summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLiam P. White <inkscapebronyat-signgmaildotcom>2014-04-12 22:58:48 +0000
committerLiam P. White <inkscapebronyat-signgmaildotcom>2014-04-12 22:58:48 +0000
commit3a4844ef32ce02cbcb9f1102f61d60914bb48d72 (patch)
tree2b5a2fb7dddbd6c8f88089b0047fb500d75a20eb /src
parentFix memory leak (diff)
downloadinkscape-3a4844ef32ce02cbcb9f1102f61d60914bb48d72.tar.gz
inkscape-3a4844ef32ce02cbcb9f1102f61d60914bb48d72.zip
Enable line caps
(bzr r13090.1.54)
Diffstat (limited to 'src')
-rw-r--r--src/live_effects/pathoutlineprovider.cpp30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/live_effects/pathoutlineprovider.cpp b/src/live_effects/pathoutlineprovider.cpp
index 080f42c08..d7f5362aa 100644
--- a/src/live_effects/pathoutlineprovider.cpp
+++ b/src/live_effects/pathoutlineprovider.cpp
@@ -528,14 +528,23 @@ Geom::PathVector outlinePath(const Geom::PathVector& path_in, double line_width,
case butt_round:
pb.arcTo((-line_width) / 2, (-line_width) / 2, 0., true, true, against_direction.initialPoint() );
break;
- case butt_pointy:
- //I have ZERO idea what to do here.
+ case butt_pointy: {
+ Geom::Point end_deriv = -Geom::unitTangentAt(Geom::reverse(path_in[i].back().toSBasis()), 0.);
+ double radius = 0.5 * Geom::distance(with_direction.finalPoint(), against_direction.initialPoint());
+ Geom::Point midpoint = 0.5 * (with_direction.finalPoint() + against_direction.initialPoint()) + radius*end_deriv;
+ pb.lineTo(midpoint);
pb.lineTo(against_direction.initialPoint());
break;
- case butt_square:
+ }
+ case butt_square: {
+ Geom::Point end_deriv = -Geom::unitTangentAt(Geom::reverse(path_in[i].back().toSBasis()), 0.);
+ double radius = 0.5 * Geom::distance(with_direction.finalPoint(), against_direction.initialPoint());
+ pb.lineTo(with_direction.finalPoint() + radius*end_deriv);
+ pb.lineTo(against_direction.initialPoint() + radius*end_deriv);
pb.lineTo(against_direction.initialPoint());
break;
}
+ }
} else {
pb.moveTo(against_direction.initialPoint());
}
@@ -551,14 +560,23 @@ Geom::PathVector outlinePath(const Geom::PathVector& path_in, double line_width,
case butt_round:
pb.arcTo((-line_width) / 2, (-line_width) / 2, 0., true, true, with_direction.initialPoint() );
break;
- case butt_pointy:
- //I have ZERO idea what to do here.
+ case butt_pointy: {
+ Geom::Point end_deriv = -Geom::unitTangentAt(path_in[i].front().toSBasis(), 0.);
+ double radius = 0.5 * Geom::distance(against_direction.finalPoint(), with_direction.initialPoint());
+ Geom::Point midpoint = 0.5 * (against_direction.finalPoint() + with_direction.initialPoint()) + radius*end_deriv;
+ pb.lineTo(midpoint);
pb.lineTo(with_direction.initialPoint());
break;
- case butt_square:
+ }
+ case butt_square: {
+ Geom::Point end_deriv = -Geom::unitTangentAt(path_in[i].front().toSBasis(), 0.);
+ double radius = 0.5 * Geom::distance(against_direction.finalPoint(), with_direction.initialPoint());
+ pb.lineTo(against_direction.finalPoint() + radius*end_deriv);
+ pb.lineTo(with_direction.initialPoint() + radius*end_deriv);
pb.lineTo(with_direction.initialPoint());
break;
}
+ }
}
pb.flush();
for (unsigned m = 0; i < pb.peek().size(); i++) {