+ 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;
+
+ DPRINT("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;