diff options
author | Rafael Lima <rafael.palma.lima@gmail.com> | 2024-06-11 01:04:30 +0200 |
---|---|---|
committer | Adolfo Jayme Barrientos <fitojb@ubuntu.com> | 2024-06-12 01:07:15 +0200 |
commit | 3c0db898092c2cf6148c01f6c561acc199d484f5 (patch) | |
tree | 93a748e890725df25fd3748b7d175cf34607fa7b /svx | |
parent | c90b99d74ee9e7438ffe3ceb36638b864d7deacf (diff) |
tdf#161204 Fix selection outline with overlapping ranges
The previous commit [1] caused a regression in the outline when two or more ranges overlapped in the selection. This patch fixes the issue.
[1] dc243f0122ba656d2630e93bebfb84a2bfe4042a
Change-Id: Ib5ec72504ba0efaae715c47628c3d5a47557f506
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168625
Tested-by: Jenkins
Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/sdr/overlay/overlayselection.cxx | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/svx/source/sdr/overlay/overlayselection.cxx b/svx/source/sdr/overlay/overlayselection.cxx index 232d6dcc487b..700aa1915c75 100644 --- a/svx/source/sdr/overlay/overlayselection.cxx +++ b/svx/source/sdr/overlay/overlayselection.cxx @@ -40,12 +40,19 @@ namespace sdr::overlay // combine ranges geometrically to a single, ORed polygon static basegfx::B2DPolyPolygon impCombineRangesToPolyPolygon(const std::vector< basegfx::B2DRange >& rRanges) { + // Determines the offset in twips + Size aSize(1, 1); + aSize = o3tl::convert(aSize, o3tl::Length::px, o3tl::Length::twip); + const sal_Int32 nOffset = aSize.getWidth(); + const sal_uInt32 nCount(rRanges.size()); basegfx::B2DPolyPolygon aRetval; for(sal_uInt32 a(0); a < nCount; a++) { - const basegfx::B2DPolygon aDiscretePolygon(basegfx::utils::createPolygonFromRect(rRanges[a])); + basegfx::B2DRange aRange(rRanges[a]); + aRange.grow(nOffset); + const basegfx::B2DPolygon aDiscretePolygon(basegfx::utils::createPolygonFromRect(aRange)); if(0 == a) { @@ -60,23 +67,15 @@ namespace sdr::overlay return aRetval; } - // Creates an ORed polygon with all the ranges shrinked by 1px - // This is used to draw the internal white line in the selection - static basegfx::B2DPolyPolygon impCombineRangesToInternalPolyPolygon(const std::vector< basegfx::B2DRange >& rRanges) + // tdf#161204 Creates a poly-polygon using white hairline to provide contrast + static basegfx::B2DPolyPolygon impCombineRangesToContrastPolyPolygon(const std::vector< basegfx::B2DRange >& rRanges) { - // Determines the offset in twips - Size aSize(1, 1); - aSize = o3tl::convert(aSize, o3tl::Length::px, o3tl::Length::twip); - const sal_Int32 nShrink = aSize.getWidth(); - const sal_uInt32 nCount(rRanges.size()); basegfx::B2DPolyPolygon aRetval; for(sal_uInt32 a(0); a < nCount; a++) { - basegfx::B2DRange aRange(rRanges[a]); - aRange.grow(-nShrink); - const basegfx::B2DPolygon aDiscretePolygon(basegfx::utils::createPolygonFromRect(aRange)); + const basegfx::B2DPolygon aDiscretePolygon(basegfx::utils::createPolygonFromRect(rRanges[a])); if(0 == a) { @@ -175,16 +174,16 @@ namespace sdr::overlay std::move(aPolyPolygon), aRGBColor)); - // Internal outline with white color to provide contrast - basegfx::B2DPolyPolygon aInternalPolyPolygon(impCombineRangesToInternalPolyPolygon(getRanges())); - const drawinglayer::primitive2d::Primitive2DReference aInternalSelectionOutline( + // tdf#161204 Outline with white color to provide contrast + basegfx::B2DPolyPolygon aContrastPolyPolygon(impCombineRangesToContrastPolyPolygon(getRanges())); + const drawinglayer::primitive2d::Primitive2DReference aContrastSelectionOutline( new drawinglayer::primitive2d::PolyPolygonHairlinePrimitive2D( - std::move(aInternalPolyPolygon), + std::move(aContrastPolyPolygon), basegfx::BColor(1.0, 1.0, 1.0))); // add both to result aRetval = drawinglayer::primitive2d::Primitive2DContainer { aUnifiedTransparence, aSelectionOutline }; - aRetval.append(drawinglayer::primitive2d::Primitive2DContainer{aUnifiedTransparence, aInternalSelectionOutline}); + aRetval.append(drawinglayer::primitive2d::Primitive2DContainer{aUnifiedTransparence, aContrastSelectionOutline}); } else { |