[Libreoffice-commits] .: vcl/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Tue Dec 11 03:54:38 PST 2012


 vcl/source/gdi/gradient.cxx |    7 -------
 vcl/source/gdi/outdev4.cxx  |   21 ++++++++++++++++-----
 2 files changed, 16 insertions(+), 12 deletions(-)

New commits:
commit 055fca04a4e00b14e68fa5860b417cb25e471299
Author: Michael Meeks <michael.meeks at suse.com>
Date:   Tue Dec 11 11:28:30 2012 +0000

    fdo#42553 - fix square gradient rendering by vcl.

diff --git a/vcl/source/gdi/gradient.cxx b/vcl/source/gdi/gradient.cxx
index 5a776e3..06b3e48 100644
--- a/vcl/source/gdi/gradient.cxx
+++ b/vcl/source/gdi/gradient.cxx
@@ -286,13 +286,6 @@ void Gradient::GetBoundRect( const Rectangle& rRect, Rectangle& rBoundRect, Poin
             aSize.Width() = (long)( 0.5 + (double) aSize.Width()  * 1.4142 );
             aSize.Height() = (long)( 0.5 + (double) aSize.Height() * 1.4142 );
         }
-        else if( GetStyle() == GradientStyle_SQUARE )
-        {
-            if ( aSize.Width() > aSize.Height() )
-                aSize.Height() = aSize.Width();
-            else
-                aSize.Width() = aSize.Height();
-        }
 
         // neue Mittelpunkte berechnen
         long    nZWidth = aRect.GetWidth() * (long) GetOfsX() / 100;
diff --git a/vcl/source/gdi/outdev4.cxx b/vcl/source/gdi/outdev4.cxx
index 8096924..4e895eb 100644
--- a/vcl/source/gdi/outdev4.cxx
+++ b/vcl/source/gdi/outdev4.cxx
@@ -481,7 +481,18 @@ void OutputDevice::ImplDrawComplexGradient( const Rectangle& rRect,
     double  fScanTop = aRect.Top();
     double  fScanRight = aRect.Right();
     double  fScanBottom = aRect.Bottom();
-    double  fScanInc = (double) nMinRect / (double) nSteps * 0.5;
+    double  fScanIncX = (double) aRect.GetWidth() / (double) nSteps * 0.5;
+    double  fScanIncY = (double) aRect.GetHeight() / (double) nSteps * 0.5;
+
+    // all gradients are rendered as nested rectangles which shrink
+    // equally in each dimension - except for 'square' gradients
+    // which shrink to a central vertex but are not per-se square.
+    if( rGradient.GetStyle() != GradientStyle_SQUARE )
+    {
+        fScanIncY = std::min( fScanIncY, fScanIncX );
+        fScanIncX = fScanIncY;
+    }
+
     sal_uInt8   nRed = (sal_uInt8) nStartRed, nGreen = (sal_uInt8) nStartGreen, nBlue = (sal_uInt8) nStartBlue;
     bool    bPaintLastPolygon( false ); // #107349# Paint last polygon only if loop has generated any output
 
@@ -512,10 +523,10 @@ void OutputDevice::ImplDrawComplexGradient( const Rectangle& rRect,
     for( long i = 1; i < nSteps; i++ )
     {
         // neues Polygon berechnen
-        aRect.Left() = (long)( fScanLeft += fScanInc );
-        aRect.Top() = (long)( fScanTop += fScanInc );
-        aRect.Right() = (long)( fScanRight -= fScanInc );
-        aRect.Bottom() = (long)( fScanBottom -= fScanInc );
+        aRect.Left() = (long)( fScanLeft += fScanIncX );
+        aRect.Top() = (long)( fScanTop += fScanIncY );
+        aRect.Right() = (long)( fScanRight -= fScanIncX );
+        aRect.Bottom() = (long)( fScanBottom -= fScanIncY );
 
         if( ( aRect.GetWidth() < 2 ) || ( aRect.GetHeight() < 2 ) )
             break;


More information about the Libreoffice-commits mailing list