summaryrefslogtreecommitdiffstats
path: root/src/display
diff options
context:
space:
mode:
authorRick Yorgason <rick@firefang.com>2018-10-18 03:06:34 +0000
committerRick Yorgason <rick@firefang.com>2018-10-18 03:06:34 +0000
commit33131a183f9f34d798a741f317a91d87537684f6 (patch)
tree5753465248676eb17c48029e676e99ed69ad37e8 /src/display
parentCode cleanup and adding comments. (diff)
downloadinkscape-33131a183f9f34d798a741f317a91d87537684f6.tar.gz
inkscape-33131a183f9f34d798a741f317a91d87537684f6.zip
New "Outline thin strokes" view mode which draws thin strokes in outline mode so they're easier to see, while still drawing everything else normally. Very useful for making hairline strokes (0.001") for laser cutters.
Diffstat (limited to 'src/display')
-rw-r--r--src/display/drawing-context.h2
-rw-r--r--src/display/drawing-shape.cpp22
-rw-r--r--src/display/drawing-text.cpp10
-rw-r--r--src/display/drawing.cpp7
-rw-r--r--src/display/drawing.h1
-rw-r--r--src/display/rendermode.h3
6 files changed, 43 insertions, 2 deletions
diff --git a/src/display/drawing-context.h b/src/display/drawing-context.h
index 8587fbf66..12d192a7c 100644
--- a/src/display/drawing-context.h
+++ b/src/display/drawing-context.h
@@ -52,6 +52,8 @@ public:
void translate(double dx, double dy) { cairo_translate(_ct, dx, dy); }
void scale(Geom::Scale const &s) { cairo_scale(_ct, s[Geom::X], s[Geom::Y]); }
void scale(double sx, double sy) { cairo_scale(_ct, sx, sy); }
+ void device_to_user_distance(double &dx, double &dy) { cairo_device_to_user_distance(_ct, &dx, &dy); }
+ void user_to_device_distance(double &dx, double &dy) { cairo_user_to_device_distance(_ct, &dx, &dy); }
void moveTo(Geom::Point const &p) { cairo_move_to(_ct, p[Geom::X], p[Geom::Y]); }
void lineTo(Geom::Point const &p) { cairo_line_to(_ct, p[Geom::X], p[Geom::Y]); }
diff --git a/src/display/drawing-shape.cpp b/src/display/drawing-shape.cpp
index 63db9475d..c2208d161 100644
--- a/src/display/drawing-shape.cpp
+++ b/src/display/drawing-shape.cpp
@@ -185,6 +185,17 @@ DrawingShape::_renderStroke(DrawingContext &dc)
dc.save();
}
_nrstyle.applyStroke(dc);
+
+ // Special handling for thin outline mode when we're drawing lines smaller than half a
+ // pixel
+ if (_drawing.outlineThin()) {
+ double outline_thin_size = 0.5, trash = 0.5;
+ dc.device_to_user_distance(outline_thin_size, trash);
+ if (_nrstyle.stroke_width < outline_thin_size) {
+ dc.setLineWidth(outline_thin_size);
+ }
+ }
+
dc.strokePreserve();
dc.newPath(); // clear path
}
@@ -255,6 +266,17 @@ DrawingShape::_renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigne
}
if (has_stroke) {
_nrstyle.applyStroke(dc);
+
+ // Special handling for thin outline mode when we're drawing lines smaller than
+ // half a pixel
+ if (_drawing.outlineThin()) {
+ double outline_thin_size = 0.5, trash = 0.5;
+ dc.device_to_user_distance(outline_thin_size, trash);
+ if (_nrstyle.stroke_width < outline_thin_size) {
+ dc.setLineWidth(outline_thin_size);
+ }
+ }
+
dc.strokePreserve();
}
dc.newPath(); // clear path
diff --git a/src/display/drawing-text.cpp b/src/display/drawing-text.cpp
index 76c392d67..b48ce7d31 100644
--- a/src/display/drawing-text.cpp
+++ b/src/display/drawing-text.cpp
@@ -603,6 +603,16 @@ unsigned DrawingText::_renderItem(DrawingContext &dc, Geom::IntRect const &/*are
}
if (has_stroke) {
_nrstyle.applyStroke(dc);
+
+ // Special handling for thin outline mode when we're drawing lines smaller than half a pixel
+ if (_drawing.outlineThin()) {
+ double outline_thin_size = 0.5, trash = 0.5;
+ dc.device_to_user_distance(outline_thin_size, trash);
+ if (_nrstyle.stroke_width < outline_thin_size) {
+ dc.setLineWidth(outline_thin_size);
+ }
+ }
+
dc.strokePreserve();
}
}
diff --git a/src/display/drawing.cpp b/src/display/drawing.cpp
index 18c2d98e8..7ecaea987 100644
--- a/src/display/drawing.cpp
+++ b/src/display/drawing.cpp
@@ -79,9 +79,14 @@ Drawing::outline() const
return renderMode() == RENDERMODE_OUTLINE;
}
bool
+Drawing::outlineThin() const
+{
+ return renderMode() == RENDERMODE_OUTLINE_THIN;
+}
+bool
Drawing::renderFilters() const
{
- return renderMode() == RENDERMODE_NORMAL;
+ return renderMode() == RENDERMODE_NORMAL || renderMode() == RENDERMODE_OUTLINE_THIN;
}
int
Drawing::blurQuality() const
diff --git a/src/display/drawing.h b/src/display/drawing.h
index 1348f02af..1669cc3a4 100644
--- a/src/display/drawing.h
+++ b/src/display/drawing.h
@@ -50,6 +50,7 @@ public:
RenderMode renderMode() const;
ColorMode colorMode() const;
bool outline() const;
+ bool outlineThin() const;
bool renderFilters() const;
int blurQuality() const;
int filterQuality() const;
diff --git a/src/display/rendermode.h b/src/display/rendermode.h
index cbd35de73..36dd0ead3 100644
--- a/src/display/rendermode.h
+++ b/src/display/rendermode.h
@@ -12,7 +12,8 @@ namespace Inkscape {
enum RenderMode {
RENDERMODE_NORMAL,
RENDERMODE_NO_FILTERS,
- RENDERMODE_OUTLINE
+ RENDERMODE_OUTLINE,
+ RENDERMODE_OUTLINE_THIN
};
enum ColorMode {