oox/source/drawingml/drawingmltypes.cxx | 12 +++++------- oox/source/export/drawingml.cxx | 18 +++++++++++++----- sc/qa/unit/subsequent_export_test3.cxx | 8 ++++---- 3 files changed, 22 insertions(+), 16 deletions(-)
New commits: commit 6e3ed71f906c3571a6b6efb5335c26807b566a42 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Fri Apr 12 09:16:12 2024 +0100 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Sat Apr 13 01:19:00 2024 +0200 Use o3tl::convert in oox Change-Id: I1cbc299e7e64eae48f0f6c896a8160bbe6e19c97 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165938 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/oox/source/drawingml/drawingmltypes.cxx b/oox/source/drawingml/drawingmltypes.cxx index 30fed83f4391..04668c6b9a72 100644 --- a/oox/source/drawingml/drawingmltypes.cxx +++ b/oox/source/drawingml/drawingmltypes.cxx @@ -92,22 +92,20 @@ float GetTextSize( std::u16string_view sValue ) return fRet; } -/** converts the ST_TextSpacingPoint to 1/100mm */ +/** converts the ST_TextSpacingPoint (1/100pt) to 1/100mm */ sal_Int32 GetTextSpacingPoint( std::u16string_view sValue ) { sal_Int32 nRet; - if( ::sax::Converter::convertNumber( nRet, sValue, (SAL_MIN_INT32 + 360) / 254, (SAL_MAX_INT32 - 360) / 254 ) ) + if( ::sax::Converter::convertNumber( nRet, sValue ) ) nRet = GetTextSpacingPoint( nRet ); return nRet; } sal_Int32 GetTextSpacingPoint(sal_Int32 nValue) { - if (nValue > 0) - nValue = (nValue * 254 + 360); - else if (nValue < 0) - nValue = (nValue * 254 - 360); - return nValue / 720; + constexpr auto mdFromPt = o3tl::getConversionMulDiv(o3tl::Length::pt, o3tl::Length::mm100); + constexpr o3tl::detail::m_and_d md(mdFromPt.first, mdFromPt.second * 100); + return o3tl::convertNarrowing<sal_Int32, md.m, md.d>(nValue); } float GetFontHeight( sal_Int32 nHeight ) diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 92aa84438e62..d14fd037f237 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -167,6 +167,14 @@ const char* g_aPredefinedClrNames[] = { "hlink", "folHlink", }; + +/** converts 1/100mm to the ST_TextSpacingPoint (1/100pt) */ +sal_Int64 toTextSpacingPoint(sal_Int64 mm100) +{ + constexpr auto mdToPt = o3tl::getConversionMulDiv(o3tl::Length::mm100, o3tl::Length::pt); + constexpr o3tl::detail::m_and_d md(mdToPt.first * 100, mdToPt.second); + return o3tl::convert(mm100, md.m, md.d); +} } namespace oox::drawingml { @@ -2491,7 +2499,7 @@ void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool * therefore to get original value CharKerning need to be convert. * https://opengrok.libreoffice.org/xref/core/oox/source/drawingml/drawingmltypes.cxx#95 **/ - nCharKerning = ((nCharKerning * 720)-360) / 254; + nCharKerning = toTextSpacingPoint(nCharKerning); if ((bComplex && GetProperty(rXPropSet, "CharWeightComplex")) || GetProperty(rXPropSet, "CharWeight")) @@ -3445,7 +3453,7 @@ void DrawingML::WriteLinespacing(const LineSpacing& rSpacing, float fFirstCharHe XML_val, OString::number(static_cast<sal_Int32>(rSpacing.Height)*1000)); } else if (rSpacing.Mode == LineSpacingMode::MINIMUM - && fFirstCharHeight > static_cast<float>(rSpacing.Height) * 0.001 * 72.0 / 2.54) + && fFirstCharHeight > o3tl::convert(rSpacing.Height, o3tl::Length::mm100, o3tl::Length::pt)) { // 100% proportional line spacing = single line spacing mpFS->singleElementNS(XML_a, XML_spcPct, XML_val, @@ -3454,7 +3462,7 @@ void DrawingML::WriteLinespacing(const LineSpacing& rSpacing, float fFirstCharHe else { mpFS->singleElementNS( XML_a, XML_spcPts, - XML_val, OString::number(std::lround(rSpacing.Height / 25.4 * 72))); + XML_val, OString::number(toTextSpacingPoint(rSpacing.Height))); } } @@ -3582,7 +3590,7 @@ bool DrawingML::WriteParagraphProperties(const Reference<XTextContent>& rParagra mpFS->startElementNS(XML_a, XML_spcBef); { mpFS->singleElementNS( XML_a, XML_spcPts, - XML_val, OString::number(std::lround(nParaTopMargin / 25.4 * 72))); + XML_val, OString::number(toTextSpacingPoint(nParaTopMargin))); } mpFS->endElementNS( XML_a, XML_spcBef ); } @@ -3592,7 +3600,7 @@ bool DrawingML::WriteParagraphProperties(const Reference<XTextContent>& rParagra mpFS->startElementNS(XML_a, XML_spcAft); { mpFS->singleElementNS( XML_a, XML_spcPts, - XML_val, OString::number(std::lround(nParaBottomMargin / 25.4 * 72))); + XML_val, OString::number(toTextSpacingPoint(nParaBottomMargin))); } mpFS->endElementNS( XML_a, XML_spcAft ); } diff --git a/sc/qa/unit/subsequent_export_test3.cxx b/sc/qa/unit/subsequent_export_test3.cxx index 3ad4782440f8..8f8d5160d2eb 100644 --- a/sc/qa/unit/subsequent_export_test3.cxx +++ b/sc/qa/unit/subsequent_export_test3.cxx @@ -1341,8 +1341,8 @@ CPPUNIT_TEST_FIXTURE(ScExportTest3, testSheetCharacterKerningSpaceXLSX) "/xdr:wsDr[1]/xdr:twoCellAnchor[1]/xdr:sp[1]/xdr:txBody[1]/a:p[1]/a:r[1]/a:rPr[1]"_ostr, "spc"_ostr); - // make sure that the CharKerning is 1997. - CPPUNIT_ASSERT_EQUAL(OUString("1997"), CharKerningSpace); + // make sure that the CharKerning is 2001 (2000 in original document). + CPPUNIT_ASSERT_EQUAL(OUString("2001"), CharKerningSpace); } CPPUNIT_TEST_FIXTURE(ScExportTest3, testSheetCondensedCharacterSpaceXLSX) @@ -1358,8 +1358,8 @@ CPPUNIT_TEST_FIXTURE(ScExportTest3, testSheetCondensedCharacterSpaceXLSX) "/xdr:wsDr[1]/xdr:twoCellAnchor[1]/xdr:sp[1]/xdr:txBody[1]/a:p[1]/a:r[1]/a:rPr[1]"_ostr, "spc"_ostr); - // make sure that the CondensedCharSpace is -1002. - CPPUNIT_ASSERT_EQUAL(OUString("-1002"), CondensedCharSpace); + // make sure that the CondensedCharSpace is -1001 (-1000 in original document). + CPPUNIT_ASSERT_EQUAL(OUString("-1001"), CondensedCharSpace); } CPPUNIT_TEST_FIXTURE(ScExportTest3, testTextUnderlineColorXLSX)