/*
 * 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 )
