/*
 * DC device-independent Get/SetXXX functions
 *
 * Copyright 1993 Alexandre Julliard
 *
 */

#include "winbase.h"
#include "winerror.h"
#include "gdi.h"
#include "dc.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 *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
    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 *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
    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 *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
    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 *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
    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 *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
    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, w.backgroundMode, TRANSPARENT, OPAQUE ) 

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

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

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

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

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

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

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

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

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

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

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

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

/***********************************************************************
 *		GetTextColor		(GDI.90) (GDI32.227)
 */
DC_GET_VAL( COLORREF, GetTextColor, w.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, w.hVisRgn )

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

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

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

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

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

/***********************************************************************
 *		GetGraphicsMode (GDI32.188)
 */
DC_GET_VAL( INT, GetGraphicsMode, w.GraphicsMode)

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

/***********************************************************************
 *		GetCurrentPositionEx	(GDI.470) (GDI32.167)
 */
DC_GET_VAL_EX( GetCurrentPositionEx, w.CursPosX, w.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 )
