Kaydet (Commit) 2a67712f authored tarafından Chris Sherlock's avatar Chris Sherlock

Refactor VCL bitmap code

Turns out that all bitmap code eventually calls on ImplDrawBitmap and
ImplDrawBitmapEx, which is called by a version with the same function
signature but without a type parameter. If you make that sal_uLong
parameter a default parameter, you can remove ImplDrawBitmap/Ex and just
call on that version of DrawBitmap/Ex.

Change-Id: Ifd75561bb824b3941c2cf700984ca80e0b851bd3
üst f596ee9a
...@@ -20,6 +20,9 @@ ...@@ -20,6 +20,9 @@
#ifndef INCLUDED_VCL_OUTDEV_HXX #ifndef INCLUDED_VCL_OUTDEV_HXX
#define INCLUDED_VCL_OUTDEV_HXX #define INCLUDED_VCL_OUTDEV_HXX
#define META_BMPSCALEPART_ACTION (118)
#define META_BMPEXSCALEPART_ACTION (121)
#include <tools/gen.hxx> #include <tools/gen.hxx>
#include <tools/solar.h> #include <tools/solar.h>
#include <vcl/dllapi.h> #include <vcl/dllapi.h>
...@@ -774,12 +777,6 @@ public: ...@@ -774,12 +777,6 @@ public:
*/ */
///@{ ///@{
SAL_DLLPRIVATE void ImplDrawOutDevDirect ( const OutputDevice* pSrcDev, SalTwoRect& rPosAry ); SAL_DLLPRIVATE void ImplDrawOutDevDirect ( const OutputDevice* pSrcDev, SalTwoRect& rPosAry );
SAL_DLLPRIVATE void ImplDrawBitmap ( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel,
const Bitmap& rBitmap, const sal_uLong nAction );
SAL_DLLPRIVATE void ImplDrawBitmapEx ( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel,
const BitmapEx& rBitmapEx, const sal_uLong nAction );
SAL_DLLPRIVATE void ImplDrawAlpha ( const Bitmap& rBmp, const AlphaMask& rAlpha, SAL_DLLPRIVATE void ImplDrawAlpha ( const Bitmap& rBmp, const AlphaMask& rAlpha,
const Point& rDestPt, const Size& rDestSize, const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel ); const Point& rSrcPtPixel, const Size& rSrcSizePixel );
...@@ -1111,7 +1108,8 @@ public: ...@@ -1111,7 +1108,8 @@ public:
const Bitmap& rBitmap ); const Bitmap& rBitmap );
void DrawBitmap( const Point& rDestPt, const Size& rDestSize, void DrawBitmap( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel, const Point& rSrcPtPixel, const Size& rSrcSizePixel,
const Bitmap& rBitmap ); const Bitmap& rBitmap, sal_uLong nAction = META_BMPSCALEPART_ACTION );
void DrawBitmapEx( const Point& rDestPt, void DrawBitmapEx( const Point& rDestPt,
const BitmapEx& rBitmapEx ); const BitmapEx& rBitmapEx );
...@@ -1119,7 +1117,7 @@ public: ...@@ -1119,7 +1117,7 @@ public:
const BitmapEx& rBitmapEx ); const BitmapEx& rBitmapEx );
void DrawBitmapEx( const Point& rDestPt, const Size& rDestSize, void DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel, const Point& rSrcPtPixel, const Size& rSrcSizePixel,
const BitmapEx& rBitmapEx ); const BitmapEx& rBitmapExi, sal_uLong nAction = META_BMPEXSCALEPART_ACTION );
/** Draw BitampEx transformed /** Draw BitampEx transformed
......
...@@ -43,54 +43,24 @@ ...@@ -43,54 +43,24 @@
void OutputDevice::DrawBitmap( const Point& rDestPt, const Bitmap& rBitmap ) void OutputDevice::DrawBitmap( const Point& rDestPt, const Bitmap& rBitmap )
{ {
if( ImplIsRecordLayout() )
return;
const Size aSizePix( rBitmap.GetSizePixel() ); const Size aSizePix( rBitmap.GetSizePixel() );
ImplDrawBitmap( rDestPt, PixelToLogic( aSizePix ), Point(), aSizePix, rBitmap, META_BMP_ACTION ); DrawBitmap( rDestPt, PixelToLogic( aSizePix ), Point(), aSizePix, rBitmap, META_BMP_ACTION );
if( mpAlphaVDev )
{
// #i32109#: Make bitmap area opaque
mpAlphaVDev->ImplFillOpaqueRectangle( Rectangle(rDestPt, PixelToLogic( aSizePix )) );
}
} }
void OutputDevice::DrawBitmap( const Point& rDestPt, const Size& rDestSize, const Bitmap& rBitmap ) void OutputDevice::DrawBitmap( const Point& rDestPt, const Size& rDestSize, const Bitmap& rBitmap )
{ {
if( ImplIsRecordLayout() ) DrawBitmap( rDestPt, rDestSize, Point(), rBitmap.GetSizePixel(), rBitmap, META_BMPSCALE_ACTION );
return;
ImplDrawBitmap( rDestPt, rDestSize, Point(), rBitmap.GetSizePixel(), rBitmap, META_BMPSCALE_ACTION );
if( mpAlphaVDev )
{
// #i32109#: Make bitmap area opaque
mpAlphaVDev->ImplFillOpaqueRectangle( Rectangle(rDestPt, rDestSize) );
}
} }
void OutputDevice::DrawBitmap( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel,
const Bitmap& rBitmap )
{
if( ImplIsRecordLayout() )
return;
ImplDrawBitmap( rDestPt, rDestSize, rSrcPtPixel, rSrcSizePixel, rBitmap, META_BMPSCALEPART_ACTION );
if( mpAlphaVDev )
{
// #i32109#: Make bitmap area opaque
mpAlphaVDev->ImplFillOpaqueRectangle( Rectangle(rDestPt, rDestSize) );
}
}
void OutputDevice::ImplDrawBitmap( const Point& rDestPt, const Size& rDestSize, void OutputDevice::DrawBitmap( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel, const Point& rSrcPtPixel, const Size& rSrcSizePixel,
const Bitmap& rBitmap, const sal_uLong nAction ) const Bitmap& rBitmap, const sal_uLong nAction )
{ {
if( ImplIsRecordLayout() )
return;
if ( ( mnDrawMode & DRAWMODE_NOBITMAP ) ) if ( ( mnDrawMode & DRAWMODE_NOBITMAP ) )
{ {
return; return;
...@@ -183,6 +153,12 @@ void OutputDevice::ImplDrawBitmap( const Point& rDestPt, const Size& rDestSize, ...@@ -183,6 +153,12 @@ void OutputDevice::ImplDrawBitmap( const Point& rDestPt, const Size& rDestSize,
} }
} }
} }
if( mpAlphaVDev )
{
// #i32109#: Make bitmap area opaque
mpAlphaVDev->ImplFillOpaqueRectangle( Rectangle(rDestPt, rDestSize) );
}
} }
void OutputDevice::ScaleBitmap (Bitmap &rBmp, SalTwoRect &rPosAry) void OutputDevice::ScaleBitmap (Bitmap &rBmp, SalTwoRect &rPosAry)
...@@ -212,7 +188,7 @@ void OutputDevice::DrawBitmapEx( const Point& rDestPt, ...@@ -212,7 +188,7 @@ void OutputDevice::DrawBitmapEx( const Point& rDestPt,
else else
{ {
const Size aSizePix( rBitmapEx.GetSizePixel() ); const Size aSizePix( rBitmapEx.GetSizePixel() );
ImplDrawBitmapEx( rDestPt, PixelToLogic( aSizePix ), Point(), aSizePix, rBitmapEx, META_BMPEX_ACTION ); DrawBitmapEx( rDestPt, PixelToLogic( aSizePix ), Point(), aSizePix, rBitmapEx, META_BMPEX_ACTION );
} }
} }
...@@ -228,14 +204,16 @@ void OutputDevice::DrawBitmapEx( const Point& rDestPt, const Size& rDestSize, ...@@ -228,14 +204,16 @@ void OutputDevice::DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
} }
else else
{ {
ImplDrawBitmapEx( rDestPt, rDestSize, Point(), rBitmapEx.GetSizePixel(), rBitmapEx, META_BMPEXSCALE_ACTION ); DrawBitmapEx( rDestPt, rDestSize, Point(), rBitmapEx.GetSizePixel(), rBitmapEx, META_BMPEXSCALE_ACTION );
} }
} }
void OutputDevice::DrawBitmapEx( const Point& rDestPt, const Size& rDestSize, void OutputDevice::DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel, const Point& rSrcPtPixel, const Size& rSrcSizePixel,
const BitmapEx& rBitmapEx ) const BitmapEx& rBitmapEx, const sal_uLong nAction )
{ {
if( ImplIsRecordLayout() ) if( ImplIsRecordLayout() )
return; return;
...@@ -245,10 +223,84 @@ void OutputDevice::DrawBitmapEx( const Point& rDestPt, const Size& rDestSize, ...@@ -245,10 +223,84 @@ void OutputDevice::DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
} }
else else
{ {
ImplDrawBitmapEx( rDestPt, rDestSize, rSrcPtPixel, rSrcSizePixel, rBitmapEx, META_BMPEXSCALEPART_ACTION ); if ( mnDrawMode & DRAWMODE_NOBITMAP )
return;
if ( ROP_INVERT == meRasterOp )
{
DrawRect( Rectangle( rDestPt, rDestSize ) );
return;
}
BitmapEx aBmpEx( rBitmapEx );
if ( mnDrawMode & ( DRAWMODE_BLACKBITMAP | DRAWMODE_WHITEBITMAP |
DRAWMODE_GRAYBITMAP | DRAWMODE_GHOSTEDBITMAP ) )
{
if ( mnDrawMode & ( DRAWMODE_BLACKBITMAP | DRAWMODE_WHITEBITMAP ) )
{
Bitmap aColorBmp( aBmpEx.GetSizePixel(), ( mnDrawMode & DRAWMODE_GHOSTEDBITMAP ) ? 4 : 1 );
sal_uInt8 cCmpVal;
if ( mnDrawMode & DRAWMODE_BLACKBITMAP )
cCmpVal = ( mnDrawMode & DRAWMODE_GHOSTEDBITMAP ) ? 0x80 : 0;
else
cCmpVal = 255;
aColorBmp.Erase( Color( cCmpVal, cCmpVal, cCmpVal ) );
if( aBmpEx.IsAlpha() )
{
// Create one-bit mask out of alpha channel, by
// thresholding it at alpha=0.5. As
// DRAWMODE_BLACK/WHITEBITMAP requires monochrome
// output, having alpha-induced grey levels is not
// acceptable.
Bitmap aMask( aBmpEx.GetAlpha().GetBitmap() );
aMask.MakeMono( 129 );
aBmpEx = BitmapEx( aColorBmp, aMask );
}
else
{
aBmpEx = BitmapEx( aColorBmp, aBmpEx.GetMask() );
}
}
else if( !!aBmpEx )
{
if ( mnDrawMode & DRAWMODE_GRAYBITMAP )
aBmpEx.Convert( BMP_CONVERSION_8BIT_GREYS );
if ( mnDrawMode & DRAWMODE_GHOSTEDBITMAP )
aBmpEx.Convert( BMP_CONVERSION_GHOSTED );
}
}
if ( mpMetaFile )
{
switch( nAction )
{
case( META_BMPEX_ACTION ):
mpMetaFile->AddAction( new MetaBmpExAction( rDestPt, aBmpEx ) );
break;
case( META_BMPEXSCALE_ACTION ):
mpMetaFile->AddAction( new MetaBmpExScaleAction( rDestPt, rDestSize, aBmpEx ) );
break;
case( META_BMPEXSCALEPART_ACTION ):
mpMetaFile->AddAction( new MetaBmpExScalePartAction( rDestPt, rDestSize,
rSrcPtPixel, rSrcSizePixel, aBmpEx ) );
break;
}
}
OUTDEV_INIT();
DrawDeviceBitmap( rDestPt, rDestSize, rSrcPtPixel, rSrcSizePixel, aBmpEx );
} }
} }
bool OutputDevice::DrawTransformBitmapExDirect( bool OutputDevice::DrawTransformBitmapExDirect(
const basegfx::B2DHomMatrix& aFullTransform, const basegfx::B2DHomMatrix& aFullTransform,
const BitmapEx& rBitmapEx) const BitmapEx& rBitmapEx)
...@@ -505,88 +557,6 @@ void OutputDevice::DrawTransformedBitmapEx( ...@@ -505,88 +557,6 @@ void OutputDevice::DrawTransformedBitmapEx(
} }
} }
void OutputDevice::ImplDrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel,
const BitmapEx& rBitmapEx, const sal_uLong nAction )
{
OSL_ENSURE(TRANSPARENT_NONE != rBitmapEx.GetTransparentType(), "ImplDrawBitmapEx not needed, no transparency in BitmapEx (!)");
if ( mnDrawMode & DRAWMODE_NOBITMAP )
return;
if ( ROP_INVERT == meRasterOp )
{
DrawRect( Rectangle( rDestPt, rDestSize ) );
return;
}
BitmapEx aBmpEx( rBitmapEx );
if ( mnDrawMode & ( DRAWMODE_BLACKBITMAP | DRAWMODE_WHITEBITMAP |
DRAWMODE_GRAYBITMAP | DRAWMODE_GHOSTEDBITMAP ) )
{
if ( mnDrawMode & ( DRAWMODE_BLACKBITMAP | DRAWMODE_WHITEBITMAP ) )
{
Bitmap aColorBmp( aBmpEx.GetSizePixel(), ( mnDrawMode & DRAWMODE_GHOSTEDBITMAP ) ? 4 : 1 );
sal_uInt8 cCmpVal;
if ( mnDrawMode & DRAWMODE_BLACKBITMAP )
cCmpVal = ( mnDrawMode & DRAWMODE_GHOSTEDBITMAP ) ? 0x80 : 0;
else
cCmpVal = 255;
aColorBmp.Erase( Color( cCmpVal, cCmpVal, cCmpVal ) );
if( aBmpEx.IsAlpha() )
{
// Create one-bit mask out of alpha channel, by
// thresholding it at alpha=0.5. As
// DRAWMODE_BLACK/WHITEBITMAP requires monochrome
// output, having alpha-induced grey levels is not
// acceptable.
Bitmap aMask( aBmpEx.GetAlpha().GetBitmap() );
aMask.MakeMono( 129 );
aBmpEx = BitmapEx( aColorBmp, aMask );
}
else
{
aBmpEx = BitmapEx( aColorBmp, aBmpEx.GetMask() );
}
}
else if( !!aBmpEx )
{
if ( mnDrawMode & DRAWMODE_GRAYBITMAP )
aBmpEx.Convert( BMP_CONVERSION_8BIT_GREYS );
if ( mnDrawMode & DRAWMODE_GHOSTEDBITMAP )
aBmpEx.Convert( BMP_CONVERSION_GHOSTED );
}
}
if ( mpMetaFile )
{
switch( nAction )
{
case( META_BMPEX_ACTION ):
mpMetaFile->AddAction( new MetaBmpExAction( rDestPt, aBmpEx ) );
break;
case( META_BMPEXSCALE_ACTION ):
mpMetaFile->AddAction( new MetaBmpExScaleAction( rDestPt, rDestSize, aBmpEx ) );
break;
case( META_BMPEXSCALEPART_ACTION ):
mpMetaFile->AddAction( new MetaBmpExScalePartAction( rDestPt, rDestSize,
rSrcPtPixel, rSrcSizePixel, aBmpEx ) );
break;
}
}
OUTDEV_INIT();
DrawDeviceBitmap( rDestPt, rDestSize, rSrcPtPixel, rSrcSizePixel, aBmpEx );
}
void OutputDevice::DrawDeviceBitmap( const Point& rDestPt, const Size& rDestSize, void OutputDevice::DrawDeviceBitmap( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel, const Point& rSrcPtPixel, const Size& rSrcSizePixel,
BitmapEx& rBmpEx ) BitmapEx& rBmpEx )
......
...@@ -168,7 +168,7 @@ void OutputDevice::ImplPrintTransparent( const Bitmap& rBmp, const Bitmap& rMask ...@@ -168,7 +168,7 @@ void OutputDevice::ImplPrintTransparent( const Bitmap& rBmp, const Bitmap& rMask
Bitmap aBandBmp(aPaint); Bitmap aBandBmp(aPaint);
aBandBmp.Crop(*aRectIter); aBandBmp.Crop(*aRectIter);
ImplDrawBitmap(aMapPt, aMapSz, Point(), aBandBmp.GetSizePixel(), aBandBmp, META_BMPSCALEPART_ACTION); DrawBitmap(aMapPt, aMapSz, Point(), aBandBmp.GetSizePixel(), aBandBmp, META_BMPSCALEPART_ACTION);
} }
mbMap = bOldMap; mbMap = bOldMap;
......
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