Better implementation of GetCalendarInfo{A,W}, not perfect.
[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     rgnsize = GetRegionData( hrgn, 0, NULL );
138     size = rgnsize + sizeof(*emr) - 1;
139     emr = HeapAlloc( GetProcessHeap(), 0, size );
140
141     GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData );
142
143     emr->emr.iType = EMR_EXTSELECTCLIPRGN;
144     emr->emr.nSize = size;
145     emr->cbRgnData = rgnsize;
146     emr->iMode     = mode;
147
148     ret = EMFDRV_WriteRecord( dev, &emr->emr );
149     HeapFree( GetProcessHeap(), 0, emr );
150     return ret ? SIMPLEREGION : ERROR;
151 }
152
153 DWORD EMFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags )
154 {
155     EMRSETMAPPERFLAGS emr;
156
157     emr.emr.iType = EMR_SETMAPPERFLAGS;
158     emr.emr.nSize = sizeof(emr);
159     emr.dwFlags   = flags;
160
161     return EMFDRV_WriteRecord( dev, &emr.emr );
162 }
163
164 BOOL EMFDRV_AbortPath( PHYSDEV dev )
165 {
166     EMRABORTPATH emr;
167
168     emr.emr.iType = EMR_ABORTPATH;
169     emr.emr.nSize = sizeof(emr);
170
171     return EMFDRV_WriteRecord( dev, &emr.emr );
172 }
173
174 BOOL EMFDRV_BeginPath( PHYSDEV dev )
175 {
176     EMRBEGINPATH emr;
177
178     emr.emr.iType = EMR_BEGINPATH;
179     emr.emr.nSize = sizeof(emr);
180
181     return EMFDRV_WriteRecord( dev, &emr.emr );
182 }
183
184 BOOL EMFDRV_CloseFigure( PHYSDEV dev )
185 {
186     EMRCLOSEFIGURE emr;
187
188     emr.emr.iType = EMR_CLOSEFIGURE;
189     emr.emr.nSize = sizeof(emr);
190
191     return EMFDRV_WriteRecord( dev, &emr.emr );
192 }
193
194 BOOL EMFDRV_EndPath( PHYSDEV dev )
195 {
196     EMRENDPATH emr;
197
198     emr.emr.iType = EMR_ENDPATH;
199     emr.emr.nSize = sizeof(emr);
200
201     return EMFDRV_WriteRecord( dev, &emr.emr );
202 }
203
204 BOOL EMFDRV_FillPath( PHYSDEV dev )
205 {
206     EMRFILLPATH emr;
207
208     emr.emr.iType = EMR_FILLPATH;
209     emr.emr.nSize = sizeof(emr);
210     FIXME("Bounds\n");
211     emr.rclBounds.left = 0;
212     emr.rclBounds.top = 0;
213     emr.rclBounds.right = 0;
214     emr.rclBounds.bottom = 0;
215     return EMFDRV_WriteRecord( dev, &emr.emr );
216 }
217
218 BOOL EMFDRV_FlattenPath( PHYSDEV dev )
219 {
220     EMRFLATTENPATH emr;
221
222     emr.emr.iType = EMR_FLATTENPATH;
223     emr.emr.nSize = sizeof(emr);
224
225     return EMFDRV_WriteRecord( dev, &emr.emr );
226 }
227
228 BOOL EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode )
229 {
230     EMRSELECTCLIPPATH emr;
231
232     emr.emr.iType = EMR_SELECTCLIPPATH;
233     emr.emr.nSize = sizeof(emr);
234     emr.iMode = iMode;
235
236     return EMFDRV_WriteRecord( dev, &emr.emr );
237 }
238
239 BOOL EMFDRV_StrokeAndFillPath( PHYSDEV dev )
240 {
241     EMRSTROKEANDFILLPATH emr;
242
243     emr.emr.iType = EMR_STROKEANDFILLPATH;
244     emr.emr.nSize = sizeof(emr);
245     FIXME("Bounds\n");
246     emr.rclBounds.left = 0;
247     emr.rclBounds.top = 0;
248     emr.rclBounds.right = 0;
249     emr.rclBounds.bottom = 0;
250     return EMFDRV_WriteRecord( dev, &emr.emr );
251 }
252
253 BOOL EMFDRV_StrokePath( PHYSDEV dev )
254 {
255     EMRSTROKEPATH emr;
256
257     emr.emr.iType = EMR_STROKEPATH;
258     emr.emr.nSize = sizeof(emr);
259     FIXME("Bounds\n");
260     emr.rclBounds.left = 0;
261     emr.rclBounds.top = 0;
262     emr.rclBounds.right = 0;
263     emr.rclBounds.bottom = 0;
264     return EMFDRV_WriteRecord( dev, &emr.emr );
265 }
266
267 BOOL EMFDRV_WidenPath( PHYSDEV dev )
268 {
269     EMRWIDENPATH emr;
270
271     emr.emr.iType = EMR_WIDENPATH;
272     emr.emr.nSize = sizeof(emr);
273
274     return EMFDRV_WriteRecord( dev, &emr.emr );
275 }