| /* | |
| * GDI pen objects | |
| * | |
| * Copyright 1993 Alexandre Julliard | |
| * | |
| * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| */ | |
| #include "config.h" | |
| #include <string.h> | |
| #include "windef.h" | |
| #include "wingdi.h" | |
| #include "wine/wingdi16.h" | |
| #include "gdi.h" | |
| #include "wine/debug.h" | |
| WINE_DEFAULT_DEBUG_CHANNEL(gdi); | |
| /* GDI logical pen object */ | |
| typedef struct | |
| { | |
| GDIOBJHDR header; | |
| LOGPEN logpen; | |
| } PENOBJ; | |
| static HGDIOBJ PEN_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ); | |
| static INT PEN_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); | |
| static INT PEN_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); | |
| static const struct gdi_obj_funcs pen_funcs = | |
| { | |
| PEN_SelectObject, /* pSelectObject */ | |
| PEN_GetObject16, /* pGetObject16 */ | |
| PEN_GetObject, /* pGetObjectA */ | |
| PEN_GetObject, /* pGetObjectW */ | |
| NULL, /* pUnrealizeObject */ | |
| GDI_FreeObject /* pDeleteObject */ | |
| }; | |
| /*********************************************************************** | |
| * CreatePen (GDI32.@) | |
| */ | |
| HPEN WINAPI CreatePen( INT style, INT width, COLORREF color ) | |
| { | |
| LOGPEN logpen; | |
| TRACE("%d %d %06lx\n", style, width, color ); | |
| logpen.lopnStyle = style; | |
| logpen.lopnWidth.x = width; | |
| logpen.lopnWidth.y = 0; | |
| logpen.lopnColor = color; | |
| return CreatePenIndirect( &logpen ); | |
| } | |
| /*********************************************************************** | |
| * CreatePenIndirect (GDI32.@) | |
| */ | |
| HPEN WINAPI CreatePenIndirect( const LOGPEN * pen ) | |
| { | |
| PENOBJ * penPtr; | |
| HPEN hpen; | |
| if (!(penPtr = GDI_AllocObject( sizeof(PENOBJ), PEN_MAGIC, &hpen, &pen_funcs ))) return 0; | |
| penPtr->logpen.lopnStyle = pen->lopnStyle; | |
| penPtr->logpen.lopnWidth = pen->lopnWidth; | |
| penPtr->logpen.lopnColor = pen->lopnColor; | |
| GDI_ReleaseObj( hpen ); | |
| return hpen; | |
| } | |
| /*********************************************************************** | |
| * ExtCreatePen (GDI32.@) | |
| * | |
| * FIXME: PS_USERSTYLE not handled | |
| */ | |
| HPEN WINAPI ExtCreatePen( DWORD style, DWORD width, | |
| const LOGBRUSH * brush, DWORD style_count, | |
| const DWORD *style_bits ) | |
| { | |
| PENOBJ * penPtr; | |
| HPEN hpen; | |
| if ((style & PS_STYLE_MASK) == PS_USERSTYLE) | |
| FIXME("PS_USERSTYLE not handled\n"); | |
| if ((style & PS_TYPE_MASK) == PS_GEOMETRIC) | |
| if (brush->lbHatch) | |
| FIXME("Hatches not implemented\n"); | |
| if (!(penPtr = GDI_AllocObject( sizeof(PENOBJ), PEN_MAGIC, &hpen, &pen_funcs ))) return 0; | |
| penPtr->logpen.lopnStyle = style & ~PS_TYPE_MASK; | |
| /* PS_USERSTYLE workaround */ | |
| if((penPtr->logpen.lopnStyle & PS_STYLE_MASK) == PS_USERSTYLE) | |
| penPtr->logpen.lopnStyle = | |
| (penPtr->logpen.lopnStyle & ~PS_STYLE_MASK) | PS_SOLID; | |
| penPtr->logpen.lopnWidth.x = (style & PS_GEOMETRIC) ? width : 1; | |
| penPtr->logpen.lopnWidth.y = 0; | |
| penPtr->logpen.lopnColor = brush->lbColor; | |
| GDI_ReleaseObj( hpen ); | |
| return hpen; | |
| } | |
| /*********************************************************************** | |
| * PEN_SelectObject | |
| */ | |
| static HGDIOBJ PEN_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ) | |
| { | |
| HGDIOBJ ret; | |
| DC *dc = DC_GetDCPtr( hdc ); | |
| if (!dc) return 0; | |
| ret = dc->hPen; | |
| if (dc->funcs->pSelectPen) handle = dc->funcs->pSelectPen( dc->physDev, handle ); | |
| if (handle) dc->hPen = handle; | |
| else ret = 0; | |
| GDI_ReleaseObj( hdc ); | |
| return ret; | |
| } | |
| /*********************************************************************** | |
| * PEN_GetObject16 | |
| */ | |
| static INT PEN_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ) | |
| { | |
| PENOBJ *pen = obj; | |
| LOGPEN16 logpen; | |
| logpen.lopnStyle = pen->logpen.lopnStyle; | |
| logpen.lopnColor = pen->logpen.lopnColor; | |
| CONV_POINT32TO16( &pen->logpen.lopnWidth, &logpen.lopnWidth ); | |
| if (count > sizeof(logpen)) count = sizeof(logpen); | |
| memcpy( buffer, &logpen, count ); | |
| return count; | |
| } | |
| /*********************************************************************** | |
| * PEN_GetObject | |
| */ | |
| static INT PEN_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ) | |
| { | |
| PENOBJ *pen = obj; | |
| if (count > sizeof(pen->logpen)) count = sizeof(pen->logpen); | |
| memcpy( buffer, &pen->logpen, count ); | |
| return count; | |
| } |