summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Sherlock <chris.sherlock79@gmail.com>2014-04-12 21:09:51 +1000
committerChris Sherlock <chris.sherlock79@gmail.com>2014-04-12 23:46:01 +1000
commit30e0e6ff95417295874e23376f83fc5ff26bf3d7 (patch)
tree3289ba6342cc14e208d26fe5dc446c756890b283
parent555d49bf1a5d299d45a3b29fa555efcd4e2c917a (diff)
Unify DrawGradient functions in OutputDevice
Turns out that the two versions of DrawGradient in OutputDevice are almost exactly the same in every way, except one deals with a rectangle and the other with a PolyPolygon. So I just convert the Rectangle into a PolyPolygon and use the PolyPolygon function. Now that the functions are unified, the need for a seperate function to clip and draw the gradient is no longer really required, so I've merged this back into DrawGradient. Change-Id: I94d4af1bb7dd900495672f0c0481dc9a1083ff67
-rw-r--r--vcl/source/gdi/outdev4.cxx221
1 files changed, 64 insertions, 157 deletions
diff --git a/vcl/source/gdi/outdev4.cxx b/vcl/source/gdi/outdev4.cxx
index 794c6d7108a1..6b76788b8227 100644
--- a/vcl/source/gdi/outdev4.cxx
+++ b/vcl/source/gdi/outdev4.cxx
@@ -606,100 +606,11 @@ void OutputDevice::SetGrayscaleColors( Gradient &rGradient )
void OutputDevice::DrawGradient( const Rectangle& rRect,
const Gradient& rGradient )
{
- if ( mnDrawMode & DRAWMODE_NOGRADIENT )
- return; // nothing to draw!
-
- if ( mbInitClipRegion )
- ImplInitClipRegion();
-
- if ( mbOutputClipped )
- return;
-
- if ( !rRect.IsEmpty() )
- {
- if ( mnDrawMode & ( DRAWMODE_BLACKGRADIENT | DRAWMODE_WHITEGRADIENT | DRAWMODE_SETTINGSGRADIENT) )
- {
- Color aColor = GetSingleColorGradientFill();
-
- Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
- SetLineColor( aColor );
- SetFillColor( aColor );
- DrawRect( rRect );
- Pop();
- return;
- }
-
- Gradient aGradient( rGradient );
-
- if ( mnDrawMode & ( DRAWMODE_GRAYGRADIENT | DRAWMODE_GHOSTEDGRADIENT ) )
- {
- SetGrayscaleColors( aGradient );
- }
-
- if( mpMetaFile )
- mpMetaFile->AddAction( new MetaGradientAction( rRect, aGradient ) );
-
- if( !IsDeviceOutputNecessary() || ImplIsRecordLayout() )
- return;
-
- if ( !Rectangle( PixelToLogic( Point() ), GetOutputSize() ).IsEmpty() )
- {
- // convert rectangle to pixels
- Rectangle aRect( ImplLogicToDevicePixel( rRect ) );
- aRect.Justify();
-
- // do nothing if the rectangle is empty
- if ( !aRect.IsEmpty() )
- {
- // we need a graphics
- if ( !mpGraphics && !ImplGetGraphics() )
- return;
-
- // secure clip region
- Push( PUSH_CLIPREGION );
- IntersectClipRegion( rRect );
-
- // because we draw with no border line, we have to expand gradient
- // rect to avoid missing lines on the right and bottom edge
- aRect.Left()--;
- aRect.Top()--;
- aRect.Right()++;
- aRect.Bottom()++;
-
- if ( mbInitClipRegion )
- ImplInitClipRegion();
-
- if ( !mbOutputClipped )
- {
- // gradients are drawn without border
- if ( mbLineColor || mbInitLineColor )
- {
- mpGraphics->SetLineColor();
- mbInitLineColor = true;
- }
-
- mbInitFillColor = true;
-
- // calculate step count if necessary
- if ( !aGradient.GetSteps() )
- aGradient.SetSteps( GRADIENT_DEFAULT_STEPCOUNT );
-
- if( aGradient.GetStyle() == GradientStyle_LINEAR || aGradient.GetStyle() == GradientStyle_AXIAL )
- ImplDrawLinearGradient( aRect, aGradient, false, NULL );
- else
- ImplDrawComplexGradient( aRect, aGradient, false, NULL );
- }
-
- Pop();
- }
- }
- }
+ // Convert rectangle to a PolyPolygon by first converting to a Polygon
+ Polygon aPolygon ( rRect );
+ PolyPolygon aPolyPoly ( aPolygon );
- if( mpAlphaVDev )
- {
- // #i32109#: Make gradient area opaque
- mpAlphaVDev->ImplFillOpaqueRectangle( rRect );
- }
+ DrawGradient ( aPolyPoly, rGradient );
}
void OutputDevice::ClipAndDrawGradientMetafile ( const Gradient &rGradient, const PolyPolygon &rPolyPoly )
@@ -720,69 +631,6 @@ void OutputDevice::ClipAndDrawGradientMetafile ( const Gradient &rGradient, cons
EnableOutput( bOldOutput );
}
-void OutputDevice::ClipAndDrawGradient ( Gradient &rGradient, const PolyPolygon &rPolyPoly )
-{
- const Rectangle aBoundRect( rPolyPoly.GetBoundRect() );
-
- if( !Rectangle( PixelToLogic( Point() ), GetOutputSize() ).IsEmpty() )
- {
- // convert rectangle to pixels
- Rectangle aRect( ImplLogicToDevicePixel( aBoundRect ) );
- aRect.Justify();
-
- // do nothing if the rectangle is empty
- if ( !aRect.IsEmpty() )
- {
- if( !mpGraphics && !ImplGetGraphics() )
- return;
-
- // secure clip region
- Push( PUSH_CLIPREGION );
- IntersectClipRegion( aBoundRect );
-
- if( mbInitClipRegion )
- ImplInitClipRegion();
-
- if( !mbOutputClipped )
- {
- PolyPolygon aClipPolyPoly( ImplLogicToDevicePixel( rPolyPoly ) );
-
- // draw gradients without border
- if( mbLineColor || mbInitLineColor )
- {
- mpGraphics->SetLineColor();
- mbInitLineColor = true;
- }
-
- mbInitFillColor = true;
-
- // calculate step count if necessary
- if ( !rGradient.GetSteps() )
- rGradient.SetSteps( GRADIENT_DEFAULT_STEPCOUNT );
-
- if ( rPolyPoly.IsRect() )
- {
- // because we draw with no border line, we have to expand gradient
- // rect to avoid missing lines on the right and bottom edge
- aRect.Left()--;
- aRect.Top()--;
- aRect.Right()++;
- aRect.Bottom()++;
- }
-
- // if the clipping polypolygon is a rectangle, then it's the same size as the bounding of the
- // polypolygon, so pass in a NULL for the clipping parameter
- if( rGradient.GetStyle() == GradientStyle_LINEAR || rGradient.GetStyle() == GradientStyle_AXIAL )
- ImplDrawLinearGradient( aRect, rGradient, false, aClipPolyPoly.IsRect() ? NULL : &aClipPolyPoly );
- else
- ImplDrawComplexGradient( aRect, rGradient, false, aClipPolyPoly.IsRect() ? NULL : &aClipPolyPoly );
- }
-
- Pop();
- }
- }
-}
-
void OutputDevice::DrawGradient( const PolyPolygon& rPolyPoly,
const Gradient& rGradient )
{
@@ -837,7 +685,66 @@ void OutputDevice::DrawGradient( const PolyPolygon& rPolyPoly,
if( !IsDeviceOutputNecessary() || ImplIsRecordLayout() )
return;
- ClipAndDrawGradient ( aGradient, rPolyPoly );
+ // Clip and then draw the gradient
+ if( !Rectangle( PixelToLogic( Point() ), GetOutputSize() ).IsEmpty() )
+ {
+ const Rectangle aBoundRect( rPolyPoly.GetBoundRect() );
+
+ // convert rectangle to pixels
+ Rectangle aRect( ImplLogicToDevicePixel( aBoundRect ) );
+ aRect.Justify();
+
+ // do nothing if the rectangle is empty
+ if ( !aRect.IsEmpty() )
+ {
+ if( !mpGraphics && !ImplGetGraphics() )
+ return;
+
+ // secure clip region
+ Push( PUSH_CLIPREGION );
+ IntersectClipRegion( aBoundRect );
+
+ if( mbInitClipRegion )
+ ImplInitClipRegion();
+
+ if( !mbOutputClipped )
+ {
+ PolyPolygon aClipPolyPoly( ImplLogicToDevicePixel( rPolyPoly ) );
+
+ // draw gradients without border
+ if( mbLineColor || mbInitLineColor )
+ {
+ mpGraphics->SetLineColor();
+ mbInitLineColor = true;
+ }
+
+ mbInitFillColor = true;
+
+ // calculate step count if necessary
+ if ( !aGradient.GetSteps() )
+ aGradient.SetSteps( GRADIENT_DEFAULT_STEPCOUNT );
+
+ if ( rPolyPoly.IsRect() )
+ {
+ // because we draw with no border line, we have to expand gradient
+ // rect to avoid missing lines on the right and bottom edge
+ aRect.Left()--;
+ aRect.Top()--;
+ aRect.Right()++;
+ aRect.Bottom()++;
+ }
+
+ // if the clipping polypolygon is a rectangle, then it's the same size as the bounding of the
+ // polypolygon, so pass in a NULL for the clipping parameter
+ if( aGradient.GetStyle() == GradientStyle_LINEAR || rGradient.GetStyle() == GradientStyle_AXIAL )
+ ImplDrawLinearGradient( aRect, aGradient, false, aClipPolyPoly.IsRect() ? NULL : &aClipPolyPoly );
+ else
+ ImplDrawComplexGradient( aRect, aGradient, false, aClipPolyPoly.IsRect() ? NULL : &aClipPolyPoly );
+ }
+
+ Pop();
+ }
+ }
}
if( mpAlphaVDev )