Kaydet (Commit) 30e0e6ff authored tarafından Chris Sherlock's avatar Chris Sherlock

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
üst 555d49bf
......@@ -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 )
......
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