/*
 * Metafile GDI mapping mode functions
 *
 * Copyright 1996 Alexandre Julliard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "gdi.h"
#include "gdi_private.h"
#include "mfdrv/metafiledrv.h"


/***********************************************************************
 *           MFDRV_SetMapMode
 */
INT MFDRV_SetMapMode( PHYSDEV dev, INT mode )
{
    if(!MFDRV_MetaParam1( dev, META_SETMAPMODE, mode ))
        return FALSE;
    return GDI_NO_MORE_WORK;
}


/***********************************************************************
 *           MFDRV_SetViewportExt
 */
INT MFDRV_SetViewportExt( PHYSDEV dev, INT x, INT y )
{
    if(!MFDRV_MetaParam2( dev, META_SETVIEWPORTEXT, x, y ))
        return FALSE;
    return GDI_NO_MORE_WORK;
}


/***********************************************************************
 *           MFDRV_SetViewportOrg
 */
INT MFDRV_SetViewportOrg( PHYSDEV dev, INT x, INT y )
{
    if(!MFDRV_MetaParam2( dev, META_SETVIEWPORTORG, x, y ))
        return FALSE;
    return GDI_NO_MORE_WORK;
}


/***********************************************************************
 *           MFDRV_SetWindowExt
 */
INT MFDRV_SetWindowExt( PHYSDEV dev, INT x, INT y )
{
    if(!MFDRV_MetaParam2( dev, META_SETWINDOWEXT, x, y ))
        return FALSE;
    return GDI_NO_MORE_WORK;
}


/***********************************************************************
 *           MFDRV_SetWindowOrg
 */
INT MFDRV_SetWindowOrg( PHYSDEV dev, INT x, INT y )
{
    if(!MFDRV_MetaParam2( dev, META_SETWINDOWORG, x, y ))
        return FALSE;
    return GDI_NO_MORE_WORK;
}


/***********************************************************************
 *           MFDRV_OffsetViewportOrg
 */
INT MFDRV_OffsetViewportOrg( PHYSDEV dev, INT x, INT y )
{
    if(!MFDRV_MetaParam2( dev, META_OFFSETVIEWPORTORG, x, y ))
        return FALSE;
    return GDI_NO_MORE_WORK;
}


/***********************************************************************
 *           MFDRV_OffsetWindowOrg
 */
INT MFDRV_OffsetWindowOrg( PHYSDEV dev, INT x, INT y )
{
    if(!MFDRV_MetaParam2( dev, META_OFFSETWINDOWORG, x, y ))
        return FALSE;
    return GDI_NO_MORE_WORK;
}


/***********************************************************************
 *           MFDRV_ScaleViewportExt
 */
INT MFDRV_ScaleViewportExt( PHYSDEV dev, INT xNum, INT xDenom, INT yNum, INT yDenom )
{
    if(!MFDRV_MetaParam4( dev, META_SCALEVIEWPORTEXT, xNum, xDenom, yNum, yDenom ))
        return FALSE;
    return GDI_NO_MORE_WORK;
}


/***********************************************************************
 *           MFDRV_ScaleWindowExt
 */
INT MFDRV_ScaleWindowExt( PHYSDEV dev, INT xNum, INT xDenom, INT yNum, INT yDenom )
{
    if(!MFDRV_MetaParam4( dev, META_SCALEWINDOWEXT, xNum, xDenom, yNum, yDenom ))
        return FALSE;
    return GDI_NO_MORE_WORK;
}
