svtools/source/filter/exportdialog.cxx |   70 ++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 35 deletions(-)

New commits:
commit bb04dcc6050069bd22c2276fec860672bb5aff5e
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Tue Dec 24 16:17:53 2024 +0500
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Tue Dec 24 16:14:38 2024 +0100

    tdf#128957: fix UpdateHdlMtfSize* handlers in ExportDialog
    
    Since the introduction of resolution support in the dialog in commit
    333d1e3dcc2e819f8c62c9713cca96fbedaba3de (impress186: #i4499# graphic
    dialog reorganisation - added support of bitmap resolution, 2010-06-16),
    the code handling points was wrong, multiplying by 72, where it needed
    to divide. This created an error times 72 * 72 = 5184.
    
    This change uses o3tl::convert for the task.
    
    Change-Id: I096c72422e477d28f08632f8902e31fcbb548c4e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/179308
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Tested-by: Jenkins

diff --git a/svtools/source/filter/exportdialog.cxx 
b/svtools/source/filter/exportdialog.cxx
index 0347385cbae4..c876c6fa8e3c 100644
--- a/svtools/source/filter/exportdialog.cxx
+++ b/svtools/source/filter/exportdialog.cxx
@@ -922,29 +922,21 @@ void ExportDialog::updateControls()
         }
         else
         {
+            double x = double(maSize.Width) / maResolution.Width; // pixels -> 
meters
+            x = o3tl::convert(x, o3tl::Length::m, MapToO3tlLength(aMapUnit));
             mxMfSizeX->set_digits( 2 );
+            mxMfSizeX->set_value(x * 
weld::SpinButton::Power10(mxMfSizeX->get_digits()) + 0.5);
+            double y = double(maSize.Height) / maResolution.Height; // pixels 
-> meters
+            y = o3tl::convert(y, o3tl::Length::m, MapToO3tlLength(aMapUnit));
             mxMfSizeY->set_digits( 2 );
-            double fRatio;
-            switch( GetMapUnit( mxLbSizeX->get_active() ) )
-            {
-                case MapUnit::MapInch : fRatio = static_cast< double >( 
maResolution.Width ) * 0.0254; break;
-                case MapUnit::MapMM :   fRatio = static_cast< double >( 
maResolution.Width ) * 0.001; break;
-                case MapUnit::MapPoint :fRatio = ( static_cast< double >( 
maResolution.Width ) * 0.0254 ) / 72.0; break;
-                default:
-                case MapUnit::MapCM :   fRatio = static_cast< double >( 
maResolution.Width ) * 0.01; break;
-            }
-            mxMfSizeX->set_value( static_cast< sal_Int32 >( ( static_cast< 
double >( maSize.Width * 100 ) / fRatio ) + 0.5 ) );
-            mxMfSizeY->set_value( static_cast< sal_Int32 >( ( static_cast< 
double >( maSize.Height * 100 ) / fRatio ) + 0.5 ) );
+            mxMfSizeY->set_value(y * 
weld::SpinButton::Power10(mxMfSizeY->get_digits()) + 0.5);
         }
     }
-    sal_Int32 nResolution = 0;
-    switch( mxLbResolution->get_active() )
-    {
-        case 0 : nResolution = maResolution.Width / 100; break;     // pixels 
/ cm
-        case 2 : nResolution = maResolution.Width; break;           // pixels 
/ meter
-        default:
-        case 1 : nResolution = static_cast< sal_Int32 >(maResolution.Width * 
0.0254); break;    // pixels / inch
-    }
+    sal_Int32 nResolution = maResolution.Width;
+    if (mxLbResolution->get_active() == 0) // pixels / cm
+        nResolution = o3tl::convert(nResolution, o3tl::Length::cm, 
o3tl::Length::m); // reverse
+    else if (mxLbResolution->get_active() == 1) // pixels / inch
+        nResolution = o3tl::convert(nResolution, o3tl::Length::in, 
o3tl::Length::m); // reverse
     mxNfResolution->set_value( nResolution );
 
     if (mpSbCompression && mpSbCompression->get_visible() && mpNfCompression)
