Kaydet (Commit) 87eb8f8e authored tarafından Dmitry A Ashkadov's avatar Dmitry A Ashkadov Kaydeden (comit) Tor Lillqvist

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().
üst bcc46178
...@@ -1351,10 +1351,45 @@ void WinSalGraphics::drawPolyLine( sal_uLong nPoints, const SalPoint* pPtAry ) ...@@ -1351,10 +1351,45 @@ void WinSalGraphics::drawPolyLine( sal_uLong nPoints, const SalPoint* pPtAry )
"WinSalGraphics::DrawPolyLine(): POINT != SalPoint" ); "WinSalGraphics::DrawPolyLine(): POINT != SalPoint" );
POINT* pWinPtAry = (POINT*)pPtAry; 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 // Wegen Windows 95 und der Beschraenkung auf eine maximale Anzahl
// von Punkten // von Punkten
if ( !Polyline( mhDC, pWinPtAry, (int)nPoints ) && (nPoints > MAX_64KSALPOINTS) ) if ( !Polyline( mhDC, pWinPtAry, (int)nPoints ) && (nPoints > MAX_64KSALPOINTS) )
Polyline( mhDC, pWinPtAry, 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 );
}
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
......
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