Author: fireball
Date: Sun Feb 14 21:45:31 2010
New Revision: 45594
URL:
http://svn.reactos.org/svn/reactos?rev=45594&view=rev
Log:
- Calculate correct bounding rectangle and pass it to GrePolygon. Fixes non-filled polygon
bug (because GrepFillPolygon relies on a correct bounding rect), issue #31 in the Arwinss
wiki.
- Pass bounding rect to GrepFillPolygon by pointer instead of by value.
- Update line brush in GrePolyline.
Modified:
branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c
branches/arwinss/reactos/subsystems/win32/win32k/gre/lineto.c
branches/arwinss/reactos/subsystems/win32/win32k/gre/polyfill.c
branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c
branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h
Modified: branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c [iso-8859-1] Sun Feb 14
21:45:31 2010
@@ -151,6 +151,7 @@
NTSTATUS Status = STATUS_SUCCESS;
POINT pStackBuf[16];
POINT *pPoints = pStackBuf;
+ RECTL rcBound;
ULONG i;
/* Get a pointer to the DC */
@@ -186,15 +187,28 @@
return FALSE;
}
- /* Offset points data */
- for (i=0; i<count; i++)
+ /* Calculate bounding rect and offset points data */
+ pPoints[0].x += pDC->rcDcRect.left + pDC->rcVport.left;
+ pPoints[0].y += pDC->rcDcRect.top + pDC->rcVport.top;
+
+ rcBound.left = pPoints[0].x;
+ rcBound.right = pPoints[0].x;
+ rcBound.top = pPoints[0].y;
+ rcBound.bottom = pPoints[0].y;
+
+ for (i=1; i<count; i++)
{
pPoints[i].x += pDC->rcDcRect.left + pDC->rcVport.left;
pPoints[i].y += pDC->rcDcRect.top + pDC->rcVport.top;
+
+ rcBound.left = min(rcBound.left, pPoints[i].x);
+ rcBound.right = max(rcBound.right, pPoints[i].x);
+ rcBound.top = min(rcBound.top, pPoints[i].y);
+ rcBound.bottom = max(rcBound.bottom, pPoints[i].y);
}
/* Draw the polygon */
- GrePolygon(pDC, pPoints, count);
+ GrePolygon(pDC, pPoints, count, &rcBound);
/* Release the object */
DC_Unlock(pDC);
Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/lineto.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/lineto.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/lineto.c [iso-8859-1] Sun Feb 14
21:45:31 2010
@@ -112,6 +112,7 @@
/* Draw pen-based polygon */
if (!(pDC->pLineBrush->flAttrs & GDIBRUSH_IS_NULL))
{
+ GreUpdateBrush(pDC->pLineBrush, pDC);
Mix = ROP2_TO_MIX(R2_COPYPEN);/*pdcattr->jROP2*/
for (i=0; i<count-1; i++)
{
Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/polyfill.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/polyfill.c [iso-8859-1]
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/polyfill.c [iso-8859-1] Sun Feb
14 21:45:31 2010
@@ -605,7 +605,7 @@
BRUSHOBJ *BrushObj,
CONST POINT *Points,
int Count,
- RECTL DestRect,
+ CONST PRECTL DestRect,
POINTL *BrushOrigin)
{
FILL_EDGE_LIST *list = 0;
@@ -622,7 +622,7 @@
return FALSE;
/* For each Scanline from DestRect.top to DestRect.bottom, determine line segments to
draw */
- for ( ScanLine = DestRect.top; ScanLine < DestRect.bottom; ++ScanLine )
+ for ( ScanLine = DestRect->top; ScanLine < DestRect->bottom; ++ScanLine )
{
POLYGONFILL_BuildActiveList(ScanLine, list, &ActiveHead);
//DEBUG_PRINT_ACTIVE_EDGELIST(ActiveHead);
Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c [iso-8859-1] Sun Feb 14
21:45:31 2010
@@ -98,19 +98,13 @@
NTAPI
GrePolygon(PDC pDC,
const POINT *ptPoints,
- INT count)
+ INT count,
+ PRECTL DestRect)
{
BOOLEAN bRet;
- RECTL DestRect;
MIX Mix;
INT i;
POINT BrushOrigin;
-
- // HACK
- DestRect.left = 0;
- DestRect.top = 0;
- DestRect.bottom = PrimarySurface.GDIInfo.ulVertRes;
- DestRect.right = PrimarySurface.GDIInfo.ulHorzRes;
BrushOrigin.x = pDC->ptBrushOrg.x + pDC->rcDcRect.left;
BrushOrigin.y = pDC->ptBrushOrg.y + pDC->rcDcRect.top;
@@ -145,7 +139,7 @@
ptPoints[i].y,
ptPoints[i+1].x,
ptPoints[i+1].y,
- &DestRect, // Bounding rectangle
+ DestRect,
Mix);
}
}
Modified: branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h [iso-8859-1]
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h [iso-8859-1] Sun Feb 14
21:45:31 2010
@@ -189,7 +189,7 @@
BRUSHOBJ *BrushObj,
CONST POINT *Points,
int Count,
- RECTL DestRect,
+ PRECTL DestRect,
POINTL *BrushOrigin);
/* rect.c */
@@ -203,7 +203,8 @@
VOID NTAPI
GrePolygon(PDC pDC,
const POINT *ptPoints,
- INT count);
+ INT count,
+ PRECTL pDestRect);
VOID NTAPI
GrePolyline(PDC pDC,