24d423cdada806ff15fea19bda5bd017b34da3e5
[reactos.git] / reactos / gdi32 / objects / brush.c
1 #include "precomp.h"
2
3 #define NDEBUG
4 #include <debug.h>
5
6 /*
7 * @implemented
8 */
9 BOOL
10 STDCALL
11 FixBrushOrgEx(
12 HDC hDC,
13 INT nXOrg,
14 INT nYOrg,
15 LPPOINT lpPoint)
16 {
17 return FALSE;
18 }
19
20 /*
21 * @implemented
22 */
23 HPEN
24 APIENTRY
25 ExtCreatePen(DWORD dwPenStyle,
26 DWORD dwWidth,
27 CONST LOGBRUSH *lplb,
28 DWORD dwStyleCount,
29 CONST DWORD *lpStyle)
30 {
31 /* Call NTGDI (hack... like most of gdi32..sigh) */
32 return NtGdiExtCreatePen(dwPenStyle,
33 dwWidth,
34 lplb->lbStyle,
35 lplb->lbColor,
36 lplb->lbHatch,
37 0,
38 dwStyleCount,
39 (PULONG)lpStyle,
40 0,
41 FALSE,
42 NULL);
43 }
44
45 /*
46 * @implemented
47 */
48 HBRUSH STDCALL
49 CreateDIBPatternBrush(
50 HGLOBAL hglbDIBPacked,
51 UINT fuColorSpec)
52 {
53 PVOID lpPackedDIB;
54 HBRUSH hBrush = NULL;
55 PBITMAPINFO pConvertedInfo;
56 UINT ConvertedInfoSize;
57
58 lpPackedDIB = GlobalLock(hglbDIBPacked);
59 if (lpPackedDIB == NULL)
60 return 0;
61
62 pConvertedInfo = ConvertBitmapInfo((PBITMAPINFO)lpPackedDIB, fuColorSpec,
63 &ConvertedInfoSize, TRUE);
64 if (pConvertedInfo)
65 {
66 hBrush = NtGdiCreateDIBBrush(pConvertedInfo, fuColorSpec,
67 ConvertedInfoSize, FALSE, FALSE, lpPackedDIB);
68 if ((PBITMAPINFO)lpPackedDIB != pConvertedInfo)
69 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
70 }
71
72 GlobalUnlock(hglbDIBPacked);
73
74 return hBrush;
75 }
76
77 /*
78 * @implemented
79 */
80 HBRUSH STDCALL
81 CreateDIBPatternBrushPt(
82 CONST VOID *lpPackedDIB,
83 UINT fuColorSpec)
84 {
85 HBRUSH hBrush = NULL;
86 PBITMAPINFO pConvertedInfo;
87 UINT ConvertedInfoSize;
88
89 if (lpPackedDIB == NULL)
90 return 0;
91
92 pConvertedInfo = ConvertBitmapInfo((PBITMAPINFO)lpPackedDIB, fuColorSpec,
93 &ConvertedInfoSize, TRUE);
94 if (pConvertedInfo)
95 {
96 hBrush = NtGdiCreateDIBBrush(pConvertedInfo, fuColorSpec,
97 ConvertedInfoSize, FALSE, FALSE, (PVOID)lpPackedDIB);
98 if ((PBITMAPINFO)lpPackedDIB != pConvertedInfo)
99 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
100 }
101
102 return hBrush;
103 }
104
105 /*
106 * @implemented
107 */
108 HBRUSH
109 STDCALL
110 CreateHatchBrush(INT fnStyle,
111 COLORREF clrref)
112 {
113 return NtGdiCreateHatchBrushInternal(fnStyle, clrref, FALSE);
114 }
115
116 /*
117 * @implemented
118 */
119 HBRUSH
120 STDCALL
121 CreatePatternBrush(HBITMAP hbmp)
122 {
123 return NtGdiCreatePatternBrushInternal(hbmp, FALSE, FALSE);
124 }
125
126 /*
127 * @implemented
128 */
129 HBRUSH
130 STDCALL
131 CreateSolidBrush(IN COLORREF crColor)
132 {
133 /* Call Server-Side API */
134 return NtGdiCreateSolidBrush(crColor, NULL);
135 }
136
137 /*
138 * @implemented
139 */
140 HBRUSH STDCALL
141 CreateBrushIndirect(
142 CONST LOGBRUSH *LogBrush)
143 {
144 HBRUSH hBrush;
145
146 switch (LogBrush->lbStyle)
147 {
148 case BS_DIBPATTERN8X8:
149 case BS_DIBPATTERN:
150 hBrush = CreateDIBPatternBrush((HGLOBAL)LogBrush->lbHatch,
151 LogBrush->lbColor);
152 break;
153
154 case BS_DIBPATTERNPT:
155 hBrush = CreateDIBPatternBrushPt((PVOID)LogBrush->lbHatch,
156 LogBrush->lbColor);
157 break;
158
159 case BS_PATTERN:
160 hBrush = NtGdiCreatePatternBrushInternal((HBITMAP)LogBrush->lbHatch,
161 FALSE,
162 FALSE);
163 break;
164
165 case BS_PATTERN8X8:
166 hBrush = NtGdiCreatePatternBrushInternal((HBITMAP)LogBrush->lbHatch,
167 FALSE,
168 TRUE);
169 break;
170
171 case BS_SOLID:
172 hBrush = NtGdiCreateSolidBrush(LogBrush->lbColor, 0);
173 break;
174
175 case BS_HATCHED:
176 hBrush = NtGdiCreateHatchBrushInternal(LogBrush->lbHatch,
177 LogBrush->lbColor,
178 FALSE);
179 break;
180
181 case BS_NULL:
182 hBrush = NtGdiGetStockObject(NULL_BRUSH);
183 break;
184
185 default:
186 SetLastError(ERROR_INVALID_PARAMETER);
187 hBrush = NULL;
188 break;
189 }
190
191 return hBrush;
192 }
193