diff options
| author | Thomas Holder <thomas@thomas-holder.de> | 2018-09-12 14:43:47 +0000 |
|---|---|---|
| committer | Thomas Holder <thomas@thomas-holder.de> | 2018-09-12 14:43:47 +0000 |
| commit | 1fa0c72b664afa4803dffd463ed11ce01632ab76 (patch) | |
| tree | c1f746d4e8f7a5d65541cf6c05d3cdc79b3f9c10 /src/display/sodipodi-ctrlrect.cpp | |
| parent | Fix preferences crash (diff) | |
| download | inkscape-1fa0c72b664afa4803dffd463ed11ce01632ab76.tar.gz inkscape-1fa0c72b664afa4803dffd463ed11ce01632ab76.zip | |
New option to invert y-axis
Replaces all hard coded or implicit desktop coordinate usage with
doc2dt multiplication.
New global preference: Interface > Origin at upper left
https://bugs.launchpad.net/inkscape/+bug/170049
Diffstat (limited to 'src/display/sodipodi-ctrlrect.cpp')
| -rw-r--r-- | src/display/sodipodi-ctrlrect.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/src/display/sodipodi-ctrlrect.cpp b/src/display/sodipodi-ctrlrect.cpp index a35f07c3d..f097203fd 100644 --- a/src/display/sodipodi-ctrlrect.cpp +++ b/src/display/sodipodi-ctrlrect.cpp @@ -16,6 +16,7 @@ * */ +#include "inkscape.h" #include "sodipodi-ctrlrect.h" #include "sp-canvas-util.h" #include "display/cairo-utils.h" @@ -122,33 +123,41 @@ void CtrlRect::render(SPCanvasBuf *buf) // Draw shadow first. Shadow extends under rectangle to reduce aliasing effects. if (_shadow_width > 0 && !_dashed) { + Geom::Point const * corners = rect_transformed; + double shadowydir = _affine.det() > 0 ? -1 : 1; + + // is the desktop y-axis downwards? + if (SP_ACTIVE_DESKTOP && SP_ACTIVE_DESKTOP->is_yaxisdown()) { + ++corners; // need corners 1/2/3 instead of 0/1/2 + shadowydir *= -1; + } // Offset by half stroke width (_shadow_width is in window coordinates). // Need to handle change in handedness with flips. - Geom::Point shadow( _shadow_width/2.0, (_affine.det()>0?-1:1)*_shadow_width/2.0 ); + Geom::Point shadow( _shadow_width/2.0, shadowydir * _shadow_width/2.0 ); shadow *= Geom::Rotate( rotation ); if (axis_aligned) { // Snap to pixel grid (add 0.5 to center on pixel). cairo_move_to( buf->ct, - floor(rect_transformed[0][X]+shadow[X]+0.5) + 0.5, - floor(rect_transformed[0][Y]+shadow[Y]+0.5) + 0.5 ); + floor(corners[0][X] + shadow[X]+0.5) + 0.5, + floor(corners[0][Y] + shadow[Y]+0.5) + 0.5 ); cairo_line_to( buf->ct, - floor(rect_transformed[1][X]+shadow[X]+0.5) + 0.5, - floor(rect_transformed[1][Y]+shadow[Y]+0.5) + 0.5 ); + floor(corners[1][X] + shadow[X]+0.5) + 0.5, + floor(corners[1][Y] + shadow[Y]+0.5) + 0.5 ); cairo_line_to( buf->ct, - floor(rect_transformed[2][X]+shadow[X]+0.5) + 0.5, - floor(rect_transformed[2][Y]+shadow[Y]+0.5) + 0.5 ); + floor(corners[2][X] + shadow[X]+0.5) + 0.5, + floor(corners[2][Y] + shadow[Y]+0.5) + 0.5 ); } else { cairo_move_to( buf->ct, - rect_transformed[0][X]+shadow[X], - rect_transformed[0][Y]+shadow[Y] ); + corners[0][X] + shadow[X], + corners[0][Y] + shadow[Y] ); cairo_line_to( buf->ct, - rect_transformed[1][X]+shadow[X], - rect_transformed[1][Y]+shadow[Y] ); + corners[1][X] + shadow[X], + corners[1][Y] + shadow[Y] ); cairo_line_to( buf->ct, - rect_transformed[2][X]+shadow[X], - rect_transformed[2][Y]+shadow[Y] ); + corners[2][X] + shadow[X], + corners[2][Y] + shadow[Y] ); } ink_cairo_set_source_rgba32( buf->ct, _shadow_color ); |
