diff options
author | Noel Grandin <noel@peralex.com> | 2021-01-06 10:10:39 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2021-01-06 11:38:01 +0100 |
commit | 2298b055cab8cf8d0268ee1375a5c6e416bf1332 (patch) | |
tree | 1fe4b266d730e13591506434ccbbeefe9cd053ff | |
parent | 9b36cae4ca95ab9508752f2a13a45d09c3dbd87f (diff) |
move the bigint based Scale() implementations to one central place
Picking the best looking one in the process.
Change-Id: I77f9236fcd21f883a23fe2f43f20336f17b44cc6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108831
Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | editeng/source/items/borderline.cxx | 11 | ||||
-rw-r--r-- | editeng/source/items/frmitems.cxx | 29 | ||||
-rw-r--r-- | editeng/source/items/textitem.cxx | 5 | ||||
-rw-r--r-- | include/editeng/itemtype.hxx | 12 | ||||
-rw-r--r-- | include/tools/bigint.hxx | 3 | ||||
-rw-r--r-- | svx/source/svdraw/svdattr.cxx | 6 | ||||
-rw-r--r-- | svx/source/svdraw/svdtrans.cxx | 16 | ||||
-rw-r--r-- | svx/source/xoutdev/xattr.cxx | 24 | ||||
-rw-r--r-- | tools/source/generic/bigint.cxx | 16 |
9 files changed, 52 insertions, 70 deletions
diff --git a/editeng/source/items/borderline.cxx b/editeng/source/items/borderline.cxx index 6a33b4bbcfc5..08261ed7165f 100644 --- a/editeng/source/items/borderline.cxx +++ b/editeng/source/items/borderline.cxx @@ -28,6 +28,7 @@ #include <editeng/itemtype.hxx> #include <editeng/editrids.hrc> #include <editeng/eerdll.hxx> +#include <tools/bigint.hxx> using namespace ::com::sun::star::table::BorderLineStyle; @@ -496,23 +497,23 @@ void SvxBorderLine::GuessLinesWidths( SvxBorderLineStyle nStyle, sal_uInt16 nOut sal_uInt16 SvxBorderLine::GetOutWidth() const { - sal_uInt16 nOut = static_cast<sal_uInt16>(Scale( m_aWidthImpl.GetLine1( m_nWidth ), m_nMult, m_nDiv )); + sal_uInt16 nOut = static_cast<sal_uInt16>(BigInt::Scale( m_aWidthImpl.GetLine1( m_nWidth ), m_nMult, m_nDiv )); if ( m_bMirrorWidths ) - nOut = static_cast<sal_uInt16>(Scale( m_aWidthImpl.GetLine2( m_nWidth ), m_nMult, m_nDiv )); + nOut = static_cast<sal_uInt16>(BigInt::Scale( m_aWidthImpl.GetLine2( m_nWidth ), m_nMult, m_nDiv )); return nOut; } sal_uInt16 SvxBorderLine::GetInWidth() const { - sal_uInt16 nIn = static_cast<sal_uInt16>(Scale( m_aWidthImpl.GetLine2( m_nWidth ), m_nMult, m_nDiv )); + sal_uInt16 nIn = static_cast<sal_uInt16>(BigInt::Scale( m_aWidthImpl.GetLine2( m_nWidth ), m_nMult, m_nDiv )); if ( m_bMirrorWidths ) - nIn = static_cast<sal_uInt16>(Scale( m_aWidthImpl.GetLine1( m_nWidth ), m_nMult, m_nDiv )); + nIn = static_cast<sal_uInt16>(BigInt::Scale( m_aWidthImpl.GetLine1( m_nWidth ), m_nMult, m_nDiv )); return nIn; } sal_uInt16 SvxBorderLine::GetDistance() const { - return static_cast<sal_uInt16>(Scale( m_aWidthImpl.GetGap( m_nWidth ), m_nMult, m_nDiv )); + return static_cast<sal_uInt16>(BigInt::Scale( m_aWidthImpl.GetGap( m_nWidth ), m_nMult, m_nDiv )); } diff --git a/editeng/source/items/frmitems.cxx b/editeng/source/items/frmitems.cxx index 4f365da2b7de..43a9be8e4635 100644 --- a/editeng/source/items/frmitems.cxx +++ b/editeng/source/items/frmitems.cxx @@ -40,6 +40,7 @@ #include <comphelper/processfactory.hxx> #include <vcl/GraphicObject.hxx> #include <tools/urlobj.hxx> +#include <tools/bigint.hxx> #include <svl/memberid.h> #include <rtl/math.hxx> #include <rtl/ustring.hxx> @@ -270,8 +271,8 @@ bool SvxSizeItem::GetPresentation void SvxSizeItem::ScaleMetrics( tools::Long nMult, tools::Long nDiv ) { - m_aSize.setWidth( Scale( m_aSize.Width(), nMult, nDiv ) ); - m_aSize.setHeight( Scale( m_aSize.Height(), nMult, nDiv ) ); + m_aSize.setWidth( BigInt::Scale( m_aSize.Width(), nMult, nDiv ) ); + m_aSize.setHeight( BigInt::Scale( m_aSize.Height(), nMult, nDiv ) ); } @@ -572,10 +573,10 @@ bool SvxLRSpaceItem::GetPresentation void SvxLRSpaceItem::ScaleMetrics( tools::Long nMult, tools::Long nDiv ) { - nFirstLineOffset = static_cast<short>(Scale( nFirstLineOffset, nMult, nDiv )); - nTxtLeft = Scale( nTxtLeft, nMult, nDiv ); - nLeftMargin = Scale( nLeftMargin, nMult, nDiv ); - nRightMargin = Scale( nRightMargin, nMult, nDiv ); + nFirstLineOffset = static_cast<short>(BigInt::Scale( nFirstLineOffset, nMult, nDiv )); + nTxtLeft = BigInt::Scale( nTxtLeft, nMult, nDiv ); + nLeftMargin = BigInt::Scale( nLeftMargin, nMult, nDiv ); + nRightMargin = BigInt::Scale( nRightMargin, nMult, nDiv ); } @@ -824,8 +825,8 @@ bool SvxULSpaceItem::GetPresentation void SvxULSpaceItem::ScaleMetrics( tools::Long nMult, tools::Long nDiv ) { - nUpper = static_cast<sal_uInt16>(Scale( nUpper, nMult, nDiv )); - nLower = static_cast<sal_uInt16>(Scale( nLower, nMult, nDiv )); + nUpper = static_cast<sal_uInt16>(BigInt::Scale( nUpper, nMult, nDiv )); + nLower = static_cast<sal_uInt16>(BigInt::Scale( nLower, nMult, nDiv )); } @@ -1222,7 +1223,7 @@ bool SvxShadowItem::GetPresentation void SvxShadowItem::ScaleMetrics( tools::Long nMult, tools::Long nDiv ) { - nWidth = static_cast<sal_uInt16>(Scale( nWidth, nMult, nDiv )); + nWidth = static_cast<sal_uInt16>(BigInt::Scale( nWidth, nMult, nDiv )); } @@ -1862,10 +1863,10 @@ void SvxBoxItem::ScaleMetrics( tools::Long nMult, tools::Long nDiv ) if ( pBottom ) pBottom->ScaleMetrics( nMult, nDiv ); if ( pLeft ) pLeft->ScaleMetrics( nMult, nDiv ); if ( pRight ) pRight->ScaleMetrics( nMult, nDiv ); - nTopDist = static_cast<sal_uInt16>(Scale( nTopDist, nMult, nDiv )); - nBottomDist = static_cast<sal_uInt16>(Scale( nBottomDist, nMult, nDiv )); - nLeftDist = static_cast<sal_uInt16>(Scale( nLeftDist, nMult, nDiv )); - nRightDist = static_cast<sal_uInt16>(Scale( nRightDist, nMult, nDiv )); + nTopDist = static_cast<sal_uInt16>(BigInt::Scale( nTopDist, nMult, nDiv )); + nBottomDist = static_cast<sal_uInt16>(BigInt::Scale( nBottomDist, nMult, nDiv )); + nLeftDist = static_cast<sal_uInt16>(BigInt::Scale( nLeftDist, nMult, nDiv )); + nRightDist = static_cast<sal_uInt16>(BigInt::Scale( nRightDist, nMult, nDiv )); } @@ -2162,7 +2163,7 @@ void SvxBoxInfoItem::ScaleMetrics( tools::Long nMult, tools::Long nDiv ) { if ( pHori ) pHori->ScaleMetrics( nMult, nDiv ); if ( pVert ) pVert->ScaleMetrics( nMult, nDiv ); - nDefDist = static_cast<sal_uInt16>(Scale( nDefDist, nMult, nDiv )); + nDefDist = static_cast<sal_uInt16>(BigInt::Scale( nDefDist, nMult, nDiv )); } diff --git a/editeng/source/items/textitem.cxx b/editeng/source/items/textitem.cxx index 84cc8e743dec..dd2205b670ab 100644 --- a/editeng/source/items/textitem.cxx +++ b/editeng/source/items/textitem.cxx @@ -33,6 +33,7 @@ #include <editeng/editids.hrc> #include <editeng/editrids.hrc> +#include <tools/bigint.hxx> #include <tools/mapunit.hxx> #include <tools/UnitConversion.hxx> @@ -835,7 +836,7 @@ bool SvxFontHeightItem::GetPresentation void SvxFontHeightItem::ScaleMetrics( tools::Long nMult, tools::Long nDiv ) { - nHeight = static_cast<sal_uInt32>(Scale( nHeight, nMult, nDiv )); + nHeight = static_cast<sal_uInt32>(BigInt::Scale( nHeight, nMult, nDiv )); } @@ -1496,7 +1497,7 @@ SvxKerningItem* SvxKerningItem::Clone( SfxItemPool * ) const void SvxKerningItem::ScaleMetrics( tools::Long nMult, tools::Long nDiv ) { - SetValue( static_cast<sal_Int16>(Scale( GetValue(), nMult, nDiv )) ); + SetValue( static_cast<sal_Int16>(BigInt::Scale( GetValue(), nMult, nDiv )) ); } diff --git a/include/editeng/itemtype.hxx b/include/editeng/itemtype.hxx index 470bd99f16f2..4338d1ff9142 100644 --- a/include/editeng/itemtype.hxx +++ b/include/editeng/itemtype.hxx @@ -21,7 +21,7 @@ // forward --------------------------------------------------------------- #include <rtl/ustring.hxx> -#include <tools/bigint.hxx> +#include <tools/long.hxx> #include <tools/mapunit.hxx> #include <editeng/editengdllapi.h> @@ -35,16 +35,6 @@ EDITENG_DLLPUBLIC OUString GetMetricText( tools::Long nVal, MapUnit eSrcUnit, Ma OUString GetColorString( const Color& rCol ); EDITENG_DLLPUBLIC const char* GetMetricId(MapUnit eUnit); - -inline tools::Long Scale( tools::Long nVal, tools::Long nMult, tools::Long nDiv ) -{ - BigInt aVal( nVal ); - aVal *= nMult; - aVal += nDiv/2; - aVal /= nDiv; - return aVal; -} - #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/tools/bigint.hxx b/include/tools/bigint.hxx index 53f681609ecf..3299d56c5374 100644 --- a/include/tools/bigint.hxx +++ b/include/tools/bigint.hxx @@ -106,6 +106,9 @@ public: BigInt& operator =( sal_Int32 nValue ); + /* Scale and round value */ + static tools::Long Scale(tools::Long nVal, tools::Long nMult, tools::Long nDiv); + friend inline BigInt operator +( const BigInt& rVal1, const BigInt& rVal2 ); friend inline BigInt operator -( const BigInt& rVal1, const BigInt& rVal2 ); friend inline BigInt operator *( const BigInt& rVal1, const BigInt& rVal2 ); diff --git a/svx/source/svdraw/svdattr.cxx b/svx/source/svdraw/svdattr.cxx index 0342f65c2760..a683704d41a1 100644 --- a/svx/source/svdraw/svdattr.cxx +++ b/svx/source/svdraw/svdattr.cxx @@ -874,11 +874,7 @@ bool SdrMetricItem::HasMetrics() const void SdrMetricItem::ScaleMetrics(tools::Long nMul, tools::Long nDiv) { if (GetValue()!=0) { - BigInt aVal(GetValue()); - aVal*=nMul; - aVal+=nDiv/2; // to round accurately - aVal/=nDiv; - SetValue(tools::Long(aVal)); + SetValue(BigInt::Scale(GetValue(), nMul, nDiv)); } } diff --git a/svx/source/svdraw/svdtrans.cxx b/svx/source/svdraw/svdtrans.cxx index 6025dee157a3..5b02f994cc12 100644 --- a/svx/source/svdraw/svdtrans.cxx +++ b/svx/source/svdraw/svdtrans.cxx @@ -559,19 +559,9 @@ void OrthoDistance4(const Point& rPt0, Point& rPt, bool bBigOrtho) tools::Long BigMulDiv(tools::Long nVal, tools::Long nMul, tools::Long nDiv) { - BigInt aVal(nVal); - aVal*=nMul; - if (aVal.IsNeg()!=(nDiv<0)) { - aVal-=nDiv/2; // to round correctly - } else { - aVal+=nDiv/2; // to round correctly - } - if(nDiv) - { - aVal/=nDiv; - return tools::Long(aVal); - } - return 0x7fffffff; + if (!nDiv) + return 0x7fffffff; + return BigInt::Scale(nVal, nMul, nDiv); } // How many eU units fit into a mm, respectively an inch? diff --git a/svx/source/xoutdev/xattr.cxx b/svx/source/xoutdev/xattr.cxx index 5d3caa64fa1d..79ee53600f63 100644 --- a/svx/source/xoutdev/xattr.cxx +++ b/svx/source/xoutdev/xattr.cxx @@ -91,22 +91,6 @@ using namespace ::com::sun::star; typedef std::map<OUString, OUString> StringMap; -static tools::Long ScaleMetricValue( tools::Long nVal, tools::Long nMul, tools::Long nDiv ) -{ - BigInt aVal( nVal ); - - aVal *= nMul; - - if ( aVal.IsNeg() != ( nDiv < 0 ) ) - aVal-=nDiv/2; // for correct rounding - else - aVal+=nDiv/2; // for correct rounding - - aVal/=nDiv; - - return tools::Long( aVal ); -} - NameOrIndex::NameOrIndex(sal_uInt16 _nWhich, sal_Int32 nIndex) : SfxStringItem(_nWhich, OUString()), nPalIndex(nIndex) @@ -635,9 +619,9 @@ bool XLineDashItem::HasMetrics() const void XLineDashItem::ScaleMetrics(tools::Long nMul, tools::Long nDiv) { - aDash.SetDotLen( ScaleMetricValue( aDash.GetDotLen(), nMul, nDiv ) ); - aDash.SetDashLen( ScaleMetricValue( aDash.GetDashLen(), nMul, nDiv ) ); - aDash.SetDistance( ScaleMetricValue( aDash.GetDistance(), nMul, nDiv ) ); + aDash.SetDotLen( BigInt::Scale( aDash.GetDotLen(), nMul, nDiv ) ); + aDash.SetDashLen( BigInt::Scale( aDash.GetDashLen(), nMul, nDiv ) ); + aDash.SetDistance( BigInt::Scale( aDash.GetDistance(), nMul, nDiv ) ); } bool XLineDashItem::QueryValue( css::uno::Any& rVal, sal_uInt8 nMemberId ) const @@ -2634,7 +2618,7 @@ bool XFillHatchItem::HasMetrics() const void XFillHatchItem::ScaleMetrics(tools::Long nMul, tools::Long nDiv) { - aHatch.SetDistance( ScaleMetricValue( aHatch.GetDistance(), nMul, nDiv ) ); + aHatch.SetDistance( BigInt::Scale( aHatch.GetDistance(), nMul, nDiv ) ); } bool XFillHatchItem::QueryValue( css::uno::Any& rVal, sal_uInt8 nMemberId ) const diff --git a/tools/source/generic/bigint.cxx b/tools/source/generic/bigint.cxx index 62350a30c311..6616ef76f423 100644 --- a/tools/source/generic/bigint.cxx +++ b/tools/source/generic/bigint.cxx @@ -843,4 +843,20 @@ bool operator<( const BigInt& rVal1, const BigInt& rVal2 ) return nA.bIsNeg ? (nA.nNum[i] > nB.nNum[i]) : (nA.nNum[i] < nB.nNum[i]); } +tools::Long BigInt::Scale( tools::Long nVal, tools::Long nMul, tools::Long nDiv ) +{ + BigInt aVal( nVal ); + + aVal *= nMul; + + if ( aVal.IsNeg() != ( nDiv < 0 ) ) + aVal -= nDiv / 2; // for correct rounding + else + aVal += nDiv / 2; // for correct rounding + + aVal /= nDiv; + + return tools::Long( aVal ); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |