diff options
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 && |
