[Libreoffice-commits] core.git: 3 commits - vcl/source

Chris Sherlock chris.sherlock79 at gmail.com
Sat Apr 12 06:48:18 PDT 2014


 vcl/source/gdi/outdev4.cxx |  203 ++++++++++++++-------------------------------
 1 file changed, 64 insertions(+), 139 deletions(-)

New commits:
commit 30e0e6ff95417295874e23376f83fc5ff26bf3d7
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date:   Sat Apr 12 21:09:51 2014 +1000

    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

diff --git a/vcl/source/gdi/outdev4.cxx b/vcl/source/gdi/outdev4.cxx
index 794c6d7..6b76788 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 )
commit 555d49bf1a5d299d45a3b29fa555efcd4e2c917a
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date:   Sat Apr 12 20:47:29 2014 +1000

    Detect if polypolygon is a rectangle in DrawGradient
    
    If the polypolygon that we use for DrawGradient is a rectangle, then we
    need to 1) expand the gradient rectangle to avoid missing lines on the
    right and bottom edge, and 2) we should pass NULL as the clipping
    parameter for ImplDrawLinearGradient and ImplDrawComplexGradient.
    
    Change-Id: I8d8289ace069b5c500db59d1a2addfcea8388dfb

diff --git a/vcl/source/gdi/outdev4.cxx b/vcl/source/gdi/outdev4.cxx
index fde2790..794c6d7 100644
--- a/vcl/source/gdi/outdev4.cxx
+++ b/vcl/source/gdi/outdev4.cxx
@@ -760,10 +760,22 @@ void OutputDevice::ClipAndDrawGradient ( Gradient &rGradient, const PolyPolygon
                 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 );
+                    ImplDrawLinearGradient( aRect, rGradient, false, aClipPolyPoly.IsRect() ? NULL : &aClipPolyPoly );
                 else
-                    ImplDrawComplexGradient( aRect, rGradient, false, &aClipPolyPoly );
+                    ImplDrawComplexGradient( aRect, rGradient, false, aClipPolyPoly.IsRect() ? NULL : &aClipPolyPoly );
             }
 
             Pop();
commit 4981bb9eed1a51f8ce54d01c37bfb5b5d46f0637
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date:   Sat Apr 12 12:11:37 2014 +1000

    Reduce the clip region in ClipAndDrawGradient
    
    We should reduce OutputDevice's clipping region to the bounds of the
    polypolygon. To do this we run OutputDevice::Push(PUSH_CLIPREGION)
    to have it set the clip region of the device, then intersect the clip
    region of the device with the bounding rectangle.
    
    Change-Id: I58ff5d1def1eca3c1213c7fd2d6a7205b70cdd01

diff --git a/vcl/source/gdi/outdev4.cxx b/vcl/source/gdi/outdev4.cxx
index ed149c6..fde2790 100644
--- a/vcl/source/gdi/outdev4.cxx
+++ b/vcl/source/gdi/outdev4.cxx
@@ -736,6 +736,10 @@ void OutputDevice::ClipAndDrawGradient ( Gradient &rGradient, const PolyPolygon
             if( !mpGraphics && !ImplGetGraphics() )
                 return;
 
+            // secure clip region
+            Push( PUSH_CLIPREGION );
+            IntersectClipRegion( aBoundRect );
+
             if( mbInitClipRegion )
                 ImplInitClipRegion();
 
@@ -761,6 +765,8 @@ void OutputDevice::ClipAndDrawGradient ( Gradient &rGradient, const PolyPolygon
                 else
                     ImplDrawComplexGradient( aRect, rGradient, false, &aClipPolyPoly );
             }
+
+            Pop();
         }
     }
 }


More information about the Libreoffice-commits mailing list