/* * Copyright (C) 2007 Google (Evan Stade) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "windef.h" #include "winbase.h" #include "wingdi.h" #include "gdiplus.h" #include "gdiplus_private.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(gdiplus); static DWORD gdip_to_gdi_dash(GpDashStyle dash) { switch(dash){ case DashStyleSolid: return PS_SOLID; case DashStyleDash: return PS_DASH; case DashStyleDot: return PS_DOT; case DashStyleDashDot: return PS_DASHDOT; case DashStyleDashDotDot: return PS_DASHDOTDOT; case DashStyleCustom: FIXME("DashStyleCustom not implemented\n"); return PS_SOLID; default: ERR("Not a member of GpDashStyle enumeration\n"); return 0; } } 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 GdipClonePen(GpPen *pen, GpPen **clonepen) { LOGBRUSH lb; if(!pen || !clonepen) return InvalidParameter; *clonepen = GdipAlloc(sizeof(GpPen)); if(!*clonepen) return OutOfMemory; memcpy(*clonepen, pen, sizeof(GpPen)); lb.lbStyle = BS_SOLID; lb.lbColor = (*clonepen)->color; lb.lbHatch = 0; (*clonepen)->gdipen = ExtCreatePen((*clonepen)->style, roundr((*clonepen)->width), &lb, 0, NULL); return Ok; } GpStatus WINGDIPAPI GdipCreatePen1(ARGB color, FLOAT width, GpUnit unit, GpPen **pen) { LOGBRUSH lb; GpPen *gp_pen; if(!pen) return InvalidParameter; gp_pen = GdipAlloc(sizeof(GpPen)); if(!gp_pen) return OutOfMemory; gp_pen->style = GP_DEFAULT_PENSTYLE; gp_pen->color = ARGB2COLORREF(color); 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; lb.lbColor = gp_pen->color; lb.lbHatch = 0; if((gp_pen->unit == UnitWorld) || (gp_pen->unit == UnitPixel)) { gp_pen->gdipen = ExtCreatePen(gp_pen->style, (INT) gp_pen->width, &lb, 0, NULL); } else { FIXME("UnitWorld, UnitPixel only supported units\n"); GdipFree(gp_pen); return NotImplemented; } *pen = gp_pen; return Ok; } GpStatus WINGDIPAPI GdipDeletePen(GpPen *pen) { if(!pen) return InvalidParameter; DeleteObject(pen->gdipen); GdipFree(pen); return Ok; } GpStatus WINGDIPAPI GdipSetPenDashStyle(GpPen *pen, GpDashStyle dash) { LOGBRUSH lb; if(!pen) return InvalidParameter; DeleteObject(pen->gdipen); pen->dash = dash; pen->style &= ~(PS_ALTERNATE | PS_SOLID | PS_DASH | PS_DOT | PS_DASHDOT | PS_DASHDOTDOT | PS_NULL | PS_USERSTYLE | PS_INSIDEFRAME); pen->style |= gdip_to_gdi_dash(dash); lb.lbStyle = BS_SOLID; lb.lbColor = pen->color; lb.lbHatch = 0; pen->gdipen = ExtCreatePen(pen->style, (INT) pen->width, &lb, 0, NULL); return Ok; } GpStatus WINGDIPAPI GdipSetPenEndCap(GpPen *pen, GpLineCap cap) { if(!pen) return InvalidParameter; pen->endcap = cap; return Ok; } /* FIXME: startcap, dashcap not used. */ GpStatus WINGDIPAPI GdipSetPenLineCap197819(GpPen *pen, GpLineCap start, GpLineCap end, GpDashCap dash) { if(!pen) return InvalidParameter; pen->startcap = start; pen->endcap = end; pen->dashcap = dash; 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; } GpStatus WINGDIPAPI GdipSetPenMiterLimit(GpPen *pen, REAL limit) { if(!pen) return InvalidParameter; pen->miterlimit = limit; return Ok; }