23 #include <com/sun/star/lang/XServiceInfo.hpp>
24 #include <com/sun/star/rendering/XIntegerBitmap.hpp>
41 sal_Int32 calcDIBColorCount(
const BITMAPINFOHEADER& rBIH )
43 if( rBIH.biSize !=
sizeof( BITMAPCOREHEADER ) )
45 if( rBIH.biBitCount <= 8 )
48 return rBIH.biClrUsed;
50 return 1 << rBIH.biBitCount;
55 BITMAPCOREHEADER
const * pCoreHeader =
reinterpret_cast<BITMAPCOREHEADER
const *
>(&rBIH);
57 if( pCoreHeader->bcBitCount <= 8 )
58 return 1 << pCoreHeader->bcBitCount;
65 bool drawDIBits(
const std::shared_ptr< Gdiplus::Graphics >& rGraphics,
71 const BITMAPINFO* pBI =
static_cast<BITMAPINFO*
>(GlobalLock( const_cast<void *>(hDIB) ));
75 const BYTE* pBits =
reinterpret_cast<BYTE const *
>(pBI) + pBI->bmiHeader.biSize +
76 calcDIBColorCount( pBI->bmiHeader ) *
sizeof( RGBQUAD );
82 GlobalUnlock( const_cast<void *>(hDIB) );
94 bool drawVCLBitmap(
const std::shared_ptr< Gdiplus::Graphics >& rGraphics,
136 RawRGBABitmap bitmapFromVCLBitmapEx( const ::BitmapEx& rBmpEx )
145 "::dxcanvas::tools::bitmapFromVCLBitmapEx(): "
146 "BmpEx not transparent" );
151 const ::Size aBmpSize( rBmpEx.GetSizePixel() );
154 aBmpData.mnWidth = aBmpSize.Width();
155 aBmpData.mnHeight = aBmpSize.Height();
156 aBmpData.maBitmapData.resize(4*aBmpData.mnWidth*aBmpData.mnHeight);
158 Bitmap aBitmap( rBmpEx.GetBitmap() );
162 const sal_Int32 nWidth( aBmpSize.Width() );
163 const sal_Int32 nHeight( aBmpSize.Height() );
166 "::dxcanvas::tools::bitmapFromVCLBitmapEx(): "
167 "Unable to acquire read access to bitmap" );
169 if( rBmpEx.IsAlpha() || rBmpEx.GetMask().GetBitCount() == 8 )
171 Bitmap aAlpha( rBmpEx.IsAlpha() ? rBmpEx.GetAlpha().GetBitmap() : rBmpEx.GetMask());
191 "::dxcanvas::tools::bitmapFromVCLBitmapEx(): "
192 "Unable to acquire read access to alpha" );
194 ENSURE_OR_THROW( pAlphaReadAccess->GetScanlineFormat() == ScanlineFormat::N8BitPal,
195 "::dxcanvas::tools::bitmapFromVCLBitmapEx(): "
196 "Unsupported alpha scanline format" );
199 sal_uInt8* pCurrOutput(aBmpData.maBitmapData.data());
202 for( y=0; y<nHeight; ++
y )
204 switch( pReadAccess->GetScanlineFormat() )
206 case ScanlineFormat::N8BitPal:
208 Scanline pScan = pReadAccess->GetScanline( y );
209 Scanline pAScan = pAlphaReadAccess->GetScanline( y );
211 for( x=0; x<nWidth; ++
x )
213 aCol = pReadAccess->GetPaletteColor( *pScan++ );
215 *pCurrOutput++ = aCol.GetBlue();
216 *pCurrOutput++ = aCol.GetGreen();
217 *pCurrOutput++ = aCol.GetRed();
222 *pCurrOutput++ = 255 -
static_cast<BYTE>(*pAScan++);
227 case ScanlineFormat::N24BitTcBgr:
229 Scanline pScan = pReadAccess->GetScanline( y );
230 Scanline pAScan = pAlphaReadAccess->GetScanline( y );
232 for( x=0; x<nWidth; ++
x )
235 *pCurrOutput++ = *pScan++;
236 *pCurrOutput++ = *pScan++;
237 *pCurrOutput++ = *pScan++;
242 *pCurrOutput++ = 255 -
static_cast<BYTE>(*pAScan++);
250 case ScanlineFormat::N1BitMsbPal:
251 case ScanlineFormat::N4BitMsnPal:
252 case ScanlineFormat::N32BitTcMask:
254 Scanline pAScan = pAlphaReadAccess->GetScanline( y );
258 for( x=0; x<nWidth; ++
x )
261 aCol = pReadAccess->GetColor(y,x);
263 *pCurrOutput++ = aCol.GetBlue();
264 *pCurrOutput++ = aCol.GetGreen();
265 *pCurrOutput++ = aCol.GetRed();
270 *pCurrOutput++ = 255 -
static_cast<BYTE>(*pAScan++);
275 case ScanlineFormat::N1BitLsbPal:
276 case ScanlineFormat::N4BitLsnPal:
277 case ScanlineFormat::N24BitTcRgb:
278 case ScanlineFormat::N32BitTcAbgr:
279 case ScanlineFormat::N32BitTcArgb:
280 case ScanlineFormat::N32BitTcBgra:
281 case ScanlineFormat::N32BitTcRgba:
284 "::dxcanvas::tools::bitmapFromVCLBitmapEx(): "
285 "Unexpected scanline format - has "
286 "WinSalBitmap::AcquireBuffer() changed?" );
292 Bitmap aMask( rBmpEx.GetMask() );
312 "::dxcanvas::tools::bitmapFromVCLBitmapEx(): "
313 "Unable to acquire read access to mask" );
315 ENSURE_OR_THROW( pMaskReadAccess->GetScanlineFormat() == ScanlineFormat::N1BitMsbPal,
316 "::dxcanvas::tools::bitmapFromVCLBitmapEx(): "
317 "Unsupported mask scanline format" );
321 const int nMask( 1 );
322 const int nInitialBit(7);
323 sal_uInt8* pCurrOutput(aBmpData.maBitmapData.data());
330 const BitmapColor& rCol0( pMaskReadAccess->GetPaletteColor( 0 ) );
331 const BitmapColor& rCol1( pMaskReadAccess->GetPaletteColor( 1 ) );
338 aColorMap[0] = rCol1.GetRed();
339 aColorMap[1] = rCol0.GetRed();
341 for( y=0; y<nHeight; ++
y )
343 switch( pReadAccess->GetScanlineFormat() )
345 case ScanlineFormat::N8BitPal:
347 Scanline pScan = pReadAccess->GetScanline( y );
348 Scanline pMScan = pMaskReadAccess->GetScanline( y );
350 for( x=0, nCurrBit=nInitialBit; x<nWidth; ++
x )
352 aCol = pReadAccess->GetPaletteColor( *pScan++ );
354 *pCurrOutput++ = aCol.GetBlue();
355 *pCurrOutput++ = aCol.GetGreen();
356 *pCurrOutput++ = aCol.GetRed();
358 *pCurrOutput++ = aColorMap[ (pMScan[ (x & ~7) >> 3 ] >> nCurrBit ) & nMask ];
359 nCurrBit = ((nCurrBit - 1) % 8) & 7;
364 case ScanlineFormat::N24BitTcBgr:
366 Scanline pScan = pReadAccess->GetScanline( y );
367 Scanline pMScan = pMaskReadAccess->GetScanline( y );
369 for( x=0, nCurrBit=nInitialBit; x<nWidth; ++
x )
372 *pCurrOutput++ = *pScan++;
373 *pCurrOutput++ = *pScan++;
374 *pCurrOutput++ = *pScan++;
376 *pCurrOutput++ = aColorMap[ (pMScan[ (x & ~7) >> 3 ] >> nCurrBit ) & nMask ];
377 nCurrBit = ((nCurrBit - 1) % 8) & 7;
385 case ScanlineFormat::N1BitMsbPal:
386 case ScanlineFormat::N4BitMsnPal:
387 case ScanlineFormat::N32BitTcMask:
389 Scanline pMScan = pMaskReadAccess->GetScanline( y );
393 for( x=0, nCurrBit=nInitialBit; x<nWidth; ++
x )
396 aCol = pReadAccess->GetColor(y,x);
399 *pCurrOutput++ = aCol.GetBlue();
400 *pCurrOutput++ = aCol.GetGreen();
401 *pCurrOutput++ = aCol.GetRed();
403 *pCurrOutput++ = aColorMap[ (pMScan[ (x & ~7) >> 3 ] >> nCurrBit ) & nMask ];
404 nCurrBit = ((nCurrBit - 1) % 8) & 7;
409 case ScanlineFormat::N1BitLsbPal:
410 case ScanlineFormat::N4BitLsnPal:
411 case ScanlineFormat::N24BitTcRgb:
412 case ScanlineFormat::N32BitTcAbgr:
413 case ScanlineFormat::N32BitTcArgb:
414 case ScanlineFormat::N32BitTcBgra:
415 case ScanlineFormat::N32BitTcRgba:
418 "::dxcanvas::tools::bitmapFromVCLBitmapEx(): "
419 "Unexpected scanline format - has "
420 "WinSalBitmap::AcquireBuffer() changed?" );
428 bool drawVCLBitmapEx(
const std::shared_ptr< Gdiplus::Graphics >& rGraphics,
429 const ::BitmapEx& rBmpEx )
431 if( !rBmpEx.IsTransparent() )
433 Bitmap aBmp( rBmpEx.GetBitmap() );
434 return drawVCLBitmap( rGraphics, aBmp );
439 bitmapFromVCLBitmapEx( rBmpEx ) );
445 const uno::Reference< rendering::XBitmap >& xBitmap )
448 uno::Reference< rendering::XIntegerReadOnlyBitmap > xIntBmp(
449 xBitmap, uno::UNO_QUERY );
458 return drawVCLBitmapEx( rGraphics, aBmpEx );
BitmapReadAccess * AcquireReadAccess()
std::shared_ptr< ::cppcanvas::Bitmap > BitmapSharedPtr
bool GetSystemData(BitmapSystemData &rData) const
static void ReleaseAccess(BitmapInfoAccess *pAccess)
Gdiplus::BitmapData aBmpData
#define ENSURE_OR_THROW(c, m)