Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index


Hi everybody,
my name's Matteo and this is my first contribution [attempt] to this wonderful piece of work, besides "spreading the word". The attached patch does a little code cleanup in Docuview::DrawSymbol function and its helper, reducing local variables and calls to "real" draw functions.
Please note that:
* the results of reworked code was not fully tested, since I really
  don't know were all of those symbols are drawn, but those that I was
  able to verify look OK to me;
* There were some inconsistencies in symbol size evaluation, I chose
  one approach but it could be not the best or correct one;
* There are still other cleanups that can be done in that code, but I
  would like to have some feedback before working on them. For example,
  this patch could include too many changes.
The attached patch is contributed under LGPL3+/MPL1.1 license.

Ciao
Matteo
From f9427c431d2bd7160058ba85ab9cb7b6436a271c Mon Sep 17 00:00:00 2001
From: Matteo Casalin <matteo.casalin@poste.it>
Date: Sun, 13 Nov 2011 19:19:27 +0100
Subject: [PATCH] Decoview code cleanup

Fixed DrawSymbol color selection
Cleaned up many ImplDrawSymbol cases, reducing number of calls to drawing functions
Removed unused local variables in ImplDrawSymbol
Translated some comments from German to English
---
 vcl/source/window/decoview.cxx |  403 ++++++++++++++++-----------------------
 1 files changed, 165 insertions(+), 238 deletions(-)

