From 5e3184580abd601f97d3f039a89fd649f6bd8fd4 Mon Sep 17 00:00:00 2001 From: su_v Date: Wed, 7 Oct 2015 23:32:24 +0200 Subject: Extensions. DXF export: support default values for omitted attributes of basic SVG shapes (line, rect, circle, ellipse) (bzr r14398) --- share/extensions/dxf_outlines.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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) -- cgit v1.2.3 From da9cf410675cdc6d534eee54c9aef472e50f81d4 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 8 Oct 2015 10:47:24 +0200 Subject: Add 'mesh' and 'hatch' related attributes. (bzr r14399) --- share/attributes/genMapDataSVG.pl | 19 +++++++++++++++++++ share/attributes/svgprops | 38 +++++++++++++++++++++++++++++--------- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/share/attributes/genMapDataSVG.pl b/share/attributes/genMapDataSVG.pl index f3d84d2c5..beb06dc04 100755 --- a/share/attributes/genMapDataSVG.pl +++ b/share/attributes/genMapDataSVG.pl @@ -84,6 +84,25 @@ 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{ "transform" }->{elements}}, "mesh"; +push @{$attributes{ "href" }->{elements}}, "mesh"; +push @{$attributes{ "type" }->{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..c3948b8da 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" @@ -106,10 +106,14 @@ "gradientTransform" - "linearGradient","radialGradient" -"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","mesh","hatch" "type" - "animateTransform","feColorMatrix","feTurbulence","script","style","feFuncA","feFuncB","feFuncG","feFuncR","mesh" @@ -524,6 +530,10 @@ "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,6 +560,16 @@ "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-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" -- cgit v1.2.3 From 91a6389c70d24a5d1d58bb946bfa36e05b3f0d57 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 8 Oct 2015 11:03:11 +0200 Subject: More additions for 'mesh' attributes. (bzr r14400) --- share/attributes/genMapDataSVG.pl | 6 +++++- share/attributes/svgprops | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/share/attributes/genMapDataSVG.pl b/share/attributes/genMapDataSVG.pl index beb06dc04..d64b1c01d 100755 --- a/share/attributes/genMapDataSVG.pl +++ b/share/attributes/genMapDataSVG.pl @@ -88,9 +88,13 @@ push @{$attributes{ "transform" }->{elements}}, "flowRoot","flowPara","flowSpan" push @{$attributes{ "id" }->{elements}}, "mesh","meshrow","meshpatch"; push @{$attributes{ "path" }->{elements}}, "stop"; push @{$attributes{ "gradientUnits" }->{elements}}, "mesh"; -push @{$attributes{ "transform" }->{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"; diff --git a/share/attributes/svgprops b/share/attributes/svgprops index c3948b8da..ba84836da 100644 --- a/share/attributes/svgprops +++ b/share/attributes/svgprops @@ -104,7 +104,7 @@ "glyphRef" - "altGlyph","glyphRef" -"gradientTransform" - "linearGradient","radialGradient" +"gradientTransform" - "linearGradient","radialGradient","mesh" "gradientUnits" - "linearGradient","radialGradient","mesh" @@ -348,7 +348,7 @@ "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","mesh","hatch" +"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" @@ -392,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" @@ -406,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" @@ -422,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" -- cgit v1.2.3 From 6ec542b8becf1a402c3109f44d2b028a8c87a26c Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 8 Oct 2015 12:15:34 +0200 Subject: Correct transform when picking colors under mesh. (bzr r14401) --- src/sp-mesh-array.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) 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 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 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 ) { -- cgit v1.2.3 From 92d48dff17928ec1f964e5671383a9ebb32f3a6b Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 8 Oct 2015 12:25:06 +0200 Subject: Add buttons for some side/corner mesh opeartions. (bzr r14402) --- src/ui/tools/mesh-tool.cpp | 2 +- src/ui/tools/mesh-tool.h | 2 ++ src/widgets/mesh-toolbar.cpp | 78 +++++++++++++++++++++++++++++++++++++++++++- src/widgets/toolbox.cpp | 5 ++- 4 files changed, 84 insertions(+), 3 deletions(-) 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 #include #include "ui/tools/tool-base.h" +#include "sp-mesh-array.h" #define SP_MESH_CONTEXT(obj) (dynamic_cast((Inkscape::UI::Tools::ToolBase*)obj)) #define SP_IS_MESH_CONTEXT(obj) (dynamic_cast((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/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(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 cdf39e9ef..a1c32352c 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -519,9 +519,12 @@ static gchar const * ui_descr = // " " // " " // " " + " " + " " + " " + " " " " " " - " " " " " " -- cgit v1.2.3 From 17f2a27dfcfbf68d218193a830faa9580ce8a363 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sat, 10 Oct 2015 21:17:34 +0200 Subject: Added new button to get global measure as a dimension (bzr r14393.1.15) --- src/ui/tools/measure-tool.cpp | 169 ++++++++++++++++++++++++++++------------ src/ui/tools/measure-tool.h | 1 + src/widgets/measure-toolbar.cpp | 35 ++++++++- src/widgets/toolbox.cpp | 2 + 4 files changed, 155 insertions(+), 52 deletions(-) diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp index 32f164a96..585128135 100644 --- a/src/ui/tools/measure-tool.cpp +++ b/src/ui/tools/measure-tool.cpp @@ -25,6 +25,7 @@ #include "desktop.h" #include "svg/svg.h" #include "document.h" +#include "document-undo.h" #include #include "pixmaps/cursor-measure.xpm" #include "preferences.h" @@ -50,11 +51,14 @@ #include "enums.h" #include "ui/control-manager.h" #include "knot-enums.h" +#include "desktop-style.h" +#include "verbs.h" #include 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 @@ -74,7 +78,7 @@ const std::string MeasureTool::prefsPath = "/tools/measure"; namespace { -gint const DIMENSION_OFFSET = 35; +gint dimension_offset = 35; /** * Simple class to use for removing label overlap. @@ -236,8 +240,10 @@ void createAngleDisplayCurve(SPDesktop *desktop, Geom::Point const ¢er, Geom } // 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) @@ -256,10 +262,10 @@ 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); + if(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(); } @@ -288,9 +294,9 @@ MeasureTool::~MeasureTool() { 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); } @@ -304,7 +310,7 @@ void MeasureTool::knotStartMovedHandler(SPKnot */*knot*/, Geom::Point const &ppo 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); + this->knot_start->moveto(start_p); } m.unSetup(); } @@ -320,7 +326,7 @@ void MeasureTool::knotEndMovedHandler(SPKnot */*knot*/, Geom::Point const &ppoin 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); + this->knot_end->moveto(end_p); } m.unSetup(); } @@ -328,7 +334,7 @@ void MeasureTool::knotEndMovedHandler(SPKnot */*knot*/, Geom::Point const &ppoin } void MeasureTool::knotUngrabbedHandler(SPKnot */*knot*/, unsigned int state){ - showCanvasItems(this->knot_start->position(), end_p); + showCanvasItems(this->knot_start->position(), this->knot_end->position()); } @@ -432,18 +438,20 @@ bool MeasureTool::root_handler(GdkEvent* event) { break; } case GDK_MOTION_NOTIFY: { - if (!(event->motion.state & GDK_BUTTON1_MASK) && !(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)); + 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)); - SnapManager &m = desktop->namedview->snap_manager; - m.setup(desktop); + SnapManager &m = desktop->namedview->snap_manager; + m.setup(desktop); - Inkscape::SnapCandidatePoint scp(motion_dt, Inkscape::SNAPSOURCE_OTHER_HANDLE); - scp.addOrigin(start_point); + Inkscape::SnapCandidatePoint scp(motion_dt, Inkscape::SNAPSOURCE_OTHER_HANDLE); + scp.addOrigin(start_point); - m.preSnap(scp); - m.unSetup(); + m.preSnap(scp); + m.unSetup(); + } } else { ret = TRUE; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); @@ -482,12 +490,13 @@ bool MeasureTool::root_handler(GdkEvent* event) { break; } case GDK_BUTTON_RELEASE: { - this->knot_start->setPosition(start_point, SP_KNOT_STATE_NORMAL); + this->knot_start->moveto(start_point); this->knot_start->show(); + Geom::Point end_point = end_p; if(last_end){ - Geom::Point end_point = desktop->w2d(*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); + 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); @@ -497,14 +506,14 @@ 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(); } + 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; } - sp_event_context_discard_delayed_snap_event(this); break; } default: @@ -562,7 +571,7 @@ void MeasureTool::setMarker(bool isStart){ } else { repr2->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"); + repr2->setAttribute("style", "stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"); if(isStart){ repr2->setAttribute("transform", "scale(0.3) translate(-2.3,0)"); } else { @@ -574,17 +583,18 @@ void MeasureTool::setMarker(bool isStart){ } void MeasureTool::toMarkDimension(){ - Geom::Point windowNormal = Geom::unit_vector(Geom::rot90(desktop->d2w(end_p - start_p))); - Geom::Point normal = desktop->w2d(windowNormal); setMarkers(); Geom::PathVector c; Geom::Path p; - p.start(desktop->doc2dt(start_p) + normal * 60); - p.appendNew(desktop->doc2dt(end_p) + normal * 60); + Geom::Ray ray(start_p,end_p); + Geom::Point start = start_p + Geom::Point::polar(ray.angle(), 5); + start = desktop->doc2dt(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 = desktop->doc2dt(end+ Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), -(dimension_offset / 4.0))); + p.start(start); + p.appendNew(end); 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(); @@ -592,21 +602,79 @@ void MeasureTool::toMarkDimension(){ 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 stroke_width = Geom::Point(1,1) * SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse(); + std::stringstream style_str; + style_str.imbue(std::locale::classic()); + style_str << "fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:" << stroke_width[Geom::X] << ";stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Sstart);marker-end:url(#Arrow2Send)"; g_assert( str != NULL ); repr->setAttribute("d", str); - repr->setAttribute("style", style_str); - // Attach repr + repr->setAttribute("style", style_str.str().c_str()); SPItem *item = SP_ITEM(desktop->currentLayer()->appendChildRepr(repr)); Inkscape::GC::release(repr); item->updateRepr(); } + 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()); // Flush pending updates doc->ensureUpToDate(); + DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_MEASURE, + _("Add global meassure line")); //reset(); } +void MeasureTool::setLabelText(const char *value, Geom::Point pos, double fontsize, Geom::Coord angle) +{ + /* Create */ + Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc(); + 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); + + sp_repr_set_svg_double(rtext, "x", 0); + sp_repr_set_svg_double(rtext, "y", 0); + + /* Create */ + Inkscape::XML::Node *rtspan = xml_doc->createElement("svg:tspan"); + rtspan->setAttribute("sodipodi:role", "line"); // otherwise, why bother creating the tspan? + std::stringstream text_style; + text_style.imbue(std::locale::classic()); + text_style << "font-style:normal;font-weight:normal;font-size:" << fontsize << "px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"; + rtspan->setAttribute("style", text_style.str().c_str()); + 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 (bbox) { + Geom::Coord posX = Geom::middle_point(Geom::Point(bbox->left(), bbox->top()), Geom::Point(bbox->right(), bbox->top()))[Geom::X]; + Geom::Coord posY = Geom::middle_point(Geom::Point(bbox->left(), bbox->top()), Geom::Point(bbox->left(), bbox->bottom()))[Geom::Y]; + text_item->transform *= Geom::Translate(Geom::Point(posX, posY)).inverse(); + pos = pos + Geom::Point::polar(angle + Geom::deg_to_rad(90), -Geom::distance(Geom::Point(bbox->left(), bbox->top()), Geom::Point(bbox->left(), bbox->bottom()))); + } + 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(){ this->knot_start->hide(); this->knot_end->hide(); @@ -622,6 +690,9 @@ void MeasureTool::showCanvasItems(){ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point){ SPDesktop *desktop = SP_ACTIVE_DESKTOP; + if(!desktop || !start_point.isFinite() || !end_point.isFinite() || end_point == MAGIC_POINT){ + return; + } start_p = start_point; end_p = end_point; //clear previous temporary canvas items, we'll draw new ones @@ -632,6 +703,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)); @@ -660,13 +732,13 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point 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); + 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 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]){ @@ -722,8 +794,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); @@ -748,7 +819,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); @@ -830,7 +901,7 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point 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, + 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; @@ -893,18 +964,18 @@ 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)); 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)); 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)); } @@ -928,7 +999,7 @@ 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), + desktop->doc2dt(measure_text_pos) - (normal * dimension_offset), CTLINE_SECONDARY); measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0)); } diff --git a/src/ui/tools/measure-tool.h b/src/ui/tools/measure-tool.h index 44153a144..0670fb9f7 100644 --- a/src/ui/tools/measure-tool.h +++ b/src/ui/tools/measure-tool.h @@ -43,6 +43,7 @@ public: virtual void setMarkers(); virtual void setMarker(bool isStart); virtual const std::string& getPrefsPath(); + void setLabelText(const char *value, Geom::Point pos, double fontsize, Geom::Coord angle); 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*/); diff --git a/src/widgets/measure-toolbar.cpp b/src/widgets/measure-toolbar.cpp index a619418db..9c782b4b6 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(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(g_object_get_data(tbl, "tracker")); @@ -180,13 +196,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 +216,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,7 +278,7 @@ 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) ); diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 765e91629..65a0cd9cb 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -339,6 +339,8 @@ static gchar const * ui_descr = " " " " " " + " " + " " " " " " " " -- cgit v1.2.3 From fc8d6dbbd964ddb260286e5af7f0a1fb05a737e3 Mon Sep 17 00:00:00 2001 From: su_v Date: Sun, 11 Oct 2015 08:45:15 +0200 Subject: Extensions. Random Tree: optionally omit redundant segments (bug #1500124) Fixed bugs: - https://launchpad.net/bugs/1500124 (bzr r14403) --- share/extensions/rtree.inx | 1 + share/extensions/rtree.py | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) 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 @@ inkex.py 100.0 40.0 + false all 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) -- cgit v1.2.3 From b76d7592902d9e27cb442e203ebffed4a915b8e6 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Mon, 12 Oct 2015 12:05:07 +0200 Subject: Fix from Johan to prevent referencing null C++ pointer. Found via Clang scan build. (bzr r14404) --- src/ui/clipboard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 object(s) to paste live path effect to.")); return false; } -- cgit v1.2.3 From 2653fd7c3a138f91181f7bb64e1fd342c943ee7b Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Mon, 12 Oct 2015 12:37:15 +0200 Subject: Convert Measure to Item done (bzr r14393.1.17) --- src/ui/tools/measure-tool.cpp | 905 ++++++++++++++++++++++++++-------------- src/ui/tools/measure-tool.h | 21 +- src/widgets/measure-toolbar.cpp | 17 + src/widgets/toolbox.cpp | 1 + 4 files changed, 638 insertions(+), 306 deletions(-) diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp index 585128135..76b8e931e 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 * Jon A. Cruz + * Jabiertxo Arraiza * * Copyright (C) 2011 Authors * @@ -14,42 +15,44 @@ #include #include #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 "document-undo.h" -#include -#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" @@ -63,20 +66,21 @@ using Inkscape::DocumentUndo; #define MT_KNOT_COLOR_NORMAL 0xffffff00 #define MT_KNOT_COLOR_MOUSEOVER 0xff000000 + namespace Inkscape { namespace UI { namespace Tools { std::vector 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 dimension_offset = 35; @@ -196,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. @@ -205,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)) @@ -235,9 +240,47 @@ 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(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 Geom::Point const MAGIC_POINT = Geom::Point(-0.0003432532004303,-0.006745034004304); @@ -249,7 +292,7 @@ MeasureTool::MeasureTool() , 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); @@ -262,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 != MAGIC_POINT){ + 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->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)); @@ -276,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(); @@ -291,7 +336,8 @@ 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->moveto(end); @@ -301,45 +347,59 @@ void MeasureTool::reverseKnots(){ 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->moveto(start_p); - } + 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->moveto(end_p); - } + 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(), this->knot_end->position()); +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) { @@ -386,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 @@ -398,106 +458,83 @@ 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)){ - 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)); + 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)); - SnapManager &m = desktop->namedview->snap_manager; - m.setup(desktop); + SnapManager &m = desktop->namedview->snap_manager; + m.setup(desktop); - Inkscape::SnapCandidatePoint scp(motion_dt, Inkscape::SNAPSOURCE_OTHER_HANDLE); - scp.addOrigin(start_point); + Inkscape::SnapCandidatePoint scp(motion_dt, Inkscape::SNAPSOURCE_OTHER_HANDLE); + scp.addOrigin(start_point); - 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 ; + 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. } - 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) { + // 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->button.state & GDK_SHIFT_MASK)) { + } 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); @@ -506,153 +543,317 @@ bool MeasureTool::root_handler(GdkEvent* event) { end_point = sp.getPoint(); m.unSetup(); } + showCanvasItems(start_point, end_point); + last_end = motion_w ; } - 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; + 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(); } - 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"); + rmarker->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("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", "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::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(){ +void MeasureTool::toMarkDimension() +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + SPDocument *doc = desktop->getDocument(); setMarkers(); - Geom::PathVector c; - Geom::Path p; Geom::Ray ray(start_p,end_p); Geom::Point start = start_p + Geom::Point::polar(ray.angle(), 5); - start = desktop->doc2dt(start + Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), -(dimension_offset / 4.0))); + 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 = desktop->doc2dt(end+ Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), -(dimension_offset / 4.0))); - p.start(start); - p.appendNew(end); + 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_point)); + p.appendNew(desktop->doc2dt(end_point)); c.push_back(p); c *= SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse(); - 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); - Geom::Point stroke_width = Geom::Point(1,1) * SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse(); - std::stringstream style_str; - style_str.imbue(std::locale::classic()); - style_str << "fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:" << stroke_width[Geom::X] << ";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", "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"); + 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.str().c_str()); - SPItem *item = SP_ITEM(desktop->currentLayer()->appendChildRepr(repr)); - Inkscape::GC::release(repr); - item->updateRepr(); + 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(); + } } +} - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - Glib::ustring unit_name = prefs->getString("/tools/measure/unit"); - if (!unit_name.compare("")) { - unit_name = "px"; +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 -3.55,-3.55 7.11,7.11 m 0,-7.11 -7.11,7.11"; + Geom::PathVector c = sp_svg_read_pathv(svgd); + Geom::Scale scale = Geom::Scale(desktop->current_zoom()).inverse(); + c *= scale; + Geom::Point strokewidth = (Geom::Point(1,1) * SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse())/ desktop->current_zoom(); + c *= Geom::Translate(Geom::Point(strokewidth/2.0) - (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(); + 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", "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); } - 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()); - // Flush pending updates - doc->ensureUpToDate(); - DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_MEASURE, - _("Add global meassure line")); - //reset(); } -void MeasureTool::setLabelText(const char *value, Geom::Point pos, double fontsize, Geom::Coord angle) +void MeasureTool::setLabelText(const char *value, Geom::Point pos, double fontsize, Geom::Coord angle, guint32 *background, Inkscape::XML::Node *measure_repr, CanvasTextAnchorPositionEnum text_anchor) { - /* Create */ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc(); + /* Create */ + 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); - - sp_repr_set_svg_double(rtext, "x", 0); - sp_repr_set_svg_double(rtext, "y", 0); + 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 */ Inkscape::XML::Node *rtspan = xml_doc->createElement("svg:tspan"); rtspan->setAttribute("sodipodi:role", "line"); // otherwise, why bother creating the tspan? - std::stringstream text_style; - text_style.imbue(std::locale::classic()); - text_style << "font-style:normal;font-weight:normal;font-size:" << fontsize << "px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"; - rtspan->setAttribute("style", text_style.str().c_str()); + 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 */ @@ -663,19 +864,63 @@ void MeasureTool::setLabelText(const char *value, Geom::Point pos, double fontsi Inkscape::GC::release(rtext); text_item->updateRepr(); Geom::OptRect bbox = text_item->geometricBounds(); - if (bbox) { - Geom::Coord posX = Geom::middle_point(Geom::Point(bbox->left(), bbox->top()), Geom::Point(bbox->right(), bbox->top()))[Geom::X]; - Geom::Coord posY = Geom::middle_point(Geom::Point(bbox->left(), bbox->top()), Geom::Point(bbox->left(), bbox->bottom()))[Geom::Y]; - text_item->transform *= Geom::Translate(Geom::Point(posX, posY)).inverse(); - pos = pos + Geom::Point::polar(angle + Geom::deg_to_rad(90), -Geom::distance(Geom::Point(bbox->left(), bbox->top()), Geom::Point(bbox->left(), bbox->bottom()))); + 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 */ + Inkscape::XML::Node *rgroup = xml_doc->createElement("svg:g"); + /* Create */ + 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); } - 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) { @@ -684,15 +929,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){ + 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 @@ -731,7 +980,7 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point std::vector items; Inkscape::Rubberband *r = Inkscape::Rubberband::get(desktop); r->setMode(RUBBERBAND_MODE_TOUCHPATH); - if(!show_in_between){ + if(!show_in_between) { r->start(desktop,start_p); r->move(end_p); items = desktop->getDocument()->getItemsAtPoints(desktop->dkey, r->getPoints(), all_layers, 2); @@ -741,10 +990,10 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point r->move(start_p); std::vector 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 { @@ -754,10 +1003,10 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point r->stop(); } std::vector intersection_times; - for (std::vector::const_iterator i=items.begin();i!=items.end();i++) { + for (std::vector::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(); @@ -802,11 +1051,11 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point std::vector intersections; std::sort(intersection_times.begin(), intersection_times.end()); for (std::vector::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])); } @@ -828,47 +1077,52 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point // Adjust positions repositionOverlappingLabels(placements, desktop, windowNormal, fontsize); - for (std::vector::iterator it = placements.begin(); it != placements.end(); ++it) - { + for (std::vector::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); } @@ -879,17 +1133,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); } @@ -900,44 +1157,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 * (dimension_offset * 2), - 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])) { @@ -951,12 +1232,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); } } @@ -967,29 +1254,50 @@ void MeasureTool::showCanvasItems(Geom::Point start_point, Geom::Point end_point 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 * (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 * (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::iterator it = placements.begin(); it != placements.end(); ++it) - { + for (std::vector::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); + } } { @@ -998,28 +1306,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 0670fb9f7..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 - * + * Jabiertxo Arraiza * Copyright (C) 2011 Authors * * Released under GNU GPL, read the file 'COPYING' for more information @@ -15,6 +15,7 @@ #include #include "ui/tools/tool-base.h" #include <2geom/point.h> +#include "display/canvas-text.h" #include #define SP_MEASURE_CONTEXT(obj) (dynamic_cast((Inkscape::UI::Tools::ToolBase*)obj)) @@ -36,14 +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 setLabelText(const char *value, Geom::Point pos, double fontsize, Geom::Coord angle); + 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*/); @@ -66,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/widgets/measure-toolbar.cpp b/src/widgets/measure-toolbar.cpp index 9c782b4b6..48c781fb3 100644 --- a/src/widgets/measure-toolbar.cpp +++ b/src/widgets/measure-toolbar.cpp @@ -178,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); @@ -283,6 +290,16 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G 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/toolbox.cpp b/src/widgets/toolbox.cpp index 3daa3c467..665502745 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -348,6 +348,7 @@ static gchar const * ui_descr = " " " " " " + " " " " " " -- cgit v1.2.3 From f586b5aeb837df4cd4e3aac55c0e0fcba4ae54fa Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Mon, 12 Oct 2015 13:48:06 +0200 Subject: Fix position of text when 'direction' is 'rtl' (right-to-left). (bzr r14405) --- src/libnrtype/Layout-TNG-Compute.cpp | 28 ++++++++++++++++++++++------ src/libnrtype/Layout-TNG-Input.cpp | 6 +++--- 2 files changed, 25 insertions(+), 9 deletions(-) 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..c9cfe81cc 100644 --- a/src/libnrtype/Layout-TNG-Input.cpp +++ b/src/libnrtype/Layout-TNG-Input.cpp @@ -202,13 +202,13 @@ Layout::Direction Layout::InputStreamTextSource::styleGetBlockProgression() cons } -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; } } -- cgit v1.2.3 From 328132ad756f7b094341c52175d184449155fe0f Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Mon, 12 Oct 2015 18:08:22 +0200 Subject: Fix positions of genetated intersection items (bzr r14393.1.19) --- src/ui/tools/measure-tool.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp index 76b8e931e..00d66b4c9 100644 --- a/src/ui/tools/measure-tool.cpp +++ b/src/ui/tools/measure-tool.cpp @@ -733,7 +733,7 @@ void MeasureTool::setLine(Geom::Point start_point,Geom::Point end_point, bool ma } else { sp_repr_css_set_property (css, "stroke", "#000000"); } - sp_repr_css_set_property (css, "stroke-linecap", "butt"); + 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"); @@ -770,12 +770,12 @@ void MeasureTool::setPoint(Geom::Point origin, Inkscape::XML::Node *measure_repr return; } char const * svgd; - svgd = "m -3.55,-3.55 7.11,7.11 m 0,-7.11 -7.11,7.11"; + 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; - Geom::Point strokewidth = (Geom::Point(1,1) * SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse())/ desktop->current_zoom(); - c *= Geom::Translate(Geom::Point(strokewidth/2.0) - (scale.vector() * 0.5)); + 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(); @@ -785,6 +785,7 @@ void MeasureTool::setPoint(Geom::Point origin, Inkscape::XML::Node *measure_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]; @@ -794,7 +795,7 @@ void MeasureTool::setPoint(Geom::Point origin, Inkscape::XML::Node *measure_repr 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-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"); -- cgit v1.2.3 From 78e9ba3876f94d4626c4a912cb39045c1d5a744f Mon Sep 17 00:00:00 2001 From: Eduard Braun <> Date: Mon, 12 Oct 2015 20:36:39 +0200 Subject: Translations. German translation update. Fixed bugs: - https://launchpad.net/bugs/1443126 (bzr r14406) --- po/de.po | 902 ++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 436 insertions(+), 466 deletions(-) diff --git a/po/de.po b/po/de.po index ef4318123..d1b6ae856 100644 --- a/po/de.po +++ b/po/de.po @@ -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 \n" +"PO-Revision-Date: 2015-10-02 16:07+0200\n" +"Last-Translator: Maren Hachmann \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 "" "Note: setting the precision too high may result in a large SVG file " "and slow performance." msgstr "" -"Hinweis: Die Präzision zu hoch einzustellen kann zu einem großen SVG " -"und schlechter Leistung führen." +"Hinweis: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 0 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 1 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 2 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 3 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 4 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 5 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 6 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 7 - Strg+Alt+Klick: zurücksetzen, Ctrl: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:57 msgid "Control 8x9:" @@ -10284,6 +10305,8 @@ msgstr "Anfasser 8x9:" msgid "" "Control 8x9 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 8x9 - Strg+Alt+Klick: zurücksetzen, Ctrl: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:58 msgid "Control 10x11:" @@ -10293,6 +10316,8 @@ msgstr "Anfasser 10x11:" msgid "" "Control 10x11 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 10x11 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 12 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 13 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 14 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 15 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 16 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 17 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 18 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 19 - Strg+Alt+Klick: zurücksetzen, Ctrl: nur entlang " +"Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:67 msgid "Control 20x21:" @@ -10366,6 +10407,8 @@ msgstr "Anfasser 20x21:" msgid "" "Control 20x21 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 20x21 - Strg+Alt+Klick: zurücksetzen, Ctrl: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:68 msgid "Control 22x23:" @@ -10375,6 +10418,8 @@ msgstr "Anfasser 22x23:" msgid "" "Control 22x23 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 22x23 - Strg+Alt+Klick: zurücksetzen, Ctrl: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:69 msgid "Control 24x26:" @@ -10384,6 +10429,8 @@ msgstr "Anfasser 24x26:" msgid "" "Control 24x26 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 24x26 - Strg+Alt+Klick: zurücksetzen, Ctrl: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:70 msgid "Control 25x27:" @@ -10393,6 +10440,8 @@ msgstr "Anfasser 25x27:" msgid "" "Control 25x27 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 25x27 - Strg+Alt+Klick: zurücksetzen, Ctrl: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:71 msgid "Control 28x30:" @@ -10402,6 +10451,8 @@ msgstr "Anfasser 28x30:" msgid "" "Control 28x30 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 28x30 - Strg+Alt+Klick: zurücksetzen, Ctrl: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:72 msgid "Control 29x31:" @@ -10411,6 +10462,8 @@ msgstr "Anfasser 29x31:" msgid "" "Control 29x31 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Anfasser 29x31 - Strg+Alt+Klick: zurücksetzen, Ctrl: nur " +"entlang Hauptachsen verschieben" #: ../src/live_effects/lpe-lattice2.cpp:73 msgid "Control 32x33x34x35:" @@ -10421,6 +10474,8 @@ msgid "" "Control 32x33x34x35 - Ctrl+Alt+Click: reset, Ctrl: move along " "axes" msgstr "" +"Anfasser 32x33x34x35 - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Links oben - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Rechts oben - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Links unten - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 - Ctrl+Alt+Click: reset, Ctrl: move along axes" msgstr "" +"Rechts unten - Strg+Alt+Klick: zurücksetzen, Ctrl: 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 "L" msgstr "L" @@ -25440,13 +25476,14 @@ msgstr "L" #: ../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 "R" msgstr "R" @@ -25454,28 +25491,26 @@ msgstr "R" #: ../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 "M" -msgstr "L" +msgstr "G" +# 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 x" -msgstr "Die erzwungene Dimension muss als x gesetzt werden." +msgstr "Die erzwungene Dimension muss als x 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 "Roughen unit" -#~ msgstr "Segment" - -#, 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 at least two objects to combine." #~ msgstr "Mindestens zwei Objekte 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" -- cgit v1.2.3 From af1bbe5ddd52aef9e74a778006b01b3a0e249e5d Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Tue, 13 Oct 2015 12:11:48 +0200 Subject: Fix position node splited Added parameter to Symm move nodes, Todo:Get better english strings (bzr r14407) --- src/live_effects/lpe-roughen.cpp | 125 +++++++++++++++++++++++++++++++++------ src/live_effects/lpe-roughen.h | 7 ++- 2 files changed, 111 insertions(+), 21 deletions(-) diff --git a/src/live_effects/lpe-roughen.cpp b/src/live_effects/lpe-roughen.cpp index 33ffd96d6..108b34a26 100644 --- a/src/live_effects/lpe-roughen.cpp +++ b/src/live_effects/lpe-roughen.cpp @@ -49,8 +49,10 @@ 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), + shift_handles_sym(_("Sym shift node handles"), _("Sym shift node handles"), + "shift_handles_sym", &wr, this, false) { registerParameter(&method); registerParameter(&max_segment_size); @@ -59,7 +61,8 @@ LPERoughen::LPERoughen(LivePathEffectObject *lpeobject) registerParameter(&displace_y); registerParameter(&global_randomize); registerParameter(&shift_nodes); - registerParameter(&shift_node_handles); + registerParameter(&shift_handles); + registerParameter(&shift_handles_sym); displace_x.param_set_range(0., Geom::infinity()); displace_y.param_set_range(0., Geom::infinity()); global_randomize.param_set_range(0., Geom::infinity()); @@ -170,6 +173,7 @@ 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(); + Geom::Point prev(0, 0); if (path_it->closed()) { const Geom::Curve &closingline = path_it->back_closed(); @@ -212,18 +216,26 @@ 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()); } 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(); + if(t!= splits){ + nCurve->backspace(); + } nCurve->append_continuous(tmp, 0.001); } else { nCurve = tmp->copy(); @@ -237,6 +249,27 @@ void LPERoughen::doEffect(SPCurve *curve) first = false; } if (path_it->closed()) { + if(shift_handles_sym && curve_it2 == curve_endit){ + SPCurve *out = new SPCurve(); + nCurve = nCurve->create_reverse(); + Geom::CubicBezier const *cubic_start = dynamic_cast(nCurve->first_segment()); + Geom::CubicBezier const *cubic = dynamic_cast(nCurve->last_segment()); + Geom::Point oposite = nCurve->first_segment()->initialPoint(); + 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->closepath_current(); } curve->append(nCurve, false); @@ -245,7 +278,7 @@ 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(&*A); @@ -259,38 +292,94 @@ SPCurve *LPERoughen::addNodesAndJitter(const Geom::Curve *A, double t) point3 = randomize(); point_b3 = randomize(); } - if (shift_node_handles) { + if (shift_handles && !shift_handles_sym) { point1 = randomize(); point2 = randomize(); point_b1 = randomize(); point_b2 = randomize(); - } else { + } else if(shift_handles_sym) { + Geom::Ray ray(prev,A->initialPoint()); + double dist = Geom::distance(prev, A->initialPoint()); + point1 = Geom::Point::polar(ray.angle(),dist) + A->initialPoint(); + if(prev==Geom::Point(0,0)){ + point1 = A->pointAt(t / 3) + randomize(); + } + point2 = A->pointAt((t / 3) * 2) + randomize(); + Geom::Ray ray2(point2, point3); + double dist2 = Geom::distance(point2, point3); + point_b1 = Geom::Point::polar(ray2.angle(),dist2) + point3; + point1 = point1 - A->pointAt(t / 3); + point2 = point2 - A->pointAt((t / 3) * 2); + point_b1 = randomize(); + point_b2 = randomize(); + }else { point2 = point3; point_b1 = point3; point_b2 = point_b3; } - if (cubic) { + if(shift_handles_sym && cubic) { + std::pair div = cubic->subdivide(t); + std::vector seg1 = div.first.controlPoints(), + seg2 = div.second.controlPoints(); + out->moveto(seg1[0]); + Geom::Ray ray(prev,A->initialPoint()); + double dist = Geom::distance(seg1[1], A->initialPoint()); + point1 = Geom::Point::polar(ray.angle(),dist) + A->initialPoint(); + point2 = seg1[2] + point2; + point3 = seg1[3] + point3; + if(prev==Geom::Point(0,0)){ + point1 = seg1[1] + randomize(); + } + out->curveto(point1, point2, point3); + + Geom::Ray ray2(point2, point3); + double dist2 = Geom::distance(seg2[1], point3); + point_b1 = Geom::Point::polar(ray2.angle(),dist2) + point3; + point_b2 = seg2[2]; + out->curveto(point_b1, point_b2, seg2[3]); + } else if(shift_handles_sym && !cubic) { + out->moveto(A->initialPoint()); + Geom::Ray ray(prev,A->initialPoint()); + double dist = Geom::distance(A->pointAt(t / 3) + randomize(), A->initialPoint()); + point1 = Geom::Point::polar(ray.angle(),dist) + A->initialPoint(); + point2 = A->pointAt((t / 3) * 2) + point2; + point3 = A->pointAt(t) + point3; + if(prev==Geom::Point(0,0)){ + point1 = A->pointAt(t / 3) + randomize(); + } + out->curveto(point1, point2, point3); + Geom::Ray ray2(point2, point3); + double dist2 = Geom::distance(A->pointAt(t + ((t / 3) * 2)) + point_b2, point3); + point_b1 = Geom::Point::polar(ray2.angle(),dist2) + point3; + point_b2 = A->pointAt(t + ((t / 3) * 2)) + point_b2; + out->curveto(point_b1, point_b2, A->finalPoint()); + } else if (cubic) { std::pair div = cubic->subdivide(t); std::vector 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) { + } 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 + (t / 3)) + point_b1, A->pointAt(t + ((t / 3) * 2)) + point_b2, + A->finalPoint()); } else { out->moveto(A->initialPoint()); out->lineto(A->pointAt(t) + point3); out->lineto(A->finalPoint()); } + if(last){ + prev = point_b2; + } else { + prev = point2; + } return out; } -SPCurve *LPERoughen::jitter(const Geom::Curve *A) +SPCurve *LPERoughen::jitter(Geom::Curve const * A) { SPCurve *out = new SPCurve(); Geom::CubicBezier const *cubic = dynamic_cast(&*A); @@ -300,7 +389,7 @@ SPCurve *LPERoughen::jitter(const Geom::Curve *A) if (shift_nodes) { point3 = randomize(); } - if (shift_node_handles) { + if (shift_handles) { point1 = randomize(); point2 = randomize(); } else { @@ -309,7 +398,7 @@ SPCurve *LPERoughen::jitter(const Geom::Curve *A) if (cubic) { out->moveto((*cubic)[0]); out->curveto((*cubic)[1] + point1, (*cubic)[2] + point2, (*cubic)[3] + point3); - } else if (shift_node_handles) { + } else if (shift_handles) { out->moveto(A->initialPoint()); out->curveto(A->pointAt(0.3333) + point1, A->pointAt(0.6666) + point2, A->finalPoint() + point3); diff --git a/src/live_effects/lpe-roughen.h b/src/live_effects/lpe-roughen.h index 2b285cd40..8241cedca 100644 --- a/src/live_effects/lpe-roughen.h +++ b/src/live_effects/lpe-roughen.h @@ -38,8 +38,8 @@ public: virtual double sign(double randNumber); virtual Geom::Point randomize(); 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); virtual Geom::Point tPoint(Geom::Point A, Geom::Point B, double t = 0.5); virtual Gtk::Widget *newWidget(); @@ -51,7 +51,8 @@ private: RandomParam displace_y; RandomParam global_randomize; BoolParam shift_nodes; - BoolParam shift_node_handles; + BoolParam shift_handles; + BoolParam shift_handles_sym; LPERoughen(const LPERoughen &); LPERoughen &operator=(const LPERoughen &); -- cgit v1.2.3 From f886fd682e7e4ea2622fbb523dc3a14ba75569a3 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Tue, 13 Oct 2015 22:09:54 +0200 Subject: Added a parameter to roughen LPE to allow fixed displacement of points (bzr r14408) --- src/live_effects/lpe-roughen.cpp | 235 +++++++++++++++++++++------------------ src/live_effects/lpe-roughen.h | 5 +- 2 files changed, 127 insertions(+), 113 deletions(-) diff --git a/src/live_effects/lpe-roughen.cpp b/src/live_effects/lpe-roughen.cpp index 108b34a26..6f24c288d 100644 --- a/src/live_effects/lpe-roughen.cpp +++ b/src/live_effects/lpe-roughen.cpp @@ -52,7 +52,9 @@ LPERoughen::LPERoughen(LivePathEffectObject *lpeobject) shift_handles(_("Shift node handles"), _("Shift node handles"), "shift_handles", &wr, this, true), shift_handles_sym(_("Sym shift node handles"), _("Sym shift node handles"), - "shift_handles_sym", &wr, this, false) + "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); @@ -63,6 +65,7 @@ LPERoughen::LPERoughen(LivePathEffectObject *lpeobject) registerParameter(&shift_nodes); registerParameter(&shift_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()); @@ -150,12 +153,15 @@ 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; } @@ -181,33 +187,24 @@ void LPERoughen::doEffect(SPCurve *curve) 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); + nCurve->moveto(curve_it1->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 point_a1(0, 0); + Geom::Point point_a2(0, 0); + Geom::Point point_a3(0, 0); 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(); + point_a1 = curve_it1->initialPoint(); + point_a2 = curve_it1->finalPoint(); + point_a3 = curve_it1->finalPoint(); cubic = dynamic_cast(&*curve_it1); if (cubic) { - point1 = (*cubic)[1]; - if (shift_nodes && first) { - point1 = (*cubic)[1] + initialMove; - } - point2 = (*cubic)[2]; - nCurve->curveto(point1, point2, point3); + point_a1 = (*cubic)[1]; + point_a2 = (*cubic)[2]; + nCurve->curveto(point_a1, point_a2, point_a3); } else { - nCurve->lineto(point3); + nCurve->lineto(point_a3); } double length = curve_it1->length(0.001); std::size_t splits = 0; @@ -223,7 +220,7 @@ void LPERoughen::doEffect(SPCurve *curve) } SPCurve const * tmp; if (splits == 1) { - tmp = jitter(nCurve->last_segment()); + tmp = jitter(nCurve->last_segment(), prev); } else { bool last = false; if(t == splits-1){ @@ -233,9 +230,7 @@ void LPERoughen::doEffect(SPCurve *curve) tmp = addNodesAndJitter(nCurve->last_segment(), prev, time, last); } if (nCurve->get_segment_count() > 1) { - if(t!= splits){ - nCurve->backspace(); - } + nCurve->backspace(); nCurve->append_continuous(tmp, 0.001); } else { nCurve = tmp->copy(); @@ -246,7 +241,6 @@ void LPERoughen::doEffect(SPCurve *curve) if(curve_it2 != curve_endit) { ++curve_it2; } - first = false; } if (path_it->closed()) { if(shift_handles_sym && curve_it2 == curve_endit){ @@ -254,7 +248,7 @@ void LPERoughen::doEffect(SPCurve *curve) nCurve = nCurve->create_reverse(); Geom::CubicBezier const *cubic_start = dynamic_cast(nCurve->first_segment()); Geom::CubicBezier const *cubic = dynamic_cast(nCurve->last_segment()); - Geom::Point oposite = nCurve->first_segment()->initialPoint(); + 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]); @@ -269,7 +263,9 @@ void LPERoughen::doEffect(SPCurve *curve) } 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); @@ -282,129 +278,146 @@ SPCurve const * LPERoughen::addNodesAndJitter(Geom::Curve const * A, Geom::Point { SPCurve *out = new SPCurve(); Geom::CubicBezier const *cubic = dynamic_cast(&*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_handles && !shift_handles_sym) { - point1 = randomize(); - point2 = randomize(); - point_b1 = randomize(); - point_b2 = randomize(); - } else if(shift_handles_sym) { - Geom::Ray ray(prev,A->initialPoint()); - double dist = Geom::distance(prev, A->initialPoint()); - point1 = Geom::Point::polar(ray.angle(),dist) + A->initialPoint(); - if(prev==Geom::Point(0,0)){ - point1 = A->pointAt(t / 3) + 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 { + point_a2 = point_a3; + point_b1 = point_a3; + if(last){ + point_b2 = point_b3; } - point2 = A->pointAt((t / 3) * 2) + randomize(); - Geom::Ray ray2(point2, point3); - double dist2 = Geom::distance(point2, point3); - point_b1 = Geom::Point::polar(ray2.angle(),dist2) + point3; - point1 = point1 - A->pointAt(t / 3); - point2 = point2 - A->pointAt((t / 3) * 2); - point_b1 = randomize(); - point_b2 = randomize(); - }else { - point2 = point3; - point_b1 = point3; - point_b2 = point_b3; } if(shift_handles_sym && cubic) { std::pair div = cubic->subdivide(t); std::vector seg1 = div.first.controlPoints(), seg2 = div.second.controlPoints(); - out->moveto(seg1[0]); Geom::Ray ray(prev,A->initialPoint()); - double dist = Geom::distance(seg1[1], A->initialPoint()); - point1 = Geom::Point::polar(ray.angle(),dist) + A->initialPoint(); - point2 = seg1[2] + point2; - point3 = seg1[3] + point3; - if(prev==Geom::Point(0,0)){ - point1 = seg1[1] + randomize(); + point_a1 = Geom::Point::polar(ray.angle(), max_lenght); + if(prev == Geom::Point(0,0)){ + point_a1 = randomize(max_lenght); + } + if(last){ + prev = A->pointAt(1 - (t / 3)) + point_b2; + } else { + point_b3 = Geom::Point(0,0); + point_b2 = Geom::Point(0,0); + } + Geom::Ray ray2(seg2[1] + point_b1, seg1[3] + point_a3); + point_a2 = Geom::Point::polar(ray2.angle(), max_lenght); + if(!last){ + prev = seg1[3] + point_a3 + point_a2; + } + out->moveto(seg1[0]); + out->curveto(seg1[0] + point_a1, seg1[3] + point_a3 + point_a2, seg1[3] + point_a3); + if(last){ + out->curveto(seg2[1] + point_b1, A->pointAt(1 - (t / 3)) + point_b2, seg2[3] + point_b3); + } else { + out->curveto(seg2[1] + point_b1, seg2[2] + point_b2, seg2[3] + point_b3); } - out->curveto(point1, point2, point3); - - Geom::Ray ray2(point2, point3); - double dist2 = Geom::distance(seg2[1], point3); - point_b1 = Geom::Point::polar(ray2.angle(),dist2) + point3; - point_b2 = seg2[2]; - out->curveto(point_b1, point_b2, seg2[3]); } else if(shift_handles_sym && !cubic) { - out->moveto(A->initialPoint()); Geom::Ray ray(prev,A->initialPoint()); - double dist = Geom::distance(A->pointAt(t / 3) + randomize(), A->initialPoint()); - point1 = Geom::Point::polar(ray.angle(),dist) + A->initialPoint(); - point2 = A->pointAt((t / 3) * 2) + point2; - point3 = A->pointAt(t) + point3; + point_a1 = Geom::Point::polar(ray.angle(), max_lenght); if(prev==Geom::Point(0,0)){ - point1 = A->pointAt(t / 3) + randomize(); + point_a1 = randomize(max_lenght); + } + if(last){ + prev = A->pointAt(1 - (t / 3)) + point_b2; + } else { + point_b3 = Geom::Point(0,0); + point_b2 = Geom::Point(0,0); + } + Geom::Ray ray2(A->pointAt(t + (t / 3)) + point_b1, A->pointAt(t) + point_a3); + point_a2 = Geom::Point::polar(ray2.angle(), max_lenght); + if(!last){ + prev = A->pointAt((t / 3) * 2) + point_a2; + } + out->moveto(A->initialPoint()); + out->curveto(A->initialPoint() + point_a1, A->pointAt(t) + point_a3 + point_a2, A->pointAt(t) + point_a3); + if(last){ + out->curveto(A->pointAt(t + (t / 3)) + point_b1, A->pointAt(1 - (t / 3)) + point_b2, A->finalPoint() + point_b3); + } else { + out->curveto(A->pointAt(t + (t / 3)) + point_b1, A->pointAt(t +((t / 3) * 2)) + point_b2, A->finalPoint() + point_b3); } - out->curveto(point1, point2, point3); - Geom::Ray ray2(point2, point3); - double dist2 = Geom::distance(A->pointAt(t + ((t / 3) * 2)) + point_b2, point3); - point_b1 = Geom::Point::polar(ray2.angle(),dist2) + point3; - point_b2 = A->pointAt(t + ((t / 3) * 2)) + point_b2; - out->curveto(point_b1, point_b2, A->finalPoint()); } else if (cubic) { std::pair div = cubic->subdivide(t); std::vector 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]); + out->curveto(seg1[1] + point_a1, seg1[2] + point_a2, seg1[3] + point_a3); + out->curveto(seg2[1] + point_b1, seg2[2] + point_b2, 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)) + point_b2, - A->finalPoint()); + out->curveto(A->pointAt(t / 3) + point_a1, A->pointAt((t / 3) * 2) + point_a2, A->pointAt(t) + point_a3); + out->curveto(A->pointAt(t + (t / 3)) + point_b1, A->pointAt(t +((t / 3) * 2)) + point_b2, A->finalPoint() + point_b3); } else { out->moveto(A->initialPoint()); - out->lineto(A->pointAt(t) + point3); - out->lineto(A->finalPoint()); - } - if(last){ - prev = point_b2; - } else { - prev = point2; + out->lineto(A->pointAt(t) + point_a3); + out->lineto(A->finalPoint() + point_b3); } return out; } -SPCurve *LPERoughen::jitter(Geom::Curve const * A) +SPCurve *LPERoughen::jitter(Geom::Curve const * A, Geom::Point &prev) { SPCurve *out = new SPCurve(); Geom::CubicBezier const *cubic = dynamic_cast(&*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_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(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, (*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, A->finalPoint() + point_a3); + } else if (cubic) { out->moveto((*cubic)[0]); - out->curveto((*cubic)[1] + point1, (*cubic)[2] + point2, (*cubic)[3] + point3); + out->curveto((*cubic)[1] + point_a1, (*cubic)[2] + point_a2, (*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, + 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 8241cedca..e221e95fb 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 const * addNodesAndJitter(Geom::Curve const * A, Geom::Point &prev, double t, bool last); - virtual SPCurve *jitter(Geom::Curve const * A); + 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(); @@ -53,6 +53,7 @@ private: BoolParam shift_nodes; BoolParam shift_handles; BoolParam shift_handles_sym; + BoolParam fixed_displacement; LPERoughen(const LPERoughen &); LPERoughen &operator=(const LPERoughen &); -- cgit v1.2.3 From bdf7f8acb13e3c1920307674e3fea3cbca8ba12e Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Wed, 14 Oct 2015 13:20:09 +0200 Subject: Fix from Johan to prevent referencing null C++ pointer. Found via Clang scan build. (bzr r14409) --- src/widgets/gradient-vector.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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); -- cgit v1.2.3 From d6926d4ffcd9fdf0c1e69fb3bf9397eac0f54f81 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Wed, 14 Oct 2015 20:42:56 +0200 Subject: improved results of roughen LPE (bzr r14410) --- src/live_effects/lpe-roughen.cpp | 44 ++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/src/live_effects/lpe-roughen.cpp b/src/live_effects/lpe-roughen.cpp index 6f24c288d..dec3f955f 100644 --- a/src/live_effects/lpe-roughen.cpp +++ b/src/live_effects/lpe-roughen.cpp @@ -314,23 +314,19 @@ SPCurve const * LPERoughen::addNodesAndJitter(Geom::Curve const * A, Geom::Point if(prev == Geom::Point(0,0)){ point_a1 = randomize(max_lenght); } - if(last){ - prev = A->pointAt(1 - (t / 3)) + point_b2; - } else { - point_b3 = Geom::Point(0,0); - point_b2 = Geom::Point(0,0); - } - Geom::Ray ray2(seg2[1] + point_b1, seg1[3] + point_a3); - point_a2 = Geom::Point::polar(ray2.angle(), max_lenght); + ray.setPoints(seg2[1] + point_a3 + point_b1, seg1[3] + point_a3); + point_a2 = Geom::Point::polar(ray.angle(), max_lenght); if(!last){ prev = seg1[3] + point_a3 + point_a2; + } else { + prev = A->pointAt(1 - (t / 3)) + point_b2 + point_b3; } out->moveto(seg1[0]); - out->curveto(seg1[0] + point_a1, seg1[3] + point_a3 + point_a2, seg1[3] + point_a3); + out->curveto(seg1[0] + point_a1, seg1[2] + point_a3 + point_a2, seg1[3] + point_a3); if(last){ - out->curveto(seg2[1] + point_b1, A->pointAt(1 - (t / 3)) + point_b2, seg2[3] + point_b3); + 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_b1, seg2[2] + point_b2, seg2[3] + point_b3); + 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()); @@ -338,35 +334,31 @@ SPCurve const * LPERoughen::addNodesAndJitter(Geom::Curve const * A, Geom::Point if(prev==Geom::Point(0,0)){ point_a1 = randomize(max_lenght); } - if(last){ - prev = A->pointAt(1 - (t / 3)) + point_b2; - } else { - point_b3 = Geom::Point(0,0); - point_b2 = Geom::Point(0,0); - } - Geom::Ray ray2(A->pointAt(t + (t / 3)) + point_b1, A->pointAt(t) + point_a3); - point_a2 = Geom::Point::polar(ray2.angle(), 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 / 3) * 2) + point_a2; + } else { + prev = A->pointAt(1 - (t / 3)) + point_b2 + point_b3; } 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->initialPoint() + point_a1, A->pointAt((t / 3) * 2) + point_a3 + point_a2, A->pointAt(t) + point_a3); if(last){ - out->curveto(A->pointAt(t + (t / 3)) + point_b1, A->pointAt(1 - (t / 3)) + point_b2, A->finalPoint() + point_b3); + out->curveto(A->pointAt(t + (t / 3)) + point_a3 + point_b1, A->pointAt(1 - (t / 3)) + point_b2 + point_b3, A->finalPoint() + point_b3); } else { - out->curveto(A->pointAt(t + (t / 3)) + point_b1, A->pointAt(t +((t / 3) * 2)) + point_b2, A->finalPoint() + point_b3); + 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 div = cubic->subdivide(t); std::vector seg1 = div.first.controlPoints(), seg2 = div.second.controlPoints(); out->moveto(seg1[0]); - out->curveto(seg1[1] + point_a1, seg1[2] + point_a2, seg1[3] + point_a3); - out->curveto(seg2[1] + point_b1, seg2[2] + point_b2, seg2[3] + point_b3); + 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) + point_a1, A->pointAt((t / 3) * 2) + point_a2, A->pointAt(t) + point_a3); - out->curveto(A->pointAt(t + (t / 3)) + point_b1, A->pointAt(t +((t / 3) * 2)) + point_b2, A->finalPoint() + point_b3); + 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) + point_a3); -- cgit v1.2.3 From e49ce373b61fba07422c156090b0ee7553cde18f Mon Sep 17 00:00:00 2001 From: Diederik van Lierop Date: Wed, 14 Oct 2015 21:47:34 +0200 Subject: Fix snapping while rotating a selection Fixed bugs: - https://launchpad.net/bugs/1479167 (bzr r14411) --- src/2geom/path-sink.cpp | 4 ++-- src/object-snapper.cpp | 43 ++++++------------------------------------- src/pure-transform.cpp | 2 +- 3 files changed, 9 insertions(+), 40 deletions(-) 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/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(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::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 inters = constraint_path.intersect(*(k->path_vector)); - // Convert the collected points of intersection to snapped points - for (std::vector::iterator p_inters = intersections.begin(); p_inters != intersections.end(); ++p_inters) { + // Convert the collected intersections to snapped points + for (std::vector::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 todo(owner->hrefList); todo.push_front(owner->parent); while(!todo.empty()){ -- cgit v1.2.3 From b39fc82af6e1320d3c2b301a1639965b04f05fd9 Mon Sep 17 00:00:00 2001 From: Marc Jeanmougin Date: Thu, 15 Oct 2015 01:13:10 +0200 Subject: clang-format (bzr r14413) --- src/uri-references.cpp | 159 +++++++++++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 72 deletions(-) diff --git a/src/uri-references.cpp b/src/uri-references.cpp index 0aae9b39d..b6ccdbf5f 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -26,74 +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 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 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 done; - SPObject * owner = getOwner(); - if(!owner)return true; - while(owner->cloned){ - std::vector positions; - while(owner->cloned){ - int position=0; - SPObject* c = owner->parent->firstChild(); - while(c != owner && dynamic_cast(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 todo(owner->hrefList); - todo.push_front(owner->parent); - while(!todo.empty()){ - SPObject* e = todo.front(); - todo.pop_front(); - if(!dynamic_cast(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 done; + SPObject *owner = getOwner(); + if (!owner) + return true; + while (owner->cloned) { + std::vector positions; + while (owner->cloned) { + int position = 0; + SPObject *c = owner->parent->firstChild(); + while (c != owner && dynamic_cast(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 todo(owner->hrefList); + todo.push_front(owner->parent); + while (!todo.empty()) { + SPObject *e = todo.front(); + todo.pop_front(); + if (!dynamic_cast(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; @@ -109,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(); } @@ -149,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(); } @@ -184,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(); @@ -211,7 +227,7 @@ void URIReference::_setObject(SPObject *obj) */ void URIReference::_release(SPObject *obj) { - g_assert( _obj == obj ); + g_assert(_obj == obj); _setObject(NULL); } @@ -219,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; -- cgit v1.2.3 From a0aa872111376b85e7d748ca6e098c6ef51ec25c Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 15 Oct 2015 11:19:22 +0200 Subject: Add a few new properties dealing with text and transforms. (bzr r14414) --- share/attributes/css_defaults | 24 +++++++++++++++++++++++ share/attributes/cssprops | 14 ++++++++++++++ share/attributes/genMapDataCSS.pl | 40 +++++++++++++++++++++++++++++++++++++-- share/attributes/svgprops | 14 ++++++++++++++ 4 files changed, 90 insertions(+), 2 deletions(-) diff --git a/share/attributes/css_defaults b/share/attributes/css_defaults index 1f8e8835b..eecd2069b 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,28 @@ "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-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..28552c632 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,18 @@ "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-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..380942794 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,42 @@ 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-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/svgprops b/share/attributes/svgprops index ba84836da..5474d94dd 100644 --- a/share/attributes/svgprops +++ b/share/attributes/svgprops @@ -436,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" @@ -526,6 +528,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" @@ -570,10 +576,18 @@ "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-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" -- cgit v1.2.3 From 7955f779344953ea99a7cf0cb3a7982e06709364 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 15 Oct 2015 11:30:51 +0200 Subject: Add 'transform-box' to CSS properties. (bzr r14415) --- share/attributes/css_defaults | 2 ++ share/attributes/cssprops | 2 ++ share/attributes/genMapDataCSS.pl | 5 +++++ share/attributes/svgprops | 2 ++ 4 files changed, 11 insertions(+) diff --git a/share/attributes/css_defaults b/share/attributes/css_defaults index eecd2069b..05735a0f2 100644 --- a/share/attributes/css_defaults +++ b/share/attributes/css_defaults @@ -148,6 +148,8 @@ "transform" - "none" - "no" +"transform-box" - "NO_DEFAULT" - "no" + "transform-origin" - "NO_DEFAULT" - "no" "transform-style" - "flat" - "no" diff --git a/share/attributes/cssprops b/share/attributes/cssprops index 28552c632..3767200a4 100644 --- a/share/attributes/cssprops +++ b/share/attributes/cssprops @@ -148,6 +148,8 @@ "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" diff --git a/share/attributes/genMapDataCSS.pl b/share/attributes/genMapDataCSS.pl index 380942794..0d6e5c13d 100755 --- a/share/attributes/genMapDataCSS.pl +++ b/share/attributes/genMapDataCSS.pl @@ -248,6 +248,11 @@ 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 diff --git a/share/attributes/svgprops b/share/attributes/svgprops index 5474d94dd..4fbcb16b4 100644 --- a/share/attributes/svgprops +++ b/share/attributes/svgprops @@ -584,6 +584,8 @@ "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" -- cgit v1.2.3 From b80f68e9585593a78bad9ae34385cbebe780299a Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 15 Oct 2015 13:52:47 +0200 Subject: Add new 'writing-mode' values, remove 'block-progression', fix a few typos. (bzr r14416) --- src/attributes-test.h | 3 ++- src/attributes.cpp | 2 +- src/attributes.h | 2 +- src/libnrtype/Layout-TNG-Input.cpp | 7 ------- src/style-enums.h | 39 +++++++++++++++++++++++++------------- src/style.cpp | 27 ++++++++++++++------------ src/style.h | 8 ++++---- 7 files changed, 49 insertions(+), 39 deletions(-) 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-Input.cpp b/src/libnrtype/Layout-TNG-Input.cpp index c9cfe81cc..9c2fc5c11 100644 --- a/src/libnrtype/Layout-TNG-Input.cpp +++ b/src/libnrtype/Layout-TNG-Input.cpp @@ -172,11 +172,6 @@ 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}, @@ -190,8 +185,6 @@ Layout::Direction Layout::InputStreamTextSource::styleGetBlockProgression() cons SPStyle const *this_style = style; 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; 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(&SPStyle::text_transform ) ) ); // _propmap.insert( std::make_pair( direction.name, reinterpret_cast(&SPStyle::direction ) ) ); - // _propmap.insert( std::make_pair( block_progression.name, reinterpret_cast(&SPStyle::block_progression ) ) ); // _propmap.insert( std::make_pair( writing_mode.name, reinterpret_cast(&SPStyle::writing_mode ) ) ); + // _propmap.insert( std::make_pair( text_orientation.name, reinterpret_cast(&SPStyle::text_orientation ) ) ); // _propmap.insert( std::make_pair( baseline_shift.name, reinterpret_cast(&SPStyle::baseline_shift ) ) ); // _propmap.insert( std::make_pair( text_anchor.name, reinterpret_cast(&SPStyle::text_anchor ) ) ); // _propmap.insert( std::make_pair( white_space.name, reinterpret_cast(&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; -- cgit v1.2.3 From d929999b79640a8b1425a999483d782883035d3b Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 15 Oct 2015 14:14:01 +0200 Subject: Simplify code after removal of 'block-progression'. (bzr r14417) --- src/libnrtype/Layout-TNG-Input.cpp | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/libnrtype/Layout-TNG-Input.cpp b/src/libnrtype/Layout-TNG-Input.cpp index 9c2fc5c11..77480cebe 100644 --- a/src/libnrtype/Layout-TNG-Input.cpp +++ b/src/libnrtype/Layout-TNG-Input.cpp @@ -172,27 +172,24 @@ float Layout::InputStreamTextSource::styleComputeFontSize() const return medium_font_size * inherit_multiplier; } -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->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) -- cgit v1.2.3 From f8a67994cf1d608c6f14e7c41497b62f4a402392 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Thu, 15 Oct 2015 17:15:00 +0200 Subject: Bug fixes in roughen and added uption to retract handles (bzr r14418) --- src/live_effects/lpe-roughen.cpp | 82 ++++++++++++++++++---------------------- src/live_effects/lpe-roughen.h | 1 + 2 files changed, 38 insertions(+), 45 deletions(-) diff --git a/src/live_effects/lpe-roughen.cpp b/src/live_effects/lpe-roughen.cpp index dec3f955f..ed1ddcaf8 100644 --- a/src/live_effects/lpe-roughen.cpp +++ b/src/live_effects/lpe-roughen.cpp @@ -51,6 +51,8 @@ LPERoughen::LPERoughen(LivePathEffectObject *lpeobject) 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"), @@ -64,6 +66,7 @@ LPERoughen::LPERoughen(LivePathEffectObject *lpeobject) registerParameter(&global_randomize); registerParameter(&shift_nodes); registerParameter(&shift_handles); + registerParameter(&retract_handles); registerParameter(&shift_handles_sym); registerParameter(&fixed_displacement); displace_x.param_set_range(0., Geom::infinity()); @@ -167,8 +170,7 @@ Geom::Point LPERoughen::randomize(double max_lenght) 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) { @@ -180,31 +182,14 @@ void LPERoughen::doEffect(SPCurve *curve) Geom::Path::const_iterator curve_endit = path_it->end_default(); SPCurve *nCurve = new SPCurve(); Geom::Point prev(0, 0); - 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(); - } - } nCurve->moveto(curve_it1->initialPoint()); - Geom::Point point0(0, 0); - Geom::Point point_a1(0, 0); - Geom::Point point_a2(0, 0); - Geom::Point point_a3(0, 0); while (curve_it1 != curve_endit) { Geom::CubicBezier const *cubic = NULL; - point0 = curve_it1->initialPoint(); - point_a1 = curve_it1->initialPoint(); - point_a2 = curve_it1->finalPoint(); - point_a3 = curve_it1->finalPoint(); cubic = dynamic_cast(&*curve_it1); if (cubic) { - point_a1 = (*cubic)[1]; - point_a2 = (*cubic)[2]; - nCurve->curveto(point_a1, point_a2, point_a3); + nCurve->curveto((*cubic)[1], (*cubic)[2], curve_it1->finalPoint()); } else { - nCurve->lineto(point_a3); + nCurve->lineto(curve_it1->finalPoint()); } double length = curve_it1->length(0.001); std::size_t splits = 0; @@ -238,12 +223,10 @@ void LPERoughen::doEffect(SPCurve *curve) delete tmp; } ++curve_it1; - if(curve_it2 != curve_endit) { - ++curve_it2; - } + ++curve_it2; } if (path_it->closed()) { - if(shift_handles_sym && curve_it2 == curve_endit){ + 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(nCurve->first_segment()); @@ -305,7 +288,17 @@ SPCurve const * LPERoughen::addNodesAndJitter(Geom::Curve const * A, Geom::Point point_b2 = point_b3; } } - if(shift_handles_sym && cubic) { + if(retract_handles){ + out->moveto(A->initialPoint()); + out->lineto(A->pointAt(t) + point_a3); + if(cubic && !last){ + std::pair div = cubic->subdivide(t); + std::vector 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 div = cubic->subdivide(t); std::vector seg1 = div.first.controlPoints(), seg2 = div.second.controlPoints(); @@ -314,15 +307,15 @@ SPCurve const * LPERoughen::addNodesAndJitter(Geom::Curve const * A, Geom::Point if(prev == Geom::Point(0,0)){ point_a1 = randomize(max_lenght); } - ray.setPoints(seg2[1] + point_a3 + point_b1, seg1[3] + point_a3); + ray.setPoints(seg2[1] + point_a3 + point_b1, seg2[0] + point_a3); point_a2 = Geom::Point::polar(ray.angle(), max_lenght); - if(!last){ - prev = seg1[3] + point_a3 + point_a2; - } else { + 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[2] + point_a3 + point_a2, seg1[3] + point_a3); + 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 { @@ -336,18 +329,14 @@ SPCurve const * LPERoughen::addNodesAndJitter(Geom::Curve const * A, Geom::Point } 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 / 3) * 2) + point_a2; - } else { - prev = A->pointAt(1 - (t / 3)) + point_b2 + point_b3; - } - out->moveto(A->initialPoint()); - out->curveto(A->initialPoint() + point_a1, A->pointAt((t / 3) * 2) + point_a3 + point_a2, A->pointAt(t) + point_a3); if(last){ - out->curveto(A->pointAt(t + (t / 3)) + point_a3 + point_b1, A->pointAt(1 - (t / 3)) + point_b2 + point_b3, A->finalPoint() + point_b3); + prev = A->pointAt(t +((t / 3) * 2)) + point_b2 + point_b3; } else { - 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); + 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 div = cubic->subdivide(t); std::vector seg1 = div.first.controlPoints(), @@ -382,7 +371,10 @@ SPCurve *LPERoughen::jitter(Geom::Curve const * A, Geom::Point &prev) point_a1 = randomize(max_lenght); point_a2 = randomize(max_lenght); } - if(shift_handles_sym && 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)){ @@ -390,7 +382,7 @@ SPCurve *LPERoughen::jitter(Geom::Curve const * A, Geom::Point &prev) } prev = (*cubic)[2] + point_a2; out->moveto((*cubic)[0]); - out->curveto((*cubic)[0] + point_a1, (*cubic)[2] + point_a2, (*cubic)[3] + point_a3); + 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); @@ -399,13 +391,13 @@ SPCurve *LPERoughen::jitter(Geom::Curve const * A, Geom::Point &prev) } 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, A->finalPoint() + point_a3); + 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] + point_a1, (*cubic)[2] + point_a2, (*cubic)[3] + point_a3); + 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) + point_a1, A->pointAt(0.6666) + point_a2, + 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()); diff --git a/src/live_effects/lpe-roughen.h b/src/live_effects/lpe-roughen.h index e221e95fb..57a516310 100644 --- a/src/live_effects/lpe-roughen.h +++ b/src/live_effects/lpe-roughen.h @@ -52,6 +52,7 @@ private: RandomParam global_randomize; BoolParam shift_nodes; BoolParam shift_handles; + BoolParam retract_handles; BoolParam shift_handles_sym; BoolParam fixed_displacement; -- cgit v1.2.3