/*
 * 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.@)
 *
 */
DC_SET_MODE( SetBkMode, backgroundMode, TRANSPARENT, OPAQUE ) 

/***********************************************************************
 *		SetROP2			(GDI.4) (GDI32.@)
 */
DC_SET_MODE( SetROP2, ROPmode, R2_BLACK, R2_WHITE )

/***********************************************************************
 *		SetRelAbs		(GDI.5) (GDI32.@)
 */
DC_SET_MODE( SetRelAbs, relAbsMode, ABSOLUTE, RELATIVE )

/***********************************************************************
 *		SetPolyFillMode		(GDI.6) (GDI32.@)
 */
DC_SET_MODE( SetPolyFillMode, polyFillMode, ALTERNATE, WINDING )

/***********************************************************************
 *		SetStretchBltMode	(GDI.7) (GDI32.@)
 */
DC_SET_MODE( SetStretchBltMode, stretchBltMode, BLACKONWHITE, HALFTONE )

/***********************************************************************
 *		GetBkColor		(GDI.75) (GDI32.@)
 */
DC_GET_VAL( COLORREF, GetBkColor, backgroundColor )

/***********************************************************************
 *		GetBkMode		(GDI.76) (GDI32.@)
 */
DC_GET_VAL( INT, GetBkMode, backgroundMode )

/***********************************************************************
 *		GetCurrentPosition	(GDI.78)
 */
DC_GET_X_Y( DWORD, GetCurrentPosition16, CursPosX, CursPosY )

/***********************************************************************
 *		GetMapMode		(GDI.81) (GDI32.@)
 */
DC_GET_VAL( INT, GetMapMode, MapMode )

/***********************************************************************
 *		GetPolyFillMode		(GDI.84) (GDI32.@)
 */
DC_GET_VAL( INT, GetPolyFillMode, polyFillMode )

/***********************************************************************
 *		GetROP2			(GDI.85) (GDI32.@)
 */
DC_GET_VAL( INT, GetROP2, ROPmode )

/***********************************************************************
 *		GetRelAbs		(GDI.86)
 */
DC_GET_VAL_16( INT16, GetRelAbs16, relAbsMode )

/***********************************************************************
 *		GetStretchBltMode	(GDI.88) (GDI32.@)
 */
DC_GET_VAL( INT, GetStretchBltMode, stretchBltMode )

/***********************************************************************
 *		GetTextColor		(GDI.90) (GDI32.@)
 */
DC_GET_VAL( COLORREF, GetTextColor, textColor )

/***********************************************************************
 *		GetViewportExt	(GDI.94)
 */
DC_GET_X_Y( DWORD, GetViewportExt16, vportExtX, vportExtY )

/***********************************************************************
 *		GetViewportOrg	(GDI.95)
 */
DC_GET_X_Y( DWORD, GetViewportOrg16, vportOrgX, vportOrgY )

/***********************************************************************
 *		GetWindowExt		(GDI.96)
 */
DC_GET_X_Y( DWORD, GetWindowExt16, wndExtX, wndExtY )

/***********************************************************************
 *		GetWindowOrg	(GDI.97)
 */
DC_GET_X_Y( DWORD, GetWindowOrg16, wndOrgX, wndOrgY )

/***********************************************************************
 *		InquireVisRgn	(GDI.131)
 */
DC_GET_VAL_16( HRGN16, InquireVisRgn16, hVisRgn )

/***********************************************************************
 *		GetClipRgn	(GDI.173)
 */
DC_GET_VAL_16( HRGN16, GetClipRgn16, hClipRgn )

/***********************************************************************
 *		GetBrushOrg	(GDI.149)
 */
DC_GET_X_Y( DWORD, GetBrushOrg16, brushOrgX, brushOrgY )

/***********************************************************************
 *		GetTextAlign	(GDI.345) (GDI32.@)
 */
DC_GET_VAL( UINT, GetTextAlign, textAlign )

/***********************************************************************
 *		GetCurLogFont	(GDI.411)
 */
DC_GET_VAL_16( HFONT16, GetCurLogFont16, hFont )

/***********************************************************************
 *		GetArcDirection	(GDI.524) (GDI32.@)
 */
DC_GET_VAL( INT, GetArcDirection, ArcDirection )

/***********************************************************************
 *		GetGraphicsMode (GDI32.@)
 */
DC_GET_VAL( INT, GetGraphicsMode, GraphicsMode)

/***********************************************************************
 *		GetBrushOrgEx	(GDI.469) (GDI32.@)
 */
DC_GET_VAL_EX( GetBrushOrgEx, brushOrgX, brushOrgY, POINT ) /*  */

/***********************************************************************
 *		GetCurrentPositionEx	(GDI.470) (GDI32.@)
 */
DC_GET_VAL_EX( GetCurrentPositionEx, CursPosX, CursPosY, POINT )

/***********************************************************************
 *		GetViewportExtEx	(GDI.472) (GDI32.@)
 */
DC_GET_VAL_EX( GetViewportExtEx, vportExtX, vportExtY, SIZE )

/***********************************************************************
 *		GetViewportOrgEx	(GDI.473) (GDI32.@)
 */
DC_GET_VAL_EX( GetViewportOrgEx, vportOrgX, vportOrgY, POINT )

/***********************************************************************
 *		GetWindowExtEx	(GDI.474) (GDI32.@)
 */
DC_GET_VAL_EX( GetWindowExtEx, wndExtX, wndExtY, SIZE )

/***********************************************************************
 *		GetWindowOrgEx	(GDI.475) (GDI32.@)
 */
DC_GET_VAL_EX( GetWindowOrgEx, wndOrgX, wndOrgY, POINT )