diff --git a/vcl/source/window/decoview.cxx b/vcl/source/window/decoview.cxx
index ab61741..fd5eeee 100644
--- a/vcl/source/window/decoview.cxx
+++ b/vcl/source/window/decoview.cxx
@@ -50,10 +50,6 @@ static void ImplDrawSymbol( OutputDevice* pDev, const Rectangle& rRect,
 {
     // Groessen vorberechnen
     long    nMin    = Min( rRect.GetWidth(), rRect.GetHeight() );
-    long    nSize   = nMin;
-
-    if ( nMin & 0x01 )
-        nMin--;
     Point   aCenter = rRect.Center();
     long    nCenterX = aCenter.X();
     long    nCenterY = aCenter.Y();
@@ -63,149 +59,107 @@ static void ImplDrawSymbol( OutputDevice* pDev, const Rectangle& rRect,
     long    nTop;
     long    nRight;
     long    nBottom;
-    long    nTemp;
-    long    i;
+
+    const bool bMinSideIsOdd = nMin & 1;
 
     switch ( eType )
     {
         case SYMBOL_ARROW_UP:
+            if ( !bMinSideIsOdd )
             {
-            if ( !(nMin & 0x01) )
-            {
-                n2--;
-                n4--;
+                // Make odd size for spearhead
+                n4 = --n2 / 2;
             }
             nTop = nCenterY-n2;
-            nBottom = nCenterY;
-            pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
-            i = 1;
-            while ( i <= n2 )
+            pDev->DrawPixel( Point( nCenterX, nTop ) );
+            for ( long i = 1; i <= n2; ++i )
             {
                 nTop++;
-                nTemp = nCenterX-i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                nTemp = nCenterX+i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                i++;
-            }
-            pDev->DrawRect( Rectangle( nCenterX-n4, nBottom,
-                                       nCenterX+n4, nBottom+n2 ) );
+                pDev->DrawRect( Rectangle (Point( nCenterX-i, nTop ),
+                                Point( nCenterX+i, nTop ) ) );
             }
+            pDev->DrawRect( Rectangle( nCenterX-n4, nCenterY,
+                                       nCenterX+n4, nCenterY+n2 ) );
             break;
 
         case SYMBOL_ARROW_DOWN:
+            if ( !bMinSideIsOdd )
             {
-            if ( !(nMin & 0x01) )
-            {
-                n2--;
-                n4--;
+                // Make odd size for spearhead
+                n4 = --n2 / 2;
             }
-            nTop = nCenterY;
             nBottom = nCenterY+n2;
-            pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
-            i = 1;
-            while ( i <= n2 )
+            pDev->DrawPixel( Point( nCenterX, nBottom ) );
+            for ( long i = 1; i <= n2; ++i )
             {
                 nBottom--;
-                nTemp = nCenterX-i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                nTemp = nCenterX+i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                i++;
-            }
-            pDev->DrawRect( Rectangle( nCenterX-n4, nTop-n2,
-                                       nCenterX+n4, nTop ) );
+                pDev->DrawLine( Point( nCenterX-i, nBottom ),
+                                Point( nCenterX+i, nBottom ) );
             }
+            pDev->DrawRect( Rectangle( nCenterX-n4, nCenterY-n2,
+                                       nCenterX+n4, nCenterY ) );
             break;
 
         case SYMBOL_ARROW_LEFT:
+            if ( !bMinSideIsOdd )
             {
-            if ( !(nMin & 0x01) )
-            {
-                n2--;
-                n4--;
+                // Make odd size for spearhead
+                n4 = --n2 / 2;
             }
             nLeft = nCenterX-n2;
-            nRight = nCenterX;
-            pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
-            i = 1;
-            while ( i <= n2 )
+            pDev->DrawPixel( Point( nLeft, nCenterY ) );
+            for ( long i = 1; i <= n2; ++i )
             {
                 nLeft++;
-                nTemp = nCenterY-i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                nTemp = nCenterY+i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                i++;
-            }
-            pDev->DrawRect( Rectangle( nRight, nCenterY-n4,
-                                       nRight+n2, nCenterY+n4 ) );
+                pDev->DrawLine( Point( nLeft, nCenterY-i ),
+                                Point( nLeft, nCenterY+i ) );
             }
+            pDev->DrawRect( Rectangle( nCenterX, nCenterY-n4,
+                                       nCenterX+n2, nCenterY+n4 ) );
             break;
 
         case SYMBOL_ARROW_RIGHT:
+            if ( !bMinSideIsOdd )
             {
-            if ( !(nMin & 0x01) )
-            {
-                n2--;
-                n4--;
+                // Make odd size for spearhead
+                n4 = --n2 / 2;
             }
-            nLeft = nCenterX;
             nRight = nCenterX+n2;
-            pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
-            i = 1;
-            while ( i <= n2 )
+            pDev->DrawPixel( Point( nRight, nCenterY ) );
+            for ( long i = 1; i <= n2; ++i )
             {
                 nRight--;
-                nTemp = nCenterY-i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                nTemp = nCenterY+i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                i++;
-            }
-            pDev->DrawRect( Rectangle( nLeft-n2, nCenterY-n4,
-                                       nLeft, nCenterY+n4 ) );
+                pDev->DrawLine( Point( nRight, nCenterY-i ),
+                                Point( nRight, nCenterY+i ) );
             }
+            pDev->DrawRect( Rectangle( nCenterX-n2, nCenterY-n4,
+                                       nCenterX, nCenterY+n4 ) );
             break;
 
 
         case SYMBOL_SPIN_UP:
-            {
-            if ( !(nMin & 0x01) )
+            if ( !bMinSideIsOdd )
                 n2--;
             nTop = nCenterY-n4;
-            nBottom = nTop+n2;
-            pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
-            i = 1;
-            while ( i <= n2 )
+            pDev->DrawPixel( Point( nCenterX, nTop ) );
+            for ( long i = 1; i <= n2; ++i )
             {
                 nTop++;
-                nTemp = nCenterX-i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                nTemp = nCenterX+i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                i++;
-            }
+                pDev->DrawLine( Point( nCenterX-i, nTop ),
+                                Point( nCenterX+i, nTop ) );
             }
             break;
 
         case SYMBOL_SPIN_DOWN:
-            {
-            if ( !(nMin & 0x01) )
+            if ( !bMinSideIsOdd )
                 n2--;
-            nTop = nCenterY-n4;
-            nBottom = nTop+n2;
-            pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
-            i = 1;
-            while ( i <= n2 )
+            nBottom = nCenterY+n4;
+            pDev->DrawPixel( Point( nCenterX, nBottom ) );
+            for ( long i = 1; i <= n2; ++i )
             {
                 nBottom--;
-                nTemp = nCenterX-i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                nTemp = nCenterX+i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                i++;
-            }
+                pDev->DrawLine( Point( nCenterX-i, nBottom ),
+                                Point( nCenterX+i, nBottom ) );
             }
             break;
 
@@ -213,29 +167,21 @@ static void ImplDrawSymbol( OutputDevice* pDev, const Rectangle& rRect,
         case SYMBOL_FIRST:
         case SYMBOL_PREV:
         case SYMBOL_REVERSEPLAY:
-            {
-            if ( !(nMin & 0x01) )
+            if ( !bMinSideIsOdd )
                 n2--;
             nLeft = nCenterX-n4;
             if ( eType == SYMBOL_FIRST )
-                nLeft++;
-            nRight = nLeft+n2;
-            pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
-            i = 1;
-            while ( i <= n2 )
             {
+                pDev->DrawLine( Point( nLeft-1, nCenterY-n2 ),
+                                Point( nLeft-1, nCenterY+n2 ) );
                 nLeft++;
-                nTemp = nCenterY-i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                nTemp = nCenterY+i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                i++;
             }
-            if ( eType == SYMBOL_FIRST )
+            pDev->DrawPixel( Point( nLeft, nCenterY ) );
+            for ( long i = 1; i <= n2; ++i )
             {
-                pDev->DrawRect( Rectangle( nCenterX-n4-1, nCenterY-n2,
-                                           nCenterX-n4-1, nCenterY+n2 ) );
-            }
+                nLeft++;
+                pDev->DrawLine( Point( nLeft, nCenterY-i ),
+                                Point( nLeft, nCenterY+i ) );
             }
             break;
 
@@ -243,63 +189,73 @@ static void ImplDrawSymbol( OutputDevice* pDev, const Rectangle& rRect,
         case SYMBOL_LAST:
         case SYMBOL_NEXT:
         case SYMBOL_PLAY:
-            {
-            if ( !(nMin & 0x01) )
+            if ( !bMinSideIsOdd )
                 n2--;
-            nLeft = nCenterX-n4;
+            nRight = nCenterX+n4;
             if ( eType == SYMBOL_LAST )
-                nLeft--;
-            nRight = nLeft+n2;
-            pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
-            i = 1;
-            while ( i <= n2 )
             {
+                pDev->DrawLine( Point( nRight+1, nCenterY-n2 ),
+                                Point( nRight+1, nCenterY+n2 ) );
                 nRight--;
-                nTemp = nCenterY-i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                nTemp = nCenterY+i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                i++;
             }
-            if ( eType == SYMBOL_LAST )
+            pDev->DrawPixel( Point( nRight, nCenterY ) );
+            for ( long i = 1; i <= n2; ++i )
             {
-                pDev->DrawRect( Rectangle( nCenterX+n4+1, nCenterY-n2,
-                                           nCenterX+n4+1, nCenterY+n2 ) );
-            }
+                nRight--;
+                pDev->DrawLine( Point( nRight, nCenterY-i ),
+                                Point( nRight, nCenterY+i ) );
             }
             break;
 
         case SYMBOL_PAGEUP:
-        case SYMBOL_PAGEDOWN:
-        {
-            if ( !( nSize & 0x01 ))
+            if ( !bMinSideIsOdd )
             {
                 // An even rectangle size means we have to use a smaller size for
                 // our arrows as we want to use one pixel for the spearhead! Otherwise
                 // it will be clipped!
                 nCenterX++;
-                n2 = ( nMin-1 ) / 2;
-                n4 = ( nMin-1 ) / 4;
+                n4 = --n2 / 2;
             }
 
             nTop = nCenterY-n2;
-            nBottom = nCenterY-1;
-            pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
-            pDev->DrawRect( Rectangle( nCenterX, nTop+n2+1, nCenterX, nBottom+n2+1 ) );
-            i = 1;
-            while ( i < n2 )
+            nBottom = nCenterY+1;
+            pDev->DrawPixel( Point( nCenterX, nTop ) );
+            pDev->DrawPixel( Point( nCenterX, nBottom ) );
+            for ( long i = 1; i < n2; ++i )
+            {
+                ++nTop;
+                ++nBottom;
+                pDev->DrawLine( Point( nCenterX-i, nTop ),
+                                Point( nCenterX+i, nTop ) );
+                pDev->DrawLine( Point( nCenterX-i, nBottom ),
+                                Point( nCenterX+i, nBottom ) );
+            }
+            break;
+
+        case SYMBOL_PAGEDOWN:
+            if ( !bMinSideIsOdd )
+            {
+                // An even rectangle size means we have to use a smaller size for
+                // our arrows as we want to use one pixel for the spearhead! Otherwise
+                // it will be clipped!
+                nCenterX++;
+                n4 = --n2 / 2;
+            }
+
+            nTop = nCenterY-1;
+            nBottom = nCenterY+n2;
+            pDev->DrawPixel( Point( nCenterX, nTop ) );
+            pDev->DrawPixel( Point( nCenterX, nBottom ) );
+            for ( long i = 1; i < n2; ++i )
             {
-                ( eType == SYMBOL_PAGEUP ) ? nTop++ : nBottom--;
-                nTemp = nCenterX-i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                pDev->DrawRect( Rectangle( nTemp, nTop+n2+1, nTemp, nBottom+n2+1 ) );
-                nTemp = nCenterX+i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                pDev->DrawRect( Rectangle( nTemp, nTop+n2+1, nTemp, nBottom+n2+1 ) );
-                i++;
+                --nTop;
+                --nBottom;
+                pDev->DrawLine( Point( nCenterX-i, nTop ),
+                                Point( nCenterX+i, nTop ) );
+                pDev->DrawLine( Point( nCenterX-i, nBottom ),
+                                Point( nCenterX+i, nBottom ) );
             }
-        }
-        break;
+            break;
 
         case SYMBOL_RADIOCHECKMARK:
         case SYMBOL_RECORD:
@@ -326,77 +282,65 @@ static void ImplDrawSymbol( OutputDevice* pDev, const Rectangle& rRect,
         break;
 
         case SYMBOL_STOP:
-            {
             nLeft = nCenterX-n2;
             nRight = nCenterX+n2;
             nTop = nCenterY-n2;
             nBottom = nCenterY+n2;
             pDev->DrawRect( Rectangle( nLeft, nTop, nRight, nBottom ) );
-            }
             break;
 
         case SYMBOL_PAUSE:
-            {
             nLeft = nCenterX-n2;
             nRight = nCenterX+n2-1;
             nTop = nCenterY-n2;
             nBottom = nCenterY+n2;
             pDev->DrawRect( Rectangle( nLeft, nTop, nCenterX-2, nBottom ) );
             pDev->DrawRect( Rectangle( nCenterX+1, nTop, nRight, nBottom ) );
-            }
             break;
 
         case SYMBOL_WINDSTART:
         case SYMBOL_WINDBACKWARD:
-            {
-            nLeft = nCenterX-n2+1;
-            nRight = nCenterX;
-            pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
-            pDev->DrawRect( Rectangle( nLeft+n2, nCenterY, nRight+n2, nCenterY ) );
-            i = 1;
-            while ( i < n2 )
-            {
-                nLeft++;
-                nTemp = nCenterY-i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                pDev->DrawRect( Rectangle( nLeft+n2, nTemp, nRight+n2, nTemp ) );
-                nTemp = nCenterY+i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                pDev->DrawRect( Rectangle( nLeft+n2, nTemp, nRight+n2, nTemp ) );
-                i++;
-            }
+            nLeft = nCenterX-n2;
             if ( eType == SYMBOL_WINDSTART )
             {
-                pDev->DrawRect( Rectangle( nCenterX-n2, nCenterY-n2,
-                                           nCenterX-n2, nCenterY+n2 ) );
+                pDev->DrawLine( Point( nLeft, nCenterY-n2 ),
+                                Point( nLeft, nCenterY+n2 ) );
             }
+            ++nLeft;
+            nRight = nLeft+n2;
+            pDev->DrawPixel( Point( nLeft, nCenterY ) );
+            pDev->DrawPixel( Point( nRight, nCenterY ) );
+            for ( long i = 1; i < n2; ++i )
+            {
+                ++nLeft;
+                ++nRight;
+                pDev->DrawLine( Point( nLeft, nCenterY-i ),
+                                Point( nLeft, nCenterY+i ) );
+                pDev->DrawLine( Point( nRight, nCenterY-i ),
+                                Point( nRight, nCenterY+i ) );
             }
             break;
 
         case SYMBOL_WINDEND:
         case SYMBOL_WINDFORWARD:
-            {
-            nLeft = nCenterX-n2;
-            nRight = nCenterX-1;
-            pDev->DrawRect( Rectangle( nLeft, nCenterY, nRight, nCenterY ) );
-            pDev->DrawRect( Rectangle( nLeft+n2, nCenterY, nRight+n2, nCenterY ) );
-            i = 1;
-            while ( i < n2 )
-            {
-                nRight--;
-                nTemp = nCenterY-i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                pDev->DrawRect( Rectangle( nLeft+n2, nTemp, nRight+n2, nTemp ) );
-                nTemp = nCenterY+i;
-                pDev->DrawRect( Rectangle( nLeft, nTemp, nRight, nTemp ) );
-                pDev->DrawRect( Rectangle( nLeft+n2, nTemp, nRight+n2, nTemp ) );
-                i++;
-            }
+            nRight = nCenterX+n2;
             if ( eType == SYMBOL_WINDEND )
             {
-                pDev->DrawRect( Rectangle( nCenterX+n2, nCenterY-n2,
-                                           nCenterX+n2, nCenterY+n2 ) );
+                pDev->DrawLine( Point( nRight, nCenterY-n2 ),
+                                Point( nRight, nCenterY+n2 ) );
             }
+            --nRight;
+            nLeft = nRight-n2;
+            pDev->DrawPixel( Point( nLeft, nCenterY ) );
+            pDev->DrawPixel( Point( nRight, nCenterY ) );
+            for ( long i = 1; i < n2; ++i )
+            {
+                --nLeft;
+                --nRight;
+                pDev->DrawLine( Point( nLeft, nCenterY-i ),
+                                Point( nLeft, nCenterY+i ) );
+                pDev->DrawLine( Point( nRight, nCenterY-i ),
+                                Point( nRight, nCenterY+i ) );
             }
             break;
 
@@ -410,12 +354,10 @@ static void ImplDrawSymbol( OutputDevice* pDev, const Rectangle& rRect,
             nLeft   = nCenterX-n2+1;
             nTop    = nCenterY-n2+1;
             nBottom = nCenterY-n2+nMin-aRectSize.Width()+1;
-            i = 0;
-            while ( i < nMin-aRectSize.Width()+1 )
+            for ( long i = 0; i < nMin-aRectSize.Width()+1; ++i )
             {
                 pDev->DrawRect( Rectangle( Point( nLeft+i, nTop+i ), aRectSize ) );
                 pDev->DrawRect( Rectangle( Point( nLeft+i, nBottom-i ), aRectSize ) );
-                i++;
             }
             }
             break;
@@ -480,33 +422,22 @@ static void ImplDrawSymbol( OutputDevice* pDev, const Rectangle& rRect,
             break;
 
         case SYMBOL_SPIN_UPDOWN:
-            {
             nTop = nCenterY-n2-1;
-            nBottom = nTop+n2;
-            pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
-            i = 1;
-            while ( i <= n2 )
-            {
-                nTop++;
-                nTemp = nCenterX-i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                nTemp = nCenterX+i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                i++;
-            }
-            nTop = nCenterY+1;
-            nBottom = nTop+n2;
-            pDev->DrawRect( Rectangle( nCenterX, nTop, nCenterX, nBottom ) );
-            i = 1;
-            while ( i <= n2 )
+            nBottom = nCenterY+n2+1;
+            pDev->DrawPixel( Point( nCenterX, nTop ) );
+            pDev->DrawPixel( Point( nCenterX, nBottom ) );
+            nLeft = nCenterX;
+            nRight = nCenterX;
+            for ( long i = 1; i <= n2; ++i )
             {
-                nBottom--;
-                nTemp = nCenterX-i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                nTemp = nCenterX+i;
-                pDev->DrawRect( Rectangle( nTemp, nTop, nTemp, nBottom ) );
-                i++;
-            }
+                ++nTop;
+                --nLeft;
+                --nBottom;
+                ++nRight;
+                pDev->DrawLine( Point( nLeft, nTop ),
+                                Point( nRight, nTop ) );
+                pDev->DrawLine( Point( nLeft, nBottom ),
+                                Point( nRight, nBottom ) );
             }
             break;
 
@@ -568,14 +499,12 @@ static void ImplDrawSymbol( OutputDevice* pDev, const Rectangle& rRect,
             break;
 
         case SYMBOL_PLUS:
-            {
             nLeft = nCenterX-n2;
             nRight = nCenterX+n2;
             nTop = nCenterY-n2;
             nBottom = nCenterY+n2;
             pDev->DrawRect( Rectangle( nLeft, nCenterY - 1, nRight, nCenterY + 1 ) );
             pDev->DrawRect( Rectangle( nCenterX - 1, nTop, nCenterX + 1, nBottom ) );
-            }
             break;
     }
 }
@@ -586,12 +515,11 @@ void DecorationView::DrawSymbol( const Rectangle& rRect, SymbolType eType,
                                  const Color& rColor, sal_uInt16 nStyle )
 {
     const StyleSettings&    rStyleSettings  = mpOutDev->GetSettings().GetStyleSettings();
-    Rectangle               aRect           = mpOutDev->LogicToPixel( rRect );
-    Color                   aOldLineColor   = mpOutDev->GetLineColor();
-    Color                   aOldFillColor   = mpOutDev->GetFillColor();
-    sal_Bool                    bOldMapMode     = mpOutDev->IsMapModeEnabled();
-    mpOutDev->SetLineColor();
-    mpOutDev->SetFillColor( rColor );
+    const Rectangle         aRect           = mpOutDev->LogicToPixel( rRect );
+    const Color             aOldLineColor   = mpOutDev->GetLineColor();
+    const Color             aOldFillColor   = mpOutDev->GetFillColor();
+    const bool              bOldMapMode     = mpOutDev->IsMapModeEnabled();
+    Color                   nColor(rColor);
     mpOutDev->EnableMapMode( sal_False );
 
     if ( (rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ||
@@ -600,28 +528,27 @@ void DecorationView::DrawSymbol( const Rectangle& rRect, SymbolType eType,
 
     if ( nStyle & SYMBOL_DRAW_MONO )
     {
-        if ( nStyle & SYMBOL_DRAW_DISABLE )
-            mpOutDev->SetFillColor( Color( COL_GRAY ) );
-        else
-            mpOutDev->SetFillColor( Color( COL_BLACK ) );
+        // Monochrome: set color to black if enabled, to gray if disabled
+        nColor = Color( ( nStyle & SYMBOL_DRAW_DISABLE ) ? COL_GRAY : COL_BLACK );
     }
     else
     {
         if ( nStyle & SYMBOL_DRAW_DISABLE )
         {
-            // Als Embosed ausgeben
+            // Draw shifted and brighter symbol for embossed look
+            mpOutDev->SetLineColor( rStyleSettings.GetLightColor() );
             mpOutDev->SetFillColor( rStyleSettings.GetLightColor() );
-            Rectangle aTempRect = aRect;
-            aTempRect.Move( 1, 1 );
-            ImplDrawSymbol( mpOutDev, aTempRect, eType );
-            mpOutDev->SetFillColor( rStyleSettings.GetShadowColor() );
+            ImplDrawSymbol( mpOutDev, aRect + Point(1, 1) , eType );
+            nColor = rStyleSettings.GetShadowColor();
         }
-        else
-            mpOutDev->SetFillColor( rColor );
     }
 
+    // Set selected color and draw the symbol
+    mpOutDev->SetLineColor( nColor );
+    mpOutDev->SetFillColor( nColor );
     ImplDrawSymbol( mpOutDev, aRect, eType );
 
+    // Restore previous settings
     mpOutDev->SetLineColor( aOldLineColor );
     mpOutDev->SetFillColor( aOldFillColor );
     mpOutDev->EnableMapMode( bOldMapMode );
-- 
1.7.5.4


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.