Implemented RtlAcquirePebLock and RtlReleasePebLock.
[wine] / objects / pen.c
1 /*
2  * GDI pen objects
3  *
4  * Copyright 1993 Alexandre Julliard
5  */
6
7 #include <string.h>
8 #include "pen.h"
9 #include "debugtools.h"
10
11 DEFAULT_DEBUG_CHANNEL(gdi);
12
13
14
15 /***********************************************************************
16  *           CreatePen16    (GDI.61)
17  */
18 HPEN16 WINAPI CreatePen16( INT16 style, INT16 width, COLORREF color )
19 {
20     LOGPEN logpen;
21
22     TRACE("%d %d %06lx\n", style, width, color );
23
24     logpen.lopnStyle = style; 
25     logpen.lopnWidth.x = width;
26     logpen.lopnWidth.y = 0;
27     logpen.lopnColor = color;
28
29     return CreatePenIndirect( &logpen );
30 }
31
32
33 /***********************************************************************
34  *           CreatePen    (GDI32.55)
35  */
36 HPEN WINAPI CreatePen( INT style, INT width, COLORREF color )
37 {
38     LOGPEN logpen;
39
40     TRACE("%d %d %06lx\n", style, width, color );
41
42     logpen.lopnStyle = style; 
43     logpen.lopnWidth.x = width;
44     logpen.lopnWidth.y = 0;
45     logpen.lopnColor = color;
46
47     return CreatePenIndirect( &logpen );
48 }
49
50
51 /***********************************************************************
52  *           CreatePenIndirect16    (GDI.62)
53  */
54 HPEN16 WINAPI CreatePenIndirect16( const LOGPEN16 * pen )
55 {
56     PENOBJ * penPtr;
57     HPEN hpen;
58
59     if (pen->lopnStyle > PS_INSIDEFRAME) return 0;
60     if (!(penPtr = GDI_AllocObject( sizeof(PENOBJ), PEN_MAGIC, &hpen ))) return 0;
61     penPtr->logpen.lopnStyle = pen->lopnStyle;
62     penPtr->logpen.lopnColor = pen->lopnColor;
63     CONV_POINT16TO32( &pen->lopnWidth, &penPtr->logpen.lopnWidth );
64     GDI_ReleaseObj( hpen );
65     return hpen;
66 }
67
68
69 /***********************************************************************
70  *           CreatePenIndirect    (GDI32.56)
71  */
72 HPEN WINAPI CreatePenIndirect( const LOGPEN * pen )
73 {
74     PENOBJ * penPtr;
75     HPEN hpen;
76
77     if (!(penPtr = GDI_AllocObject( sizeof(PENOBJ), PEN_MAGIC, &hpen ))) return 0;
78     penPtr->logpen.lopnStyle = pen->lopnStyle;
79     penPtr->logpen.lopnWidth = pen->lopnWidth;
80     penPtr->logpen.lopnColor = pen->lopnColor;
81     GDI_ReleaseObj( hpen );
82     return hpen;
83 }
84
85 /***********************************************************************
86  *           ExtCreatePen    (GDI32.93)
87  *
88  * FIXME: PS_USERSTYLE not handled
89  */
90
91 HPEN WINAPI ExtCreatePen( DWORD style, DWORD width,
92                               const LOGBRUSH * brush, DWORD style_count,
93                               const DWORD *style_bits )
94 {
95     PENOBJ * penPtr;
96     HPEN hpen;
97
98     if ((style & PS_STYLE_MASK) == PS_USERSTYLE)
99         FIXME("PS_USERSTYLE not handled\n");
100     if ((style & PS_TYPE_MASK) == PS_GEOMETRIC)
101         if (brush->lbHatch)
102             FIXME("Hatches not implemented\n");
103
104     if (!(penPtr = GDI_AllocObject( sizeof(PENOBJ), PEN_MAGIC, &hpen ))) return 0;
105     penPtr->logpen.lopnStyle = style & ~PS_TYPE_MASK; 
106     
107     /* PS_USERSTYLE workaround */   
108     if((penPtr->logpen.lopnStyle & PS_STYLE_MASK) == PS_USERSTYLE)
109        penPtr->logpen.lopnStyle = 
110          (penPtr->logpen.lopnStyle & ~PS_STYLE_MASK) | PS_SOLID;
111
112     penPtr->logpen.lopnWidth.x = (style & PS_GEOMETRIC) ? width : 1; 
113     penPtr->logpen.lopnWidth.y = 0;
114     penPtr->logpen.lopnColor = brush->lbColor;
115     GDI_ReleaseObj( hpen );
116
117     return hpen;
118 }
119
120 /***********************************************************************
121  *           PEN_GetObject16
122  */
123 INT16 PEN_GetObject16( PENOBJ * pen, INT16 count, LPSTR buffer )
124 {
125     LOGPEN16 logpen;
126     logpen.lopnStyle = pen->logpen.lopnStyle;
127     logpen.lopnColor = pen->logpen.lopnColor;
128     CONV_POINT32TO16( &pen->logpen.lopnWidth, &logpen.lopnWidth );
129     if (count > sizeof(logpen)) count = sizeof(logpen);
130     memcpy( buffer, &logpen, count );
131     return count;
132 }
133
134
135 /***********************************************************************
136  *           PEN_GetObject
137  */
138 INT PEN_GetObject( PENOBJ * pen, INT count, LPSTR buffer )
139 {
140     if (count > sizeof(pen->logpen)) count = sizeof(pen->logpen);
141     memcpy( buffer, &pen->logpen, count );
142     return count;
143 }
144