just calculate the scanline positions
rather than generating a big offset table to dramatically reduce the amount of memory loading graphics takes Change-Id: I8a4b1dc5cbcb686d6b8570f2eeef61ee0fe25515 Reviewed-on: https://gerrit.libreoffice.org/35005 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
This commit is contained in:
@@ -115,7 +115,6 @@ protected:
|
|||||||
FncSetPixel mFncSetPixel;
|
FncSetPixel mFncSetPixel;
|
||||||
|
|
||||||
SAL_DLLPRIVATE void ImplInitScanBuffer( Bitmap& rBitmap );
|
SAL_DLLPRIVATE void ImplInitScanBuffer( Bitmap& rBitmap );
|
||||||
SAL_DLLPRIVATE void ImplClearScanBuffer();
|
|
||||||
SAL_DLLPRIVATE bool ImplSetAccessPointers( ScanlineFormat nFormat );
|
SAL_DLLPRIVATE bool ImplSetAccessPointers( ScanlineFormat nFormat );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -303,13 +302,11 @@ inline const BitmapColor& BitmapInfoAccess::GetPaletteColor( sal_uInt16 nColor )
|
|||||||
return mpBuffer->maPalette[nColor];
|
return mpBuffer->maPalette[nColor];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline const BitmapColor& BitmapInfoAccess::GetBestPaletteColor(const BitmapColor& rBitmapColor) const
|
inline const BitmapColor& BitmapInfoAccess::GetBestPaletteColor(const BitmapColor& rBitmapColor) const
|
||||||
{
|
{
|
||||||
return GetPaletteColor(GetBestPaletteIndex(rBitmapColor));
|
return GetPaletteColor(GetBestPaletteIndex(rBitmapColor));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline ColorMask& BitmapInfoAccess::GetColorMask() const
|
inline ColorMask& BitmapInfoAccess::GetColorMask() const
|
||||||
{
|
{
|
||||||
assert(mpBuffer && "Access is not valid!");
|
assert(mpBuffer && "Access is not valid!");
|
||||||
@@ -317,7 +314,6 @@ inline ColorMask& BitmapInfoAccess::GetColorMask() const
|
|||||||
return mpBuffer->maColorMask;
|
return mpBuffer->maColorMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline Scanline BitmapReadAccess::GetBuffer() const
|
inline Scanline BitmapReadAccess::GetBuffer() const
|
||||||
{
|
{
|
||||||
assert(mpBuffer && "Access is not valid!");
|
assert(mpBuffer && "Access is not valid!");
|
||||||
@@ -325,32 +321,32 @@ inline Scanline BitmapReadAccess::GetBuffer() const
|
|||||||
return mpBuffer ? mpBuffer->mpBits : nullptr;
|
return mpBuffer ? mpBuffer->mpBits : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline Scanline BitmapReadAccess::GetScanline(long nY) const
|
inline Scanline BitmapReadAccess::GetScanline(long nY) const
|
||||||
{
|
{
|
||||||
assert(mpBuffer && mpScanBuf && "Access is not valid!");
|
assert(mpBuffer && "Access is not valid!");
|
||||||
assert(nY < mpBuffer->mnHeight && "y-coordinate out of range!");
|
assert(nY < mpBuffer->mnHeight && "y-coordinate out of range!");
|
||||||
|
|
||||||
return mpScanBuf[nY];
|
if (mpBuffer->mnFormat & ScanlineFormat::TopDown)
|
||||||
|
{
|
||||||
|
return mpBuffer->mpBits + (nY * mpBuffer->mnScanlineSize);
|
||||||
|
}
|
||||||
|
return mpBuffer->mpBits + ((mpBuffer->mnHeight - 1 - nY) * mpBuffer->mnScanlineSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline BitmapColor BitmapReadAccess::GetPixel(long nY, long nX) const
|
inline BitmapColor BitmapReadAccess::GetPixel(long nY, long nX) const
|
||||||
{
|
{
|
||||||
assert(mpBuffer && mpScanBuf && "Access is not valid!");
|
assert(mpBuffer && "Access is not valid!");
|
||||||
assert(nX < mpBuffer->mnWidth && "x-coordinate out of range!");
|
assert(nX < mpBuffer->mnWidth && "x-coordinate out of range!");
|
||||||
assert(nY < mpBuffer->mnHeight && "y-coordinate out of range!");
|
assert(nY < mpBuffer->mnHeight && "y-coordinate out of range!");
|
||||||
|
|
||||||
return mFncGetPixel(mpScanBuf[nY], nX, maColorMask );
|
return mFncGetPixel(GetScanline(nY), nX, maColorMask );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline sal_uInt8 BitmapReadAccess::GetPixelIndex(long nY, long nX) const
|
inline sal_uInt8 BitmapReadAccess::GetPixelIndex(long nY, long nX) const
|
||||||
{
|
{
|
||||||
return GetPixel(nY, nX).GetBlueOrIndex();
|
return GetPixel(nY, nX).GetBlueOrIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline BitmapColor BitmapReadAccess::GetPixelFromData(const sal_uInt8* pData, long nX) const
|
inline BitmapColor BitmapReadAccess::GetPixelFromData(const sal_uInt8* pData, long nX) const
|
||||||
{
|
{
|
||||||
assert(pData && "Access is not valid!");
|
assert(pData && "Access is not valid!");
|
||||||
@@ -358,7 +354,6 @@ inline BitmapColor BitmapReadAccess::GetPixelFromData(const sal_uInt8* pData, lo
|
|||||||
return mFncGetPixel( pData, nX, maColorMask );
|
return mFncGetPixel( pData, nX, maColorMask );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void BitmapReadAccess::SetPixelOnData(sal_uInt8* pData, long nX, const BitmapColor& rBitmapColor)
|
inline void BitmapReadAccess::SetPixelOnData(sal_uInt8* pData, long nX, const BitmapColor& rBitmapColor)
|
||||||
{
|
{
|
||||||
assert(pData && "Access is not valid!");
|
assert(pData && "Access is not valid!");
|
||||||
@@ -413,7 +408,7 @@ inline void BitmapWriteAccess::SetPixel(long nY, long nX, const BitmapColor& rBi
|
|||||||
assert(nX < mpBuffer->mnWidth && "x-coordinate out of range!");
|
assert(nX < mpBuffer->mnWidth && "x-coordinate out of range!");
|
||||||
assert(nY < mpBuffer->mnHeight && "y-coordinate out of range!");
|
assert(nY < mpBuffer->mnHeight && "y-coordinate out of range!");
|
||||||
|
|
||||||
mFncSetPixel(mpScanBuf[nY], nX, rBitmapColor, maColorMask);
|
mFncSetPixel(GetScanline(nY), nX, rBitmapColor, maColorMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -102,7 +102,6 @@ sal_uInt16 BitmapInfoAccess::GetBestPaletteIndex( const BitmapColor& rBitmapColo
|
|||||||
|
|
||||||
BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap, BitmapAccessMode nMode ) :
|
BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap, BitmapAccessMode nMode ) :
|
||||||
BitmapInfoAccess( rBitmap, nMode ),
|
BitmapInfoAccess( rBitmap, nMode ),
|
||||||
mpScanBuf ( nullptr ),
|
|
||||||
mFncGetPixel ( nullptr ),
|
mFncGetPixel ( nullptr ),
|
||||||
mFncSetPixel ( nullptr )
|
mFncSetPixel ( nullptr )
|
||||||
{
|
{
|
||||||
@@ -111,7 +110,6 @@ BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap, BitmapAccessMode nMode ) :
|
|||||||
|
|
||||||
BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap ) :
|
BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap ) :
|
||||||
BitmapInfoAccess( rBitmap, BitmapAccessMode::Read ),
|
BitmapInfoAccess( rBitmap, BitmapAccessMode::Read ),
|
||||||
mpScanBuf ( nullptr ),
|
|
||||||
mFncGetPixel ( nullptr ),
|
mFncGetPixel ( nullptr ),
|
||||||
mFncSetPixel ( nullptr )
|
mFncSetPixel ( nullptr )
|
||||||
{
|
{
|
||||||
@@ -120,7 +118,6 @@ BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap ) :
|
|||||||
|
|
||||||
BitmapReadAccess::~BitmapReadAccess()
|
BitmapReadAccess::~BitmapReadAccess()
|
||||||
{
|
{
|
||||||
ImplClearScanBuffer();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BitmapReadAccess::ImplInitScanBuffer( Bitmap& rBitmap )
|
void BitmapReadAccess::ImplInitScanBuffer( Bitmap& rBitmap )
|
||||||
@@ -134,45 +131,15 @@ void BitmapReadAccess::ImplInitScanBuffer( Bitmap& rBitmap )
|
|||||||
|
|
||||||
maColorMask = mpBuffer->maColorMask;
|
maColorMask = mpBuffer->maColorMask;
|
||||||
|
|
||||||
bool bOk(true);
|
bool bOk = ImplSetAccessPointers(RemoveScanline(mpBuffer->mnFormat));
|
||||||
const long nHeight = mpBuffer->mnHeight;
|
|
||||||
Scanline pTmpLine = mpBuffer->mpBits;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
mpScanBuf = new Scanline[ nHeight ];
|
|
||||||
if( mpBuffer->mnFormat & ScanlineFormat::TopDown )
|
|
||||||
{
|
|
||||||
for( long nY = 0; nY < nHeight; nY++, pTmpLine += mpBuffer->mnScanlineSize )
|
|
||||||
mpScanBuf[ nY ] = pTmpLine;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for( long nY = nHeight - 1; nY >= 0; nY--, pTmpLine += mpBuffer->mnScanlineSize )
|
|
||||||
mpScanBuf[ nY ] = pTmpLine;
|
|
||||||
}
|
|
||||||
bOk = ImplSetAccessPointers(RemoveScanline(mpBuffer->mnFormat));
|
|
||||||
}
|
|
||||||
catch (const std::bad_alloc&)
|
|
||||||
{
|
|
||||||
bOk = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!bOk)
|
if (!bOk)
|
||||||
{
|
{
|
||||||
delete[] mpScanBuf;
|
|
||||||
mpScanBuf = nullptr;
|
|
||||||
|
|
||||||
xImpBmp->ImplReleaseBuffer( mpBuffer, mnAccessMode );
|
xImpBmp->ImplReleaseBuffer( mpBuffer, mnAccessMode );
|
||||||
mpBuffer = nullptr;
|
mpBuffer = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BitmapReadAccess::ImplClearScanBuffer()
|
|
||||||
{
|
|
||||||
delete[] mpScanBuf;
|
|
||||||
mpScanBuf = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool BitmapReadAccess::ImplSetAccessPointers( ScanlineFormat nFormat )
|
bool BitmapReadAccess::ImplSetAccessPointers( ScanlineFormat nFormat )
|
||||||
{
|
{
|
||||||
bool bRet = true;
|
bool bRet = true;
|
||||||
@@ -405,7 +372,7 @@ void BitmapWriteAccess::CopyScanline( long nY, const BitmapReadAccess& rReadAcc
|
|||||||
if( ( GetScanlineFormat() == rReadAcc.GetScanlineFormat() ) &&
|
if( ( GetScanlineFormat() == rReadAcc.GetScanlineFormat() ) &&
|
||||||
( GetScanlineSize() >= rReadAcc.GetScanlineSize() ) )
|
( GetScanlineSize() >= rReadAcc.GetScanlineSize() ) )
|
||||||
{
|
{
|
||||||
memcpy( mpScanBuf[ nY ], rReadAcc.GetScanline( nY ), rReadAcc.GetScanlineSize() );
|
memcpy(GetScanline(nY), rReadAcc.GetScanline(nY), rReadAcc.GetScanlineSize());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
// TODO: use fastbmp infrastructure
|
// TODO: use fastbmp infrastructure
|
||||||
@@ -428,7 +395,7 @@ void BitmapWriteAccess::CopyScanline( long nY, ConstScanline aSrcScanline,
|
|||||||
if( nCount )
|
if( nCount )
|
||||||
{
|
{
|
||||||
if( GetScanlineFormat() == RemoveScanline( nSrcScanlineFormat ) )
|
if( GetScanlineFormat() == RemoveScanline( nSrcScanlineFormat ) )
|
||||||
memcpy( mpScanBuf[ nY ], aSrcScanline, nCount );
|
memcpy(GetScanline(nY), aSrcScanline, nCount);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DBG_ASSERT( nFormat != ScanlineFormat::N8BitTcMask &&
|
DBG_ASSERT( nFormat != ScanlineFormat::N8BitTcMask &&
|
||||||
|
Reference in New Issue
Block a user