ddraw/tests: New visual back buffer flipping tests.
[wine] / dlls / gdi32 / 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "enhmfdrv/enhmetafiledrv.h"
22 #include "wine/debug.h"
23
24 WINE_DEFAULT_DEBUG_CHANNEL(enhmetafile);
25
26 INT CDECL EMFDRV_SaveDC( PHYSDEV dev )
27 {
28     EMFDRV_PDEVICE* physDev = (EMFDRV_PDEVICE*)dev;
29     INT ret = save_dc_state( physDev->hdc );
30     EMRSAVEDC emr;
31
32     if (ret)
33     {
34         emr.emr.iType = EMR_SAVEDC;
35         emr.emr.nSize = sizeof(emr);
36         EMFDRV_WriteRecord( dev, &emr.emr );
37     }
38     return ret;
39 }
40
41 BOOL CDECL EMFDRV_RestoreDC( PHYSDEV dev, INT level )
42 {
43     EMFDRV_PDEVICE* physDev = (EMFDRV_PDEVICE*)dev;
44     DC *dc = get_dc_ptr( physDev->hdc );
45     EMRRESTOREDC emr;
46     BOOL ret;
47
48     emr.emr.iType = EMR_RESTOREDC;
49     emr.emr.nSize = sizeof(emr);
50
51     if (level < 0)
52         emr.iRelative = level;
53     else
54         emr.iRelative = level - dc->saveLevel - 1;
55     release_dc_ptr( dc );
56
57     physDev->restoring++;
58     ret = restore_dc_state( physDev->hdc, level );
59     physDev->restoring--;
60
61     if (ret) EMFDRV_WriteRecord( dev, &emr.emr );
62     return ret;
63 }
64
65 UINT CDECL EMFDRV_SetTextAlign( PHYSDEV dev, UINT align )
66 {
67     EMRSETTEXTALIGN emr;
68     emr.emr.iType = EMR_SETTEXTALIGN;
69     emr.emr.nSize = sizeof(emr);
70     emr.iMode = align;
71     return EMFDRV_WriteRecord( dev, &emr.emr );
72 }
73
74 BOOL CDECL EMFDRV_SetTextJustification(PHYSDEV dev, INT nBreakExtra, INT nBreakCount)
75 {
76     EMRSETTEXTJUSTIFICATION emr;
77     emr.emr.iType = EMR_SETTEXTJUSTIFICATION;
78     emr.emr.nSize = sizeof(emr);
79     emr.nBreakExtra = nBreakExtra;
80     emr.nBreakCount = nBreakCount;
81     return EMFDRV_WriteRecord(dev, &emr.emr);
82 }
83
84 INT CDECL EMFDRV_SetBkMode( PHYSDEV dev, INT mode )
85 {
86     EMRSETBKMODE emr;
87     emr.emr.iType = EMR_SETBKMODE;
88     emr.emr.nSize = sizeof(emr);
89     emr.iMode = mode;
90     return EMFDRV_WriteRecord( dev, &emr.emr );
91 }
92
93 INT CDECL EMFDRV_SetROP2( PHYSDEV dev, INT rop )
94 {
95     EMRSETROP2 emr;
96     emr.emr.iType = EMR_SETROP2;
97     emr.emr.nSize = sizeof(emr);
98     emr.iMode = rop;
99     return EMFDRV_WriteRecord( dev, &emr.emr );
100 }
101
102 INT CDECL EMFDRV_SetPolyFillMode( PHYSDEV dev, INT mode )
103 {
104     EMRSETPOLYFILLMODE emr;
105     emr.emr.iType = EMR_SETPOLYFILLMODE;
106     emr.emr.nSize = sizeof(emr);
107     emr.iMode = mode;
108     return EMFDRV_WriteRecord( dev, &emr.emr );
109 }
110
111 INT CDECL EMFDRV_SetStretchBltMode( PHYSDEV dev, INT mode )
112 {
113     EMRSETSTRETCHBLTMODE emr;
114     emr.emr.iType = EMR_SETSTRETCHBLTMODE;
115     emr.emr.nSize = sizeof(emr);
116     emr.iMode = mode;
117     return EMFDRV_WriteRecord( dev, &emr.emr );
118 }
119
120 INT CDECL EMFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
121 {
122     EMREXCLUDECLIPRECT emr;
123     emr.emr.iType      = EMR_EXCLUDECLIPRECT;
124     emr.emr.nSize      = sizeof(emr);
125     emr.rclClip.left   = left;
126     emr.rclClip.top    = top;
127     emr.rclClip.right  = right;
128     emr.rclClip.bottom = bottom;
129     return EMFDRV_WriteRecord( dev, &emr.emr );
130 }
131
132 INT CDECL EMFDRV_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom)
133 {
134     EMRINTERSECTCLIPRECT emr;
135     emr.emr.iType      = EMR_INTERSECTCLIPRECT;
136     emr.emr.nSize      = sizeof(emr);
137     emr.rclClip.left   = left;
138     emr.rclClip.top    = top;
139     emr.rclClip.right  = right;
140     emr.rclClip.bottom = bottom;
141     return EMFDRV_WriteRecord( dev, &emr.emr );
142 }
143
144 INT CDECL EMFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y )
145 {
146     EMROFFSETCLIPRGN emr;
147     emr.emr.iType   = EMR_OFFSETCLIPRGN;
148     emr.emr.nSize   = sizeof(emr);
149     emr.ptlOffset.x = x;
150     emr.ptlOffset.y = y;
151     return EMFDRV_WriteRecord( dev, &emr.emr );
152 }
153
154 INT CDECL EMFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode )
155 {
156     EMREXTSELECTCLIPRGN *emr;
157     DWORD size, rgnsize;
158     BOOL ret;
159
160     if (!hrgn)
161     {
162         if (mode != RGN_COPY) return ERROR;
163         rgnsize = 0;
164     }
165     else rgnsize = GetRegionData( hrgn, 0, NULL );
166
167     size = rgnsize + offsetof(EMREXTSELECTCLIPRGN,RgnData);
168     emr = HeapAlloc( GetProcessHeap(), 0, size );
169     if (rgnsize) GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData );
170
171     emr->emr.iType = EMR_EXTSELECTCLIPRGN;
172     emr->emr.nSize = size;
173     emr->cbRgnData = rgnsize;
174     emr->iMode     = mode;
175
176     ret = EMFDRV_WriteRecord( dev, &emr->emr );
177     HeapFree( GetProcessHeap(), 0, emr );
178     return ret ? SIMPLEREGION : ERROR;
179 }
180
181 DWORD CDECL EMFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags )
182 {
183     EMRSETMAPPERFLAGS emr;
184
185     emr.emr.iType = EMR_SETMAPPERFLAGS;
186     emr.emr.nSize = sizeof(emr);
187     emr.dwFlags   = flags;
188
189     return EMFDRV_WriteRecord( dev, &emr.emr );
190 }
191
192 BOOL CDECL EMFDRV_AbortPath( PHYSDEV dev )
193 {
194     EMRABORTPATH emr;
195
196     emr.emr.iType = EMR_ABORTPATH;
197     emr.emr.nSize = sizeof(emr);
198
199     return EMFDRV_WriteRecord( dev, &emr.emr );
200 }
201
202 BOOL CDECL EMFDRV_BeginPath( PHYSDEV dev )
203 {
204     EMRBEGINPATH emr;
205
206     emr.emr.iType = EMR_BEGINPATH;
207     emr.emr.nSize = sizeof(emr);
208
209     return EMFDRV_WriteRecord( dev, &emr.emr );
210 }
211
212 BOOL CDECL EMFDRV_CloseFigure( PHYSDEV dev )
213 {
214     EMRCLOSEFIGURE emr;
215
216     emr.emr.iType = EMR_CLOSEFIGURE;
217     emr.emr.nSize = sizeof(emr);
218
219     return EMFDRV_WriteRecord( dev, &emr.emr );
220 }
221
222 BOOL CDECL EMFDRV_EndPath( PHYSDEV dev )
223 {
224     EMRENDPATH emr;
225
226     emr.emr.iType = EMR_ENDPATH;
227     emr.emr.nSize = sizeof(emr);
228
229     return EMFDRV_WriteRecord( dev, &emr.emr );
230 }
231
232 BOOL CDECL EMFDRV_FillPath( PHYSDEV dev )
233 {
234     EMRFILLPATH emr;
235
236     emr.emr.iType = EMR_FILLPATH;
237     emr.emr.nSize = sizeof(emr);
238     FIXME("Bounds\n");
239     emr.rclBounds.left = 0;
240     emr.rclBounds.top = 0;
241     emr.rclBounds.right = 0;
242     emr.rclBounds.bottom = 0;
243     return EMFDRV_WriteRecord( dev, &emr.emr );
244 }
245
246 BOOL CDECL EMFDRV_FlattenPath( PHYSDEV dev )
247 {
248     EMRFLATTENPATH emr;
249
250     emr.emr.iType = EMR_FLATTENPATH;
251     emr.emr.nSize = sizeof(emr);
252
253     return EMFDRV_WriteRecord( dev, &emr.emr );
254 }
255
256 BOOL CDECL EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode )
257 {
258     EMRSELECTCLIPPATH emr;
259
260     emr.emr.iType = EMR_SELECTCLIPPATH;
261     emr.emr.nSize = sizeof(emr);
262     emr.iMode = iMode;
263
264     return EMFDRV_WriteRecord( dev, &emr.emr );
265 }
266
267 BOOL CDECL EMFDRV_StrokeAndFillPath( PHYSDEV dev )
268 {
269     EMRSTROKEANDFILLPATH emr;
270
271     emr.emr.iType = EMR_STROKEANDFILLPATH;
272     emr.emr.nSize = sizeof(emr);
273     FIXME("Bounds\n");
274     emr.rclBounds.left = 0;
275     emr.rclBounds.top = 0;
276     emr.rclBounds.right = 0;
277     emr.rclBounds.bottom = 0;
278     return EMFDRV_WriteRecord( dev, &emr.emr );
279 }
280
281 BOOL CDECL EMFDRV_StrokePath( PHYSDEV dev )
282 {
283     EMRSTROKEPATH emr;
284
285     emr.emr.iType = EMR_STROKEPATH;
286     emr.emr.nSize = sizeof(emr);
287     FIXME("Bounds\n");
288     emr.rclBounds.left = 0;
289     emr.rclBounds.top = 0;
290     emr.rclBounds.right = 0;
291     emr.rclBounds.bottom = 0;
292     return EMFDRV_WriteRecord( dev, &emr.emr );
293 }
294
295 BOOL CDECL EMFDRV_WidenPath( PHYSDEV dev )
296 {
297     EMRWIDENPATH emr;
298
299     emr.emr.iType = EMR_WIDENPATH;
300     emr.emr.nSize = sizeof(emr);
301
302     return EMFDRV_WriteRecord( dev, &emr.emr );
303 }
304
305 INT CDECL EMFDRV_GetDeviceCaps(PHYSDEV dev, INT cap)
306 {
307     EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev;
308
309     switch(cap) {
310
311     case HORZRES:
312         return physDev->horzres;
313     case VERTRES:
314         return physDev->vertres;
315     case LOGPIXELSX:
316         return physDev->logpixelsx;
317     case LOGPIXELSY:
318         return physDev->logpixelsy;
319     case HORZSIZE:
320         return physDev->horzsize;
321     case VERTSIZE:
322         return physDev->vertsize;
323     case BITSPIXEL:
324         return physDev->bitspixel;
325     case TEXTCAPS:
326         return physDev->textcaps;
327     case RASTERCAPS:
328         return physDev->rastercaps;
329     case TECHNOLOGY:
330         return physDev->technology;
331     case PLANES:
332         return physDev->planes;
333     case NUMCOLORS:
334         return physDev->numcolors;
335     default:
336         FIXME("Unimplemented cap %d\n", cap);
337         return 0;
338     }
339 }