[1/8] gdiplus: SetPenLineJoin
Evan Stade
estade at gmail.com
Thu Jul 12 21:42:47 CDT 2007
Hi,
Changelog:
*added line join types
*added GdipSetPenLineJoin
dlls/gdiplus/gdiplus_private.h | 2 ++
dlls/gdiplus/pen.c | 40 ++++++++++++++++++++++++++++++++++++++++
include/gdiplusenums.h | 9 +++++++++
include/gdiplusflat.h | 1 +
include/gdiplusgpstubs.h | 1 +
5 files changed, 53 insertions(+), 0 deletions(-)
--
Evan Stade
-------------- next part --------------
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 7b7ec62..1a2d67c 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -47,6 +47,8 @@ struct GpPen{
REAL width;
HPEN gdipen;
GpLineCap endcap;
+ GpLineJoin join;
+ REAL miterlimit;
};
struct GpGraphics{
diff --git a/dlls/gdiplus/pen.c b/dlls/gdiplus/pen.c
index 52515d5..a4894d3 100644
--- a/dlls/gdiplus/pen.c
+++ b/dlls/gdiplus/pen.c
@@ -27,6 +27,22 @@ #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
+static DWORD gdip_to_gdi_join(GpLineJoin join)
+{
+ switch(join){
+ case LineJoinRound:
+ return PS_JOIN_ROUND;
+ case LineJoinBevel:
+ return PS_JOIN_BEVEL;
+ case LineJoinMiter:
+ case LineJoinMiterClipped:
+ return PS_JOIN_MITER;
+ default:
+ ERR("Not a member of GpLineJoin enumeration\n");
+ return 0;
+ }
+}
+
GpStatus WINGDIPAPI GdipCreatePen1(ARGB color, FLOAT width, GpUnit unit,
GpPen **pen)
{
@@ -44,6 +60,8 @@ GpStatus WINGDIPAPI GdipCreatePen1(ARGB
gp_pen->width = width;
gp_pen->unit = unit;
gp_pen->endcap = LineCapFlat;
+ gp_pen->join = LineJoinMiter;
+ gp_pen->miterlimit = 10.0;
/* FIXME: Currently only solid lines supported. */
lb.lbStyle = BS_SOLID;
@@ -81,3 +99,25 @@ GpStatus WINGDIPAPI GdipSetPenEndCap(GpP
return Ok;
}
+
+/* FIXME: Miter line joins behave a bit differently than they do in windows.
+ * Both kinds of miter joins clip if the angle is less than 11 degrees. */
+GpStatus WINGDIPAPI GdipSetPenLineJoin(GpPen *pen, GpLineJoin join)
+{
+ LOGBRUSH lb;
+
+ if(!pen) return InvalidParameter;
+
+ DeleteObject(pen->gdipen);
+ pen->join = join;
+ pen->style &= ~(PS_JOIN_ROUND | PS_JOIN_BEVEL | PS_JOIN_MITER);
+ pen->style |= gdip_to_gdi_join(join);
+
+ lb.lbStyle = BS_SOLID;
+ lb.lbColor = pen->color;
+ lb.lbHatch = 0;
+
+ pen->gdipen = ExtCreatePen(pen->style, (INT) pen->width, &lb, 0, NULL);
+
+ return Ok;
+}
diff --git a/include/gdiplusenums.h b/include/gdiplusenums.h
index 1d00188..629a741 100644
--- a/include/gdiplusenums.h
+++ b/include/gdiplusenums.h
@@ -73,6 +73,14 @@ enum PathPointType{
PathPointTypeBezier3 = 3
};
+enum LineJoin
+{
+ LineJoinMiter = 0,
+ LineJoinBevel = 1,
+ LineJoinRound = 2,
+ LineJoinMiterClipped = 3
+};
+
#ifndef __cplusplus
typedef enum Unit Unit;
@@ -80,6 +88,7 @@ typedef enum BrushType BrushType;
typedef enum FillMode FillMode;
typedef enum LineCap LineCap;
typedef enum PathPointType PathPointType;
+typedef enum LineJoin LineJoin;
#endif /* end of c typedefs */
diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h
index 4e5e95f..5e275c9 100644
--- a/include/gdiplusflat.h
+++ b/include/gdiplusflat.h
@@ -30,6 +30,7 @@ #endif
GpStatus WINGDIPAPI GdipCreatePen1(ARGB,REAL,GpUnit,GpPen**);
GpStatus WINGDIPAPI GdipDeletePen(GpPen*);
GpStatus WINGDIPAPI GdipSetPenEndCap(GpPen*,GpLineCap);
+GpStatus WINGDIPAPI GdipSetPenLineJoin(GpPen*,GpLineJoin);
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC,GpGraphics**);
GpStatus WINGDIPAPI GdipCreateFromHWND(HWND,GpGraphics**);
diff --git a/include/gdiplusgpstubs.h b/include/gdiplusgpstubs.h
index 5c02268..b3962aa 100644
--- a/include/gdiplusgpstubs.h
+++ b/include/gdiplusgpstubs.h
@@ -47,5 +47,6 @@ typedef FillMode GpFillMode;
typedef PathData GpPathData;
typedef LineCap GpLineCap;
typedef RectF GpRectF;
+typedef LineJoin GpLineJoin;
#endif
--
1.4.1
More information about the wine-patches
mailing list