diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2021-04-27 11:44:48 +0200 |
---|---|---|
committer | Adolfo Jayme Barrientos <fitojb@ubuntu.com> | 2021-05-06 04:06:22 +0200 |
commit | 57595773df9f89245457443a3def786fa0e70a69 (patch) | |
tree | 2a8ec29cbd73bb9c954f0201241b5cf12b977ecb /vcl/source/gdi/lineinfo.cxx | |
parent | 1dd4bfc1fc4b9ba178fb8ee3b24b85aa3ef0c115 (diff) |
do not apply line dashing in drawinglayer (tdf#136957)
basegfx::utils::applyLineDashing() is not as good as the actual
VCL backend dashing, and there are some rounding errors because of
all the canvas transformation matrices or whatever, which leads
to the drawing problem. So use LineInfo to carry the dashing
information.
As a part of this change, also make LineInfo use doubles instead
of ints. The use of transformation matrices means that the values
may be fractional and less than one.
Change-Id: Ia5ac7d266cab344b7137052c81fbd96c1ce28003
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114710
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
(cherry picked from commit b71d9a6d15cfb8a50afdea5ac064f40d84c561f8)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115038
Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
Diffstat (limited to 'vcl/source/gdi/lineinfo.cxx')
-rw-r--r-- | vcl/source/gdi/lineinfo.cxx | 55 |
1 files changed, 33 insertions, 22 deletions
diff --git a/vcl/source/gdi/lineinfo.cxx b/vcl/source/gdi/lineinfo.cxx index 9490a0383133..b6619406737b 100644 --- a/vcl/source/gdi/lineinfo.cxx +++ b/vcl/source/gdi/lineinfo.cxx @@ -53,7 +53,7 @@ inline bool ImplLineInfo::operator==( const ImplLineInfo& rB ) const } -LineInfo::LineInfo( LineStyle eStyle, sal_Int32 nWidth ) : mpImplLineInfo() +LineInfo::LineInfo( LineStyle eStyle, double nWidth ) : mpImplLineInfo() { mpImplLineInfo->meStyle = eStyle; mpImplLineInfo->mnWidth = nWidth; @@ -79,7 +79,7 @@ void LineInfo::SetStyle( LineStyle eStyle ) mpImplLineInfo->meStyle = eStyle; } -void LineInfo::SetWidth( sal_Int32 nWidth ) +void LineInfo::SetWidth( double nWidth ) { mpImplLineInfo->mnWidth = nWidth; } @@ -89,7 +89,7 @@ void LineInfo::SetDashCount( sal_uInt16 nDashCount ) mpImplLineInfo->mnDashCount = nDashCount; } -void LineInfo::SetDashLen( sal_Int32 nDashLen ) +void LineInfo::SetDashLen( double nDashLen ) { mpImplLineInfo->mnDashLen = nDashLen; } @@ -99,31 +99,24 @@ void LineInfo::SetDotCount( sal_uInt16 nDotCount ) mpImplLineInfo->mnDotCount = nDotCount; } -void LineInfo::SetDotLen( sal_Int32 nDotLen ) +void LineInfo::SetDotLen( double nDotLen ) { mpImplLineInfo->mnDotLen = nDotLen; } -void LineInfo::SetDistance( sal_Int32 nDistance ) +void LineInfo::SetDistance( double nDistance ) { mpImplLineInfo->mnDistance = nDistance; } void LineInfo::SetLineJoin(basegfx::B2DLineJoin eLineJoin) { - - if(eLineJoin != mpImplLineInfo->meLineJoin) - { - mpImplLineInfo->meLineJoin = eLineJoin; - } + mpImplLineInfo->meLineJoin = eLineJoin; } void LineInfo::SetLineCap(css::drawing::LineCap eLineCap) { - if(eLineCap != mpImplLineInfo->meLineCap) - { - mpImplLineInfo->meLineCap = eLineCap; - } + mpImplLineInfo->meLineCap = eLineCap; } bool LineInfo::IsDefault() const @@ -139,7 +132,8 @@ SvStream& ReadLineInfo( SvStream& rIStm, LineInfo& rLineInfo ) sal_uInt16 nTmp16(0); sal_Int32 nTmp32(0); - rIStm.ReadUInt16( nTmp16 ); rLineInfo.mpImplLineInfo->meStyle = static_cast<LineStyle>(nTmp16); + rIStm.ReadUInt16( nTmp16 ); + rLineInfo.mpImplLineInfo->meStyle = static_cast<LineStyle>(nTmp16); rIStm.ReadInt32( nTmp32 ); rLineInfo.mpImplLineInfo->mnWidth = nTmp32; @@ -157,13 +151,24 @@ SvStream& ReadLineInfo( SvStream& rIStm, LineInfo& rLineInfo ) if( aCompat.GetVersion() >= 3 ) { // version 3 - rIStm.ReadUInt16( nTmp16 ); rLineInfo.mpImplLineInfo->meLineJoin = static_cast<basegfx::B2DLineJoin>(nTmp16); + rIStm.ReadUInt16( nTmp16 ); + rLineInfo.mpImplLineInfo->meLineJoin = static_cast<basegfx::B2DLineJoin>(nTmp16); } if( aCompat.GetVersion() >= 4 ) { // version 4 - rIStm.ReadUInt16( nTmp16 ); rLineInfo.mpImplLineInfo->meLineCap = static_cast<css::drawing::LineCap>(nTmp16); + rIStm.ReadUInt16( nTmp16 ); + rLineInfo.mpImplLineInfo->meLineCap = static_cast<css::drawing::LineCap>(nTmp16); + } + + if( aCompat.GetVersion() >= 5 ) + { + // version 5 + rIStm.ReadDouble( rLineInfo.mpImplLineInfo->mnWidth ); + rIStm.ReadDouble( rLineInfo.mpImplLineInfo->mnDashLen ); + rIStm.ReadDouble( rLineInfo.mpImplLineInfo->mnDotLen ); + rIStm.ReadDouble( rLineInfo.mpImplLineInfo->mnDistance ); } return rIStm; @@ -171,18 +176,18 @@ SvStream& ReadLineInfo( SvStream& rIStm, LineInfo& rLineInfo ) SvStream& WriteLineInfo( SvStream& rOStm, const LineInfo& rLineInfo ) { - VersionCompat aCompat( rOStm, StreamMode::WRITE, 4 ); + VersionCompat aCompat( rOStm, StreamMode::WRITE, 5 ); // version 1 rOStm.WriteUInt16( static_cast<sal_uInt16>(rLineInfo.mpImplLineInfo->meStyle) ) - .WriteInt32( rLineInfo.mpImplLineInfo->mnWidth ); + .WriteInt32( basegfx::fround( rLineInfo.mpImplLineInfo->mnWidth )); // since version2 rOStm.WriteUInt16( rLineInfo.mpImplLineInfo->mnDashCount ) - .WriteInt32( rLineInfo.mpImplLineInfo->mnDashLen ); + .WriteInt32( basegfx::fround( rLineInfo.mpImplLineInfo->mnDashLen )); rOStm.WriteUInt16( rLineInfo.mpImplLineInfo->mnDotCount ) - .WriteInt32( rLineInfo.mpImplLineInfo->mnDotLen ); - rOStm.WriteInt32( rLineInfo.mpImplLineInfo->mnDistance ); + .WriteInt32( basegfx::fround( rLineInfo.mpImplLineInfo->mnDotLen )); + rOStm.WriteInt32( basegfx::fround( rLineInfo.mpImplLineInfo->mnDistance )); // since version3 rOStm.WriteUInt16( static_cast<sal_uInt16>(rLineInfo.mpImplLineInfo->meLineJoin) ); @@ -190,6 +195,12 @@ SvStream& WriteLineInfo( SvStream& rOStm, const LineInfo& rLineInfo ) // since version4 rOStm.WriteUInt16( static_cast<sal_uInt16>(rLineInfo.mpImplLineInfo->meLineCap) ); + // since version5 + rOStm.WriteDouble( rLineInfo.mpImplLineInfo->mnWidth ); + rOStm.WriteDouble( rLineInfo.mpImplLineInfo->mnDashLen ); + rOStm.WriteDouble( rLineInfo.mpImplLineInfo->mnDotLen ); + rOStm.WriteDouble( rLineInfo.mpImplLineInfo->mnDistance ); + return rOStm; } |