/*
 * Enhanced MetaFile driver definitions
 *
 * Copyright 1999 Huw D M Davies
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __WINE_ENHMETAFILEDRV_H
#define __WINE_ENHMETAFILEDRV_H

#include "windef.h"
#include "wingdi.h"
#include "gdi.h"

/* Enhanced Metafile driver physical DC */

typedef struct
{
    ENHMETAHEADER  *emh;           /* Pointer to enhanced metafile header */
    UINT       nextHandle;         /* Next handle number */
    HFILE      hFile;              /* HFILE for disk based MetaFile */ 
} EMFDRV_PDEVICE;


extern BOOL EMFDRV_WriteRecord( DC *dc, EMR *emr );
extern int EMFDRV_AddHandleDC( DC *dc );
extern void EMFDRV_UpdateBBox( DC *dc, RECTL *rect );
extern DWORD EMFDRV_CreateBrushIndirect( DC *dc, HBRUSH hBrush );

/* Metafile driver functions */
extern BOOL     EMFDRV_AbortPath( DC *dc );
extern BOOL     EMFDRV_Arc( DC *dc, INT left, INT top, INT right,
			    INT bottom, INT xstart, INT ystart, INT xend,
			    INT yend );
extern BOOL     EMFDRV_BeginPath( DC *dc );
extern BOOL     EMFDRV_BitBlt( DC *dcDst, INT xDst, INT yDst,
			       INT width, INT height, DC *dcSrc,
			       INT xSrc, INT ySrc, DWORD rop );
extern BOOL     EMFDRV_Chord( DC *dc, INT left, INT top, INT right,
			      INT bottom, INT xstart, INT ystart, INT xend,
			      INT yend );
extern BOOL     EMFDRV_CloseFigure( DC *dc );
extern BOOL     EMFDRV_Ellipse( DC *dc, INT left, INT top,
				INT right, INT bottom );
extern BOOL     EMFDRV_EndPath( DC *dc );
extern INT      EMFDRV_ExcludeClipRect( DC *dc, INT left, INT top, INT right,
					INT bottom );
extern BOOL     EMFDRV_ExtFloodFill( DC *dc, INT x, INT y,
				     COLORREF color, UINT fillType );
extern BOOL     EMFDRV_ExtTextOut( DC *dc, INT x, INT y,
				   UINT flags, const RECT *lprect, LPCSTR str,
				   UINT count, const INT *lpDx );
extern BOOL     EMFDRV_FillPath( DC *dc );
extern BOOL     EMFDRV_FillRgn( DC *dc, HRGN hrgn, HBRUSH hbrush );
extern BOOL     EMFDRV_FlattenPath( DC *dc );
extern BOOL     EMFDRV_FrameRgn( DC *dc, HRGN hrgn, HBRUSH hbrush, INT width,
				 INT height );
extern INT      EMFDRV_IntersectClipRect( DC *dc, INT left, INT top, INT right,
					  INT bottom );
extern BOOL     EMFDRV_InvertRgn( DC *dc, HRGN hrgn );
extern BOOL     EMFDRV_LineTo( DC *dc, INT x, INT y );
extern BOOL     EMFDRV_MoveTo( DC *dc, INT x, INT y );
extern INT      EMFDRV_OffsetClipRgn( DC *dc, INT x, INT y );
extern BOOL     EMFDRV_OffsetViewportOrg( DC *dc, INT x, INT y );
extern BOOL     EMFDRV_OffsetWindowOrg( DC *dc, INT x, INT y );
extern BOOL     EMFDRV_PaintRgn( DC *dc, HRGN hrgn );
extern BOOL     EMFDRV_PatBlt( DC *dc, INT left, INT top,
			       INT width, INT height, DWORD rop );
extern BOOL     EMFDRV_Pie( DC *dc, INT left, INT top, INT right,
			    INT bottom, INT xstart, INT ystart, INT xend,
			    INT yend );
extern BOOL     EMFDRV_PolyPolygon( DC *dc, const POINT* pt,
				    const INT* counts, UINT polys);
extern BOOL     EMFDRV_PolyPolyline( DC *dc, const POINT* pt,
				     const DWORD* counts, DWORD polys);
extern BOOL     EMFDRV_Polygon( DC *dc, const POINT* pt, INT count );
extern BOOL     EMFDRV_Polyline( DC *dc, const POINT* pt,INT count);
extern BOOL     EMFDRV_Rectangle( DC *dc, INT left, INT top,
				  INT right, INT bottom);
extern BOOL     EMFDRV_RestoreDC( DC *dc, INT level );
extern BOOL     EMFDRV_RoundRect( DC *dc, INT left, INT top,
				  INT right, INT bottom, INT ell_width,
				  INT ell_height );
extern INT      EMFDRV_SaveDC( DC *dc );
extern BOOL     EMFDRV_ScaleViewportExt( DC *dc, INT xNum,
					 INT xDenom, INT yNum, INT yDenom );
extern BOOL     EMFDRV_ScaleWindowExt( DC *dc, INT xNum, INT xDenom,
				       INT yNum, INT yDenom );
extern BOOL     EMFDRV_SelectClipPath( DC *dc, INT iMode );
extern HGDIOBJ  EMFDRV_SelectObject( DC *dc, HGDIOBJ handle );
extern COLORREF EMFDRV_SetBkColor( DC *dc, COLORREF color );
extern INT      EMFDRV_SetBkMode( DC *dc, INT mode );
extern INT      EMFDRV_SetDIBitsToDevice( DC *dc, INT xDest, INT yDest,
					  DWORD cx, DWORD cy, INT xSrc,
					  INT ySrc, UINT startscan, UINT lines,
					  LPCVOID bits, const BITMAPINFO *info,
					  UINT coloruse );
extern INT      EMFDRV_SetMapMode( DC *dc, INT mode );
extern DWORD    EMFDRV_SetMapperFlags( DC *dc, DWORD flags );
extern COLORREF EMFDRV_SetPixel( DC *dc, INT x, INT y, COLORREF color );
extern INT      EMFDRV_SetPolyFillMode( DC *dc, INT mode );
extern INT      EMFDRV_SetROP2( DC *dc, INT rop );
extern INT      EMFDRV_SetStretchBltMode( DC *dc, INT mode );
extern UINT     EMFDRV_SetTextAlign( DC *dc, UINT align );
extern COLORREF EMFDRV_SetTextColor( DC *dc, COLORREF color );
extern BOOL     EMFDRV_SetViewportExt( DC *dc, INT x, INT y );
extern BOOL     EMFDRV_SetViewportOrg( DC *dc, INT x, INT y );
extern BOOL     EMFDRV_SetWindowExt( DC *dc, INT x, INT y );
extern BOOL     EMFDRV_SetWindowOrg( DC *dc, INT x, INT y );
extern BOOL     EMFDRV_StretchBlt( DC *dcDst, INT xDst, INT yDst,
				   INT widthDst, INT heightDst,
				   DC *dcSrc, INT xSrc, INT ySrc,
				   INT widthSrc, INT heightSrc, DWORD rop );
extern INT      EMFDRV_StretchDIBits( DC *dc, INT xDst, INT yDst, INT widthDst,
				      INT heightDst, INT xSrc, INT ySrc,
				      INT widthSrc, INT heightSrc,
				      const void *bits, const BITMAPINFO *info,
				      UINT wUsage, DWORD dwRop );
extern BOOL     EMFDRV_StrokeAndFillPath( DC *dc );
extern BOOL     EMFDRV_StrokePath( DC *dc );
extern BOOL     EMFDRV_WidenPath( DC *dc );


#endif  /* __WINE_METAFILEDRV_H */