@@ -1048,14 +1040,18 @@ IMPL_LINK_NOARG(ExportDialog, UpdateHdlMtfSizeX, 
weld::SpinButton&, void)
 
     if ( mbIsPixelFormat )
     {
-        switch( GetMapUnit( mxLbSizeX->get_active() ) )
+        const MapUnit unit = GetMapUnit(mxLbSizeX->get_active());
+        if (unit == MapUnit::MapPixel)
+        {
+            maSize.Width = mxMfSizeX->get_value();
+        }
+        else
         {
-            case MapUnit::MapInch :     maSize.Width = static_cast< sal_Int32 
>( static_cast< double >( maResolution.Width ) * 0.0254 * 
mxMfSizeX->get_value() / 100.0 + 0.5 ); break;
-            case MapUnit::MapCM :       maSize.Width = static_cast< sal_Int32 
>( static_cast< double >( maResolution.Width ) * 0.01 * mxMfSizeX->get_value() 
/ 100.0 + 0.5 ); break;
-            case MapUnit::MapMM :       maSize.Width = static_cast< sal_Int32 
>( static_cast< double >( maResolution.Width ) * 0.001 * mxMfSizeX->get_value() 
/ 100.0 + 0.5 ); break;
-            case MapUnit::MapPoint :    maSize.Width = static_cast< sal_Int32 
>( static_cast< double >( maResolution.Width ) * 0.0254 * 
mxMfSizeX->get_value() / 100.0 * 72 + 0.5 ); break;
-            default:
-            case MapUnit::MapPixel :    maSize.Width = mxMfSizeX->get_value(); 
break;
+            double val = mxMfSizeX->get_value()
+                         / 
static_cast<double>(weld::SpinButton::Power10(mxMfSizeX->get_digits()));
+            // Convert to meters, since resolution is in pixels per meter
+            val = o3tl::convert(val, MapToO3tlLength(unit), o3tl::Length::m);
+            maSize.Width = static_cast<sal_Int32>(maResolution.Width * val + 
0.5);
         }
         maSize.Height = static_cast< sal_Int32 >( fRatio * maSize.Width + 0.5 
);
     }
@@ -1080,14 +1076,18 @@ IMPL_LINK_NOARG(ExportDialog, UpdateHdlMtfSizeY, 
weld::SpinButton&, void)
 
     if ( mbIsPixelFormat )
     {
-        switch( GetMapUnit( mxLbSizeX->get_active() ) )
+        const MapUnit unit = GetMapUnit(mxLbSizeX->get_active());
+        if (unit == MapUnit::MapPixel)
+        {
+            maSize.Height = mxMfSizeY->get_value();
+        }
+        else
         {
-            case MapUnit::MapInch :     maSize.Height = static_cast< sal_Int32 
>( static_cast< double >( maResolution.Height ) * 0.0254 * 
mxMfSizeY->get_value() / 100.0 + 0.5 ); break;
-            case MapUnit::MapCM :       maSize.Height = static_cast< sal_Int32 
>( static_cast< double >( maResolution.Height ) * 0.01 * mxMfSizeY->get_value() 
/ 100.0 + 0.5 ); break;
-            case MapUnit::MapMM :       maSize.Height = static_cast< sal_Int32 
>( static_cast< double >( maResolution.Height ) * 0.001 * 
mxMfSizeY->get_value() / 100.0 + 0.5 ); break;
-            case MapUnit::MapPoint :    maSize.Height = static_cast< sal_Int32 
>( static_cast< double >( maResolution.Height ) * 0.0254 * 
mxMfSizeY->get_value() / 100.0 * 72 + 0.5 ); break;
-            default:
-            case MapUnit::MapPixel :    maSize.Height = 
mxMfSizeY->get_value(); break;
+            double val = mxMfSizeY->get_value()
+                         / 
static_cast<double>(weld::SpinButton::Power10(mxMfSizeY->get_digits()));
+            // Convert to meters, since resolution is in pixels per meter
+            val = o3tl::convert(val, MapToO3tlLength(unit), o3tl::Length::m);
+            maSize.Height = static_cast<sal_Int32>(maResolution.Height * val + 
0.5);
         }
         maSize.Width = static_cast< sal_Int32 >( fRatio * maSize.Height + 0.5 
);
     }
@@ -1110,9 +1110,9 @@ IMPL_LINK_NOARG(ExportDialog, UpdateHdlNfResolution, 
weld::SpinButton&, void)
 {
     auto nResolution = mxNfResolution->get_value();
     if ( mxLbResolution->get_active() == 0 )      // pixels / cm
-        nResolution *= 100;
+        nResolution = o3tl::convert(nResolution, o3tl::Length::m, 
o3tl::Length::cm); // reverse
     else if ( mxLbResolution->get_active() == 1 ) // pixels / inch
-        nResolution = static_cast< sal_Int32 >( ( ( static_cast< double >( 
nResolution ) + 0.5 ) / 0.0254 ) );
+        nResolution = o3tl::convert(nResolution, o3tl::Length::m, 
o3tl::Length::in); // reverse
     maResolution.Width = nResolution;
     maResolution.Height= nResolution;
 

Reply via email to