[Libreoffice-commits] core.git: editeng/source include/editeng include/tools svx/source tools/source
Noel Grandin (via logerrit)
logerrit at kemper.freedesktop.org
Wed Jan 6 10:38:42 UTC 2021
editeng/source/items/borderline.cxx | 11 ++++++-----
editeng/source/items/frmitems.cxx | 29 +++++++++++++++--------------
editeng/source/items/textitem.cxx | 5 +++--
include/editeng/itemtype.hxx | 12 +-----------
include/tools/bigint.hxx | 3 +++
svx/source/svdraw/svdattr.cxx | 6 +-----
svx/source/svdraw/svdtrans.cxx | 16 +++-------------
svx/source/xoutdev/xattr.cxx | 24 ++++--------------------
tools/source/generic/bigint.cxx | 16 ++++++++++++++++
9 files changed, 52 insertions(+), 70 deletions(-)
New commits:
commit 2298b055cab8cf8d0268ee1375a5c6e416bf1332
Author: Noel Grandin <noel at peralex.com>
AuthorDate: Wed Jan 6 10:10:39 2021 +0200
Commit: Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Wed Jan 6 11:38:01 2021 +0100
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 at collabora.co.uk>
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
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: */
More information about the Libreoffice-commits
mailing list