2 * Copyright (C) 2007 Google (Evan Stade)
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include "gdiplus_private.h"
26 #include "wine/debug.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(gdiplus
);
30 static DWORD
gdip_to_gdi_join(GpLineJoin join
)
38 case LineJoinMiterClipped
:
41 ERR("Not a member of GpLineJoin enumeration\n");
46 GpStatus WINGDIPAPI
GdipCreatePen1(ARGB color
, FLOAT width
, GpUnit unit
,
53 return InvalidParameter
;
55 gp_pen
= GdipAlloc(sizeof(GpPen
));
56 if(!gp_pen
) return OutOfMemory
;
58 gp_pen
->style
= GP_DEFAULT_PENSTYLE
;
59 gp_pen
->color
= ARGB2COLORREF(color
);
60 gp_pen
->width
= width
;
62 gp_pen
->endcap
= LineCapFlat
;
63 gp_pen
->join
= LineJoinMiter
;
64 gp_pen
->miterlimit
= 10.0;
66 /* FIXME: Currently only solid lines supported. */
67 lb
.lbStyle
= BS_SOLID
;
68 lb
.lbColor
= gp_pen
->color
;
71 if((gp_pen
->unit
== UnitWorld
) || (gp_pen
->unit
== UnitPixel
)) {
72 gp_pen
->gdipen
= ExtCreatePen(gp_pen
->style
, (INT
) gp_pen
->width
, &lb
,
75 FIXME("UnitWorld, UnitPixel only supported units\n");
77 return NotImplemented
;
85 GpStatus WINGDIPAPI
GdipDeletePen(GpPen
*pen
)
87 if(!pen
) return InvalidParameter
;
88 DeleteObject(pen
->gdipen
);
94 GpStatus WINGDIPAPI
GdipSetPenEndCap(GpPen
*pen
, GpLineCap cap
)
96 if(!pen
) return InvalidParameter
;
103 /* FIXME: startcap, dashcap not used. */
104 GpStatus WINGDIPAPI
GdipSetPenLineCap197819(GpPen
*pen
, GpLineCap start
,
105 GpLineCap end
, GpDashCap dash
)
108 return InvalidParameter
;
110 pen
->startcap
= start
;
117 /* FIXME: Miter line joins behave a bit differently than they do in windows.
118 * Both kinds of miter joins clip if the angle is less than 11 degrees. */
119 GpStatus WINGDIPAPI
GdipSetPenLineJoin(GpPen
*pen
, GpLineJoin join
)
123 if(!pen
) return InvalidParameter
;
125 DeleteObject(pen
->gdipen
);
127 pen
->style
&= ~(PS_JOIN_ROUND
| PS_JOIN_BEVEL
| PS_JOIN_MITER
);
128 pen
->style
|= gdip_to_gdi_join(join
);
130 lb
.lbStyle
= BS_SOLID
;
131 lb
.lbColor
= pen
->color
;
134 pen
->gdipen
= ExtCreatePen(pen
->style
, (INT
) pen
->width
, &lb
, 0, NULL
);
139 GpStatus WINGDIPAPI
GdipSetPenMiterLimit(GpPen
*pen
, REAL limit
)
142 return InvalidParameter
;
144 pen
->miterlimit
= limit
;