[Libreoffice-commits] .: vcl/win

Tor Lillqvist tml at kemper.freedesktop.org
Mon Aug 29 03:26:40 PDT 2011


 vcl/win/source/gdi/salgdi.cxx |   35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

New commits:
commit 87eb8f8ee8f92c78ef65af1cafd266528da089e5
Author: Dmitry A Ashkadov <dmitry.ashkadov at gmail.com>
Date:   Mon Aug 29 13:18:11 2011 +0300

    Polyline improvement for Windows
    
    I tried to draw polyline.... But on Windows... the end point is not
    drawn... the main problem is WinAPI LineTo() function. MSDN says:
    
    The LineTo function draws a line from the current position up to, but
    not including, the specified point.
    
    I think WinAPI Polyline() function uses LineTo() to draw a polyline. I
    see a hack in VCL module in WinSalgraphics::drawLine(): "we must paint
    the endpoint" But there is no such hack for drawPolyLine() function. A
    possible solution is same as for drawLine().

diff --git a/vcl/win/source/gdi/salgdi.cxx b/vcl/win/source/gdi/salgdi.cxx
index ae490d4..3c0e828 100644
--- a/vcl/win/source/gdi/salgdi.cxx
+++ b/vcl/win/source/gdi/salgdi.cxx
@@ -1351,10 +1351,45 @@ void WinSalGraphics::drawPolyLine( sal_uLong nPoints, const SalPoint* pPtAry )
                 "WinSalGraphics::DrawPolyLine(): POINT != SalPoint" );
 
     POINT* pWinPtAry = (POINT*)pPtAry;
+
+    // we assume there are at least 2 points (Polyline requres at least 2 point, see MSDN)
+    // we must paint the endpoint for last line
+    BOOL bPaintEnd = TRUE;
+    if ( pWinPtAry[nPoints-2].x == pWinPtAry[nPoints-1].x )
+    {
+        bPaintEnd = FALSE;
+        if ( pWinPtAry[nPoints-2].y <=  pWinPtAry[nPoints-1].y )
+            pWinPtAry[nPoints-1].y++;
+        else
+            pWinPtAry[nPoints-1].y--;
+    }
+    if ( pWinPtAry[nPoints-2].y == pWinPtAry[nPoints-1].y )
+    {
+        bPaintEnd = FALSE;
+        if ( pWinPtAry[nPoints-2].x <= pWinPtAry[nPoints-1].x )
+            pWinPtAry[nPoints-1].x++;
+        else
+            pWinPtAry[nPoints-1].x--;
+    }
+
     // Wegen Windows 95 und der Beschraenkung auf eine maximale Anzahl
     // von Punkten
     if ( !Polyline( mhDC, pWinPtAry, (int)nPoints ) && (nPoints > MAX_64KSALPOINTS) )
         Polyline( mhDC, pWinPtAry, MAX_64KSALPOINTS );
+
+    if ( bPaintEnd && !mbPrinter )
+    {
+        if ( mbXORMode )
+        {
+            HBRUSH     hBrush = CreateSolidBrush( mnPenColor );
+            HBRUSH     hOldBrush = SelectBrush( mhDC, hBrush );
+            PatBlt( mhDC, (int)(pWinPtAry[nPoints-1].x), (int)(pWinPtAry[nPoints-1].y), (int)1, (int)1, PATINVERT );
+            SelectBrush( mhDC, hOldBrush );
+            DeleteBrush( hBrush );
+        }
+        else
+            SetPixel( mhDC, (int)(pWinPtAry[nPoints-1].x), (int)(pWinPtAry[nPoints-1].y), mnPenColor );
+    }
 }
 
 // -----------------------------------------------------------------------


More information about the Libreoffice-commits mailing list