mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
Added an initial implementation of Polygon. The initial revision is pretty slow,
and needs to be optimized. svn path=/trunk/; revision=4364
This commit is contained in:
parent
3203df9587
commit
504851d85e
1 changed files with 124 additions and 3 deletions
|
@ -52,14 +52,135 @@ W32kPie(HDC hDC,
|
|||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
//ALTERNATE Selects alternate mode (fills the area between odd-numbered and even-numbered
|
||||
//polygon sides on each scan line).
|
||||
//When the fill mode is ALTERNATE, GDI fills the area between odd-numbered and
|
||||
//even-numbered polygon sides on each scan line. That is, GDI fills the area between the
|
||||
//first and second side, between the third and fourth side, and so on.
|
||||
extern BOOL FillPolygon_ALTERNATE(SURFOBJ *SurfObj,
|
||||
PBRUSHOBJ BrushObj,
|
||||
MIX RopMode,
|
||||
CONST PPOINT Points,
|
||||
int Count,
|
||||
RECTL BoundRect,
|
||||
int OrigX,
|
||||
int OrigY);
|
||||
|
||||
|
||||
//WINDING Selects winding mode (fills any region with a nonzero winding value).
|
||||
//When the fill mode is WINDING, GDI fills any region that has a nonzero winding value.
|
||||
//This value is defined as the number of times a pen used to draw the polygon would go around the region.
|
||||
//The direction of each edge of the polygon is important.
|
||||
extern BOOL FillPolygon_WINDING(SURFOBJ *SurfObj,
|
||||
PBRUSHOBJ BrushObj,MIX RopMode,
|
||||
CONST PPOINT Points,
|
||||
int Count,
|
||||
RECTL BoundRect,
|
||||
int OrigX,
|
||||
int OrigY);
|
||||
|
||||
//This implementation is blatantly ripped off from W32kRectangle
|
||||
BOOL
|
||||
STDCALL
|
||||
W32kPolygon(HDC hDC,
|
||||
CONST PPOINT Points,
|
||||
int Count)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
DC *dc = DC_HandleToPtr(hDC);
|
||||
SURFOBJ *SurfObj = (SURFOBJ*)AccessUserObject((ULONG)dc->Surface);
|
||||
PBRUSHOBJ OutBrushObj, FillBrushObj;
|
||||
BOOL ret;
|
||||
PRECTL RectBounds;
|
||||
PENOBJ *pen;
|
||||
RECTL DestRect;
|
||||
int CurrentPoint;
|
||||
|
||||
DbgPrint("In W32kPolygon()\n");
|
||||
|
||||
if(0 == dc)
|
||||
return FALSE;
|
||||
|
||||
if(0 == Points)
|
||||
return FALSE;
|
||||
|
||||
if (2 > Count)
|
||||
return FALSE;
|
||||
|
||||
RectBounds = GDIOBJ_LockObj(dc->w.hGCClipRgn, GO_REGION_MAGIC);
|
||||
//ei not yet implemented ASSERT(RectBounds);
|
||||
|
||||
DestRect.bottom = Points[0].y + dc->w.DCOrgY + 1;
|
||||
DestRect.top = Points[0].y + dc->w.DCOrgY;
|
||||
DestRect.right = Points[0].y + dc->w.DCOrgX;
|
||||
DestRect.left = Points[0].y + dc->w.DCOrgX + 1;
|
||||
|
||||
|
||||
|
||||
if(PATH_IsPathOpen(dc->w.path))
|
||||
{
|
||||
ret = PATH_Polygon(hDC, Points, Count);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Get the current pen.
|
||||
pen = (PENOBJ*) GDIOBJ_LockObj(dc->w.hPen, GO_PEN_MAGIC);
|
||||
ASSERT(pen);
|
||||
OutBrushObj = (PBRUSHOBJ)PenToBrushObj(dc, pen);
|
||||
GDIOBJ_UnlockObj( dc->w.hPen, GO_PEN_MAGIC );
|
||||
|
||||
// Draw the Polygon Edges with the current pen
|
||||
for (CurrentPoint = 0; CurrentPoint < Count; ++CurrentPoint)
|
||||
{
|
||||
DestRect.bottom = MAX(DestRect.bottom, Points[CurrentPoint].y + dc->w.DCOrgY);
|
||||
DestRect.top = MIN(DestRect.top, Points[CurrentPoint].y + dc->w.DCOrgY);
|
||||
DestRect.right = MAX(DestRect.right, Points[CurrentPoint].y + dc->w.DCOrgX);
|
||||
DestRect.left = MIN(DestRect.left, Points[CurrentPoint].y + dc->w.DCOrgX);
|
||||
}//for
|
||||
|
||||
//Now fill the polygon with the current brush.
|
||||
FillBrushObj = (BRUSHOBJ*) GDIOBJ_LockObj(dc->w.hBrush, GO_BRUSH_MAGIC);
|
||||
// determine the fill mode to fill the polygon.
|
||||
if (dc->w.polyFillMode == WINDING)
|
||||
ret = FillPolygon_WINDING(SurfObj, FillBrushObj, dc->w.ROPmode, Points, Count, DestRect, dc->w.DCOrgX, dc->w.DCOrgY);
|
||||
else//default
|
||||
ret = FillPolygon_ALTERNATE(SurfObj, FillBrushObj, dc->w.ROPmode, Points, Count, DestRect, dc->w.DCOrgX, dc->w.DCOrgY);
|
||||
// Draw the Polygon Edges with the current pen
|
||||
for (CurrentPoint = 0; CurrentPoint < Count; ++CurrentPoint)
|
||||
{
|
||||
POINT To,From;
|
||||
//Let CurrentPoint be i
|
||||
//if i+1 > Count, Draw a line from Points[i] to Points[0]
|
||||
//Draw a line from Points[i] to Points[i+1]
|
||||
if (CurrentPoint + 1 >= Count)
|
||||
{
|
||||
To = Points[CurrentPoint];
|
||||
From = Points[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
From = Points[CurrentPoint];
|
||||
To = Points[CurrentPoint + 1];
|
||||
}
|
||||
DPRINT("Polygon Making line from (%d,%d) to (%d,%d)\n", From.x, From.y, To.x, To.y );
|
||||
ret = EngLineTo(SurfObj,
|
||||
NULL, // ClipObj,
|
||||
OutBrushObj,
|
||||
From.x + dc->w.DCOrgX,
|
||||
From.y + dc->w.DCOrgY,
|
||||
To.x + dc->w.DCOrgX,
|
||||
To.y + dc->w.DCOrgY,
|
||||
RectBounds, // Bounding rectangle
|
||||
dc->w.ROPmode); // MIX
|
||||
|
||||
}//for
|
||||
GDIOBJ_UnlockObj( dc->w.hBrush, GO_BRUSH_MAGIC );
|
||||
}// else
|
||||
|
||||
GDIOBJ_UnlockObj(dc->w.hGCClipRgn, GO_REGION_MAGIC);
|
||||
DC_ReleasePtr( hDC );
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
STDCALL
|
||||
|
|
Loading…
Reference in a new issue