Kaydet (Commit) 61064b56 authored tarafından Noel Grandin's avatar Noel Grandin

avmedia: move BitmapWriteAccess inside Bitmap

part of a larger project to hide BitmapWriteAccess inside Bitmap

Change-Id: Ia46c12b3297107892a6236633c11ca9ada6edbd4
Reviewed-on: https://gerrit.libreoffice.org/49106Reviewed-by: 's avatarMichael Meeks <michael.meeks@collabora.com>
Tested-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst d60d2973
...@@ -174,24 +174,7 @@ uno::Reference< graphic::XGraphic > SAL_CALL FrameGrabber::grabFrame( double fMe ...@@ -174,24 +174,7 @@ uno::Reference< graphic::XGraphic > SAL_CALL FrameGrabber::grabFrame( double fMe
int nStride = GST_ROUND_UP_4( nWidth * 3 ); int nStride = GST_ROUND_UP_4( nWidth * 3 );
Bitmap aBmp( Size( nWidth, nHeight ), 24 ); Bitmap aBmp( Size( nWidth, nHeight ), 24 );
aBmp.SetToData( pData, nStride );
BitmapWriteAccess *pWrite = aBmp.AcquireWriteAccess();
if( pWrite )
{
// yet another cheesy pixel copying loop
for( int y = 0; y < nHeight; ++y )
{
sal_uInt8 *p = pData + y * nStride;
Scanline pScanline = pWrite->GetScanline(y);
for (int x = 0; x < nWidth; ++x)
{
BitmapColor col(p[0], p[1], p[2]);
pWrite->SetPixelOnData(pScanline, x, col);
p += 3;
}
}
}
Bitmap::ReleaseAccess( pWrite );
#ifndef AVMEDIA_GST_0_10 #ifndef AVMEDIA_GST_0_10
gst_buffer_unmap( pBuf, &aMapInfo ); gst_buffer_unmap( pBuf, &aMapInfo );
......
...@@ -650,6 +650,16 @@ public: ...@@ -650,6 +650,16 @@ public:
BmpFilter eFilter, BmpFilter eFilter,
const BmpFilterParam* pFilterParam = nullptr ); const BmpFilterParam* pFilterParam = nullptr );
/** Copy block of image data into the bitmap.
Assumes that the Bitmap has been constructed with the desired size.
@param pData
The block of data to copy
@param nStride
The number of bytes in a scanline, must >= width
*/
void SetToData( sal_uInt8 const *pData, sal_Int32 nStride );
public: public:
SAL_DLLPRIVATE void ImplMakeUnique(); SAL_DLLPRIVATE void ImplMakeUnique();
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <osl/diagnose.h> #include <osl/diagnose.h>
#include <vcl/bitmapaccess.hxx> #include <vcl/bitmapaccess.hxx>
#include <vcl/bitmap.hxx> #include <vcl/bitmap.hxx>
#include <impbmp.hxx>
#define S2(a,b) { long t; if( ( t = b - a ) < 0 ) { a += t; b -= t; } } #define S2(a,b) { long t; if( ( t = b - a ) < 0 ) { a += t; b -= t; } }
#define MN3(a,b,c) S2(a,b); S2(a,c); #define MN3(a,b,c) S2(a,b); S2(a,c);
...@@ -111,6 +112,32 @@ bool Bitmap::Filter( BmpFilter eFilter, const BmpFilterParam* pFilterParam ) ...@@ -111,6 +112,32 @@ bool Bitmap::Filter( BmpFilter eFilter, const BmpFilterParam* pFilterParam )
return bRet; return bRet;
} }
void Bitmap::SetToData( sal_uInt8 const *pData, sal_Int32 nStride )
{
assert(mxImpBmp);
auto nWidth = mxImpBmp->ImplGetSize().getWidth();
auto nHeight = mxImpBmp->ImplGetSize().getHeight();
assert(nStride >= nWidth);
BitmapWriteAccess *pWrite = AcquireWriteAccess();
assert(pWrite);
if( pWrite )
{
for( long y = 0; y < nHeight; ++y )
{
sal_uInt8 const *p = pData + y * nStride;
Scanline pScanline = pWrite->GetScanline(y);
for (long x = 0; x < nWidth; ++x)
{
BitmapColor col(p[0], p[1], p[2]);
pWrite->SetPixelOnData(pScanline, x, col);
p += 3;
}
}
}
ReleaseAccess( pWrite );
}
bool Bitmap::ImplConvolute3( const long* pMatrix ) bool Bitmap::ImplConvolute3( const long* pMatrix )
{ {
const long nDivisor = 8; const long nDivisor = 8;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment