summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfvogel <fvogelnew1@free.fr>2017-08-17 21:03:51 (GMT)
committerfvogel <fvogelnew1@free.fr>2017-08-17 21:03:51 (GMT)
commit0f3176d9ab642b4c8fded958b542546aa7ffb0d0 (patch)
tree85269bde26e523998bf6b20ecaf3ec0aae75819d
parent529cbbedfc05feddbb139047b0acca13cf18d516 (diff)
downloadtk-0f3176d9ab642b4c8fded958b542546aa7ffb0d0.zip
tk-0f3176d9ab642b4c8fded958b542546aa7ffb0d0.tar.gz
tk-0f3176d9ab642b4c8fded958b542546aa7ffb0d0.tar.bz2
Rendering of all join styles is now correct on Windows when the first and last point of a polygon or polyline are the same, for both stippled and non stippled lines (and polygon outlines)bug_2874226
-rw-r--r--win/tkWinDraw.c72
1 files changed, 50 insertions, 22 deletions
diff --git a/win/tkWinDraw.c b/win/tkWinDraw.c
index 85d39c5..e13a5e5 100644
--- a/win/tkWinDraw.c
+++ b/win/tkWinDraw.c
@@ -741,6 +741,52 @@ XFillRectangles(
/*
*----------------------------------------------------------------------
*
+ * MakeAndStrokePath --
+ *
+ * This function draws a shape using a list of points, a stipple pattern,
+ * and the specified drawing function. It does it through creation of a
+ * so-called 'path' (see GDI documentation on MSDN).
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+static void
+MakeAndStrokePath(
+ HDC dc,
+ POINT *winPoints,
+ int npoints,
+ WinDrawFunc func) /* Name of the Windows GDI drawing function:
+ this is either Polyline or Polygon. */
+{
+ BeginPath(dc);
+ func(dc, winPoints, npoints);
+ /*
+ * In the case of closed polylines, the first and last points
+ * are the same. We want miter or bevel join be rendered also
+ * at this point, this needs telling the Windows GDI that the
+ * path is closed.
+ */
+ if (func == Polyline) {
+ if ((winPoints[0].x == winPoints[npoints-1].x) &&
+ (winPoints[0].y == winPoints[npoints-1].y)) {
+ CloseFigure(dc);
+ }
+ EndPath(dc);
+ StrokePath(dc);
+ } else {
+ EndPath(dc);
+ StrokeAndFillPath(dc);
+ }
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
* RenderObject --
*
* This function draws a shape using a list of points, a stipple pattern,
@@ -763,8 +809,7 @@ RenderObject(
int npoints,
int mode,
HPEN pen,
- WinDrawFunc func) /* Name of the Windows GDI drawing function:
- this is either Polyline or Polygon. */
+ WinDrawFunc func)
{
RECT rect = {0,0,0,0};
HPEN oldPen;
@@ -834,7 +879,7 @@ RenderObject(
SetPolyFillMode(dcMem, (gc->fill_rule == EvenOddRule) ? ALTERNATE
: WINDING);
oldMemBrush = SelectObject(dcMem, CreateSolidBrush(gc->foreground));
- func(dcMem, winPoints, npoints);
+ MakeAndStrokePath(dcMem, winPoints, npoints, func);
BitBlt(dc, rect.left, rect.top, width, height, dcMem, 0, 0, COPYFG);
/*
@@ -846,7 +891,7 @@ RenderObject(
if (gc->fill_style == FillOpaqueStippled) {
DeleteObject(SelectObject(dcMem,
CreateSolidBrush(gc->background)));
- func(dcMem, winPoints, npoints);
+ MakeAndStrokePath(dcMem, winPoints, npoints, func);
BitBlt(dc, rect.left, rect.top, width, height, dcMem, 0, 0,
COPYBG);
}
@@ -862,24 +907,7 @@ RenderObject(
SetPolyFillMode(dc, (gc->fill_rule == EvenOddRule) ? ALTERNATE
: WINDING);
- BeginPath(dc);
- func(dc, winPoints, npoints);
- /*
- * In the case of closed polylines, the first and last points
- * are the same. We want miter or bevel join be rendered also
- * at this point, this needs telling the Windows GDI that the
- * path is closed.
- */
- if ((points[0].x == points[npoints-1].x) &&
- (points[0].y == points[npoints-1].y)) {
- CloseFigure(dc);
- }
- EndPath(dc);
- if (func == Polygon) {
- StrokeAndFillPath(dc);
- } else {
- StrokePath(dc);
- }
+ MakeAndStrokePath(dc, winPoints, npoints, func);
SelectObject(dc, oldPen);
}
DeleteObject(SelectObject(dc, oldBrush));