summaryrefslogtreecommitdiff
path: root/vcl/source
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2021-09-30 15:49:58 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2021-09-30 20:45:21 +0200
commitc2de581d1943df2d84f2b71817b6a8bee41f0217 (patch)
tree17551831631883062654e5f367ec61842ae2751f /vcl/source
parent7183b3ba237dc7718501acb512d5ae1c5d0d5f6b (diff)
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@collabora.co.uk>
Diffstat (limited to 'vcl/source')
-rw-r--r--vcl/source/bitmap/impvect.cxx93
1 files changed, 45 insertions, 48 deletions
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;