diff options
| author | Rick Yorgason <rick@firefang.com> | 2018-10-18 03:06:34 +0000 |
|---|---|---|
| committer | Rick Yorgason <rick@firefang.com> | 2018-10-18 03:06:34 +0000 |
| commit | 33131a183f9f34d798a741f317a91d87537684f6 (patch) | |
| tree | 5753465248676eb17c48029e676e99ed69ad37e8 /src | |
| parent | Code cleanup and adding comments. (diff) | |
| download | inkscape-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.cpp | 3 | ||||
| -rw-r--r-- | src/desktop.h | 3 | ||||
| -rw-r--r-- | src/display/drawing-context.h | 2 | ||||
| -rw-r--r-- | src/display/drawing-shape.cpp | 22 | ||||
| -rw-r--r-- | src/display/drawing-text.cpp | 10 | ||||
| -rw-r--r-- | src/display/drawing.cpp | 7 | ||||
| -rw-r--r-- | src/display/drawing.h | 1 | ||||
| -rw-r--r-- | src/display/rendermode.h | 3 | ||||
| -rw-r--r-- | src/ui/interface.cpp | 2 | ||||
| -rw-r--r-- | src/verbs.cpp | 5 | ||||
| -rw-r--r-- | src/verbs.h | 1 | ||||
| -rw-r--r-- | src/widgets/desktop-widget.cpp | 2 |
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 && |
