- New implementation of SendMessage, ReceiveMessage, ReplyMessage functions
[wine] / include / wintypes.h
1 /*
2  * Basic types definitions
3  *
4  * Copyright 1996 Alexandre Julliard
5  */
6
7 /* Misc. constants. */
8
9 #ifdef FALSE
10 #undef FALSE
11 #endif
12 #define FALSE 0
13
14 #ifdef TRUE
15 #undef TRUE
16 #endif
17 #define TRUE  1
18
19 #ifdef NULL
20 #undef NULL
21 #endif
22 #define NULL  0
23
24 #ifndef __WINE_WINTYPES_H
25 #define __WINE_WINTYPES_H
26
27 #ifdef __WINE__
28 # include "config.h"
29 # undef UNICODE
30 #endif  /* __WINE__ */
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 /* Macros to map Winelib names to the correct implementation name */
37 /* depending on __WINE__ and UNICODE macros.                      */
38 /* Note that Winelib is purely Win32.                             */
39
40 #ifdef __WINE__
41 # define WINELIB_NAME(func)      this_is_a_syntax_error this_is_a_syntax_error
42 # define WINELIB_NAME_AW(func)   this_is_a_syntax_error this_is_a_syntax_error
43 #else  /* __WINE__ */
44 # define WINELIB_NAME(func)     func##32
45 # ifdef UNICODE
46 #  define WINELIB_NAME_AW(func) func##32W
47 # else
48 #  define WINELIB_NAME_AW(func) func##32A
49 # endif  /* UNICODE */
50 #endif  /* __WINE__ */
51
52 #ifdef __WINE__
53 # define DECL_WINELIB_TYPE(type)     /* nothing */
54 # define DECL_WINELIB_TYPE_AW(type)  /* nothing */
55 #else   /* __WINE__ */
56 # define DECL_WINELIB_TYPE(type)     typedef WINELIB_NAME(type) type;
57 # define DECL_WINELIB_TYPE_AW(type)  typedef WINELIB_NAME_AW(type) type;
58 #endif  /* __WINE__ */
59
60
61 /* Calling conventions definitions */
62
63 #ifdef __i386__
64 # if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ >= 7)
65 #  define __stdcall __attribute__((__stdcall__))
66 #  define __cdecl   __attribute__((__cdecl__))
67 #  define __RESTORE_ES  __asm__ __volatile__("pushl %ds\n\tpopl %es")
68 # else
69 #  error You need gcc >= 2.7 to build Wine on a 386
70 # endif  /* __GNUC__ */
71 #else  /* __i386__ */
72 # define __stdcall
73 # define __cdecl
74 # define __RESTORE_ES
75 #endif  /* __i386__ */
76
77 #define CALLBACK    __stdcall
78 #define WINAPI      __stdcall
79 #define APIPRIVATE  __stdcall
80 #define PASCAL      __stdcall
81 #define _pascal     __stdcall
82 #define __export    __stdcall
83 #define WINAPIV     __cdecl
84 #define APIENTRY    WINAPI
85
86 #define CONST       const
87
88 /* Standard data types. These are the same for emulator and library. */
89
90 typedef void            VOID;
91 typedef short           INT16;
92 typedef unsigned short  UINT16;
93 typedef int             INT32;
94 typedef unsigned int    UINT32;
95 typedef unsigned short  WORD;
96 typedef unsigned long   DWORD;
97 typedef unsigned long   ULONG;
98 typedef unsigned char   BYTE;
99 typedef long            LONG;
100 typedef short           SHORT;
101 typedef unsigned short  USHORT;
102 typedef char            CHAR;
103 typedef unsigned char   UCHAR;
104 /* Some systems might have wchar_t, but we really need 16 bit characters */
105 typedef unsigned short  WCHAR;
106 typedef unsigned short  BOOL16;
107 typedef int             BOOL32;
108 typedef double          DATE;
109 typedef long            LONG_PTR;
110 typedef unsigned long   ULONG_PTR;
111 typedef double          DOUBLE;
112 typedef double          LONGLONG;
113 typedef double          ULONGLONG;
114
115 /* Integer types. These are the same for emulator and library. */
116
117 typedef UINT16          HANDLE16;
118 typedef UINT32          HANDLE32;
119 typedef UINT16         *LPHANDLE16;
120 typedef UINT32         *LPHANDLE32;
121 typedef UINT16          WPARAM16;
122 typedef UINT32          WPARAM32;
123 typedef LONG            LPARAM;
124 typedef LONG            HRESULT;
125 typedef LONG            LRESULT;
126 typedef WORD            ATOM;
127 typedef WORD            CATCHBUF[9];
128 typedef WORD           *LPCATCHBUF;
129 typedef DWORD           ACCESS_MASK;
130 typedef ACCESS_MASK     REGSAM;
131 typedef HANDLE32        HHOOK;
132 typedef HANDLE32        HKEY;
133 typedef HANDLE32        HMONITOR;
134 typedef DWORD           LCID;
135 typedef WORD            LANGID;
136 typedef DWORD           LCTYPE;
137 typedef float           FLOAT;
138 typedef long long       __int64;
139
140 /* Pointers types. These are the same for emulator and library. */
141 /* winnt types */
142 typedef void           *PVOID;
143 typedef const void     *PCVOID;
144 typedef CHAR           *PCHAR;
145 typedef UCHAR          *PUCHAR;
146 typedef BYTE           *PBYTE;
147 typedef ULONG          *PULONG;
148 typedef LONG           *PLONG;
149 typedef DWORD          *PDWORD;
150 /* common win32 types */
151 typedef CHAR           *LPSTR;
152 typedef CHAR           *PSTR;
153 typedef const CHAR     *LPCSTR;
154 typedef const CHAR     *PCSTR;
155 typedef WCHAR          *LPWSTR;
156 typedef WCHAR          *PWSTR;
157 typedef const WCHAR    *LPCWSTR;
158 typedef const WCHAR    *PCWSTR;
159 typedef BYTE           *LPBYTE;
160 typedef WORD           *LPWORD;
161 typedef DWORD          *LPDWORD;
162 typedef LONG           *LPLONG;
163 typedef VOID           *LPVOID;
164 typedef const VOID     *LPCVOID;
165 typedef INT16          *LPINT16;
166 typedef UINT16         *LPUINT16;
167 typedef INT32          *PINT32;
168 typedef INT32          *LPINT32;
169 typedef UINT32         *PUINT32;
170 typedef UINT32         *LPUINT32;
171 typedef HKEY           *LPHKEY;
172 typedef HKEY           *PHKEY;
173 typedef FLOAT          *PFLOAT;
174 typedef FLOAT          *LPFLOAT;
175 typedef BOOL32         *PBOOL32;
176 typedef BOOL32         *LPBOOL32;
177
178 /* Special case: a segmented pointer is just a pointer in the user's code. */
179
180 #ifdef __WINE__
181 typedef DWORD SEGPTR;
182 #else
183 typedef void* SEGPTR;
184 #endif /* __WINE__ */
185
186 /* Handle types that exist both in Win16 and Win32. */
187
188 #define DECLARE_HANDLE(a)  typedef HANDLE16 a##16; typedef HANDLE32 a##32
189 DECLARE_HANDLE(HACCEL);
190 DECLARE_HANDLE(HBITMAP);
191 DECLARE_HANDLE(HBRUSH);
192 DECLARE_HANDLE(HCOLORSPACE);
193 DECLARE_HANDLE(HCURSOR);
194 DECLARE_HANDLE(HDC);
195 DECLARE_HANDLE(HDROP);
196 DECLARE_HANDLE(HDRVR);
197 DECLARE_HANDLE(HDWP);
198 DECLARE_HANDLE(HENHMETAFILE);
199 DECLARE_HANDLE(HFILE);
200 DECLARE_HANDLE(HFONT);
201 DECLARE_HANDLE(HGDIOBJ);
202 DECLARE_HANDLE(HGLOBAL);
203 DECLARE_HANDLE(HICON);
204 DECLARE_HANDLE(HINSTANCE);
205 DECLARE_HANDLE(HLOCAL);
206 DECLARE_HANDLE(HMENU);
207 DECLARE_HANDLE(HMETAFILE);
208 DECLARE_HANDLE(HMIDI);
209 DECLARE_HANDLE(HMIDIIN);
210 DECLARE_HANDLE(HMIDIOUT);
211 DECLARE_HANDLE(HMIDISTRM);
212 DECLARE_HANDLE(HMIXER);
213 DECLARE_HANDLE(HMIXEROBJ);
214 DECLARE_HANDLE(HMMIO);
215 DECLARE_HANDLE(HMODULE);
216 DECLARE_HANDLE(HPALETTE);
217 DECLARE_HANDLE(HPEN);
218 DECLARE_HANDLE(HQUEUE);
219 DECLARE_HANDLE(HRGN);
220 DECLARE_HANDLE(HRSRC);
221 DECLARE_HANDLE(HTASK);
222 DECLARE_HANDLE(HWAVE);
223 DECLARE_HANDLE(HWAVEIN);
224 DECLARE_HANDLE(HWAVEOUT);
225 DECLARE_HANDLE(HWINSTA);
226 DECLARE_HANDLE(HDESK);
227 DECLARE_HANDLE(HWND);
228 DECLARE_HANDLE(HKL);
229 DECLARE_HANDLE(HIC);
230 DECLARE_HANDLE(HRASCONN);
231 #undef DECLARE_HANDLE
232
233 /* Callback function pointers types */
234
235 typedef BOOL32 (CALLBACK* DATEFMT_ENUMPROC32A)(LPSTR);
236 typedef BOOL32 (CALLBACK* DATEFMT_ENUMPROC32W)(LPWSTR);
237 DECL_WINELIB_TYPE_AW(DATEFMT_ENUMPROC)
238 typedef BOOL16 (CALLBACK *DLGPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
239 typedef BOOL32 (CALLBACK *DLGPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
240 DECL_WINELIB_TYPE(DLGPROC)
241 typedef LRESULT (CALLBACK *DRIVERPROC16)(DWORD,HDRVR16,UINT16,LPARAM,LPARAM);
242 typedef LRESULT (CALLBACK *DRIVERPROC32)(DWORD,HDRVR32,UINT32,LPARAM,LPARAM);
243 DECL_WINELIB_TYPE(DRIVERPROC)
244 typedef INT16   (CALLBACK *EDITWORDBREAKPROC16)(LPSTR,INT16,INT16,INT16);
245 typedef INT32   (CALLBACK *EDITWORDBREAKPROC32A)(LPSTR,INT32,INT32,INT32);
246 typedef INT32   (CALLBACK *EDITWORDBREAKPROC32W)(LPWSTR,INT32,INT32,INT32);
247 DECL_WINELIB_TYPE_AW(EDITWORDBREAKPROC)
248 typedef LRESULT (CALLBACK *FARPROC16)();
249 typedef LRESULT (CALLBACK *FARPROC32)();
250 DECL_WINELIB_TYPE(FARPROC)
251 typedef INT16   (CALLBACK *PROC16)();
252 typedef INT32   (CALLBACK *PROC32)();
253 DECL_WINELIB_TYPE(PROC)
254 typedef INT16   (CALLBACK *GOBJENUMPROC16)(SEGPTR,LPARAM);
255 typedef INT32   (CALLBACK *GOBJENUMPROC32)(LPVOID,LPARAM);
256 DECL_WINELIB_TYPE(GOBJENUMPROC)
257 typedef BOOL16  (CALLBACK *GRAYSTRINGPROC16)(HDC16,LPARAM,INT16);
258 typedef BOOL32  (CALLBACK *GRAYSTRINGPROC32)(HDC32,LPARAM,INT32);
259 DECL_WINELIB_TYPE(GRAYSTRINGPROC)
260 typedef LRESULT (CALLBACK *HOOKPROC16)(INT16,WPARAM16,LPARAM);
261 typedef LRESULT (CALLBACK *HOOKPROC32)(INT32,WPARAM32,LPARAM);
262 DECL_WINELIB_TYPE(HOOKPROC)
263 typedef VOID    (CALLBACK *LINEDDAPROC16)(INT16,INT16,LPARAM);
264 typedef VOID    (CALLBACK *LINEDDAPROC32)(INT32,INT32,LPARAM);
265 DECL_WINELIB_TYPE(LINEDDAPROC)
266 typedef BOOL16  (CALLBACK *PROPENUMPROC16)(HWND16,SEGPTR,HANDLE16);
267 typedef BOOL32  (CALLBACK *PROPENUMPROC32A)(HWND32,LPCSTR,HANDLE32);
268 typedef BOOL32  (CALLBACK *PROPENUMPROC32W)(HWND32,LPCWSTR,HANDLE32);
269 DECL_WINELIB_TYPE_AW(PROPENUMPROC)
270 typedef BOOL32  (CALLBACK *PROPENUMPROCEX32A)(HWND32,LPCSTR,HANDLE32,LPARAM);
271 typedef BOOL32  (CALLBACK *PROPENUMPROCEX32W)(HWND32,LPCWSTR,HANDLE32,LPARAM);
272 DECL_WINELIB_TYPE_AW(PROPENUMPROCEX)
273 typedef BOOL32 (CALLBACK* TIMEFMT_ENUMPROC32A)(LPSTR);
274 typedef BOOL32 (CALLBACK* TIMEFMT_ENUMPROC32W)(LPWSTR);
275 DECL_WINELIB_TYPE_AW(TIMEFMT_ENUMPROC)
276 typedef VOID    (CALLBACK *TIMERPROC16)(HWND16,UINT16,UINT16,DWORD);
277 typedef VOID    (CALLBACK *TIMERPROC32)(HWND32,UINT32,UINT32,DWORD);
278 DECL_WINELIB_TYPE(TIMERPROC)
279 typedef LRESULT (CALLBACK *WNDENUMPROC16)(HWND16,LPARAM);
280 typedef LRESULT (CALLBACK *WNDENUMPROC32)(HWND32,LPARAM);
281 DECL_WINELIB_TYPE(WNDENUMPROC)
282 typedef LRESULT (CALLBACK *WNDPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
283 typedef LRESULT (CALLBACK *WNDPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
284 DECL_WINELIB_TYPE(WNDPROC)
285
286 /* TCHAR data types definitions for Winelib. */
287 /* These types are _not_ defined for the emulator, because they */
288 /* depend on the UNICODE macro that only exists in user's code. */
289
290 #ifndef __WINE__
291 # ifdef UNICODE
292 typedef WCHAR TCHAR;
293 typedef LPWSTR LPTSTR;
294 typedef LPCWSTR LPCTSTR;
295 #define __TEXT(string) L##string /*probably wrong */
296 # else  /* UNICODE */
297 typedef CHAR TCHAR;
298 typedef LPSTR LPTSTR;
299 typedef LPCSTR LPCTSTR;
300 #define __TEXT(string) string
301 # endif /* UNICODE */
302 #endif   /* __WINE__ */
303 #define TEXT(quote) __TEXT(quote)
304
305 /* Data types specific to the library. These do _not_ exist in the emulator. */
306
307 DECL_WINELIB_TYPE(INT)
308 DECL_WINELIB_TYPE(LPINT)
309 DECL_WINELIB_TYPE(PUINT)
310 DECL_WINELIB_TYPE(LPUINT)
311 DECL_WINELIB_TYPE(UINT)
312 DECL_WINELIB_TYPE(BOOL)
313 DECL_WINELIB_TYPE(LPBOOL)
314 DECL_WINELIB_TYPE(WPARAM)
315
316 DECL_WINELIB_TYPE(HACCEL)
317 DECL_WINELIB_TYPE(HANDLE)
318 DECL_WINELIB_TYPE(LPHANDLE)
319 DECL_WINELIB_TYPE(HBITMAP)
320 DECL_WINELIB_TYPE(HBRUSH)
321 DECL_WINELIB_TYPE(HCOLORSPACE)
322 DECL_WINELIB_TYPE(HCURSOR)
323 DECL_WINELIB_TYPE(HDC)
324 DECL_WINELIB_TYPE(HDROP)
325 DECL_WINELIB_TYPE(HDRVR)
326 DECL_WINELIB_TYPE(HDWP)
327 DECL_WINELIB_TYPE(HENHMETAFILE)
328 DECL_WINELIB_TYPE(HFILE)
329 DECL_WINELIB_TYPE(HFONT)
330 DECL_WINELIB_TYPE(HGDIOBJ)
331 DECL_WINELIB_TYPE(HGLOBAL)
332 DECL_WINELIB_TYPE(HIC)
333 DECL_WINELIB_TYPE(HICON)
334 DECL_WINELIB_TYPE(HINSTANCE)
335 DECL_WINELIB_TYPE(HLOCAL)
336 DECL_WINELIB_TYPE(HMENU)
337 DECL_WINELIB_TYPE(HMETAFILE)
338 DECL_WINELIB_TYPE(HMIDI)
339 DECL_WINELIB_TYPE(HMIDIIN)
340 DECL_WINELIB_TYPE(HMIDIOUT)
341 DECL_WINELIB_TYPE(HMMIO)
342 DECL_WINELIB_TYPE(HMODULE)
343 DECL_WINELIB_TYPE(HPALETTE)
344 DECL_WINELIB_TYPE(HPEN)
345 DECL_WINELIB_TYPE(HQUEUE)
346 DECL_WINELIB_TYPE(HRGN)
347 DECL_WINELIB_TYPE(HRSRC)
348 DECL_WINELIB_TYPE(HTASK)
349 DECL_WINELIB_TYPE(HWAVE)
350 DECL_WINELIB_TYPE(HWAVEIN)
351 DECL_WINELIB_TYPE(HWAVEOUT)
352 DECL_WINELIB_TYPE(HWND)
353
354 /* Define some empty macros for compatibility with Windows code. */
355
356 #ifndef __WINE__
357 #define NEAR
358 #define FAR
359 #define _far
360 #define _near
361 #define IN
362 #define OUT
363 #define OPTIONAL
364 #endif  /* __WINE__ */
365
366 /* Macro for structure packing. */
367
368 #ifdef __GNUC__
369 #define WINE_PACKED __attribute__ ((packed))
370 #else
371 #define WINE_PACKED  /* nothing */
372 #endif
373
374 /* Macros to split words and longs. */
375
376 #define LOBYTE(w)              ((BYTE)(WORD)(w))
377 #define HIBYTE(w)              ((BYTE)((WORD)(w) >> 8))
378
379 #define LOWORD(l)              ((WORD)(DWORD)(l))
380 #define HIWORD(l)              ((WORD)((DWORD)(l) >> 16))
381
382 #define SLOWORD(l)             ((INT16)(LONG)(l))
383 #define SHIWORD(l)             ((INT16)((LONG)(l) >> 16))
384
385 #define MAKEWORD(low,high)     ((WORD)(((BYTE)(low)) | ((WORD)((BYTE)(high))) << 8))
386 #define MAKELONG(low,high)     ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
387 #define MAKELPARAM(low,high)   ((LPARAM)MAKELONG(low,high))
388 #define MAKEWPARAM(low,high)   ((WPARAM32)MAKELONG(low,high))
389 #define MAKELRESULT(low,high)  ((LRESULT)MAKELONG(low,high))
390 #define MAKEINTATOM(atom)      ((LPCSTR)MAKELONG((atom),0))
391
392 #define SELECTOROF(ptr)     (HIWORD(ptr))
393 #define OFFSETOF(ptr)       (LOWORD(ptr))
394
395 /* Macros to access unaligned or wrong-endian WORDs and DWORDs. */
396 /* Note: These macros are semantically broken, at least for wrc.  wrc
397    spits out data in the platform's current binary format, *not* in 
398    little-endian format.  These macros are used throughout the resource
399    code to load and store data to the resources.  Since it is unlikely 
400    that we'll ever be dealing with little-endian resource data, the 
401    byte-swapping nature of these macros has been disabled.  Rather than 
402    remove the use of these macros from the resource loading code, the
403    macros have simply been disabled.  In the future, someone may want 
404    to reactivate these macros for other purposes.  In that case, the
405    resource code will have to be modified to use different macros. */ 
406
407 #if 1
408 #define PUT_WORD(ptr,w)   (*(WORD *)(ptr) = (w))
409 #define GET_WORD(ptr)     (*(WORD *)(ptr))
410 #define PUT_DWORD(ptr,dw) (*(DWORD *)(ptr) = (dw))
411 #define GET_DWORD(ptr)    (*(DWORD *)(ptr))
412 #else
413 #define PUT_WORD(ptr,w)   (*(BYTE *)(ptr) = LOBYTE(w), \
414                            *((BYTE *)(ptr) + 1) = HIBYTE(w))
415 #define GET_WORD(ptr)     ((WORD)(*(BYTE *)(ptr) | \
416                                   (WORD)(*((BYTE *)(ptr)+1) << 8)))
417 #define PUT_DWORD(ptr,dw) (PUT_WORD((ptr),LOWORD(dw)), \
418                            PUT_WORD((WORD *)(ptr)+1,HIWORD(dw)))
419 #define GET_DWORD(ptr)    ((DWORD)(GET_WORD(ptr) | \
420                                    ((DWORD)GET_WORD((WORD *)(ptr)+1) << 16)))
421 #endif  /* 1 */
422
423 /* MIN and MAX macros */
424
425 #ifdef MAX
426 #undef MAX
427 #endif
428 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
429
430 #ifdef MIN
431 #undef MIN
432 #endif
433 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
434
435 #define __max(a,b) MAX(a,b)
436 #define __min(a,b) MIN(a,b)
437 #define max(a,b)   MAX(a,b)
438 #define min(a,b)   MIN(a,b)
439
440 #define _MAX_PATH  260
441 #define _MAX_DRIVE 3
442 #define _MAX_DIR   256
443 #define _MAX_FNAME 255
444 #define _MAX_EXT   256
445
446 /* Winelib run-time flag */
447
448 #ifdef __WINE__
449 extern int __winelib;
450 #endif  /* __WINE__ */
451
452 /* The SIZE structure */
453
454 typedef struct
455 {
456     INT16  cx;
457     INT16  cy;
458 } SIZE16, *PSIZE16, *LPSIZE16;
459
460 typedef struct tagSIZE
461 {
462     INT32  cx;
463     INT32  cy;
464 } SIZE32, *PSIZE32, *LPSIZE32;
465
466 DECL_WINELIB_TYPE(SIZE)
467 DECL_WINELIB_TYPE(PSIZE)
468 DECL_WINELIB_TYPE(LPSIZE)
469
470 typedef SIZE32 SIZEL, *PSIZEL, *LPSIZEL;
471
472 #define CONV_SIZE16TO32(s16,s32) \
473             ((s32)->cx = (INT32)(s16)->cx, (s32)->cy = (INT32)(s16)->cy)
474 #define CONV_SIZE32TO16(s32,s16) \
475             ((s16)->cx = (INT16)(s32)->cx, (s16)->cy = (INT16)(s32)->cy)
476
477 /* The POINT structure */
478
479 typedef struct
480 {
481     INT16  x;
482     INT16  y;
483 } POINT16, *PPOINT16, *LPPOINT16;
484
485 typedef struct tagPOINT
486 {
487     LONG  x;
488     LONG  y;
489 } POINT32, *PPOINT32, *LPPOINT32;
490
491 DECL_WINELIB_TYPE(POINT)
492 DECL_WINELIB_TYPE(PPOINT)
493 DECL_WINELIB_TYPE(LPPOINT)
494
495 #define CONV_POINT16TO32(p16,p32) \
496             ((p32)->x = (INT32)(p16)->x, (p32)->y = (INT32)(p16)->y)
497 #define CONV_POINT32TO16(p32,p16) \
498             ((p16)->x = (INT16)(p32)->x, (p16)->y = (INT16)(p32)->y)
499
500 #define MAKEPOINT16(l) (*((POINT16 *)&(l)))
501 #define MAKEPOINT WINELIB_NAME(MAKEPOINT)
502
503 /* The POINTS structure */
504
505 typedef struct tagPOINTS
506 {
507         SHORT x;
508         SHORT y;
509 } POINTS32, *PPOINTS32, *LPPOINTS32;
510
511 DECL_WINELIB_TYPE(POINTS)
512 DECL_WINELIB_TYPE(PPOINTS)
513 DECL_WINELIB_TYPE(LPPOINTS)
514
515 #define MAKEPOINTS(l)  (*((POINTS *)&(l)))
516
517
518 /* The RECT structure */
519
520 typedef struct
521 {
522     INT16  left;
523     INT16  top;
524     INT16  right;
525     INT16  bottom;
526 } RECT16, *LPRECT16;
527
528 typedef struct tagRECT
529 {
530     INT32  left;
531     INT32  top;
532     INT32  right;
533     INT32  bottom;
534 } RECT32, *PRECT32, *LPRECT32;
535
536 DECL_WINELIB_TYPE(RECT)
537 DECL_WINELIB_TYPE(PRECT)
538 DECL_WINELIB_TYPE(LPRECT)
539
540 typedef struct tagRECTL
541 {
542     LONG left;
543     LONG top;  
544     LONG right;
545     LONG bottom;
546 } RECTL, *PRECTL, *LPRECTL;
547
548 typedef const RECTL *LPCRECTL;
549
550 #define CONV_RECT16TO32(r16,r32) \
551     ((r32)->left  = (INT32)(r16)->left,  (r32)->top    = (INT32)(r16)->top, \
552      (r32)->right = (INT32)(r16)->right, (r32)->bottom = (INT32)(r16)->bottom)
553 #define CONV_RECT32TO16(r32,r16) \
554     ((r16)->left  = (INT16)(r32)->left,  (r16)->top    = (INT16)(r32)->top, \
555      (r16)->right = (INT16)(r32)->right, (r16)->bottom = (INT16)(r32)->bottom)
556
557 #ifdef __cplusplus
558 }
559 #endif
560
561 #endif /* __WINE_WINTYPES_H */