| /* |
| * DC device-independent Get/SetXXX functions |
| * |
| * Copyright 1993 Alexandre Julliard |
| * |
| */ |
| |
| #include "winbase.h" |
| #include "winerror.h" |
| #include "gdi.h" |
| |
| #define COLORREF16 COLORREF /*hack*/ |
| |
| #define DC_GET_VAL_16( func_type, func_name, dc_field ) \ |
| func_type WINAPI func_name( HDC16 hdc ) \ |
| { \ |
| func_type ret = 0; \ |
| DC * dc = DC_GetDCPtr( hdc ); \ |
| if (dc) \ |
| { \ |
| ret = dc->dc_field; \ |
| GDI_ReleaseObj( hdc ); \ |
| } \ |
| return ret; \ |
| } |
| |
| #define DC_GET_VAL( func_type, func_name, dc_field ) \ |
| func_type##16 WINAPI func_name##16( HDC16 hdc ) \ |
| { \ |
| return func_name( hdc ); \ |
| } \ |
| \ |
| func_type WINAPI func_name( HDC hdc ) \ |
| { \ |
| func_type ret = 0; \ |
| DC * dc = DC_GetDCPtr( hdc ); \ |
| if (dc) \ |
| { \ |
| ret = dc->dc_field; \ |
| GDI_ReleaseObj( hdc ); \ |
| } \ |
| return ret; \ |
| } |
| |
| #define DC_GET_X_Y( func_type, func_name, ret_x, ret_y ) \ |
| func_type WINAPI func_name( HDC16 hdc ) \ |
| { \ |
| func_type ret = 0; \ |
| DC * dc = DC_GetDCPtr( hdc ); \ |
| if (dc) \ |
| { \ |
| ret = MAKELONG( dc->ret_x, dc->ret_y ); \ |
| GDI_ReleaseObj( hdc ); \ |
| } \ |
| return ret; \ |
| } |
| |
| /* DC_GET_VAL_EX is used to define functions returning a POINT or a SIZE. It is |
| * important that the function has the right signature, for the implementation |
| * we can do whatever we want. |
| */ |
| #define DC_GET_VAL_EX( func_name, ret_x, ret_y, type ) \ |
| BOOL16 WINAPI func_name##16( HDC16 hdc, LP##type##16 pt ) \ |
| { \ |
| DC * dc = DC_GetDCPtr( hdc ); \ |
| if (!dc) return FALSE; \ |
| ((LPPOINT16)pt)->x = dc->ret_x; \ |
| ((LPPOINT16)pt)->y = dc->ret_y; \ |
| GDI_ReleaseObj( hdc ); \ |
| return TRUE; \ |
| } \ |
| \ |
| BOOL WINAPI func_name( HDC hdc, LP##type pt ) \ |
| { \ |
| DC * dc = DC_GetDCPtr( hdc ); \ |
| if (!dc) return FALSE; \ |
| ((LPPOINT)pt)->x = dc->ret_x; \ |
| ((LPPOINT)pt)->y = dc->ret_y; \ |
| GDI_ReleaseObj( hdc ); \ |
| return TRUE; \ |
| } |
| |
| #define DC_SET_MODE( func_name, dc_field, min_val, max_val ) \ |
| INT16 WINAPI func_name##16( HDC16 hdc, INT16 mode ) \ |
| { \ |
| return func_name( hdc, mode ); \ |
| } \ |
| \ |
| INT WINAPI func_name( HDC hdc, INT mode ) \ |
| { \ |
| INT prevMode; \ |
| DC *dc; \ |
| if ((mode < min_val) || (mode > max_val)) { \ |
| SetLastError(ERROR_INVALID_PARAMETER); \ |
| return 0; \ |
| } \ |
| if (!(dc = DC_GetDCPtr( hdc ))) return 0; \ |
| if (dc->funcs->p##func_name) { \ |
| prevMode = dc->funcs->p##func_name( dc, mode ); \ |
| } else { \ |
| prevMode = dc->dc_field; \ |
| dc->dc_field = mode; \ |
| } \ |
| GDI_ReleaseObj( hdc ); \ |
| return prevMode; \ |
| } |
| |
| /*********************************************************************** |
| * SetBkMode (GDI.2) (GDI32.306) |
| * |
| */ |
| DC_SET_MODE( SetBkMode, backgroundMode, TRANSPARENT, OPAQUE ) |
| |
| /*********************************************************************** |
| * SetROP2 (GDI.4) (GDI32.331) |
| */ |
| DC_SET_MODE( SetROP2, ROPmode, R2_BLACK, R2_WHITE ) |
| |
| /*********************************************************************** |
| * SetRelAbs (GDI.5) (GDI32.333) |
| */ |
| DC_SET_MODE( SetRelAbs, relAbsMode, ABSOLUTE, RELATIVE ) |
| |
| /*********************************************************************** |
| * SetPolyFillMode (GDI.6) (GDI32.330) |
| */ |
| DC_SET_MODE( SetPolyFillMode, polyFillMode, ALTERNATE, WINDING ) |
| |
| /*********************************************************************** |
| * SetStretchBltMode (GDI.7) (GDI32.334) |
| */ |
| DC_SET_MODE( SetStretchBltMode, stretchBltMode, BLACKONWHITE, HALFTONE ) |
| |
| /*********************************************************************** |
| * GetBkColor (GDI.75) (GDI32.145) |
| */ |
| DC_GET_VAL( COLORREF, GetBkColor, backgroundColor ) |
| |
| /*********************************************************************** |
| * GetBkMode (GDI.76) (GDI32.146) |
| */ |
| DC_GET_VAL( INT, GetBkMode, backgroundMode ) |
| |
| /*********************************************************************** |
| * GetCurrentPosition16 (GDI.78) |
| */ |
| DC_GET_X_Y( DWORD, GetCurrentPosition16, CursPosX, CursPosY ) |
| |
| /*********************************************************************** |
| * GetMapMode (GDI.81) (GDI32.196) |
| */ |
| DC_GET_VAL( INT, GetMapMode, MapMode ) |
| |
| /*********************************************************************** |
| * GetPolyFillMode (GDI.84) (GDI32.213) |
| */ |
| DC_GET_VAL( INT, GetPolyFillMode, polyFillMode ) |
| |
| /*********************************************************************** |
| * GetROP2 (GDI.85) (GDI32.214) |
| */ |
| DC_GET_VAL( INT, GetROP2, ROPmode ) |
| |
| /*********************************************************************** |
| * GetRelAbs16 (GDI.86) |
| */ |
| DC_GET_VAL_16( INT16, GetRelAbs16, relAbsMode ) |
| |
| /*********************************************************************** |
| * GetStretchBltMode (GDI.88) (GDI32.221) |
| */ |
| DC_GET_VAL( INT, GetStretchBltMode, stretchBltMode ) |
| |
| /*********************************************************************** |
| * GetTextColor (GDI.90) (GDI32.227) |
| */ |
| DC_GET_VAL( COLORREF, GetTextColor, textColor ) |
| |
| /*********************************************************************** |
| * GetViewportExt16 (GDI.94) |
| */ |
| DC_GET_X_Y( DWORD, GetViewportExt16, vportExtX, vportExtY ) |
| |
| /*********************************************************************** |
| * GetViewportOrg16 (GDI.95) |
| */ |
| DC_GET_X_Y( DWORD, GetViewportOrg16, vportOrgX, vportOrgY ) |
| |
| /*********************************************************************** |
| * GetWindowExt16 (GDI.96) |
| */ |
| DC_GET_X_Y( DWORD, GetWindowExt16, wndExtX, wndExtY ) |
| |
| /*********************************************************************** |
| * GetWindowOrg16 (GDI.97) |
| */ |
| DC_GET_X_Y( DWORD, GetWindowOrg16, wndOrgX, wndOrgY ) |
| |
| /*********************************************************************** |
| * InquireVisRgn16 (GDI.131) |
| */ |
| DC_GET_VAL_16( HRGN16, InquireVisRgn16, hVisRgn ) |
| |
| /*********************************************************************** |
| * GetClipRgn16 (GDI.173) |
| */ |
| DC_GET_VAL_16( HRGN16, GetClipRgn16, hClipRgn ) |
| |
| /*********************************************************************** |
| * GetBrushOrg16 (GDI.149) |
| */ |
| DC_GET_X_Y( DWORD, GetBrushOrg16, brushOrgX, brushOrgY ) |
| |
| /*********************************************************************** |
| * GetTextAlign (GDI.345) (GDI32,224) |
| */ |
| DC_GET_VAL( UINT, GetTextAlign, textAlign ) |
| |
| /*********************************************************************** |
| * GetCurLogFont16 (GDI.411) |
| */ |
| DC_GET_VAL_16( HFONT16, GetCurLogFont16, hFont ) |
| |
| /*********************************************************************** |
| * GetArcDirection (GDI.524) (GDI32.141) |
| */ |
| DC_GET_VAL( INT, GetArcDirection, ArcDirection ) |
| |
| /*********************************************************************** |
| * GetGraphicsMode (GDI32.188) |
| */ |
| DC_GET_VAL( INT, GetGraphicsMode, GraphicsMode) |
| |
| /*********************************************************************** |
| * GetBrushOrgEx (GDI.469) (GDI32.148) |
| */ |
| DC_GET_VAL_EX( GetBrushOrgEx, brushOrgX, brushOrgY, POINT ) /* */ |
| |
| /*********************************************************************** |
| * GetCurrentPositionEx (GDI.470) (GDI32.167) |
| */ |
| DC_GET_VAL_EX( GetCurrentPositionEx, CursPosX, CursPosY, POINT ) |
| |
| /*********************************************************************** |
| * GetViewportExtEx (GDI.472 GDI32.239) |
| */ |
| DC_GET_VAL_EX( GetViewportExtEx, vportExtX, vportExtY, SIZE ) |
| |
| /*********************************************************************** |
| * GetViewportOrgEx (GDI.473) (GDI32.240) |
| */ |
| DC_GET_VAL_EX( GetViewportOrgEx, vportOrgX, vportOrgY, POINT ) |
| |
| /*********************************************************************** |
| * GetWindowExtEx (GDI.474) (GDI32.242) |
| */ |
| DC_GET_VAL_EX( GetWindowExtEx, wndExtX, wndExtY, SIZE ) |
| |
| /*********************************************************************** |
| * GetWindowOrgEx (GDI.475) (GDI32.243) |
| */ |
| DC_GET_VAL_EX( GetWindowOrgEx, wndOrgX, wndOrgY, POINT ) |