vcl/source/gdi/mapmod.cxx |   39 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 37 insertions(+), 2 deletions(-)

New commits:
commit be8e52ca8bcc674ff20432766bbe2748cbfc122b
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Wed Jul 26 18:48:20 2023 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Thu Jul 27 16:16:04 2023 +0200

    avoid some allocation in MapMode
    
    the vast majority of the time we call the single-arg constructor
    for MapMode, and don't modify the resulting object, so declare
    some singletons for those cases.
    
    Change-Id: I5f6e98c638a86acfa5da8bb5944394caa66af9cb
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154946
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/vcl/source/gdi/mapmod.cxx b/vcl/source/gdi/mapmod.cxx
index b74830faa17f..f76d3bb6ec29 100644
--- a/vcl/source/gdi/mapmod.cxx
+++ b/vcl/source/gdi/mapmod.cxx
@@ -39,6 +39,7 @@ struct MapMode::ImplMapMode
     bool            mbSimple;
 
     ImplMapMode();
+    ImplMapMode(MapUnit eMapUnit);
     ImplMapMode(const ImplMapMode& rImpMapMode);
 
     bool operator==( const ImplMapMode& rImpMapMode ) const;
@@ -53,6 +54,15 @@ MapMode::ImplMapMode::ImplMapMode() :
     mbSimple = true;
 }
 
+MapMode::ImplMapMode::ImplMapMode(MapUnit eMapUnit) :
+    maOrigin( 0, 0 ),
+    maScaleX( 1, 1 ),
+    maScaleY( 1, 1 )
+{
+    meUnit   = eMapUnit;
+    mbSimple = true;
+}
+
 MapMode::ImplMapMode::ImplMapMode( const ImplMapMode& ) = default;
 
 bool MapMode::ImplMapMode::operator==( const ImplMapMode& rImpMapMode ) const
@@ -65,11 +75,37 @@ bool MapMode::ImplMapMode::operator==( const ImplMapMode& 
rImpMapMode ) const
 
 namespace
 {
+
     MapMode::ImplType& GetGlobalDefault()
     {
         static MapMode::ImplType gDefault;
         return gDefault;
     }
+    MapMode::ImplType GetUnitDefault(MapUnit mapUnit)
+    {
+        static MapMode::ImplType defaults[]
+        {
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::Map100thMM) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::Map10thMM) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapMM) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapCM) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::Map1000thInch) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::Map100thInch) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::Map10thInch) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapInch) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapPoint) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapTwip) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapPixel) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapSysFont) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapAppFont) ),
+            MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapRelative) ),
+        };
+        if (mapUnit <= MapUnit::MapRelative) {
+            return MapMode::ImplType(defaults[static_cast<int>(mapUnit)]); // 
[-loplugin:redundantfcast] false positive
+        }
+        // sometimes the SvmReader stuff will generate a bogus mapunit value
+        return MapMode::ImplType(MapMode::ImplMapMode(mapUnit));
+    }
 }
 
 MapMode::MapMode() : mpImplMapMode(GetGlobalDefault())
@@ -78,9 +114,8 @@ MapMode::MapMode() : mpImplMapMode(GetGlobalDefault())
 
 MapMode::MapMode( const MapMode& ) = default;
 
-MapMode::MapMode( MapUnit eUnit )
+MapMode::MapMode( MapUnit eUnit ) : mpImplMapMode(GetUnitDefault(eUnit))
 {
-    mpImplMapMode->meUnit = eUnit;
 }
 
 MapMode::MapMode( MapUnit eUnit, const Point& rLogicOrg,

Reply via email to