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)

Reply via email to