4 * Copyright 1993, 1994 Alexandre Julliard
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include "wine/wingdi16.h"
32 #include "wine/debug.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(gdi);
36 /* GDI logical brush object */
43 #define NB_HATCH_STYLES 6
45 static HGDIOBJ BRUSH_SelectObject( HGDIOBJ handle, void *obj, HDC hdc );
46 static INT BRUSH_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
47 static INT BRUSH_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
48 static BOOL BRUSH_DeleteObject( HGDIOBJ handle, void *obj );
50 static const struct gdi_obj_funcs brush_funcs =
52 BRUSH_SelectObject, /* pSelectObject */
53 BRUSH_GetObject16, /* pGetObject16 */
54 BRUSH_GetObject, /* pGetObjectA */
55 BRUSH_GetObject, /* pGetObjectW */
56 NULL, /* pUnrealizeObject */
57 BRUSH_DeleteObject /* pDeleteObject */
60 static HGLOBAL16 dib_copy(BITMAPINFO *info, UINT coloruse)
66 if (info->bmiHeader.biCompression)
67 size = info->bmiHeader.biSizeImage;
69 size = DIB_GetDIBImageBytes(info->bmiHeader.biWidth,
70 info->bmiHeader.biHeight,
71 info->bmiHeader.biBitCount);
72 size += DIB_BitmapInfoSize( info, coloruse );
74 if (!(hmem = GlobalAlloc16( GMEM_MOVEABLE, size )))
78 newInfo = (BITMAPINFO *) GlobalLock16( hmem );
79 memcpy( newInfo, info, size );
80 GlobalUnlock16( hmem );
85 /***********************************************************************
86 * CreateBrushIndirect (GDI32.@)
89 * As for Windows 95 and Windows 98:
90 * Creating brushes from bitmaps or DIBs larger than 8x8 pixels
91 * is not supported. If a larger bitmap is given, only a portion
92 * of the bitmap is used.
94 HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush )
99 if (!(ptr = GDI_AllocObject( sizeof(BRUSHOBJ), BRUSH_MAGIC,
100 (HGDIOBJ *)&hbrush, &brush_funcs ))) return 0;
101 ptr->logbrush.lbStyle = brush->lbStyle;
102 ptr->logbrush.lbColor = brush->lbColor;
103 ptr->logbrush.lbHatch = brush->lbHatch;
105 switch (ptr->logbrush.lbStyle)
108 ptr->logbrush.lbStyle = BS_PATTERN;
111 ptr->logbrush.lbHatch = (LONG)BITMAP_CopyBitmap( (HBITMAP) ptr->logbrush.lbHatch );
112 if (!ptr->logbrush.lbHatch) goto error;
115 case BS_DIBPATTERNPT:
116 ptr->logbrush.lbStyle = BS_DIBPATTERN;
117 ptr->logbrush.lbHatch = (LONG)dib_copy( (BITMAPINFO *) ptr->logbrush.lbHatch,
118 ptr->logbrush.lbColor);
119 if (!ptr->logbrush.lbHatch) goto error;
122 case BS_DIBPATTERN8X8:
126 HGLOBAL h = (HGLOBAL)ptr->logbrush.lbHatch;
128 ptr->logbrush.lbStyle = BS_DIBPATTERN;
129 if (!(bmi = (BITMAPINFO *)GlobalLock( h ))) goto error;
130 ptr->logbrush.lbHatch = dib_copy( bmi, ptr->logbrush.lbColor);
132 if (!ptr->logbrush.lbHatch) goto error;
137 if(ptr->logbrush.lbStyle > BS_MONOPATTERN) goto error;
141 GDI_ReleaseObj( hbrush );
142 TRACE("%p\n", hbrush);
146 GDI_FreeObject( hbrush, ptr );
151 /***********************************************************************
152 * CreateHatchBrush (GDI32.@)
154 HBRUSH WINAPI CreateHatchBrush( INT style, COLORREF color )
158 TRACE("%d %06lx\n", style, color );
160 logbrush.lbStyle = BS_HATCHED;
161 logbrush.lbColor = color;
162 logbrush.lbHatch = style;
164 return CreateBrushIndirect( &logbrush );
168 /***********************************************************************
169 * CreatePatternBrush (GDI32.@)
171 HBRUSH WINAPI CreatePatternBrush( HBITMAP hbitmap )
173 LOGBRUSH logbrush = { BS_PATTERN, 0, 0 };
174 TRACE("%p\n", hbitmap );
176 logbrush.lbHatch = (ULONG_PTR)hbitmap;
177 return CreateBrushIndirect( &logbrush );
181 /***********************************************************************
182 * CreateDIBPatternBrush (GDI32.@)
184 * Create a logical brush which has the pattern specified by the DIB
186 * Function call is for compatibility only. CreateDIBPatternBrushPt should be used.
190 * Handle to a logical brush on success, NULL on failure.
195 HBRUSH WINAPI CreateDIBPatternBrush(
196 HGLOBAL hbitmap, /* [in] Global object containg BITMAPINFO structure */
197 UINT coloruse /* [in] Specifies color format, if provided */
202 TRACE("%p\n", hbitmap );
204 logbrush.lbStyle = BS_DIBPATTERN;
205 logbrush.lbColor = coloruse;
207 logbrush.lbHatch = (LONG)hbitmap;
209 return CreateBrushIndirect( &logbrush );
213 /***********************************************************************
214 * CreateDIBPatternBrushPt (GDI32.@)
216 * Create a logical brush which has the pattern specified by the DIB
220 * Handle to a logical brush on success, NULL on failure.
225 HBRUSH WINAPI CreateDIBPatternBrushPt(
226 const void* data, /* [in] Pointer to a BITMAPINFO structure followed by more data */
227 UINT coloruse /* [in] Specifies color format, if provided */
230 BITMAPINFO *info=(BITMAPINFO*)data;
233 TRACE("%p %ldx%ld %dbpp\n", info, info->bmiHeader.biWidth,
234 info->bmiHeader.biHeight, info->bmiHeader.biBitCount);
236 logbrush.lbStyle = BS_DIBPATTERNPT;
237 logbrush.lbColor = coloruse;
238 logbrush.lbHatch = (LONG) data;
240 return CreateBrushIndirect( &logbrush );
244 /***********************************************************************
245 * CreateSolidBrush (GDI32.@)
247 HBRUSH WINAPI CreateSolidBrush( COLORREF color )
251 TRACE("%06lx\n", color );
253 logbrush.lbStyle = BS_SOLID;
254 logbrush.lbColor = color;
255 logbrush.lbHatch = 0;
257 return CreateBrushIndirect( &logbrush );
261 /***********************************************************************
262 * SetBrushOrgEx (GDI32.@)
264 BOOL WINAPI SetBrushOrgEx( HDC hdc, INT x, INT y, LPPOINT oldorg )
266 DC *dc = DC_GetDCPtr( hdc );
268 if (!dc) return FALSE;
271 oldorg->x = dc->brushOrgX;
272 oldorg->y = dc->brushOrgY;
276 GDI_ReleaseObj( hdc );
280 /***********************************************************************
281 * FixBrushOrgEx (GDI32.@)
282 * SDK says discontinued, but in Win95 GDI32 this is the same as SetBrushOrgEx
284 BOOL WINAPI FixBrushOrgEx( HDC hdc, INT x, INT y, LPPOINT oldorg )
286 return SetBrushOrgEx(hdc,x,y,oldorg);
290 /***********************************************************************
293 static HGDIOBJ BRUSH_SelectObject( HGDIOBJ handle, void *obj, HDC hdc )
295 BRUSHOBJ *brush = obj;
297 DC *dc = DC_GetDCPtr( hdc );
301 if (brush->logbrush.lbStyle == BS_PATTERN)
302 BITMAP_SetOwnerDC( (HBITMAP)brush->logbrush.lbHatch, dc );
305 if (dc->funcs->pSelectBrush) handle = dc->funcs->pSelectBrush( dc->physDev, handle );
306 if (handle) dc->hBrush = handle;
308 GDI_ReleaseObj( hdc );
313 /***********************************************************************
316 static BOOL BRUSH_DeleteObject( HGDIOBJ handle, void *obj )
318 BRUSHOBJ *brush = obj;
320 switch(brush->logbrush.lbStyle)
323 DeleteObject( (HGDIOBJ)brush->logbrush.lbHatch );
326 GlobalFree16( (HGLOBAL16)brush->logbrush.lbHatch );
329 return GDI_FreeObject( handle, obj );
333 /***********************************************************************
336 static INT BRUSH_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer )
338 BRUSHOBJ *brush = obj;
341 logbrush.lbStyle = brush->logbrush.lbStyle;
342 logbrush.lbColor = brush->logbrush.lbColor;
343 logbrush.lbHatch = brush->logbrush.lbHatch;
344 if (count > sizeof(logbrush)) count = sizeof(logbrush);
345 memcpy( buffer, &logbrush, count );
350 /***********************************************************************
353 static INT BRUSH_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer )
355 BRUSHOBJ *brush = obj;
358 return sizeof(brush->logbrush);
360 if (count > sizeof(brush->logbrush)) count = sizeof(brush->logbrush);
361 memcpy( buffer, &brush->logbrush, count );
366 /***********************************************************************
367 * SetSolidBrush (GDI.604)
369 * If hBrush is a solid brush, change its color to newColor.
372 * TRUE on success, FALSE on failure.
374 * FIXME: untested, not sure if correct.
376 BOOL16 WINAPI SetSolidBrush16(HBRUSH16 hBrush, COLORREF newColor )
381 TRACE("(hBrush %04x, newColor %08lx)\n", hBrush, (DWORD)newColor);
382 if (!(brushPtr = (BRUSHOBJ *) GDI_GetObjPtr( HBRUSH_32(hBrush), BRUSH_MAGIC )))
385 if (brushPtr->logbrush.lbStyle == BS_SOLID)
387 brushPtr->logbrush.lbColor = newColor;
391 GDI_ReleaseObj( HBRUSH_32(hBrush) );