Fixed a real mode problem.
[wine] / objects / dcvalues.c
1 /*
2  * DC device-independent Get/SetXXX functions
3  *
4  * Copyright 1993 Alexandre Julliard
5  *
6  */
7
8 #include "gdi.h"
9 #include "metafile.h"
10
11
12 #define DC_GET_VAL_16( func_type, func_name, dc_field ) \
13 func_type WINAPI func_name( HDC16 hdc ) \
14 { \
15     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
16     if (!dc) return 0; \
17     return dc->dc_field; \
18 }
19
20 #define DC_GET_VAL_32( func_type, func_name, dc_field ) \
21 func_type WINAPI func_name( HDC32 hdc ) \
22 { \
23     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
24     if (!dc) return 0; \
25     return dc->dc_field; \
26 }
27
28 #define DC_GET_X_Y( func_type, func_name, ret_x, ret_y ) \
29 func_type WINAPI func_name( HDC16 hdc ) \
30 { \
31     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
32     if (!dc) return 0; \
33     return MAKELONG( dc->ret_x, dc->ret_y ); \
34 }
35
36 /* DC_GET_VAL_EX is used to define functions returning a POINT or a SIZE. It is 
37  * important that the function has the right signature, for the implementation 
38  * we can do whatever we want.
39  */
40 #define DC_GET_VAL_EX( func_name, ret_x, ret_y, type ) \
41 BOOL16 WINAPI func_name##16( HDC16 hdc, LP##type##16 pt ) \
42 { \
43     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
44     if (!dc) return FALSE; \
45     ((LPPOINT16)pt)->x = dc->ret_x; \
46     ((LPPOINT16)pt)->y = dc->ret_y; \
47     return TRUE; \
48 } \
49  \
50 BOOL32 WINAPI func_name##32( HDC32 hdc, LP##type##32 pt ) \
51 { \
52     DC * dc = (DC *) GDI_GetObjPtr( (HDC16)hdc, DC_MAGIC ); \
53     if (!dc) return FALSE; \
54     ((LPPOINT32)pt)->x = dc->ret_x; \
55     ((LPPOINT32)pt)->y = dc->ret_y; \
56     return TRUE; \
57 }
58
59 #define DC_SET_MODE_16( func_name, dc_field, min_val, max_val, meta_func ) \
60 INT16 WINAPI func_name( HDC16 hdc, INT16 mode ) \
61 { \
62     INT16 prevMode; \
63     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
64     if ((mode < min_val) || (mode > max_val)) return 0; \
65     if (!dc) { \
66         dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); \
67         if (!dc) return 0; \
68         MF_MetaParam1(dc, meta_func, mode); \
69         return 1; \
70     } \
71     prevMode = dc->dc_field; \
72     dc->dc_field = mode; \
73     return prevMode; \
74 }
75
76 #define DC_SET_MODE_32( func_name, dc_field, min_val, max_val, meta_func ) \
77 INT32 WINAPI func_name( HDC32 hdc, INT32 mode ) \
78 { \
79     INT32 prevMode; \
80     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
81     if ((mode < min_val) || (mode > max_val)) return 0; \
82     if (!dc) { \
83         dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); \
84         if (!dc) return 0; \
85         MF_MetaParam1(dc, meta_func, mode); \
86         return 1; \
87     } \
88     prevMode = dc->dc_field; \
89     dc->dc_field = mode; \
90     return prevMode; \
91 }
92
93
94 DC_SET_MODE_16( SetBkMode16, w.backgroundMode, TRANSPARENT,     /* GDI.2     */
95                 OPAQUE, META_SETBKMODE )
96 DC_SET_MODE_32( SetBkMode32, w.backgroundMode, TRANSPARENT,     /* GDI32.306 */
97                 OPAQUE, META_SETBKMODE )
98 DC_SET_MODE_16( SetROP216, w.ROPmode, R2_BLACK, R2_WHITE,       /* GDI.4     */
99                 META_SETROP2 )
100 DC_SET_MODE_32( SetROP232, w.ROPmode, R2_BLACK, R2_WHITE,       /* GDI32.331 */
101                 META_SETROP2 )
102 DC_SET_MODE_16( SetRelAbs16, w.relAbsMode, ABSOLUTE, RELATIVE,  /* GDI.5     */
103                 META_SETRELABS )
104 DC_SET_MODE_32( SetRelAbs32, w.relAbsMode, ABSOLUTE, RELATIVE,  /* GDI32.333 */
105                 META_SETRELABS )
106 DC_SET_MODE_16( SetPolyFillMode16, w.polyFillMode,              /* GDI.6     */
107                 ALTERNATE, WINDING, META_SETPOLYFILLMODE )
108 DC_SET_MODE_32( SetPolyFillMode32, w.polyFillMode,              /* GDI32.330 */
109                 ALTERNATE, WINDING, META_SETPOLYFILLMODE )
110 DC_SET_MODE_16( SetStretchBltMode16, w.stretchBltMode,          /* GDI.7     */
111                 BLACKONWHITE, COLORONCOLOR, META_SETSTRETCHBLTMODE )
112 DC_SET_MODE_32( SetStretchBltMode32, w.stretchBltMode,          /* GDI32.334 */
113                 BLACKONWHITE, COLORONCOLOR, META_SETSTRETCHBLTMODE )
114 DC_GET_VAL_16( COLORREF, GetBkColor16, w.backgroundColor )      /* GDI.75    */
115 DC_GET_VAL_32( COLORREF, GetBkColor32, w.backgroundColor )      /* GDI32.145 */
116 DC_GET_VAL_16( INT16, GetBkMode16, w.backgroundMode )           /* GDI.76    */
117 DC_GET_VAL_32( INT32, GetBkMode32, w.backgroundMode )           /* GDI32.146 */
118 DC_GET_X_Y( DWORD, GetCurrentPosition, w.CursPosX, w.CursPosY ) /* GDI.78    */
119 DC_GET_VAL_16( INT16, GetMapMode16, w.MapMode )                 /* GDI.81    */
120 DC_GET_VAL_32( INT32, GetMapMode32, w.MapMode )                 /* GDI32.196 */
121 DC_GET_VAL_16( INT16, GetPolyFillMode16, w.polyFillMode )       /* GDI.84    */
122 DC_GET_VAL_32( INT32, GetPolyFillMode32, w.polyFillMode )       /* GDI32.213 */
123 DC_GET_VAL_16( INT16, GetROP216, w.ROPmode )                    /* GDI.85    */
124 DC_GET_VAL_32( INT32, GetROP232, w.ROPmode )                    /* GDI32.214 */
125 DC_GET_VAL_16( INT16, GetRelAbs16, w.relAbsMode )               /* GDI.86    */
126 DC_GET_VAL_32( INT32, GetRelAbs32, w.relAbsMode )               /* GDI32.218 */
127 DC_GET_VAL_16( INT16, GetStretchBltMode16, w.stretchBltMode )   /* GDI.88    */
128 DC_GET_VAL_32( INT32, GetStretchBltMode32, w.stretchBltMode )   /* GDI32.221 */
129 DC_GET_VAL_16( COLORREF, GetTextColor16, w.textColor )          /* GDI.90    */
130 DC_GET_VAL_32( COLORREF, GetTextColor32, w.textColor )          /* GDI32.227 */
131 DC_GET_X_Y( DWORD, GetViewportExt, vportExtX, vportExtY )       /* GDI.94    */
132 DC_GET_X_Y( DWORD, GetViewportOrg, vportOrgX, vportOrgY )       /* GDI.95    */
133 DC_GET_X_Y( DWORD, GetWindowExt, wndExtX, wndExtY )             /* GDI.96    */
134 DC_GET_X_Y( DWORD, GetWindowOrg, wndOrgX, wndOrgY )             /* GDI.97    */
135 DC_GET_VAL_16( HRGN16, InquireVisRgn, w.hVisRgn )               /* GDI.131   */
136 DC_GET_VAL_16( HRGN16, GetClipRgn16, w.hClipRgn )               /* GDI.173   */
137 DC_GET_X_Y( DWORD, GetBrushOrg, w.brushOrgX, w.brushOrgY )      /* GDI.149   */
138 DC_GET_VAL_16( UINT16, GetTextAlign16, w.textAlign )            /* GDI.345   */
139 DC_GET_VAL_32( UINT32, GetTextAlign32, w.textAlign )            /* GDI32.224 */
140 DC_GET_VAL_16( HFONT16, GetCurLogFont, w.hFont )                /* GDI.411   */
141 DC_GET_VAL_EX( GetBrushOrgEx, w.brushOrgX, w.brushOrgY, POINT ) /* GDI.469 GDI32.148 */
142 DC_GET_VAL_EX( GetCurrentPositionEx, w.CursPosX, w.CursPosY,    /* GDI.470 GDI32.167 */
143                POINT )
144 DC_GET_VAL_EX( GetViewportExtEx, vportExtX, vportExtY, SIZE )   /* GDI.472 GDI32.239 */
145 DC_GET_VAL_EX( GetViewportOrgEx, vportOrgX, vportOrgY, POINT )  /* GDI.473 GDI32.240 */
146 DC_GET_VAL_EX( GetWindowExtEx, wndExtX, wndExtY, SIZE )         /* GDI.474 GDI32.242 */
147 DC_GET_VAL_EX( GetWindowOrgEx, wndOrgX, wndOrgY, POINT )        /* GDI.475 GDI32.243 */