File: //usr/include/libwmf/ipa.h
/* libwmf (<libwmf/ipa.h>): library for wmf conversion
   Copyright (C) 2000 - various; see CREDITS, ChangeLog, and sources
   The libwmf Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.
   The libwmf 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
   Library General Public License for more details.
   You should have received a copy of the GNU Library General Public
   License along with the libwmf Library; see the file COPYING.  If not,
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */
/* Interface Programmable des Applications ??
 */
#ifndef LIBWMF_IPA_H
#define LIBWMF_IPA_H
#include <libwmf/types.h>
#ifdef __cplusplus
extern "C" {
#endif
/* Type declarations
 */
typedef struct _wmfRGB                 wmfRGB;
typedef struct _wmfBMP                 wmfBMP;
typedef struct _wmfBrush               wmfBrush;
typedef struct _wmfPen                 wmfPen;
typedef struct _wmfFont                wmfFont;
typedef struct _wmfFontData            wmfFontData;
typedef struct _wmfColorData           wmfColorData;
typedef struct _wmfDC                  wmfDC;
typedef struct _wmfFlood_t             wmfFlood_t;
typedef struct _wmfDrawPixel_t         wmfDrawPixel_t;
typedef struct _wmfDrawArc_t           wmfDrawArc_t;
typedef struct _wmfDrawLine_t          wmfDrawLine_t;
typedef struct _wmfPolyLine_t          wmfPolyLine_t;
typedef struct _wmfPolyPoly_t          wmfPolyPoly_t;
typedef struct _wmfDrawRectangle_t     wmfDrawRectangle_t;
typedef struct _wmfPolyRectangle_t     wmfPolyRectangle_t;
typedef struct _wmfBMP_Read_t          wmfBMP_Read_t;
typedef struct _wmfBMP_Draw_t          wmfBMP_Draw_t;
typedef struct _wmfROP_Draw_t          wmfROP_Draw_t;
typedef struct _wmfDrawText_t          wmfDrawText_t;
typedef struct _wmfUserData_t          wmfUserData_t;
typedef struct _wmfFunctionReference   wmfFunctionReference;
typedef float (*wmfStringWidth) (wmfAPI*,wmfFont*,char*);
typedef void  (*wmfMap)         (wmfAPI*,wmfFont*);
/* Device-layer device-independent default functions
 */
extern void   wmf_ipa_bmp_b64 (wmfAPI*,wmfBMP_Draw_t*,wmfStream*);
extern void   wmf_ipa_bmp_png (wmfAPI*,wmfBMP_Draw_t*,char*);
extern void   wmf_ipa_bmp_jpg (wmfAPI*,wmfBMP_Draw_t*,char*);
extern void   wmf_ipa_bmp_eps (wmfAPI*,wmfBMP_Draw_t*,char*);
extern void   wmf_ipa_bmp_read (wmfAPI*,wmfBMP_Read_t*);
extern void   wmf_ipa_bmp_free (wmfAPI*,wmfBMP*);
extern wmfBMP wmf_ipa_bmp_copy (wmfAPI*,wmfBMP*,unsigned int,unsigned int);
extern int    wmf_ipa_bmp_color (wmfAPI*,wmfBMP*,wmfRGB*,unsigned int,unsigned int);
extern void   wmf_ipa_bmp_setcolor (wmfAPI*,wmfBMP*,wmfRGB*,unsigned char,unsigned int,unsigned int);
extern int    wmf_ipa_bmp_interpolate (wmfAPI*,wmfBMP*,wmfRGB*,float,float);
extern void          wmf_ipa_color_init (wmfAPI*);
extern void          wmf_ipa_color_add (wmfAPI*,wmfRGB*);
extern unsigned long wmf_ipa_color_index (wmfAPI*,wmfRGB*);
extern unsigned long wmf_ipa_color_count (wmfAPI*);
extern wmfRGB*       wmf_ipa_color (wmfAPI*,unsigned long);
extern char*        wmf_ipa_page_format (wmfAPI*,wmf_page_t);
extern unsigned int wmf_ipa_page_width  (wmfAPI*,wmf_page_t);
extern unsigned int wmf_ipa_page_height (wmfAPI*,wmf_page_t);
/* Other useful functions
 */
extern wmfRGB wmf_rgb_white (void);
extern wmfRGB wmf_rgb_black (void);
extern wmfRGB wmf_rgb_color (wmfAPI*,float,float,float);
/* Structure definitions
 */
struct _wmfRGB
{	unsigned char r;
	unsigned char g;
	unsigned char b;
};
struct _wmfBMP
{	U16 width;
	U16 height;
	void* data;
};
struct _wmfPen
{	U16 lopnStyle;
	double width;
	double height;
	wmfRGB lopnColor;
};
struct _wmfBrush
{	U16 lbStyle;
	U16 lbHatch;
	wmfRGB lbColor;
	wmfBMP bmp;
};
struct _wmfFont
{	U16 lfHeight;
	U16 lfWidth;
	S16 lfEscapement;
	S16 lfOrientation;
	U16 lfWeight;
	U8 lfItalic;
	U8 lfUnderline;
	U8 lfStrikeOut;
	U8 lfCharSet;
	U8 lfOutPrecision;
	U8 lfClipPrecision;
	U8 lfQuality;
	U8 lfPitchAndFamily;
	char* lfFaceName;
	void* user_data;
};
/**
 * API->font_data is a pointer to a wmfFontData. wmf_api_create () sets this up automatically, but
 * wmf_lite_create () does not. If you use wmf_lite_create () then you \b must create your own
 * wmfFontData. \b libwmflite requires you to define \p map and \p stringwidth functions but the
 * rest of these fields are ignored (they are only used by \b libwmf).
 */
struct _wmfFontData
{	/**
	 * Necessary field: exactly what the function does is irrelevant.
	 */
	wmfMap map;
	/**
	 * Necessary field: returns width of specified string in points, assuming (unstretched)
	 * font size of 1pt.
	 */
	wmfStringWidth stringwidth;
	/**
	 * A handle for data, unused by libwmflite
	 */
	void* user_data;
};
struct _wmfColorData
{	unsigned long max;
	unsigned long count;
	wmfRGB* rgb;
};
struct _wmfDC
{	void* userdata;
	wmfBrush* brush;
	wmfPen* pen;
	wmfFont* font;
	wmfRGB textcolor;
	wmfRGB bgcolor;
	U16 textalign;
	U16 bgmode;
	U16 polyfillmode;
	U16 charextra;
	U16 breakextra;
	U16 ROPmode;
	struct
	{	S32 Ox;
		S32 Oy;
		S32 width;
		S32 height;
	} Window;
	double pixel_width; /* Display pixel dimensions (inches) */
	double pixel_height;
	U16 map_mode;
	void* clip;
};
/* IPA info structures
 */
struct _wmfFlood_t
{	wmfDC* dc;
	wmfD_Coord pt;
	wmfRGB color;
	U16 type;
	double pixel_width;
	double pixel_height;
};
struct _wmfDrawPixel_t
{	wmfDC* dc;
	wmfD_Coord pt;
	wmfRGB color;
	double pixel_width;
	double pixel_height;
};
struct _wmfDrawArc_t
{	wmfDC* dc;
	wmfD_Coord TL;
	wmfD_Coord BR;
	wmfD_Coord start; /* draw_ellipse: (ignored) */
	wmfD_Coord end;
};
struct _wmfDrawLine_t
{	wmfDC* dc;
	wmfD_Coord from;
	wmfD_Coord to;
};
struct _wmfPolyLine_t
{	wmfDC* dc;
	wmfD_Coord* pt;
	U16 count;
};
struct _wmfPolyPoly_t
{	wmfDC* dc;
	wmfD_Coord** pt; /* pt[i][*] = points of ith polygon */
	U16* count;      /* points in ith polygon */
	U16  npoly;      /* number of polygons */
};
struct _wmfDrawRectangle_t
{	wmfDC* dc;
	wmfD_Coord TL;
	wmfD_Coord BR;
	float width; /* draw_rectangle: axes of corner ellipses; zero if un-rounded */
	float height;
};
struct _wmfPolyRectangle_t
{	wmfDC* dc;
	wmfD_Coord* TL; /* region_frame & region_paint: TL[count],BR[count] give the */
	wmfD_Coord* BR; /* final `extents'... */
	unsigned int count;
	float width;  /* region_frame: border thickness; zero otherwise */
	float height;
};
struct _wmfBMP_Read_t          /* Two means available for accessing BMP image:        */
{	long offset;           /* (1) position in source file of start of BMP;        *
                                * use API->bbuf.seek to set pos(ition), etc.          */
	long length;           /* (2) buffer of length length containing image of BMP */
	unsigned char* buffer;
	U16 width;  /* WMF player may preset these values; zero otherwise. */
	U16 height; /* Use caution - may be buggy... ?? [TODO]             */
	wmfBMP bmp;
};
struct _wmfBMP_Draw_t
{	wmfDC* dc;
	wmfD_Coord pt;
	wmfBMP bmp;
	U32 type;
	struct
	{	U16 x;
		U16 y;
		U16 w;
		U16 h;
	} crop;
	double pixel_width;
	double pixel_height;
};
struct _wmfROP_Draw_t
{	wmfDC* dc;
	wmfD_Coord TL;
	wmfD_Coord BR;
	U32 ROP;
	double pixel_width;
	double pixel_height;
};
struct _wmfDrawText_t
{	wmfDC* dc;
	wmfD_Coord pt;
	wmfD_Coord TL; /* Clip zone */
	wmfD_Coord BR;
	struct /* An estimated surround zone */
	{	wmfD_Coord TL;
		wmfD_Coord TR;
		wmfD_Coord BL;
		wmfD_Coord BR;
	} bbox;
	char* str;
	U16 flags;
	double font_height;
	double font_ratio;  /* width to height ratio */
};
struct _wmfUserData_t	/* TODO: Need to be careful with usage here; not all these are set by the player! */
{	wmfDC* dc;          /* dc is guaranteed */
	void* data;         /* data also, except for init */
};
struct _wmfFunctionReference
{	void (*device_open) (wmfAPI*);
	void (*device_close) (wmfAPI*);
	void (*device_begin) (wmfAPI*);
	void (*device_end) (wmfAPI*);
	void (*flood_interior) (wmfAPI*,wmfFlood_t*);
	void (*flood_exterior) (wmfAPI*,wmfFlood_t*);
	void (*draw_pixel) (wmfAPI*,wmfDrawPixel_t*);
	void (*draw_pie) (wmfAPI*,wmfDrawArc_t*);
	void (*draw_chord) (wmfAPI*,wmfDrawArc_t*);
	void (*draw_arc) (wmfAPI*,wmfDrawArc_t*);
	void (*draw_ellipse) (wmfAPI*,wmfDrawArc_t*);
	void (*draw_line) (wmfAPI*,wmfDrawLine_t*);
	void (*poly_line) (wmfAPI*,wmfPolyLine_t*);
	void (*draw_polygon) (wmfAPI*,wmfPolyLine_t*);
	void (*draw_polypolygon) (wmfAPI*,wmfPolyPoly_t*);
	void (*draw_rectangle) (wmfAPI*,wmfDrawRectangle_t*);
	void (*rop_draw) (wmfAPI*,wmfROP_Draw_t*);
	void (*bmp_draw) (wmfAPI*,wmfBMP_Draw_t*);
	void (*bmp_read) (wmfAPI*,wmfBMP_Read_t*);
	void (*bmp_free) (wmfAPI*,wmfBMP*);
	void (*draw_text) (wmfAPI*,wmfDrawText_t*);
	void (*udata_init) (wmfAPI*,wmfUserData_t*);
	void (*udata_copy) (wmfAPI*,wmfUserData_t*);
	void (*udata_set) (wmfAPI*,wmfUserData_t*);
	void (*udata_free) (wmfAPI*,wmfUserData_t*);
	void (*region_frame) (wmfAPI*,wmfPolyRectangle_t*);
	void (*region_paint) (wmfAPI*,wmfPolyRectangle_t*);
	void (*region_clip) (wmfAPI*,wmfPolyRectangle_t*);
};
#ifdef __cplusplus
}
#endif
#endif /* ! LIBWMF_IPA_H */