4 * Copyright 1993 Alexandre Julliard
7 static char Copyright
[] = "Copyright Alexandre Julliard, 1993";
11 extern Display
* XT_display
;
12 extern Screen
* XT_screen
;
14 MDESC
*GDI_Heap
= NULL
;
17 /***********************************************************************
21 static BRUSHOBJ WhiteBrush
=
23 { 0, BRUSH_MAGIC
, 1, 0 }, /* header */
24 { BS_SOLID
, RGB(255,255,255), 0 } /* logbrush */
27 static BRUSHOBJ LtGrayBrush
=
29 { 0, BRUSH_MAGIC
, 1, 0 }, /* header */
30 { BS_SOLID
, RGB(192,192,192), 0 } /* logbrush */
33 static BRUSHOBJ GrayBrush
=
35 { 0, BRUSH_MAGIC
, 1, 0 }, /* header */
36 { BS_SOLID
, RGB(128,128,128), 0 } /* logbrush */
39 static BRUSHOBJ DkGrayBrush
=
41 { 0, BRUSH_MAGIC
, 1, 0 }, /* header */
42 { BS_SOLID
, RGB(64,64,64), 0 } /* logbrush */
45 static BRUSHOBJ BlackBrush
=
47 { 0, BRUSH_MAGIC
, 1, 0 }, /* header */
48 { BS_SOLID
, RGB(0,0,0), 0 } /* logbrush */
51 static BRUSHOBJ NullBrush
=
53 { 0, BRUSH_MAGIC
, 1, 0 }, /* header */
54 { BS_NULL
, 0, 0 } /* logbrush */
57 static PENOBJ WhitePen
=
59 { 0, PEN_MAGIC
, 1, 0 }, /* header */
60 { PS_SOLID
, { 1, 0 }, RGB(255,255,255) } /* logpen */
63 static PENOBJ BlackPen
=
65 { 0, PEN_MAGIC
, 1, 0 }, /* header */
66 { PS_SOLID
, { 1, 0 }, RGB(0,0,0) } /* logpen */
69 static PENOBJ NullPen
=
71 { 0, PEN_MAGIC
, 1, 0 }, /* header */
72 { PS_NULL
, { 1, 0 }, 0 } /* logpen */
75 static FONTOBJ OEMFixedFont
=
77 { 0, FONT_MAGIC
, 1, 0 }, /* header */
78 { 12, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, OEM_CHARSET
,
79 0, 0, DEFAULT_QUALITY
, FIXED_PITCH
| FF_MODERN
, "" }
82 static FONTOBJ AnsiFixedFont
=
84 { 0, FONT_MAGIC
, 1, 0 }, /* header */
85 { 12, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
86 0, 0, DEFAULT_QUALITY
, FIXED_PITCH
| FF_MODERN
, "" }
89 static FONTOBJ AnsiVarFont
=
91 { 0, FONT_MAGIC
, 1, 0 }, /* header */
92 { 12, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
93 0, 0, DEFAULT_QUALITY
, VARIABLE_PITCH
| FF_SWISS
, "" }
96 static FONTOBJ SystemFont
=
98 { 0, FONT_MAGIC
, 1, 0 }, /* header */
99 { 12, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
100 0, 0, DEFAULT_QUALITY
, VARIABLE_PITCH
| FF_SWISS
, "" }
103 static FONTOBJ DeviceDefaultFont
=
105 { 0, FONT_MAGIC
, 1, 0 }, /* header */
106 { 12, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
107 0, 0, DEFAULT_QUALITY
, VARIABLE_PITCH
| FF_SWISS
, "" }
110 static FONTOBJ SystemFixedFont
=
112 { 0, FONT_MAGIC
, 1, 0 }, /* header */
113 { 12, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
114 0, 0, DEFAULT_QUALITY
, FIXED_PITCH
| FF_MODERN
, "" }
118 static GDIOBJHDR
* StockObjects
[NB_STOCK_OBJECTS
] =
120 (GDIOBJHDR
*) &WhiteBrush
,
121 (GDIOBJHDR
*) &LtGrayBrush
,
122 (GDIOBJHDR
*) &GrayBrush
,
123 (GDIOBJHDR
*) &DkGrayBrush
,
124 (GDIOBJHDR
*) &BlackBrush
,
125 (GDIOBJHDR
*) &NullBrush
,
126 (GDIOBJHDR
*) &WhitePen
,
127 (GDIOBJHDR
*) &BlackPen
,
128 (GDIOBJHDR
*) &NullPen
,
130 (GDIOBJHDR
*) &OEMFixedFont
,
131 (GDIOBJHDR
*) &AnsiFixedFont
,
132 (GDIOBJHDR
*) &AnsiVarFont
,
133 (GDIOBJHDR
*) &SystemFont
,
134 (GDIOBJHDR
*) &DeviceDefaultFont
,
135 NULL
, /* DEFAULT_PALETTE created by PALETTE_Init */
136 (GDIOBJHDR
*) &SystemFixedFont
139 extern GDIOBJHDR
* PALETTE_systemPalette
;
142 /***********************************************************************
145 * GDI initialisation.
149 struct segment_descriptor_s
* s
;
151 /* Create GDI heap */
153 s
= GetNextSegment( 0, 0x10000 );
154 if (s
== NULL
) return FALSE
;
155 HEAP_Init( &GDI_Heap
, s
->base_addr
, GDI_HEAP_SIZE
);
158 /* Create default palette */
161 StockObjects
[DEFAULT_PALETTE
] = PALETTE_systemPalette
;
163 /* Create default bitmap */
165 if (!BITMAP_Init()) return FALSE
;
167 /* Initialise regions */
169 if (!REGION_Init()) return FALSE
;
175 /***********************************************************************
178 * Return the GDI object whose hNext field points to obj.
180 HANDLE
GDI_FindPrevObject( HANDLE first
, HANDLE obj
)
184 for (handle
= first
; handle
&& (handle
!= obj
); )
186 GDIOBJHDR
* header
= (GDIOBJHDR
*) GDI_HEAP_ADDR( handle
);
187 handle
= header
->hNext
;
193 /***********************************************************************
196 HANDLE
GDI_AllocObject( WORD size
, WORD magic
)
198 static DWORD count
= 0;
200 HANDLE handle
= GDI_HEAP_ALLOC( GMEM_MOVEABLE
, size
);
201 if (!handle
) return 0;
203 obj
= (GDIOBJHDR
*) GDI_HEAP_ADDR( handle
);
206 obj
->dwCount
= ++count
;
211 /***********************************************************************
214 BOOL
GDI_FreeObject( HANDLE handle
)
219 /* Can't free stock objects */
220 if (handle
>= FIRST_STOCK_HANDLE
) return FALSE
;
222 object
= (GDIOBJHDR
*) GDI_HEAP_ADDR( handle
);
223 if (!object
) return FALSE
;
227 GDI_HEAP_FREE( handle
);
231 /***********************************************************************
234 * Return a pointer to the GDI object associated to the handle.
235 * Return NULL if the object has the wrong magic number.
237 GDIOBJHDR
* GDI_GetObjPtr( HANDLE handle
, WORD magic
)
239 GDIOBJHDR
* ptr
= NULL
;
241 if (handle
>= FIRST_STOCK_HANDLE
)
243 if (handle
< FIRST_STOCK_HANDLE
+ NB_STOCK_OBJECTS
)
244 ptr
= StockObjects
[handle
- FIRST_STOCK_HANDLE
];
246 else ptr
= (GDIOBJHDR
*) GDI_HEAP_ADDR( handle
);
247 if (!ptr
) return NULL
;
248 if (ptr
->wMagic
!= magic
) return NULL
;
253 /***********************************************************************
254 * DeleteObject (GDI.69)
256 BOOL
DeleteObject( HANDLE obj
)
258 /* Check if object is valid */
260 GDIOBJHDR
* header
= (GDIOBJHDR
*) GDI_HEAP_ADDR( obj
);
261 if (!header
) return FALSE
;
264 printf( "DeleteObject: %d\n", obj
);
269 switch(header
->wMagic
)
271 case PEN_MAGIC
: return GDI_FreeObject( obj
);
272 case BRUSH_MAGIC
: return BRUSH_DeleteObject( obj
, header
);
273 case FONT_MAGIC
: return GDI_FreeObject( obj
);
274 case PALETTE_MAGIC
: return GDI_FreeObject( obj
);
275 case BITMAP_MAGIC
: return BMP_DeleteObject( obj
, header
);
276 case REGION_MAGIC
: return REGION_DeleteObject( obj
, header
);
282 /***********************************************************************
283 * GetStockObject (GDI.87)
285 HANDLE
GetStockObject( int obj
)
287 if ((obj
< 0) || (obj
>= NB_STOCK_OBJECTS
)) return 0;
288 if (!StockObjects
[obj
]) return 0;
290 printf( "GetStockObject: returning %04x\n", FIRST_STOCK_HANDLE
+ obj
);
292 return FIRST_STOCK_HANDLE
+ obj
;
296 /***********************************************************************
299 int GetObject( HANDLE handle
, int count
, LPSTR buffer
)
301 GDIOBJHDR
* ptr
= NULL
;
303 printf( "GetObject: %04x %d %08x\n", handle
, count
, buffer
);
305 if (!count
) return 0;
307 if (handle
>= FIRST_STOCK_HANDLE
)
309 if (handle
< FIRST_STOCK_HANDLE
+ NB_STOCK_OBJECTS
)
310 ptr
= StockObjects
[handle
- FIRST_STOCK_HANDLE
];
312 else ptr
= (GDIOBJHDR
*) GDI_HEAP_ADDR( handle
);
318 return PEN_GetObject( (PENOBJ
*)ptr
, count
, buffer
);
320 return BRUSH_GetObject( (BRUSHOBJ
*)ptr
, count
, buffer
);
322 return BMP_GetObject( (BITMAPOBJ
*)ptr
, count
, buffer
);
324 return FONT_GetObject( (FONTOBJ
*)ptr
, count
, buffer
);
326 return PALETTE_GetObject( (PALETTEOBJ
*)ptr
, count
, buffer
);
332 /***********************************************************************
333 * SelectObject (GDI.45)
335 HANDLE
SelectObject( HDC hdc
, HANDLE handle
)
337 GDIOBJHDR
* ptr
= NULL
;
341 printf( "SelectObject: %d %04x\n", hdc
, handle
);
343 if (handle
>= FIRST_STOCK_HANDLE
)
345 if (handle
< FIRST_STOCK_HANDLE
+ NB_STOCK_OBJECTS
)
346 ptr
= StockObjects
[handle
- FIRST_STOCK_HANDLE
];
348 else ptr
= (GDIOBJHDR
*) GDI_HEAP_ADDR( handle
);
351 dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
357 return PEN_SelectObject( dc
, handle
, (PENOBJ
*)ptr
);
359 return BRUSH_SelectObject( hdc
, dc
, handle
, (BRUSHOBJ
*)ptr
);
361 return BITMAP_SelectObject( hdc
, dc
, handle
, (BITMAPOBJ
*)ptr
);
363 return FONT_SelectObject( dc
, handle
, (FONTOBJ
*)ptr
);
365 return SelectClipRgn( hdc
, handle
);
371 /***********************************************************************
372 * UnrealizeObject (GDI.150)
374 BOOL
UnrealizeObject( HANDLE handle
)
377 printf( "UnrealizeObject: %04x\n", handle
);