summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThorsten Behrens <tbehrens@suse.com>2012-03-07 00:34:52 +0100
committerTor Lillqvist <tlillqvist@suse.com>2012-03-19 08:31:08 +0200
commite5cf9610961b0f6978e15b2a81b0f9aa769e0298 (patch)
treec7cde5e8f616fdefac694fd7c24e2a4ad828b226
parent0ad246127fe8f9d788793ceb8dc327e25ef4a699 (diff)
Use transparency for gradients fdo#45219
vclcanvas has 1bpp alpha - so cut-off transparency at 98% This looks for all practical cases close enough to full alpha. (cherry picked from commit 3f5efa1e76e187070d412d102e4c057679065bcc) Signed-off-by: Tor Lillqvist <tlillqvist@suse.com>
-rw-r--r--canvas/source/vcl/canvashelper.cxx45
-rw-r--r--canvas/source/vcl/canvashelper_texturefill.cxx38
2 files changed, 42 insertions, 41 deletions
diff --git a/canvas/source/vcl/canvashelper.cxx b/canvas/source/vcl/canvashelper.cxx
index 5d4c40a31ceb..3649ccf88bb9 100644
--- a/canvas/source/vcl/canvashelper.cxx
+++ b/canvas/source/vcl/canvashelper.cxx
@@ -155,8 +155,9 @@ namespace vclcanvas
tools::OutDevStateKeeper aStateKeeper( mpProtectedOutDev );
rOutDev.EnableMapMode( sal_False );
- rOutDev.SetLineColor( COL_TRANSPARENT );
- rOutDev.SetFillColor( COL_TRANSPARENT );
+ rOutDev.SetLineColor( COL_WHITE );
+ rOutDev.SetFillColor( COL_WHITE );
+ rOutDev.SetClipRegion();
rOutDev.DrawRect( Rectangle( Point(),
rOutDev.GetOutputSizePixel()) );
@@ -166,8 +167,9 @@ namespace vclcanvas
rOutDev2.SetDrawMode( DRAWMODE_DEFAULT );
rOutDev2.EnableMapMode( sal_False );
- rOutDev2.SetLineColor( COL_TRANSPARENT );
- rOutDev2.SetFillColor( COL_TRANSPARENT );
+ rOutDev2.SetLineColor( COL_WHITE );
+ rOutDev2.SetFillColor( COL_WHITE );
+ rOutDev2.SetClipRegion();
rOutDev2.DrawRect( Rectangle( Point(),
rOutDev2.GetOutputSizePixel()) );
rOutDev2.SetDrawMode( DRAWMODE_BLACKLINE | DRAWMODE_BLACKFILL | DRAWMODE_BLACKTEXT |
@@ -500,19 +502,11 @@ namespace vclcanvas
if( mp2ndOutDev )
{
- // HACK. Normally, CanvasHelper does not care
- // about actually what mp2ndOutDev is...
- // well, here we do & assume a 1bpp target.
- if( nTransparency > 127 )
- {
- mp2ndOutDev->getOutDev().SetDrawMode( DRAWMODE_WHITELINE | DRAWMODE_WHITEFILL | DRAWMODE_WHITETEXT |
- DRAWMODE_WHITEGRADIENT | DRAWMODE_WHITEBITMAP );
- mp2ndOutDev->getOutDev().SetFillColor( COL_WHITE );
- mp2ndOutDev->getOutDev().DrawPolyPolygon( aPolyPoly );
- mp2ndOutDev->getOutDev().SetDrawMode( DRAWMODE_BLACKLINE | DRAWMODE_BLACKFILL | DRAWMODE_BLACKTEXT |
- DRAWMODE_BLACKGRADIENT | DRAWMODE_BLACKBITMAP );
- }
- else
+ // HACK. Normally, CanvasHelper does not care about
+ // actually what mp2ndOutDev is... well, here we do &
+ // assume a 1bpp target - everything beyond 97%
+ // transparency is fully transparent
+ if( nTransparency < 253 )
{
mp2ndOutDev->getOutDev().DrawPolyPolygon( aPolyPoly );
}
@@ -715,8 +709,25 @@ namespace vclcanvas
aBmpEx );
if( mp2ndOutDev )
+ {
+ // HACK. Normally, CanvasHelper does not care about
+ // actually what mp2ndOutDev is... well, here we do &
+ // assume a 1bpp target - everything beyond 97%
+ // transparency is fully transparent
+ if( aBmpEx.IsAlpha() )
+ {
+ Bitmap aMask( aBmpEx.GetAlpha().GetBitmap() );
+ aMask.MakeMono( 253 );
+ aBmpEx = BitmapEx( aBmpEx.GetBitmap(), aMask );
+ }
+ else if( aBmpEx.IsTransparent() )
+ {
+ aBmpEx = BitmapEx( aBmpEx.GetBitmap(), aBmpEx.GetMask() );
+ }
+
mp2ndOutDev->getOutDev().DrawBitmapEx( ::vcl::unotools::pointFromB2DPoint( aOutputPos ),
aBmpEx );
+ }
// Returning a cache object is not useful, the XBitmap
// itself serves this purpose
diff --git a/canvas/source/vcl/canvashelper_texturefill.cxx b/canvas/source/vcl/canvashelper_texturefill.cxx
index 325d2b6271bd..3811ebd2b021 100644
--- a/canvas/source/vcl/canvashelper_texturefill.cxx
+++ b/canvas/source/vcl/canvashelper_texturefill.cxx
@@ -555,8 +555,6 @@ namespace vclcanvas
const rendering::Texture& texture,
int nTransparency )
{
- (void)nTransparency;
-
// TODO(T2): It is maybe necessary to lock here, should
// maGradientPoly someday cease to be const. But then, beware of
// deadlocks, canvashelper calls this method with locked own
@@ -606,18 +604,14 @@ namespace vclcanvas
false );
rOutDev.Pop();
- if( p2ndOutDev )
+ if( p2ndOutDev && nTransparency < 253 )
{
- p2ndOutDev->Push( PUSH_CLIPREGION );
- p2ndOutDev->IntersectClipRegion( aPolygonDeviceRectOrig );
- doGradientFill( *p2ndOutDev,
- rValues,
- rColors,
- aTotalTransform,
- aPolygonDeviceRectOrig,
- nStepCount,
- false );
- p2ndOutDev->Pop();
+ // HACK. Normally, CanvasHelper does not care about
+ // actually what mp2ndOutDev is... well, here we do &
+ // assume a 1bpp target - everything beyond 97%
+ // transparency is fully transparent
+ p2ndOutDev->SetFillColor( COL_BLACK );
+ p2ndOutDev->DrawRect( aPolygonDeviceRectOrig );
}
}
else
@@ -637,18 +631,14 @@ namespace vclcanvas
false );
rOutDev.Pop();
- if( p2ndOutDev )
+ if( p2ndOutDev && nTransparency < 253 )
{
- p2ndOutDev->Push( PUSH_CLIPREGION );
- p2ndOutDev->SetClipRegion( aPolyClipRegion );
- doGradientFill( *p2ndOutDev,
- rValues,
- rColors,
- aTotalTransform,
- aPolygonDeviceRectOrig,
- nStepCount,
- false );
- p2ndOutDev->Pop();
+ // HACK. Normally, CanvasHelper does not care about
+ // actually what mp2ndOutDev is... well, here we do &
+ // assume a 1bpp target - everything beyond 97%
+ // transparency is fully transparent
+ p2ndOutDev->SetFillColor( COL_BLACK );
+ p2ndOutDev->DrawPolyPolygon( rPoly );
}
}
#else // TODO: remove once doing the XOR-trick in the canvas-layer becomes redundant