[Libreoffice-commits] core.git: vcl/source

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Thu Sep 30 18:45:56 UTC 2021


 vcl/source/bitmap/impvect.cxx |   93 ++++++++++++++++++++----------------------
 1 file changed, 45 insertions(+), 48 deletions(-)

New commits:
commit c2de581d1943df2d84f2b71817b6a8bee41f0217
Author:     Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Thu Sep 30 15:49:58 2021 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Thu Sep 30 20:45:21 2021 +0200

    no need to allocate ImplVectMap on the heap
    
    Change-Id: If4175ee8f0853b9ef1bb0657338116e2ee57064a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122897
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/vcl/source/bitmap/impvect.cxx b/vcl/source/bitmap/impvect.cxx
index db06fa4cc484..1d320a2648c2 100644
--- a/vcl/source/bitmap/impvect.cxx
+++ b/vcl/source/bitmap/impvect.cxx
@@ -64,11 +64,11 @@ class ImplChain;
 
 namespace ImplVectorizer
 {
-    static ImplVectMap* ImplExpand( BitmapReadAccess* pRAcc, const Color& rColor );
-    static void     ImplCalculate( ImplVectMap* pMap, tools::PolyPolygon& rPolyPoly, sal_uInt8 cReduce );
-    static bool     ImplGetChain( ImplVectMap* pMap, const Point& rStartPt, ImplChain& rChain );
-    static bool     ImplIsUp( ImplVectMap const * pMap, tools::Long nY, tools::Long nX );
-    static void     ImplLimitPolyPoly( tools::PolyPolygon& rPolyPoly );
+    static void ImplExpand( std::optional<ImplVectMap>& rMap, BitmapReadAccess* pRAcc, const Color& rColor );
+    static void ImplCalculate( ImplVectMap& rMap, tools::PolyPolygon& rPolyPoly, sal_uInt8 cReduce );
+    static bool ImplGetChain( ImplVectMap& rMap, const Point& rStartPt, ImplChain& rChain );
+    static bool ImplIsUp( ImplVectMap const & rMap, tools::Long nY, tools::Long nX );
+    static void ImplLimitPolyPoly( tools::PolyPolygon& rPolyPoly );
 }
 
 namespace {
@@ -694,16 +694,17 @@ bool ImplVectorize( const Bitmap& rColorBmp, GDIMetaFile& rMtf,
         {
             const BitmapColor   aBmpCol( pRAcc->GetPaletteColor( aColorSet[ i ].mnIndex ) );
             const Color         aFindColor( aBmpCol.GetRed(), aBmpCol.GetGreen(), aBmpCol.GetBlue() );
-            std::unique_ptr<ImplVectMap> xMap(ImplExpand( pRAcc.get(), aFindColor ));
+            std::optional<ImplVectMap> oMap;
+            ImplExpand( oMap, pRAcc.get(), aFindColor );
 
             fPercent += fPercentStep_2;
             VECT_PROGRESS( pProgress, FRound( fPercent ) );
 
-            if( xMap )
+            if( oMap )
             {
                 aPolyPoly.Clear();
-                ImplCalculate( xMap.get(), aPolyPoly, cReduce );
-                xMap.reset();
+                ImplCalculate( *oMap, aPolyPoly, cReduce );
+                oMap.reset();
 
                 if( aPolyPoly.Count() )
                 {
@@ -777,10 +778,8 @@ void ImplLimitPolyPoly( tools::PolyPolygon& rPolyPoly )
     rPolyPoly = aNewPolyPoly;
 }
 
-ImplVectMap* ImplExpand( BitmapReadAccess* pRAcc, const Color& rColor )
+void ImplExpand( std::optional<ImplVectMap>& oMap, BitmapReadAccess* pRAcc, const Color& rColor )
 {
-    ImplVectMap* pMap = nullptr;
-
     if( pRAcc && pRAcc->Width() && pRAcc->Height() )
     {
         const tools::Long          nOldWidth = pRAcc->Width();
@@ -792,7 +791,7 @@ ImplVectMap* ImplExpand( BitmapReadAccess* pRAcc, const Color& rColor )
         std::unique_ptr<tools::Long[]> pMapOut(new tools::Long[ std::max( nOldWidth, nOldHeight ) ]);
         tools::Long                nX, nY, nTmpX, nTmpY;
 
-        pMap = new ImplVectMap( nNewWidth, nNewHeight );
+        oMap.emplace( nNewWidth, nNewHeight );
 
         for( nX = 0; nX < nOldWidth; nX++ )
             VECT_MAP( pMapIn, pMapOut, nX );
@@ -807,10 +806,10 @@ ImplVectMap* ImplExpand( BitmapReadAccess* pRAcc, const Color& rColor )
                     nTmpX = pMapIn[ nX++ ];
                     nTmpY -= 3;
 
-                    pMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY, nTmpX, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY, nTmpX, VECT_CONT_INDEX );
 
                     while( nX < nOldWidth && pRAcc->GetPixelFromData( pScanlineRead, nX ) == aTest )
                          nX++;
@@ -818,10 +817,10 @@ ImplVectMap* ImplExpand( BitmapReadAccess* pRAcc, const Color& rColor )
                     nTmpX = pMapOut[ nX - 1 ];
                     nTmpY -= 3;
 
-                    pMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY, nTmpX, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY++, nTmpX, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY, nTmpX, VECT_CONT_INDEX );
                 }
                 else
                     nX++;
@@ -840,10 +839,10 @@ ImplVectMap* ImplExpand( BitmapReadAccess* pRAcc, const Color& rColor )
                     nTmpX -= 3;
                     nTmpY = pMapIn[ nY++ ];
 
-                    pMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY, nTmpX, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY, nTmpX, VECT_CONT_INDEX );
 
                     while( nY < nOldHeight && pRAcc->GetPixel( nY, nX ) == aTest )
                         nY++;
@@ -851,23 +850,21 @@ ImplVectMap* ImplExpand( BitmapReadAccess* pRAcc, const Color& rColor )
                     nTmpX -= 3;
                     nTmpY = pMapOut[ nY - 1 ];
 
-                    pMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
-                    pMap->Set( nTmpY, nTmpX, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY, nTmpX++, VECT_CONT_INDEX );
+                    oMap->Set( nTmpY, nTmpX, VECT_CONT_INDEX );
                 }
                 else
                     nY++;
             }
         }
     }
