Better separation of the palette functions.
[wine] / dlls / gdi / enhmfdrv / dc.c
1 /*
2  * Enhanced MetaFile driver dc value functions
3  *
4  * Copyright 1999 Huw D M Davies
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "enhmfdrv/enhmetafiledrv.h"
22 #include "wine/debug.h"
23
24 WINE_DEFAULT_DEBUG_CHANNEL(enhmetafile);
25
26 INT EMFDRV_SaveDC( PHYSDEV dev )
27 {
28     EMRSAVEDC emr;
29     emr.emr.iType = EMR_SAVEDC;
30     emr.emr.nSize = sizeof(emr);
31     return EMFDRV_WriteRecord( dev, &emr.emr );
32 }
33
34 BOOL EMFDRV_RestoreDC( PHYSDEV dev, INT level )
35 {
36     EMRRESTOREDC emr;
37     emr.emr.iType = EMR_RESTOREDC;
38     emr.emr.nSize = sizeof(emr);
39     emr.iRelative = level;
40     return EMFDRV_WriteRecord( dev, &emr.emr );
41 }
42
43 UINT EMFDRV_SetTextAlign( PHYSDEV dev, UINT align )
44 {
45     EMRSETTEXTALIGN emr;
46     emr.emr.iType = EMR_SETTEXTALIGN;
47     emr.emr.nSize = sizeof(emr);
48     emr.iMode = align;
49     return EMFDRV_WriteRecord( dev, &emr.emr );
50 }
51
52 INT EMFDRV_SetBkMode( PHYSDEV dev, INT mode )
53 {
54     EMRSETBKMODE emr;
55     emr.emr.iType = EMR_SETBKMODE;
56     emr.emr.nSize = sizeof(emr);
57     emr.iMode = mode;
58     return EMFDRV_WriteRecord( dev, &emr.emr );
59 }
60
61 INT EMFDRV_SetROP2( PHYSDEV dev, INT rop )
62 {
63     EMRSETROP2 emr;
64     emr.emr.iType = EMR_SETROP2;
65     emr.emr.nSize = sizeof(emr);
66     emr.iMode = rop;
67     return EMFDRV_WriteRecord( dev, &emr.emr );
68 }
69
70 INT EMFDRV_SetPolyFillMode( PHYSDEV dev, INT mode )
71 {
72     EMRSETPOLYFILLMODE emr;
73     emr.emr.iType = EMR_SETPOLYFILLMODE;
74     emr.emr.nSize = sizeof(emr);
75     emr.iMode = mode;
76     return EMFDRV_WriteRecord( dev, &emr.emr );
77 }
78
79 INT EMFDRV_SetStretchBltMode( PHYSDEV dev, INT mode )
80 {
81     EMRSETSTRETCHBLTMODE emr;
82     emr.emr.iType = EMR_SETSTRETCHBLTMODE;
83     emr.emr.nSize = sizeof(emr);
84     emr.iMode = mode;
85     return EMFDRV_WriteRecord( dev, &emr.emr );
86 }
87
88 INT EMFDRV_SetMapMode( PHYSDEV dev, INT mode )
89 {
90     EMRSETMAPMODE emr;
91     emr.emr.iType = EMR_SETMAPMODE;
92     emr.emr.nSize = sizeof(emr);
93     emr.iMode = mode;
94     return EMFDRV_WriteRecord( dev, &emr.emr );
95 }
96
97 INT EMFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
98 {
99     EMREXCLUDECLIPRECT emr;
100     emr.emr.iType      = EMR_EXCLUDECLIPRECT;
101     emr.emr.nSize      = sizeof(emr);
102     emr.rclClip.left   = left;
103     emr.rclClip.top    = top;
104     emr.rclClip.right  = right;
105     emr.rclClip.bottom = bottom;
106     return EMFDRV_WriteRecord( dev, &emr.emr );
107 }
108
109 INT EMFDRV_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom)
110 {
111     EMRINTERSECTCLIPRECT emr;
112     emr.emr.iType      = EMR_INTERSECTCLIPRECT;
113     emr.emr.nSize      = sizeof(emr);
114     emr.rclClip.left   = left;
115     emr.rclClip.top    = top;
116     emr.rclClip.right  = right;
117     emr.rclClip.bottom = bottom;
118     return EMFDRV_WriteRecord( dev, &emr.emr );
119 }
120
121 INT EMFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y )
122 {
123     EMROFFSETCLIPRGN emr;
124     emr.emr.iType   = EMR_OFFSETCLIPRGN;
125     emr.emr.nSize   = sizeof(emr);
126     emr.ptlOffset.x = x;
127     emr.ptlOffset.y = y;
128     return EMFDRV_WriteRecord( dev, &emr.emr );
129 }
130
131 INT EMFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode )
132 {
133     EMREXTSELECTCLIPRGN *emr;
134     DWORD size, rgnsize;
135     BOOL ret;
136
137     if (!hrgn)
138     {
139         if (mode != RGN_COPY) return ERROR;
140         rgnsize = 0;
141     }
142     else rgnsize = GetRegionData( hrgn, 0, NULL );
143
144     size = rgnsize + offsetof(EMREXTSELECTCLIPRGN,RgnData);
145     emr = HeapAlloc( GetProcessHeap(), 0, size );
146     if (rgnsize) GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData );
147
148     emr->emr.iType = EMR_EXTSELECTCLIPRGN;
149     emr->emr.nSize = size;
150     emr->cbRgnData = rgnsize;
151     emr->iMode     = mode;
152
153     ret = EMFDRV_WriteRecord( dev, &emr->emr );
154     HeapFree( GetProcessHeap(), 0, emr );
155     return ret ? SIMPLEREGION : ERROR;
156 }
157
158 DWORD EMFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags )
159 {
160     EMRSETMAPPERFLAGS emr;
161
162     emr.emr.iType = EMR_SETMAPPERFLAGS;
163     emr.emr.nSize = sizeof(emr);
164     emr.dwFlags   = flags;
165
166     return EMFDRV_WriteRecord( dev, &emr.emr );
167 }
168
169 BOOL EMFDRV_AbortPath( PHYSDEV dev )
170 {
171     EMRABORTPATH emr;
172
173     emr.emr.iType = EMR_ABORTPATH;
174     emr.emr.nSize = sizeof(emr);
175
176     return EMFDRV_WriteRecord( dev, &emr.emr );
177 }
178
179 BOOL EMFDRV_BeginPath( PHYSDEV dev )
180 {
181     EMRBEGINPATH emr;
182
183     emr.emr.iType = EMR_BEGINPATH;
184     emr.emr.nSize = sizeof(emr);
185
186     return EMFDRV_WriteRecord( dev, &emr.emr );
187 }
188
189 BOOL EMFDRV_CloseFigure( PHYSDEV dev )
190 {
191     EMRCLOSEFIGURE emr;
192
193     emr.emr.iType = EMR_CLOSEFIGURE;
194     emr.emr.nSize = sizeof(emr);
195
196     return EMFDRV_WriteRecord( dev, &emr.emr );
197 }
198
199 BOOL EMFDRV_EndPath( PHYSDEV dev )
200 {
201     EMRENDPATH emr;
202
203     emr.emr.iType = EMR_ENDPATH;
204     emr.emr.nSize = sizeof(emr);
205
206     return EMFDRV_WriteRecord( dev, &emr.emr );
207 }
208
209 BOOL EMFDRV_FillPath( PHYSDEV dev )
210 {
211     EMRFILLPATH emr;
212
213     emr.emr.iType = EMR_FILLPATH;
214     emr.emr.nSize = sizeof(emr);
215     FIXME("Bounds\n");
216     emr.rclBounds.left = 0;
217     emr.rclBounds.top = 0;
218     emr.rclBounds.right = 0;
219     emr.rclBounds.bottom = 0;
220     return EMFDRV_WriteRecord( dev, &emr.emr );
221 }
222
223 BOOL EMFDRV_FlattenPath( PHYSDEV dev )
224 {
225     EMRFLATTENPATH emr;
226
227     emr.emr.iType = EMR_FLATTENPATH;
228     emr.emr.nSize = sizeof(emr);
229
230     return EMFDRV_WriteRecord( dev, &emr.emr );
231 }
232
233 BOOL EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode )
234 {
235     EMRSELECTCLIPPATH emr;
236
237     emr.emr.iType = EMR_SELECTCLIPPATH;
238     emr.emr.nSize = sizeof(emr);
239     emr.iMode = iMode;
240
241     return EMFDRV_WriteRecord( dev, &emr.emr );
242 }
243
244 BOOL EMFDRV_StrokeAndFillPath( PHYSDEV dev )
245 {
246     EMRSTROKEANDFILLPATH emr;
247
248     emr.emr.iType = EMR_STROKEANDFILLPATH;
249     emr.emr.nSize = sizeof(emr);
250     FIXME("Bounds\n");
251     emr.rclBounds.left = 0;
252     emr.rclBounds.top = 0;
253     emr.rclBounds.right = 0;
254     emr.rclBounds.bottom = 0;
255     return EMFDRV_WriteRecord( dev, &emr.emr );
256 }
257
258 BOOL EMFDRV_StrokePath( PHYSDEV dev )
259 {
260     EMRSTROKEPATH emr;
261
262     emr.emr.iType = EMR_STROKEPATH;
263     emr.emr.nSize = sizeof(emr);
264     FIXME("Bounds\n");
265     emr.rclBounds.left = 0;
266     emr.rclBounds.top = 0;
267     emr.rclBounds.right = 0;
268     emr.rclBounds.bottom = 0;
269     return EMFDRV_WriteRecord( dev, &emr.emr );
270 }
271
272 BOOL EMFDRV_WidenPath( PHYSDEV dev )
273 {
274     EMRWIDENPATH emr;
275
276     emr.emr.iType = EMR_WIDENPATH;
277     emr.emr.nSize = sizeof(emr);
278
279     return EMFDRV_WriteRecord( dev, &emr.emr );
280 }