blob: fe3c6f959ebad3452a8ba3980ec30277789bb58c [file] [log] [blame]
Alexandre Julliard401710d1993-09-04 10:09:32 +00001/*
2 * GDI functions
3 *
4 * Copyright 1993 Alexandre Julliard
Alexandre Julliarda2f2e011995-06-06 16:40:35 +00005 */
Alexandre Julliard401710d1993-09-04 10:09:32 +00006
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00007#include <stdlib.h>
8#include <stdio.h>
Alexandre Julliard234bc241994-12-10 13:02:28 +00009#include "color.h"
Alexandre Julliard234bc241994-12-10 13:02:28 +000010#include "bitmap.h"
Alexandre Julliard7cbe6571995-01-09 18:21:16 +000011#include "brush.h"
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +000012#include "dc.h"
Alexandre Julliard234bc241994-12-10 13:02:28 +000013#include "font.h"
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000014#include "heap.h"
Alexandre Julliardd37eb361997-07-20 16:23:21 +000015#include "options.h"
Alexandre Julliard7cbe6571995-01-09 18:21:16 +000016#include "palette.h"
17#include "pen.h"
18#include "region.h"
19#include "stddebug.h"
Alexandre Julliardaca05781994-10-17 18:12:41 +000020#include "debug.h"
Alexandre Julliard491502b1997-11-01 19:08:16 +000021#include "gdi.h"
Alexandre Julliard401710d1993-09-04 10:09:32 +000022
Alexandre Julliarde2abbb11995-03-19 17:39:39 +000023WORD GDI_HeapSel = 0;
Alexandre Julliard401710d1993-09-04 10:09:32 +000024
Alexandre Julliard401710d1993-09-04 10:09:32 +000025/***********************************************************************
26 * GDI stock objects
27 */
28
29static BRUSHOBJ WhiteBrush =
30{
Alexandre Julliard0e270f41996-08-24 18:26:35 +000031 { 0, BRUSH_MAGIC, 1 }, /* header */
Alexandre Julliard401710d1993-09-04 10:09:32 +000032 { BS_SOLID, RGB(255,255,255), 0 } /* logbrush */
33};
34
35static BRUSHOBJ LtGrayBrush =
36{
Alexandre Julliard0e270f41996-08-24 18:26:35 +000037 { 0, BRUSH_MAGIC, 1 }, /* header */
Alexandre Julliard33072e11997-06-29 18:08:02 +000038/* FIXME : this should perhaps be BS_HATCHED, at least for 1 bitperpixel */
Alexandre Julliard401710d1993-09-04 10:09:32 +000039 { BS_SOLID, RGB(192,192,192), 0 } /* logbrush */
40};
41
42static BRUSHOBJ GrayBrush =
43{
Alexandre Julliard0e270f41996-08-24 18:26:35 +000044 { 0, BRUSH_MAGIC, 1 }, /* header */
Alexandre Julliard33072e11997-06-29 18:08:02 +000045/* FIXME : this should perhaps be BS_HATCHED, at least for 1 bitperpixel */
Alexandre Julliard401710d1993-09-04 10:09:32 +000046 { BS_SOLID, RGB(128,128,128), 0 } /* logbrush */
47};
48
49static BRUSHOBJ DkGrayBrush =
50{
Alexandre Julliard0e270f41996-08-24 18:26:35 +000051 { 0, BRUSH_MAGIC, 1 }, /* header */
Alexandre Julliard33072e11997-06-29 18:08:02 +000052/* This is BS_HATCHED, for 1 bitperpixel. This makes the spray work in pbrush */
53/* NB_HATCH_STYLES is an index into HatchBrushes */
54 { BS_HATCHED, RGB(0,0,0), NB_HATCH_STYLES } /* logbrush */
Alexandre Julliard401710d1993-09-04 10:09:32 +000055};
56
57static BRUSHOBJ BlackBrush =
58{
Alexandre Julliard0e270f41996-08-24 18:26:35 +000059 { 0, BRUSH_MAGIC, 1 }, /* header */
Alexandre Julliard401710d1993-09-04 10:09:32 +000060 { BS_SOLID, RGB(0,0,0), 0 } /* logbrush */
61};
62
63static BRUSHOBJ NullBrush =
64{
Alexandre Julliard0e270f41996-08-24 18:26:35 +000065 { 0, BRUSH_MAGIC, 1 }, /* header */
66 { BS_NULL, 0, 0 } /* logbrush */
Alexandre Julliard401710d1993-09-04 10:09:32 +000067};
68
69static PENOBJ WhitePen =
70{
Alexandre Julliard0e270f41996-08-24 18:26:35 +000071 { 0, PEN_MAGIC, 1 }, /* header */
Alexandre Julliard401710d1993-09-04 10:09:32 +000072 { PS_SOLID, { 1, 0 }, RGB(255,255,255) } /* logpen */
73};
74
75static PENOBJ BlackPen =
76{
Alexandre Julliard0e270f41996-08-24 18:26:35 +000077 { 0, PEN_MAGIC, 1 }, /* header */
Alexandre Julliard401710d1993-09-04 10:09:32 +000078 { PS_SOLID, { 1, 0 }, RGB(0,0,0) } /* logpen */
79};
80
81static PENOBJ NullPen =
82{
Alexandre Julliard0e270f41996-08-24 18:26:35 +000083 { 0, PEN_MAGIC, 1 }, /* header */
Alexandre Julliard401710d1993-09-04 10:09:32 +000084 { PS_NULL, { 1, 0 }, 0 } /* logpen */
85};
86
87static FONTOBJ OEMFixedFont =
88{
Alexandre Julliard0e270f41996-08-24 18:26:35 +000089 { 0, FONT_MAGIC, 1 }, /* header */
Alexandre Julliard401710d1993-09-04 10:09:32 +000090 { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET,
91 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" }
92};
Alexandre Julliard44ed71f1997-12-21 19:17:50 +000093/* Filler to make the location counter dword aligned again. This is necessary
94 since (a) FONTOBJ is packed, (b) gcc places initialised variables in the code
95 segment, and (c) Solaris assembler is stupid. */
96static UINT16 align_OEMFixedFont = 1;
Alexandre Julliard401710d1993-09-04 10:09:32 +000097
98static FONTOBJ AnsiFixedFont =
99{
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000100 { 0, FONT_MAGIC, 1 }, /* header */
Alexandre Julliard401710d1993-09-04 10:09:32 +0000101 { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
102 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" }
103};
Alexandre Julliard44ed71f1997-12-21 19:17:50 +0000104static UINT16 align_AnsiFixedFont = 1;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000105
106static FONTOBJ AnsiVarFont =
107{
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000108 { 0, FONT_MAGIC, 1 }, /* header */
Alexandre Julliard401710d1993-09-04 10:09:32 +0000109 { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000110 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "MS Sans Serif" }
Alexandre Julliard401710d1993-09-04 10:09:32 +0000111};
Alexandre Julliard44ed71f1997-12-21 19:17:50 +0000112static UINT16 align_AnsiVarFont = 1;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000113
114static FONTOBJ SystemFont =
115{
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000116 { 0, FONT_MAGIC, 1 },
Alexandre Julliard33072e11997-06-29 18:08:02 +0000117 { 16, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET,
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000118 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "System" }
Alexandre Julliard401710d1993-09-04 10:09:32 +0000119};
Alexandre Julliard44ed71f1997-12-21 19:17:50 +0000120static UINT16 align_SystemFont = 1;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000121
122static FONTOBJ DeviceDefaultFont =
123{
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000124 { 0, FONT_MAGIC, 1 }, /* header */
Alexandre Julliard401710d1993-09-04 10:09:32 +0000125 { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
126 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "" }
127};
Alexandre Julliard44ed71f1997-12-21 19:17:50 +0000128static UINT16 align_DeviceDefaultFont = 1;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000129
130static FONTOBJ SystemFixedFont =
131{
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000132 { 0, FONT_MAGIC, 1 }, /* header */
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000133 { 12, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET,
Alexandre Julliard401710d1993-09-04 10:09:32 +0000134 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, "" }
135};
Alexandre Julliard44ed71f1997-12-21 19:17:50 +0000136static UINT16 align_SystemFixedFont = 1;
137
138/* FIXME: Is this correct? */
139static FONTOBJ DefaultGuiFont =
140{
141 { 9, FONT_MAGIC, 1 }, /* header */
142 { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
143 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "MS Sans Serif" }
144};
145static UINT16 align_DefaultGuiFont = 1;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000146
147
148static GDIOBJHDR * StockObjects[NB_STOCK_OBJECTS] =
149{
150 (GDIOBJHDR *) &WhiteBrush,
151 (GDIOBJHDR *) &LtGrayBrush,
152 (GDIOBJHDR *) &GrayBrush,
153 (GDIOBJHDR *) &DkGrayBrush,
154 (GDIOBJHDR *) &BlackBrush,
155 (GDIOBJHDR *) &NullBrush,
156 (GDIOBJHDR *) &WhitePen,
157 (GDIOBJHDR *) &BlackPen,
158 (GDIOBJHDR *) &NullPen,
159 NULL,
160 (GDIOBJHDR *) &OEMFixedFont,
161 (GDIOBJHDR *) &AnsiFixedFont,
162 (GDIOBJHDR *) &AnsiVarFont,
163 (GDIOBJHDR *) &SystemFont,
164 (GDIOBJHDR *) &DeviceDefaultFont,
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000165 NULL, /* DEFAULT_PALETTE created by PALETTE_Init */
Alexandre Julliard44ed71f1997-12-21 19:17:50 +0000166 (GDIOBJHDR *) &SystemFixedFont,
167 (GDIOBJHDR *) &DefaultGuiFont
Alexandre Julliard401710d1993-09-04 10:09:32 +0000168};
169
Alexandre Julliardd37eb361997-07-20 16:23:21 +0000170/******************************************************************************
171 *
172 * void ReadFontInformation(
173 * char const *fontName,
174 * FONTOBJ *font,
175 * int defHeight,
176 * int defBold,
177 * int defItalic,
178 * int defUnderline,
179 * int defStrikeOut )
180 *
181 * ReadFontInformation() checks the Wine configuration file's Tweak.Fonts
182 * section for entries containing fontName.Height, fontName.Bold, etc.,
183 * where fontName is the name specified in the call (e.g., "System"). It
184 * attempts to be user friendly by accepting 'n', 'N', 'f', 'F', or '0' as
185 * the first character in the boolean attributes (bold, italic, and
186 * underline).
187 *****************************************************************************/
188
189static void ReadFontInformation(
190 char const *fontName,
191 FONTOBJ *font,
192 int defHeight,
193 int defBold,
194 int defItalic,
195 int defUnderline,
196 int defStrikeOut )
197{
198 char key[256];
199
200 sprintf(key, "%s.Height", fontName);
201 font->logfont.lfHeight =
202 PROFILE_GetWineIniInt("Tweak.Fonts", key, defHeight);
203
204 sprintf(key, "%s.Bold", fontName);
205 font->logfont.lfWeight =
206 (PROFILE_GetWineIniBool("Tweak.Fonts", key, defBold)) ?
207 FW_BOLD : FW_NORMAL;
208
209 sprintf(key, "%s.Italic", fontName);
210 font->logfont.lfItalic =
211 PROFILE_GetWineIniBool("Tweak.Fonts", key, defItalic);
212
213 sprintf(key, "%s.Underline", fontName);
214 font->logfont.lfUnderline =
215 PROFILE_GetWineIniBool("Tweak.Fonts", key, defUnderline);
216
217 sprintf(key, "%s.StrikeOut", fontName);
218 font->logfont.lfStrikeOut =
219 PROFILE_GetWineIniBool("Tweak.Fonts", key, defStrikeOut);
220
221 return;
222}
223
Alexandre Julliard401710d1993-09-04 10:09:32 +0000224
225/***********************************************************************
226 * GDI_Init
227 *
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000228 * GDI initialization.
Alexandre Julliard401710d1993-09-04 10:09:32 +0000229 */
Alexandre Julliard3051b641996-07-05 17:14:13 +0000230BOOL32 GDI_Init(void)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000231{
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000232 extern BOOL32 X11DRV_Init(void);
Alexandre Julliard7ff1c411997-05-25 13:58:18 +0000233 extern BOOL32 DIB_Init(void);
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000234
Alexandre Julliard44ed71f1997-12-21 19:17:50 +0000235 /* Kill some warnings. */
236 (void)align_OEMFixedFont;
237 (void)align_AnsiFixedFont;
238 (void)align_AnsiVarFont;
239 (void)align_SystemFont;
240 (void)align_DeviceDefaultFont;
241 (void)align_SystemFixedFont;
242 (void)align_DefaultGuiFont;
243
Alexandre Julliardd37eb361997-07-20 16:23:21 +0000244 /* TWEAK: Initialize font hints */
245 ReadFontInformation("OEMFixed", &OEMFixedFont, 12, 0, 0, 0, 0);
246 ReadFontInformation("AnsiFixed", &AnsiFixedFont, 12, 0, 0, 0, 0);
247 ReadFontInformation("AnsiVar", &AnsiVarFont, 12, 0, 0, 0, 0);
248 ReadFontInformation("System", &SystemFont, 16, 1, 0, 0, 0);
249 ReadFontInformation("SystemFixed", &SystemFixedFont, 12, 1, 0, 0, 0);
250
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000251 /* Initialize drivers */
252
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000253 DIB_Init(); /* always before X11DRV_Init() */
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000254
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000255 if( X11DRV_Init() )
256 {
257 /* Create default palette */
Alexandre Julliard401710d1993-09-04 10:09:32 +0000258
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000259 /* DR well *this* palette can't be moveable (?) */
260
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000261 HPALETTE16 hpalette = PALETTE_Init();
Alexandre Julliard401710d1993-09-04 10:09:32 +0000262
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000263 if( hpalette )
264 {
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000265 StockObjects[DEFAULT_PALETTE] = (GDIOBJHDR *)GDI_HEAP_LOCK( hpalette );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000266 return TRUE;
267 }
268 }
269 return FALSE;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000270}
271
272
273/***********************************************************************
Alexandre Julliard401710d1993-09-04 10:09:32 +0000274 * GDI_AllocObject
275 */
Alexandre Julliardbf9130a1996-10-13 17:45:47 +0000276HGDIOBJ16 GDI_AllocObject( WORD size, WORD magic )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000277{
278 static DWORD count = 0;
279 GDIOBJHDR * obj;
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000280 HGDIOBJ16 handle;
281 if ( magic == DC_MAGIC || magic == METAFILE_DC_MAGIC )
282 handle = GDI_HEAP_ALLOC( size );
283 else
284 handle = GDI_HEAP_ALLOC_MOVEABLE( size );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000285 if (!handle) return 0;
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000286 obj = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000287 obj->hNext = 0;
288 obj->wMagic = magic;
289 obj->dwCount = ++count;
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000290 GDI_HEAP_UNLOCK( handle );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000291 return handle;
292}
293
294
295/***********************************************************************
296 * GDI_FreeObject
297 */
Alexandre Julliardbf9130a1996-10-13 17:45:47 +0000298BOOL32 GDI_FreeObject( HGDIOBJ16 handle )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000299{
300 GDIOBJHDR * object;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000301
302 /* Can't free stock objects */
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000303 if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
304 return TRUE;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000305
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000306 object = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000307 if (!object) return FALSE;
Alexandre Julliardaca05781994-10-17 18:12:41 +0000308 object->wMagic = 0; /* Mark it as invalid */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000309
Alexandre Julliard401710d1993-09-04 10:09:32 +0000310 /* Free object */
311
312 GDI_HEAP_FREE( handle );
313 return TRUE;
314}
315
316/***********************************************************************
317 * GDI_GetObjPtr
318 *
319 * Return a pointer to the GDI object associated to the handle.
320 * Return NULL if the object has the wrong magic number.
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000321 * Movable GDI objects are locked in memory: it is up to the caller to unlock
322 * it after the caller is done with the pointer.
Alexandre Julliard401710d1993-09-04 10:09:32 +0000323 */
Alexandre Julliardbf9130a1996-10-13 17:45:47 +0000324GDIOBJHDR * GDI_GetObjPtr( HGDIOBJ16 handle, WORD magic )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000325{
326 GDIOBJHDR * ptr = NULL;
327
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000328 if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
329 ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
Alexandre Julliardaf0bae51995-10-03 17:06:08 +0000330 else
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000331 ptr = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000332 if (!ptr) return NULL;
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000333 if ((magic != MAGIC_DONTCARE) && (ptr->wMagic != magic))
334 {
335 GDI_HEAP_UNLOCK( handle );
336 return NULL;
337 }
Alexandre Julliard401710d1993-09-04 10:09:32 +0000338 return ptr;
339}
340
341
342/***********************************************************************
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000343 * DeleteObject16 (GDI.69)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000344 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000345BOOL16 WINAPI DeleteObject16( HGDIOBJ16 obj )
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000346{
347 return DeleteObject32( obj );
348}
349
350
351/***********************************************************************
352 * DeleteObject32 (GDI32.70)
353 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000354BOOL32 WINAPI DeleteObject32( HGDIOBJ32 obj )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000355{
356 /* Check if object is valid */
357
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000358 GDIOBJHDR * header;
359 if (HIWORD(obj)) return FALSE;
360 if ((obj >= FIRST_STOCK_HANDLE) && (obj <= LAST_STOCK_HANDLE))
361 return TRUE;
362 if (!(header = (GDIOBJHDR *) GDI_HEAP_LOCK( obj ))) return FALSE;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000363
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000364 dprintf_gdi(stddeb, "DeleteObject: %04x\n", obj );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000365
366 /* Delete object */
367
368 switch(header->wMagic)
369 {
370 case PEN_MAGIC: return GDI_FreeObject( obj );
Alexandre Julliard7cbe6571995-01-09 18:21:16 +0000371 case BRUSH_MAGIC: return BRUSH_DeleteObject( obj, (BRUSHOBJ*)header );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000372 case FONT_MAGIC: return GDI_FreeObject( obj );
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000373 case PALETTE_MAGIC: return PALETTE_DeleteObject(obj,(PALETTEOBJ*)header);
Alexandre Julliard7cbe6571995-01-09 18:21:16 +0000374 case BITMAP_MAGIC: return BITMAP_DeleteObject( obj, (BITMAPOBJ*)header);
375 case REGION_MAGIC: return REGION_DeleteObject( obj, (RGNOBJ*)header );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000376 }
377 return FALSE;
378}
379
380
381/***********************************************************************
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000382 * GetStockObject16 (GDI.87)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000383 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000384HGDIOBJ16 WINAPI GetStockObject16( INT16 obj )
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000385{
386 return (HGDIOBJ16)GetStockObject32( obj );
387}
388
389
390/***********************************************************************
391 * GetStockObject32 (GDI32.220)
392 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000393HGDIOBJ32 WINAPI GetStockObject32( INT32 obj )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000394{
395 if ((obj < 0) || (obj >= NB_STOCK_OBJECTS)) return 0;
396 if (!StockObjects[obj]) return 0;
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000397 dprintf_gdi(stddeb, "GetStockObject: returning %d\n",
398 FIRST_STOCK_HANDLE + obj );
Alexandre Julliardbf9130a1996-10-13 17:45:47 +0000399 return (HGDIOBJ16)(FIRST_STOCK_HANDLE + obj);
Alexandre Julliard401710d1993-09-04 10:09:32 +0000400}
401
402
403/***********************************************************************
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000404 * GetObject16 (GDI.82)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000405 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000406INT16 WINAPI GetObject16( HANDLE16 handle, INT16 count, LPVOID buffer )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000407{
408 GDIOBJHDR * ptr = NULL;
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000409 INT16 result = 0;
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000410 dprintf_gdi(stddeb, "GetObject16: %04x %d %p\n", handle, count, buffer );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000411 if (!count) return 0;
412
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000413 if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
414 ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
Alexandre Julliardaf0bae51995-10-03 17:06:08 +0000415 else
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000416 ptr = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000417 if (!ptr) return 0;
418
419 switch(ptr->wMagic)
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000420 {
Alexandre Julliard401710d1993-09-04 10:09:32 +0000421 case PEN_MAGIC:
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000422 result = PEN_GetObject16( (PENOBJ *)ptr, count, buffer );
423 break;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000424 case BRUSH_MAGIC:
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000425 result = BRUSH_GetObject16( (BRUSHOBJ *)ptr, count, buffer );
426 break;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000427 case BITMAP_MAGIC:
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000428 result = BITMAP_GetObject16( (BITMAPOBJ *)ptr, count, buffer );
429 break;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000430 case FONT_MAGIC:
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000431 result = FONT_GetObject16( (FONTOBJ *)ptr, count, buffer );
432 break;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000433 case PALETTE_MAGIC:
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000434 result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
435 break;
436 }
437 GDI_HEAP_UNLOCK( handle );
438 return result;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000439}
440
441
442/***********************************************************************
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000443 * GetObject32A (GDI32.204)
444 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000445INT32 WINAPI GetObject32A( HANDLE32 handle, INT32 count, LPVOID buffer )
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000446{
447 GDIOBJHDR * ptr = NULL;
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000448 INT32 result = 0;
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000449 dprintf_gdi(stddeb, "GetObject32A: %08x %d %p\n", handle, count, buffer );
450 if (!count) return 0;
451
452 if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
453 ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
454 else
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000455 ptr = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000456 if (!ptr) return 0;
457
458 switch(ptr->wMagic)
459 {
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000460 case PEN_MAGIC:
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000461 result = PEN_GetObject32( (PENOBJ *)ptr, count, buffer );
462 break;
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000463 case BRUSH_MAGIC:
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000464 result = BRUSH_GetObject32( (BRUSHOBJ *)ptr, count, buffer );
465 break;
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000466 case BITMAP_MAGIC:
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000467 result = BITMAP_GetObject32( (BITMAPOBJ *)ptr, count, buffer );
468 break;
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000469 case FONT_MAGIC:
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000470 result = FONT_GetObject32A( (FONTOBJ *)ptr, count, buffer );
471 break;
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000472 case PALETTE_MAGIC:
473 fprintf( stderr, "GetObject32: magic %04x not implemented\n",
474 ptr->wMagic );
475 break;
476 }
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000477 GDI_HEAP_UNLOCK( handle );
478 return result;
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000479}
480
Alexandre Julliard491502b1997-11-01 19:08:16 +0000481/***********************************************************************
482 * GetObjectType (GDI32.205)
483 */
484DWORD WINAPI GetObjectType( HANDLE32 handle )
485{
486 GDIOBJHDR * ptr = NULL;
487 INT32 result = 0;
488 dprintf_gdi(stddeb, "GetObjectType: %08x\n", handle );
489
490 if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
491 ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
492 else
493 ptr = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
494 if (!ptr) return 0;
495
496 switch(ptr->wMagic)
497 {
498 case PEN_MAGIC:
499 result = OBJ_PEN;
500 break;
501 case BRUSH_MAGIC:
502 result = OBJ_BRUSH;
503 break;
504 case BITMAP_MAGIC:
505 result = OBJ_BITMAP;
506 break;
507 case FONT_MAGIC:
508 result = OBJ_FONT;
509 break;
510 case PALETTE_MAGIC:
511 result = OBJ_PAL;
512 break;
513 case REGION_MAGIC:
514 result = OBJ_REGION;
515 break;
516 case DC_MAGIC:
517 result = OBJ_DC;
518 break;
519 case META_DC_MAGIC:
520 result = OBJ_METADC;
521 break;
522 case METAFILE_MAGIC:
523 result = OBJ_METAFILE;
524 break;
525 case METAFILE_DC_MAGIC:
526 result = OBJ_METADC;
527 break;
528
529 default:
530 fprintf( stderr, "GetObjectType: magic %04x not implemented\n",
531 ptr->wMagic );
532 break;
533 }
534 GDI_HEAP_UNLOCK( handle );
535 return result;
536}
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000537
538/***********************************************************************
539 * GetObject32W (GDI32.206)
540 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000541INT32 WINAPI GetObject32W( HANDLE32 handle, INT32 count, LPVOID buffer )
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000542{
543 return GetObject32A( handle, count, buffer );
544}
545
Alexandre Julliard44ed71f1997-12-21 19:17:50 +0000546/***********************************************************************
547 * GetCurrentObject (GDI32.166)
548 */
549HANDLE32 WINAPI GetCurrentObject(HDC32 hdc,UINT32 type)
550{
551 DC * dc = DC_GetDCPtr( hdc );
552
553 if (!dc)
554 return 0;
555 switch (type) {
556 case OBJ_PEN: return dc->w.hPen;
557 case OBJ_BRUSH: return dc->w.hBrush;
558 case OBJ_PAL: return dc->w.hPalette;
559 case OBJ_FONT: return dc->w.hFont;
560 case OBJ_BITMAP: return dc->w.hBitmap;
561 default:
562 /* the SDK only mentions those above */
563 fprintf(stderr,"GetCurrentObject(%08x,%d), unknown type.\n",hdc,type);
564 return 0;
565 }
566}
567
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000568
569/***********************************************************************
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000570 * SelectObject16 (GDI.45)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000571 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000572HGDIOBJ16 WINAPI SelectObject16( HDC16 hdc, HGDIOBJ16 handle )
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000573{
574 return (HGDIOBJ16)SelectObject32( hdc, handle );
575}
576
577
578/***********************************************************************
579 * SelectObject32 (GDI32.299)
580 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000581HGDIOBJ32 WINAPI SelectObject32( HDC32 hdc, HGDIOBJ32 handle )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000582{
Alexandre Julliard349a9531997-02-02 19:01:52 +0000583 DC * dc = DC_GetDCPtr( hdc );
584 if (!dc || !dc->funcs->pSelectObject) return 0;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000585 dprintf_gdi(stddeb, "SelectObject: hdc=%04x %04x\n", hdc, handle );
Alexandre Julliard349a9531997-02-02 19:01:52 +0000586 return dc->funcs->pSelectObject( dc, handle );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000587}
588
589
590/***********************************************************************
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000591 * UnrealizeObject16 (GDI.150)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000592 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000593BOOL16 WINAPI UnrealizeObject16( HGDIOBJ16 obj )
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000594{
595 return UnrealizeObject32( obj );
596}
597
598
599/***********************************************************************
600 * UnrealizeObject (GDI32.358)
601 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000602BOOL32 WINAPI UnrealizeObject32( HGDIOBJ32 obj )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000603{
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000604 BOOL32 result = TRUE;
605 /* Check if object is valid */
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000606
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000607 GDIOBJHDR * header = (GDIOBJHDR *) GDI_HEAP_LOCK( obj );
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000608 if (!header) return FALSE;
609
610 dprintf_gdi( stddeb, "UnrealizeObject: %04x\n", obj );
611
612 /* Unrealize object */
613
614 switch(header->wMagic)
615 {
616 case PALETTE_MAGIC:
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000617 result = PALETTE_UnrealizeObject( obj, (PALETTEOBJ *)header );
618 break;
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000619
620 case BRUSH_MAGIC:
621 /* Windows resets the brush origin. We don't need to. */
622 break;
623 }
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000624 GDI_HEAP_UNLOCK( obj );
625 return result;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000626}
Alexandre Julliard1f579291994-05-25 16:25:21 +0000627
628
629/***********************************************************************
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000630 * EnumObjects16 (GDI.71)
Alexandre Julliard1f579291994-05-25 16:25:21 +0000631 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000632INT16 WINAPI EnumObjects16( HDC16 hdc, INT16 nObjType,
633 GOBJENUMPROC16 lpEnumFunc, LPARAM lParam )
Alexandre Julliard1f579291994-05-25 16:25:21 +0000634{
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000635 /* Solid colors to enumerate */
636 static const COLORREF solid_colors[] =
637 { RGB(0x00,0x00,0x00), RGB(0xff,0xff,0xff),
638 RGB(0xff,0x00,0x00), RGB(0x00,0xff,0x00),
639 RGB(0x00,0x00,0xff), RGB(0xff,0xff,0x00),
640 RGB(0xff,0x00,0xff), RGB(0x00,0xff,0xff),
641 RGB(0x80,0x00,0x00), RGB(0x00,0x80,0x00),
642 RGB(0x80,0x80,0x00), RGB(0x00,0x00,0x80),
643 RGB(0x80,0x00,0x80), RGB(0x00,0x80,0x80),
644 RGB(0x80,0x80,0x80), RGB(0xc0,0xc0,0xc0)
645 };
646
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000647 INT16 i, retval = 0;
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000648 LOGPEN16 *pen;
649 LOGBRUSH16 *brush = NULL;
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000650
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000651 dprintf_gdi( stddeb, "EnumObjects16: %04x %d %08lx %08lx\n",
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000652 hdc, nObjType, (DWORD)lpEnumFunc, lParam );
653 switch(nObjType)
654 {
655 case OBJ_PEN:
656 /* Enumerate solid pens */
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000657 if (!(pen = SEGPTR_NEW(LOGPEN16))) break;
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000658 for (i = 0; i < sizeof(solid_colors)/sizeof(solid_colors[0]); i++)
659 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000660 pen->lopnStyle = PS_SOLID;
661 pen->lopnWidth.x = 1;
662 pen->lopnWidth.y = 0;
663 pen->lopnColor = solid_colors[i];
Alexandre Julliardf1aa3031996-08-05 17:42:43 +0000664 retval = lpEnumFunc( SEGPTR_GET(pen), lParam );
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000665 dprintf_gdi( stddeb, "EnumObjects16: solid pen %08lx, ret=%d\n",
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000666 solid_colors[i], retval);
667 if (!retval) break;
668 }
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000669 SEGPTR_FREE(pen);
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000670 break;
671
672 case OBJ_BRUSH:
673 /* Enumerate solid brushes */
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000674 if (!(brush = SEGPTR_NEW(LOGBRUSH16))) break;
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000675 for (i = 0; i < sizeof(solid_colors)/sizeof(solid_colors[0]); i++)
676 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000677 brush->lbStyle = BS_SOLID;
678 brush->lbColor = solid_colors[i];
679 brush->lbHatch = 0;
Alexandre Julliardf1aa3031996-08-05 17:42:43 +0000680 retval = lpEnumFunc( SEGPTR_GET(brush), lParam );
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000681 dprintf_gdi( stddeb, "EnumObjects16: solid brush %08lx, ret=%d\n",
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000682 solid_colors[i], retval);
683 if (!retval) break;
684 }
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000685
686 /* Now enumerate hatched brushes */
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000687 if (retval) for (i = HS_HORIZONTAL; i <= HS_DIAGCROSS; i++)
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000688 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000689 brush->lbStyle = BS_HATCHED;
690 brush->lbColor = RGB(0,0,0);
691 brush->lbHatch = i;
Alexandre Julliardf1aa3031996-08-05 17:42:43 +0000692 retval = lpEnumFunc( SEGPTR_GET(brush), lParam );
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000693 dprintf_gdi( stddeb, "EnumObjects16: hatched brush %d, ret=%d\n",
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000694 i, retval);
695 if (!retval) break;
696 }
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000697 SEGPTR_FREE(brush);
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000698 break;
699
700 default:
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000701 fprintf( stderr, "EnumObjects16: invalid type %d\n", nObjType );
702 break;
703 }
704 return retval;
705}
706
707
708/***********************************************************************
709 * EnumObjects32 (GDI32.89)
710 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000711INT32 WINAPI EnumObjects32( HDC32 hdc, INT32 nObjType,
712 GOBJENUMPROC32 lpEnumFunc, LPARAM lParam )
Alexandre Julliard139a4b11996-11-02 14:24:07 +0000713{
714 /* Solid colors to enumerate */
715 static const COLORREF solid_colors[] =
716 { RGB(0x00,0x00,0x00), RGB(0xff,0xff,0xff),
717 RGB(0xff,0x00,0x00), RGB(0x00,0xff,0x00),
718 RGB(0x00,0x00,0xff), RGB(0xff,0xff,0x00),
719 RGB(0xff,0x00,0xff), RGB(0x00,0xff,0xff),
720 RGB(0x80,0x00,0x00), RGB(0x00,0x80,0x00),
721 RGB(0x80,0x80,0x00), RGB(0x00,0x00,0x80),
722 RGB(0x80,0x00,0x80), RGB(0x00,0x80,0x80),
723 RGB(0x80,0x80,0x80), RGB(0xc0,0xc0,0xc0)
724 };
725
726 INT32 i, retval = 0;
727 LOGPEN32 pen;
728 LOGBRUSH32 brush;
729
730 dprintf_gdi( stddeb, "EnumObjects32: %04x %d %08lx %08lx\n",
731 hdc, nObjType, (DWORD)lpEnumFunc, lParam );
732 switch(nObjType)
733 {
734 case OBJ_PEN:
735 /* Enumerate solid pens */
736 for (i = 0; i < sizeof(solid_colors)/sizeof(solid_colors[0]); i++)
737 {
738 pen.lopnStyle = PS_SOLID;
739 pen.lopnWidth.x = 1;
740 pen.lopnWidth.y = 0;
741 pen.lopnColor = solid_colors[i];
742 retval = lpEnumFunc( &pen, lParam );
743 dprintf_gdi( stddeb, "EnumObjects32: solid pen %08lx, ret=%d\n",
744 solid_colors[i], retval);
745 if (!retval) break;
746 }
747 break;
748
749 case OBJ_BRUSH:
750 /* Enumerate solid brushes */
751 for (i = 0; i < sizeof(solid_colors)/sizeof(solid_colors[0]); i++)
752 {
753 brush.lbStyle = BS_SOLID;
754 brush.lbColor = solid_colors[i];
755 brush.lbHatch = 0;
756 retval = lpEnumFunc( &brush, lParam );
757 dprintf_gdi( stddeb, "EnumObjects32: solid brush %08lx, ret=%d\n",
758 solid_colors[i], retval);
759 if (!retval) break;
760 }
761
762 /* Now enumerate hatched brushes */
763 if (retval) for (i = HS_HORIZONTAL; i <= HS_DIAGCROSS; i++)
764 {
765 brush.lbStyle = BS_HATCHED;
766 brush.lbColor = RGB(0,0,0);
767 brush.lbHatch = i;
768 retval = lpEnumFunc( &brush, lParam );
769 dprintf_gdi( stddeb, "EnumObjects32: hatched brush %d, ret=%d\n",
770 i, retval);
771 if (!retval) break;
772 }
773 break;
774
775 default:
776 /* FIXME: implement Win32 types */
777 fprintf( stderr, "EnumObjects32: invalid type %d\n", nObjType );
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000778 break;
779 }
780 return retval;
Alexandre Julliard1f579291994-05-25 16:25:21 +0000781}
Alexandre Julliard7cc9c0c1994-06-15 15:45:11 +0000782
Alexandre Julliardd7d4fdf1995-12-26 15:05:24 +0000783
Alexandre Julliard7cc9c0c1994-06-15 15:45:11 +0000784/***********************************************************************
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000785 * IsGDIObject (GDI.462)
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000786 *
787 * returns type of object if valid (W95 system programming secrets p. 264-5)
Alexandre Julliard7cc9c0c1994-06-15 15:45:11 +0000788 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000789BOOL16 WINAPI IsGDIObject( HGDIOBJ16 handle )
Alexandre Julliard7cc9c0c1994-06-15 15:45:11 +0000790{
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +0000791 if (handle >= FIRST_STOCK_HANDLE )
792 return TRUE;
793 else
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000794 {
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +0000795 GDIOBJHDR *object = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
796 if (object)
797 {
798 UINT16 magic = object->wMagic;
799 GDI_HEAP_UNLOCK( handle );
800 if (magic >= PEN_MAGIC && magic <= METAFILE_DC_MAGIC)
801 return magic - PEN_MAGIC + 1;
802 }
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000803 }
Alexandre Julliard8cc3a5e1996-08-11 15:49:51 +0000804 return FALSE;
Alexandre Julliard7cc9c0c1994-06-15 15:45:11 +0000805}
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000806
807
808/***********************************************************************
Alexandre Julliard17216f51997-10-12 16:30:17 +0000809 * SetObjectOwner16 (GDI.461)
810 */
811void WINAPI SetObjectOwner16( HGDIOBJ16 handle, HANDLE16 owner )
812{
813 /* Nothing to do */
814}
815
816
817/***********************************************************************
818 * SetObjectOwner32 (GDI32.386)
819 */
820void WINAPI SetObjectOwner32( HGDIOBJ32 handle, HANDLE32 owner )
821{
822 /* Nothing to do */
823}
824
Alexandre Julliard491502b1997-11-01 19:08:16 +0000825/***********************************************************************
826 * GdiFlush (GDI32.128)
827 */
828BOOL32 WINAPI GdiFlush(void)
829{
830 return TRUE; /* FIXME */
831}
832
Alexandre Julliard17216f51997-10-12 16:30:17 +0000833
834/***********************************************************************
835 * GdiGetBatchLimit (GDI32.129)
836 */
837DWORD WINAPI GdiGetBatchLimit(void)
838{
839 return 1; /* FIXME */
840}
841
842
843/***********************************************************************
844 * GdiSetBatchLimit (GDI32.139)
845 */
846DWORD WINAPI GdiSetBatchLimit( DWORD limit )
847{
848 return 1; /* FIXME */
849}
850
851
852/***********************************************************************
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000853 * MulDiv16 (GDI.128)
854 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000855INT16 WINAPI MulDiv16( INT16 foo, INT16 bar, INT16 baz )
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000856{
857 INT32 ret;
858 if (!baz) return -32768;
859 ret = (foo * bar) / baz;
860 if ((ret > 32767) || (ret < -32767)) return -32768;
861 return ret;
862}
863
864
865/***********************************************************************
866 * MulDiv32 (KERNEL32.391)
867 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000868INT32 WINAPI MulDiv32( INT32 foo, INT32 bar, INT32 baz )
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000869{
870#ifdef __GNUC__
871 long long ret;
872 if (!baz) return -1;
873 ret = ((long long)foo * bar) / baz;
874 if ((ret > 2147483647) || (ret < -2147483647)) return -1;
875 return ret;
876#else
877 if (!baz) return -1;
878 return (foo * bar) / baz;
879#endif
880}