1 /*
2  * Copyright (C) 2007 Novell, Inc (http://www.novell.com)
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
5  * and associated documentation files (the "Software"), to deal in the Software without restriction,
6  * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
7  * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
8  * subject to the following conditions:
9  *
10  * The above copyright notice and this permission notice shall be included in all copies or substantial
11  * portions of the Software.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
14  * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
15  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
16  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
17  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18  *
19  * Authors:
20  *	Sebastien Pouliot  <sebastien@ximian.com>
21  */
22 
23 #ifndef __METAFILE_PRIVATE_H__
24 #define __METAFILE_PRIVATE_H__
25 
26 #include "gdiplus-private.h"
27 #include "codecs-private.h"
28 #include "bitmap-private.h"
29 #include "matrix-private.h"
30 #include "bmpcodec.h"
31 #include "emfcodec.h"
32 #include "wmfcodec.h"
33 
34 /*
35  *	http://wvware.sourceforge.net/caolan/ora-wmf.html
36  */
37 
38 #define ALDUS_PLACEABLE_METAFILE_KEY	0x9AC6CDD7
39 #define WMF_TYPE_AND_HEADERSIZE_KEY	0x00090001
40 #define EMF_EMR_HEADER_KEY		0x1
41 
42 #define MM_PER_INCH			25.4f
43 
44 /* object types */
45 #define METAOBJECT_TYPE_EMPTY	0
46 #define METAOBJECT_TYPE_PEN	1
47 #define METAOBJECT_TYPE_BRUSH	2
48 
49 #define gdip_get_metaheader(image)	(&((GpMetafile*)image)->metafile_header)
50 
51 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
52 #define GETDW(x)	(*(DWORD*)(data + (x)))
53 #else
54 #define GETDW(x)	(GUINT32_FROM_LE(*(DWORD*)(data + (x))))
55 #endif
56 
57 typedef struct {
58 	void *ptr;
59 	int type;
60 } MetaObject;
61 
62 struct _Metafile {
63 	GpImage base;
64 	MetafileHeader metafile_header;
65 	BOOL delete;
66 	BYTE *data;
67 	int length;
68 	BOOL recording;		/* recording into memory (data), file (fp) or user stream (stream) */
69 	FILE *fp;
70 	void *stream;
71 };
72 
73 typedef struct {
74 	GpMetafile *metafile;
75 	int x, y, width, height;
76 	int objects_count;
77 	MetaObject *objects;
78 	MetaObject created;
79 	GpGraphics *graphics;
80 	GpMatrix initial;
81 	GpMatrix matrix;
82 	DWORD bk_mode;
83 	DWORD bk_color;
84 	float miter_limit;
85 	int selected_pen;
86 	int selected_brush;
87 	int selected_font;
88 	int selected_palette;
89 	int map_mode;
90 	FillMode fill_mode;
91 	int current_x, current_y;
92 	/* path related data */
93 	BOOL use_path;
94 	GpPath *path;
95 	int path_x, path_y;
96 	/* stock objects */
97 	GpPen *stock_pen_white;
98 	GpPen *stock_pen_black;
99 	GpPen *stock_pen_null;
100 	GpSolidFill *stock_brush_white;
101 	GpSolidFill *stock_brush_ltgray;
102 	GpSolidFill *stock_brush_gray;
103 	GpSolidFill *stock_brush_dkgray;
104 	GpSolidFill *stock_brush_black;
105 	GpSolidFill *stock_brush_null;
106 	/* bitmap representation */
107 	BYTE *scan0;
108 } MetafilePlayContext;
109 
110 typedef struct {
111 	int num;
112 	GpPointF *points;
113 } PointFList;
114 
115 typedef struct {
116 	DWORD	cbPixelFormat;
117 	DWORD	offPixelFormat;
118 	DWORD	bOpenGL;
119 } HeaderExtension1;
120 
121 GpStatus gdip_get_metafile_from (void *pointer, GpMetafile **metafile, ImageSource source) GDIP_INTERNAL;
122 GpStatus gdip_metafile_clone (GpMetafile *metafile, GpMetafile **clonedmetafile) GDIP_INTERNAL;
123 GpStatus gdip_metafile_dispose (GpMetafile *metafile) GDIP_INTERNAL;
124 
125 GpStatus gdip_get_bitmap_from_metafile (GpMetafile *metafile, INT width, INT height, GpImage **thumbnail) GDIP_INTERNAL;
126 
127 GpStatus gdip_metafile_stop_recording (GpMetafile *metafile) GDIP_INTERNAL;
128 
129 GpStatus gdip_metafile_play_emf (MetafilePlayContext *context) GDIP_INTERNAL;
130 GpStatus gdip_metafile_play_wmf (MetafilePlayContext *context) GDIP_INTERNAL;
131 GpStatus gdip_metafile_play_emfplus_block (MetafilePlayContext *context, BYTE* data, int length) GDIP_INTERNAL;
132 
133 MetafilePlayContext* gdip_metafile_play_setup (GpMetafile *metafile, GpGraphics *graphics, int x, int y, int width,
134 	int height) GDIP_INTERNAL;
135 GpStatus gdip_metafile_play (MetafilePlayContext *context) GDIP_INTERNAL;
136 GpStatus gdip_metafile_play_cleanup (MetafilePlayContext *context) GDIP_INTERNAL;
137 
138 GpPen* gdip_metafile_GetSelectedPen (MetafilePlayContext *context) GDIP_INTERNAL;
139 GpBrush* gdip_metafile_GetSelectedBrush (MetafilePlayContext *context) GDIP_INTERNAL;
140 GpStatus GdiComment (MetafilePlayContext *context, BYTE* data, DWORD size) GDIP_INTERNAL;
141 
142 GpStatus gdip_metafile_SaveDC (MetafilePlayContext *context) GDIP_INTERNAL;
143 GpStatus gdip_metafile_SetBkMode (MetafilePlayContext *context, DWORD bkMode) GDIP_INTERNAL;
144 GpStatus gdip_metafile_SetMapMode (MetafilePlayContext *context, DWORD mode) GDIP_INTERNAL;
145 GpStatus gdip_metafile_SetROP2 (MetafilePlayContext *context, DWORD rop) GDIP_INTERNAL;
146 GpStatus gdip_metafile_SetRelabs (MetafilePlayContext *context, DWORD mode) GDIP_INTERNAL;
147 GpStatus gdip_metafile_SetPolyFillMode (MetafilePlayContext *context, DWORD mode) GDIP_INTERNAL;
148 GpStatus gdip_metafile_SetStretchBltMode (MetafilePlayContext *context, int iStretchMode) GDIP_INTERNAL;
149 GpStatus gdip_metafile_RestoreDC (MetafilePlayContext *context) GDIP_INTERNAL;
150 GpStatus gdip_metafile_SelectObject (MetafilePlayContext *context, DWORD slot) GDIP_INTERNAL;
151 GpStatus gdip_metafile_ModifyWorldTransform (MetafilePlayContext *context, XFORM *lpXform, DWORD iMode) GDIP_INTERNAL;
152 GpStatus gdip_metafile_SetTextAlign (MetafilePlayContext *context, DWORD textalign) GDIP_INTERNAL;
153 GpStatus gdip_metafile_DeleteObject (MetafilePlayContext *context, DWORD slot) GDIP_INTERNAL;
154 GpStatus gdip_metafile_SetBkColor (MetafilePlayContext *context, DWORD color) GDIP_INTERNAL;
155 GpStatus gdip_metafile_SetWindowOrg (MetafilePlayContext *context, int x, int y) GDIP_INTERNAL;
156 GpStatus gdip_metafile_SetWindowExt (MetafilePlayContext *context, int height, int width) GDIP_INTERNAL;
157 GpStatus gdip_metafile_LineTo (MetafilePlayContext *context, int x, int y) GDIP_INTERNAL;
158 GpStatus gdip_metafile_MoveTo (MetafilePlayContext *context, int x, int y) GDIP_INTERNAL;
159 GpStatus gdip_metafile_SetMiterLimit (MetafilePlayContext *context, float eNewLimit, float *peOldLimit) GDIP_INTERNAL;
160 GpStatus gdip_metafile_CreatePenIndirect (MetafilePlayContext *context, DWORD style, DWORD width, DWORD color) GDIP_INTERNAL;
161 GpStatus gdip_metafile_ExtCreatePen (MetafilePlayContext *context, DWORD dwPenStyle, DWORD dwWidth, CONST LOGBRUSH *lplb,
162 	DWORD dwStyleCount, CONST DWORD *lpStyle) GDIP_INTERNAL;
163 GpStatus gdip_metafile_CreateBrushIndirect (MetafilePlayContext *context, DWORD style, DWORD color, DWORD hatch) GDIP_INTERNAL;
164 GpStatus gdip_metafile_Arc (MetafilePlayContext *context, int left, int top, int right, int bottom,
165 	int xstart, int ystart, int xend, int yend) GDIP_INTERNAL;
166 GpStatus gdip_metafile_Rectangle (MetafilePlayContext *context, int bottomRect, int rightRect, int topRect, int leftRect) GDIP_INTERNAL;
167 GpStatus gdip_metafile_SetPixel (MetafilePlayContext *context, DWORD color, int x, int y) GDIP_INTERNAL;
168 GpStatus gdip_metafile_StretchDIBits (MetafilePlayContext *context, int XDest, int YDest, int nDestWidth, int nDestHeight,
169 	int XSrc, int YSrc, int nSrcWidth, int nSrcHeight, CONST void *lpBits, CONST BITMAPINFO *lpBitsInfo,
170 	UINT iUsage, DWORD dwRop) GDIP_INTERNAL;
171 GpStatus gdip_metafile_PolyBezier (MetafilePlayContext *context, GpPointF *points, int count) GDIP_INTERNAL;
172 GpStatus gdip_metafile_Polygon (MetafilePlayContext *context, GpPointF *points, int count) GDIP_INTERNAL;
173 GpStatus gdip_metafile_BeginPath (MetafilePlayContext *context) GDIP_INTERNAL;
174 GpStatus gdip_metafile_EndPath (MetafilePlayContext *context) GDIP_INTERNAL;
175 GpStatus gdip_metafile_CloseFigure (MetafilePlayContext *context) GDIP_INTERNAL;
176 GpStatus gdip_metafile_FillPath (MetafilePlayContext *context) GDIP_INTERNAL;
177 GpStatus gdip_metafile_StrokePath (MetafilePlayContext *context) GDIP_INTERNAL;
178 GpStatus gdip_metafile_StrokeAndFillPath (MetafilePlayContext *context) GDIP_INTERNAL;
179 
180 #include "metafile.h"
181 
182 #endif
183