-
-    return pMap;
 }
 
-void ImplCalculate( ImplVectMap* pMap, tools::PolyPolygon& rPolyPoly, sal_uInt8 cReduce )
+void ImplCalculate( ImplVectMap& rMap, tools::PolyPolygon& rPolyPoly, sal_uInt8 cReduce )
 {
-    const tools::Long nWidth = pMap->Width(), nHeight= pMap->Height();
+    const tools::Long nWidth = rMap.Width(), nHeight = rMap.Height();
 
     for( tools::Long nY = 0; nY < nHeight; nY++ )
     {
@@ -877,13 +874,13 @@ void ImplCalculate( ImplVectMap* pMap, tools::PolyPolygon& rPolyPoly, sal_uInt8
         while( nX < nWidth )
         {
             // skip free
-            while( ( nX < nWidth ) && pMap->IsFree( nY, nX ) )
+            while( ( nX < nWidth ) && rMap.IsFree( nY, nX ) )
                 nX++;
 
             if( nX == nWidth )
                 break;
 
-            if( pMap->IsCont( nY, nX ) )
+            if( rMap.IsCont( nY, nX ) )
             {
                 // new contour
                 ImplChain   aChain;
@@ -891,7 +888,7 @@ void ImplCalculate( ImplVectMap* pMap, tools::PolyPolygon& rPolyPoly, sal_uInt8
 
                 // get chain code
                 aChain.ImplBeginAdd( aStartPt );
-                ImplGetChain( pMap, aStartPt, aChain );
+                ImplGetChain( rMap, aStartPt, aChain );
 
                 aChain.ImplEndAdd( bInner ? VECT_POLY_OUTLINE_INNER : VECT_POLY_OUTLINE_OUTER );
 
@@ -911,7 +908,7 @@ void ImplCalculate( ImplVectMap* pMap, tools::PolyPolygon& rPolyPoly, sal_uInt8
                 }
 
                 // skip rest of detected contour
-                while( pMap->IsCont( nY, nX ) )
+                while( rMap.IsCont( nY, nX ) )
                     nX++;
             }
             else
@@ -919,17 +916,17 @@ void ImplCalculate( ImplVectMap* pMap, tools::PolyPolygon& rPolyPoly, sal_uInt8
                 // process done segment
                 const tools::Long nStartSegX = nX++;
 
-                while( pMap->IsDone( nY, nX ) )
+                while( rMap.IsDone( nY, nX ) )
                     nX++;
 
-                if( ( ( nX - nStartSegX ) == 1 ) || ( ImplIsUp( pMap, nY, nStartSegX ) != ImplIsUp( pMap, nY, nX - 1 ) ) )
+                if( ( ( nX - nStartSegX ) == 1 ) || ( ImplIsUp( rMap, nY, nStartSegX ) != ImplIsUp( rMap, nY, nX - 1 ) ) )
                     bInner = !bInner;
             }
         }
     }
 }
 
-bool ImplGetChain(  ImplVectMap* pMap, const Point& rStartPt, ImplChain& rChain )
+bool ImplGetChain(  ImplVectMap& rMap, const Point& rStartPt, ImplChain& rChain )
 {
     tools::Long                nActX = rStartPt.X();
     tools::Long                nActY = rStartPt.Y();
@@ -945,12 +942,12 @@ bool ImplGetChain(  ImplVectMap* pMap, const Point& rStartPt, ImplChain& rChain
         tools::Long nTryX = nActX + aImplMove[ nLastDir ].nDX;
         tools::Long nTryY = nActY + aImplMove[ nLastDir ].nDY;
 
-        if( pMap->IsCont( nTryY, nTryX ) )
+        if( rMap.IsCont( nTryY, nTryX ) )
         {
             rChain.ImplAdd( static_cast<sal_uInt8>(nLastDir) );
             nActY = nTryY;
             nActX = nTryX;
-            pMap->Set( nActY, nActX, VECT_DONE_INDEX );
+            rMap.Set( nActY, nActX, VECT_DONE_INDEX );
             nFound = 1;
         }
         else
@@ -964,12 +961,12 @@ bool ImplGetChain(  ImplVectMap* pMap, const Point& rStartPt, ImplChain& rChain
                     nTryX = nActX + aImplMove[ nDir ].nDX;
                     nTryY = nActY + aImplMove[ nDir ].nDY;
 
-                    if( pMap->IsCont( nTryY, nTryX ) )
+                    if( rMap.IsCont( nTryY, nTryX ) )
                     {
                         rChain.ImplAdd( static_cast<sal_uInt8>(nDir) );
                         nActY = nTryY;
                         nActX = nTryX;
-                        pMap->Set( nActY, nActX, VECT_DONE_INDEX );
+                        rMap.Set( nActY, nActX, VECT_DONE_INDEX );
                         nFound = 1;
                         nLastDir = nDir;
                         break;
@@ -983,13 +980,13 @@ bool ImplGetChain(  ImplVectMap* pMap, const Point& rStartPt, ImplChain& rChain
     return true;
 }
 
-bool ImplIsUp( ImplVectMap const * pMap, tools::Long nY, tools::Long nX )
+bool ImplIsUp( ImplVectMap const & rMap, tools::Long nY, tools::Long nX )
 {
-    if( pMap->IsDone( nY - 1, nX ) )
+    if( rMap.IsDone( nY - 1, nX ) )
         return true;
-    else if( pMap->IsDone( nY + 1, nX ) )
+    else if( rMap.IsDone( nY + 1, nX ) )
         return false;
-    else if( pMap->IsDone( nY - 1, nX - 1 ) || pMap->IsDone( nY - 1, nX + 1 ) )
+    else if( rMap.IsDone( nY - 1, nX - 1 ) || rMap.IsDone( nY - 1, nX + 1 ) )
         return true;
     else
         return false;


More information about the Libreoffice-commits mailing list