Optimized StretchDIBits to call SetDIBitsToDevice (when src & dst
[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 "dc.h"
10
11 #define DC_GET_VAL_16( func_type, func_name, dc_field ) \
12 func_type WINAPI func_name( HDC16 hdc ) \
13 { \
14     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
15     if (!dc) return 0; \
16     return dc->dc_field; \
17 }
18
19 #define DC_GET_VAL_32( func_type, func_name, dc_field ) \
20 func_type WINAPI func_name( HDC hdc ) \
21 { \
22     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
23     if (!dc) return 0; \
24     return dc->dc_field; \
25 }
26
27 #define DC_GET_X_Y( func_type, func_name, ret_x, ret_y ) \
28 func_type WINAPI func_name( HDC16 hdc ) \
29 { \
30     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
31     if (!dc) return 0; \
32     return MAKELONG( dc->ret_x, dc->ret_y ); \
33 }
34
35 /* DC_GET_VAL_EX is used to define functions returning a POINT or a SIZE. It is 
36  * important that the function has the right signature, for the implementation 
37  * we can do whatever we want.
38  */
39 #define DC_GET_VAL_EX( func_name, ret_x, ret_y, type ) \
40 BOOL16 WINAPI func_name##16( HDC16 hdc, LP##type##16 pt ) \
41 { \
42     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
43     if (!dc) return FALSE; \
44     ((LPPOINT16)pt)->x = dc->ret_x; \
45     ((LPPOINT16)pt)->y = dc->ret_y; \
46     return TRUE; \
47 } \
48  \
49 BOOL WINAPI func_name( HDC hdc, LP##type pt ) \
50 { \
51     DC * dc = (DC *) GDI_GetObjPtr( (HDC16)hdc, DC_MAGIC ); \
52     if (!dc) return FALSE; \
53     ((LPPOINT)pt)->x = dc->ret_x; \
54     ((LPPOINT)pt)->y = dc->ret_y; \
55     return TRUE; \
56 }
57
58 #define DC_SET_MODE( func_name, dc_field, min_val, max_val ) \
59 INT16 WINAPI func_name##16( HDC16 hdc, INT16 mode ) \
60 { \
61     return func_name( hdc, mode ); \
62 } \
63  \
64 INT WINAPI func_name( HDC hdc, INT mode ) \
65 { \
66     INT prevMode; \
67     DC *dc = DC_GetDCPtr( hdc ); \
68     if(!dc) return 0; \
69     if ((mode < min_val) || (mode > max_val)) return 0; \
70     if (dc->funcs->p##func_name) { \
71         prevMode = dc->funcs->p##func_name( dc, mode ); \
72     } else { \
73         prevMode = dc->dc_field; \
74         dc->dc_field = mode; \
75     } \
76     GDI_HEAP_UNLOCK( hdc ); \
77     return prevMode; \
78 }
79
80
81
82 /* GDI.2 GDI32.306 */
83 DC_SET_MODE( SetBkMode, w.backgroundMode, TRANSPARENT, OPAQUE ) 
84
85 /* GDI.4 GDI32.331 */
86 DC_SET_MODE( SetROP2, w.ROPmode, R2_BLACK, R2_WHITE )
87
88 /* GDI.5 GDI32.333 */
89 DC_SET_MODE( SetRelAbs, w.relAbsMode, ABSOLUTE, RELATIVE )
90
91 /* GDI.6 GDI32.330 */
92 DC_SET_MODE( SetPolyFillMode, w.polyFillMode, ALTERNATE, WINDING )
93
94 /* GDI.7 GDI32.334 */
95 DC_SET_MODE( SetStretchBltMode, w.stretchBltMode, BLACKONWHITE, HALFTONE )
96
97 DC_GET_VAL_16( COLORREF, GetBkColor16, w.backgroundColor )      /* GDI.75    */
98 DC_GET_VAL_32( COLORREF, GetBkColor, w.backgroundColor )      /* GDI32.145 */
99 DC_GET_VAL_16( INT16, GetBkMode16, w.backgroundMode )           /* GDI.76    */
100 DC_GET_VAL_32( INT, GetBkMode, w.backgroundMode )           /* GDI32.146 */
101 DC_GET_X_Y( DWORD, GetCurrentPosition16, w.CursPosX, w.CursPosY ) /* GDI.78    */
102 DC_GET_VAL_16( INT16, GetMapMode16, w.MapMode )                 /* GDI.81    */
103 DC_GET_VAL_32( INT, GetMapMode, w.MapMode )                 /* GDI32.196 */
104 DC_GET_VAL_16( INT16, GetPolyFillMode16, w.polyFillMode )       /* GDI.84    */
105 DC_GET_VAL_32( INT, GetPolyFillMode, w.polyFillMode )       /* GDI32.213 */
106 DC_GET_VAL_16( INT16, GetROP216, w.ROPmode )                    /* GDI.85    */
107 DC_GET_VAL_32( INT, GetROP2, w.ROPmode )                    /* GDI32.214 */
108 DC_GET_VAL_16( INT16, GetRelAbs16, w.relAbsMode )               /* GDI.86    */
109 DC_GET_VAL_32( INT, GetRelAbs, w.relAbsMode )               /* GDI32.218 */
110 DC_GET_VAL_16( INT16, GetStretchBltMode16, w.stretchBltMode )   /* GDI.88    */
111 DC_GET_VAL_32( INT, GetStretchBltMode, w.stretchBltMode )   /* GDI32.221 */
112 DC_GET_VAL_16( COLORREF, GetTextColor16, w.textColor )          /* GDI.90    */
113 DC_GET_VAL_32( COLORREF, GetTextColor, w.textColor )          /* GDI32.227 */
114 DC_GET_X_Y( DWORD, GetViewportExt16, vportExtX, vportExtY )       /* GDI.94    */
115 DC_GET_X_Y( DWORD, GetViewportOrg16, vportOrgX, vportOrgY )       /* GDI.95    */
116 DC_GET_X_Y( DWORD, GetWindowExt16, wndExtX, wndExtY )             /* GDI.96    */
117 DC_GET_X_Y( DWORD, GetWindowOrg16, wndOrgX, wndOrgY )             /* GDI.97    */
118 DC_GET_VAL_16( HRGN16, InquireVisRgn16, w.hVisRgn )               /* GDI.131   */
119 DC_GET_VAL_16( HRGN16, GetClipRgn16, w.hClipRgn )               /* GDI.173   */
120 DC_GET_X_Y( DWORD, GetBrushOrg16, w.brushOrgX, w.brushOrgY )      /* GDI.149   */
121 DC_GET_VAL_16( UINT16, GetTextAlign16, w.textAlign )            /* GDI.345   */
122 DC_GET_VAL_32( UINT, GetTextAlign, w.textAlign )            /* GDI32.224 */
123 DC_GET_VAL_16( HFONT16, GetCurLogFont16, w.hFont )                /* GDI.411   */
124 DC_GET_VAL_EX( GetBrushOrgEx, w.brushOrgX, w.brushOrgY, POINT ) /* GDI.469 GDI32.148 */
125 DC_GET_VAL_EX( GetCurrentPositionEx, w.CursPosX, w.CursPosY,    /* GDI.470 GDI32.167 */
126                POINT )
127 DC_GET_VAL_EX( GetViewportExtEx, vportExtX, vportExtY, SIZE )   /* GDI.472 GDI32.239 */
128 DC_GET_VAL_EX( GetViewportOrgEx, vportOrgX, vportOrgY, POINT )  /* GDI.473 GDI32.240 */
129 DC_GET_VAL_EX( GetWindowExtEx, wndExtX, wndExtY, SIZE )         /* GDI.474 GDI32.242 */
130 DC_GET_VAL_EX( GetWindowOrgEx, wndOrgX, wndOrgY, POINT )        /* GDI.475 GDI32.243 */