summaryrefslogtreecommitdiffstats
path: root/src
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
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')
-rw-r--r--src/desktop.cpp3
-rw-r--r--src/desktop.h3
-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
-rw-r--r--src/ui/interface.cpp2
-rw-r--r--src/verbs.cpp5
-rw-r--r--src/verbs.h1
-rw-r--r--src/widgets/desktop-widget.cpp2
12 files changed, 59 insertions, 2 deletions
diff --git a/src/desktop.cpp b/src/desktop.cpp
index 46589ca04..c1891301c 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -519,6 +519,9 @@ void SPDesktop::displayModeToggle() {
_setDisplayMode(Inkscape::RENDERMODE_OUTLINE);
break;
case Inkscape::RENDERMODE_OUTLINE:
+ _setDisplayMode(Inkscape::RENDERMODE_OUTLINE_THIN);
+ break;
+ case Inkscape::RENDERMODE_OUTLINE_THIN:
_setDisplayMode(Inkscape::RENDERMODE_NORMAL);
break;
default:
diff --git a/src/desktop.h b/src/desktop.h
index 379d36a78..a38876de1 100644
--- a/src/desktop.h
+++ b/src/desktop.h
@@ -266,6 +266,9 @@ public:
void setDisplayModeOutline() {
_setDisplayMode(Inkscape::RENDERMODE_OUTLINE);
}
+ void setDisplayModeOutlineThin() {
+ _setDisplayMode(Inkscape::RENDERMODE_OUTLINE_THIN);
+ }
void displayModeToggle();
Inkscape::RenderMode _display_mode;
Inkscape::RenderMode getMode() const { return _display_mode; }
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 {
diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp
index 41f5f29a0..1f04f3a49 100644
--- a/src/ui/interface.cpp
+++ b/src/ui/interface.cpp
@@ -682,6 +682,8 @@ static gboolean update_view_menu(GtkWidget *widget, cairo_t * /*cr*/, gpointer u
new_state = mode == Inkscape::RENDERMODE_NO_FILTERS;
} else if (!strcmp(action->id, "ViewModeOutline")) {
new_state = mode == Inkscape::RENDERMODE_OUTLINE;
+ } else if (!strcmp(action->id, "ViewModeOutlineThin")) {
+ new_state = mode == Inkscape::RENDERMODE_OUTLINE_THIN;
} else if (!strcmp(action->id, "ViewColorModeNormal")) {
new_state = colormode == Inkscape::COLORMODE_NORMAL;
} else if (!strcmp(action->id, "ViewColorModeGrayscale")) {
diff --git a/src/verbs.cpp b/src/verbs.cpp
index 47c532a3f..2c7cfb25f 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -2132,6 +2132,9 @@ void ZoomVerb::perform(SPAction *action, void *data)
case SP_VERB_VIEW_MODE_OUTLINE:
dt->setDisplayModeOutline();
break;
+ case SP_VERB_VIEW_MODE_OUTLINE_THIN:
+ dt->setDisplayModeOutlineThin();
+ break;
case SP_VERB_VIEW_MODE_TOGGLE:
dt->displayModeToggle();
break;
@@ -3108,6 +3111,8 @@ Verb *Verb::_base_verbs[] = {
N_("Switch to normal display without filters"), nullptr),
new ZoomVerb(SP_VERB_VIEW_MODE_OUTLINE, "ViewModeOutline", N_("_Outline"),
N_("Switch to outline (wireframe) display mode"), nullptr),
+ new ZoomVerb(SP_VERB_VIEW_MODE_OUTLINE_THIN, "ViewModeOutlineThin", N_("O_utline thin strokes"),
+ N_("Outline strokes that are smaller than 1 pixel and draw the rest normally"), nullptr),
new ZoomVerb(SP_VERB_VIEW_MODE_TOGGLE, "ViewModeToggle", N_("_Toggle"),
N_("Toggle between normal and outline display modes"), nullptr),
new ZoomVerb(SP_VERB_VIEW_COLOR_MODE_NORMAL, "ViewColorModeNormal", N_("_Normal"),
diff --git a/src/verbs.h b/src/verbs.h
index fe17cb2d1..b9402ed10 100644
--- a/src/verbs.h
+++ b/src/verbs.h
@@ -297,6 +297,7 @@ enum {
SP_VERB_VIEW_MODE_NORMAL,
SP_VERB_VIEW_MODE_NO_FILTERS,
SP_VERB_VIEW_MODE_OUTLINE,
+ SP_VERB_VIEW_MODE_OUTLINE_THIN,
SP_VERB_VIEW_MODE_TOGGLE,
SP_VERB_VIEW_COLOR_MODE_NORMAL,
SP_VERB_VIEW_COLOR_MODE_GRAYSCALE,
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index 35a9df65b..65b427208 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -813,6 +813,8 @@ SPDesktopWidget::updateTitle(gchar const* uri)
Name += N_("outline");
} else if (desktop->getMode() == Inkscape::RENDERMODE_NO_FILTERS) {
Name += N_("no filters");
+ } else if (desktop->getMode() == Inkscape::RENDERMODE_OUTLINE_THIN) {
+ Name += N_("outline thin");
}
if (desktop->getColorMode() != Inkscape::COLORMODE_NORMAL &&