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,