include: Assorted spelling fixes.
[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 EMFDRV_SaveDC( PHYSDEV dev )
27 {
28     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSaveDC );
29     INT ret = next->funcs->pSaveDC( next );
30
31     if (ret)
32     {
33         EMRSAVEDC emr;
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 EMFDRV_RestoreDC( PHYSDEV dev, INT level )
42 {
43     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pRestoreDC );
44     EMFDRV_PDEVICE* physDev = (EMFDRV_PDEVICE*)dev;
45     DC *dc = get_dc_ptr( dev->hdc );
46     EMRRESTOREDC emr;
47     BOOL ret;
48
49     emr.emr.iType = EMR_RESTOREDC;
50     emr.emr.nSize = sizeof(emr);
51
52     if (level < 0)
53         emr.iRelative = level;
54     else
55         emr.iRelative = level - dc->saveLevel - 1;
56     release_dc_ptr( dc );
57
58     physDev->restoring++;
59     ret = next->funcs->pRestoreDC( next, level );
60     physDev->restoring--;
61
62     if (ret) EMFDRV_WriteRecord( dev, &emr.emr );
63     return ret;
64 }
65
66 UINT EMFDRV_SetTextAlign( PHYSDEV dev, UINT align )
67 {
68     EMRSETTEXTALIGN emr;
69     emr.emr.iType = EMR_SETTEXTALIGN;
70     emr.emr.nSize = sizeof(emr);
71     emr.iMode = align;
72     return EMFDRV_WriteRecord( dev, &emr.emr ) ? align : GDI_ERROR;
73 }
74
75 BOOL EMFDRV_SetTextJustification(PHYSDEV dev, INT nBreakExtra, INT nBreakCount)
76 {
77     EMRSETTEXTJUSTIFICATION emr;
78     emr.emr.iType = EMR_SETTEXTJUSTIFICATION;
79     emr.emr.nSize = sizeof(emr);
80     emr.nBreakExtra = nBreakExtra;
81     emr.nBreakCount = nBreakCount;
82     return EMFDRV_WriteRecord(dev, &emr.emr);
83 }
84
85 INT EMFDRV_SetBkMode( PHYSDEV dev, INT mode )
86 {
87     EMRSETBKMODE emr;
88     emr.emr.iType = EMR_SETBKMODE;
89     emr.emr.nSize = sizeof(emr);
90     emr.iMode = mode;
91     return EMFDRV_WriteRecord( dev, &emr.emr ) ? mode : 0;
92 }
93
94 COLORREF EMFDRV_SetBkColor( PHYSDEV dev, COLORREF color )
95 {
96     EMRSETBKCOLOR emr;
97     EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE *)dev;
98
99     if (physDev->restoring) return color;  /* don't output records during RestoreDC */
100
101     emr.emr.iType = EMR_SETBKCOLOR;
102     emr.emr.nSize = sizeof(emr);
103     emr.crColor = color;
104     return EMFDRV_WriteRecord( dev, &emr.emr ) ? color : CLR_INVALID;
105 }
106
107
108 COLORREF EMFDRV_SetTextColor( PHYSDEV dev, COLORREF color )
109 {
110     EMRSETTEXTCOLOR emr;
111     EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE *)dev;
112
113     if (physDev->restoring) return color;  /* don't output records during RestoreDC */
114
115     emr.emr.iType = EMR_SETTEXTCOLOR;
116     emr.emr.nSize = sizeof(emr);
117     emr.crColor = color;
118     return EMFDRV_WriteRecord( dev, &emr.emr ) ? color : CLR_INVALID;
119 }
120
121 INT EMFDRV_SetROP2( PHYSDEV dev, INT rop )
122 {
123     EMRSETROP2 emr;
124     emr.emr.iType = EMR_SETROP2;
125     emr.emr.nSize = sizeof(emr);
126     emr.iMode = rop;
127     return EMFDRV_WriteRecord( dev, &emr.emr ) ? rop : 0;
128 }
129
130 INT EMFDRV_SetPolyFillMode( PHYSDEV dev, INT mode )
131 {
132     EMRSETPOLYFILLMODE emr;
133     emr.emr.iType = EMR_SETPOLYFILLMODE;
134     emr.emr.nSize = sizeof(emr);
135     emr.iMode = mode;
136     return EMFDRV_WriteRecord( dev, &emr.emr ) ? mode : 0;
137 }
138
139 INT EMFDRV_SetStretchBltMode( PHYSDEV dev, INT mode )
140 {
141     EMRSETSTRETCHBLTMODE emr;
142     emr.emr.iType = EMR_SETSTRETCHBLTMODE;
143     emr.emr.nSize = sizeof(emr);
144     emr.iMode = mode;
145     return EMFDRV_WriteRecord( dev, &emr.emr ) ? mode : 0;
146 }
147
148 INT EMFDRV_SetArcDirection(PHYSDEV dev, INT arcDirection)
149 {
150     EMRSETARCDIRECTION emr;
151
152     emr.emr.iType = EMR_SETARCDIRECTION;
153     emr.emr.nSize = sizeof(emr);
154     emr.iArcDirection = arcDirection;
155     return EMFDRV_WriteRecord(dev, &emr.emr) ? arcDirection : 0;
156 }
157
158 INT EMFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
159 {
160     EMREXCLUDECLIPRECT emr;
161     emr.emr.iType      = EMR_EXCLUDECLIPRECT;
162     emr.emr.nSize      = sizeof(emr);
163     emr.rclClip.left   = left;
164     emr.rclClip.top    = top;
165     emr.rclClip.right  = right;
166     emr.rclClip.bottom = bottom;
167     return EMFDRV_WriteRecord( dev, &emr.emr );
168 }
169
170 INT EMFDRV_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom)
171 {
172     EMRINTERSECTCLIPRECT emr;
173     emr.emr.iType      = EMR_INTERSECTCLIPRECT;
174     emr.emr.nSize      = sizeof(emr);
175     emr.rclClip.left   = left;
176     emr.rclClip.top    = top;
177     emr.rclClip.right  = right;
178     emr.rclClip.bottom = bottom;
179     return EMFDRV_WriteRecord( dev, &emr.emr );
180 }
181
182 INT EMFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y )
183 {
184     EMROFFSETCLIPRGN emr;
185     emr.emr.iType   = EMR_OFFSETCLIPRGN;
186     emr.emr.nSize   = sizeof(emr);
187     emr.ptlOffset.x = x;
188     emr.ptlOffset.y = y;
189     return EMFDRV_WriteRecord( dev, &emr.emr );
190 }
191
192 INT EMFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode )
193 {
194     EMREXTSELECTCLIPRGN *emr;
195     DWORD size, rgnsize;
196     BOOL ret;
197
198     if (!hrgn)
199     {
200         if (mode != RGN_COPY) return ERROR;
201         rgnsize = 0;
202     }
203     else rgnsize = GetRegionData( hrgn, 0, NULL );
204
205     size = rgnsize + offsetof(EMREXTSELECTCLIPRGN,RgnData);
206     emr = HeapAlloc( GetProcessHeap(), 0, size );
207     if (rgnsize) GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData );
208
209     emr->emr.iType = EMR_EXTSELECTCLIPRGN;
210     emr->emr.nSize = size;
211     emr->cbRgnData = rgnsize;
212     emr->iMode     = mode;
213
214     ret = EMFDRV_WriteRecord( dev, &emr->emr );
215     HeapFree( GetProcessHeap(), 0, emr );
216     return ret ? SIMPLEREGION : ERROR;
217 }
218
219 INT EMFDRV_SetMapMode( PHYSDEV dev, INT mode )
220 {
221     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetMapMode );
222     EMRSETMAPMODE emr;
223     emr.emr.iType = EMR_SETMAPMODE;
224     emr.emr.nSize = sizeof(emr);
225     emr.iMode = mode;
226
227     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
228     return next->funcs->pSetMapMode( next, mode );
229 }
230
231 BOOL EMFDRV_SetViewportExtEx( PHYSDEV dev, INT cx, INT cy, SIZE *size )
232 {
233     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetViewportExtEx );
234     EMRSETVIEWPORTEXTEX emr;
235
236     emr.emr.iType = EMR_SETVIEWPORTEXTEX;
237     emr.emr.nSize = sizeof(emr);
238     emr.szlExtent.cx = cx;
239     emr.szlExtent.cy = cy;
240
241     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
242     return next->funcs->pSetViewportExtEx( next, cx, cy, size );
243 }
244
245 BOOL EMFDRV_SetWindowExtEx( PHYSDEV dev, INT cx, INT cy, SIZE *size )
246 {
247     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetWindowExtEx );
248     EMRSETWINDOWEXTEX emr;
249
250     emr.emr.iType = EMR_SETWINDOWEXTEX;
251     emr.emr.nSize = sizeof(emr);
252     emr.szlExtent.cx = cx;
253     emr.szlExtent.cy = cy;
254
255     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
256     return next->funcs->pSetWindowExtEx( next, cx, cy, size );
257 }
258
259 BOOL EMFDRV_SetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
260 {
261     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetViewportOrgEx );
262     EMRSETVIEWPORTORGEX emr;
263
264     emr.emr.iType = EMR_SETVIEWPORTORGEX;
265     emr.emr.nSize = sizeof(emr);
266     emr.ptlOrigin.x = x;
267     emr.ptlOrigin.y = y;
268
269     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
270     return next->funcs->pSetViewportOrgEx( next, x, y, pt );
271 }
272
273 BOOL EMFDRV_SetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
274 {
275     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetWindowOrgEx );
276     EMRSETWINDOWORGEX emr;
277
278     emr.emr.iType = EMR_SETWINDOWORGEX;
279     emr.emr.nSize = sizeof(emr);
280     emr.ptlOrigin.x = x;
281     emr.ptlOrigin.y = y;
282
283     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
284     return next->funcs->pSetWindowOrgEx( next, x, y, pt );
285 }
286
287 BOOL EMFDRV_ScaleViewportExtEx( PHYSDEV dev, INT xNum, INT xDenom, INT yNum, INT yDenom, SIZE *size )
288 {
289     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pScaleViewportExtEx );
290     EMRSCALEVIEWPORTEXTEX emr;
291
292     emr.emr.iType = EMR_SCALEVIEWPORTEXTEX;
293     emr.emr.nSize = sizeof(emr);
294     emr.xNum      = xNum;
295     emr.xDenom    = xDenom;
296     emr.yNum      = yNum;
297     emr.yDenom    = yDenom;
298
299     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
300     return next->funcs->pScaleViewportExtEx( next, xNum, xDenom, yNum, yDenom, size );
301 }
302
303 BOOL EMFDRV_ScaleWindowExtEx( PHYSDEV dev, INT xNum, INT xDenom, INT yNum, INT yDenom, SIZE *size )
304 {
305     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pScaleWindowExtEx );
306     EMRSCALEWINDOWEXTEX emr;
307
308     emr.emr.iType = EMR_SCALEWINDOWEXTEX;
309     emr.emr.nSize = sizeof(emr);
310     emr.xNum      = xNum;
311     emr.xDenom    = xDenom;
312     emr.yNum      = yNum;
313     emr.yDenom    = yDenom;
314
315     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
316     return next->funcs->pScaleWindowExtEx( next, xNum, xDenom, yNum, yDenom, size );
317 }
318
319 DWORD EMFDRV_SetLayout( PHYSDEV dev, DWORD layout )
320 {
321     EMRSETLAYOUT emr;
322
323     emr.emr.iType = EMR_SETLAYOUT;
324     emr.emr.nSize = sizeof(emr);
325     emr.iMode = layout;
326     return EMFDRV_WriteRecord( dev, &emr.emr ) ? layout : GDI_ERROR;
327 }
328
329 BOOL EMFDRV_SetWorldTransform( PHYSDEV dev, const XFORM *xform)
330 {
331     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetWorldTransform );
332     EMRSETWORLDTRANSFORM emr;
333
334     emr.emr.iType = EMR_SETWORLDTRANSFORM;
335     emr.emr.nSize = sizeof(emr);
336     emr.xform = *xform;
337
338     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
339     return next->funcs->pSetWorldTransform( next, xform );
340 }
341
342 BOOL EMFDRV_ModifyWorldTransform( PHYSDEV dev, const XFORM *xform, DWORD mode)
343 {
344     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pModifyWorldTransform );
345     EMRMODIFYWORLDTRANSFORM emr;
346
347     emr.emr.iType = EMR_MODIFYWORLDTRANSFORM;
348     emr.emr.nSize = sizeof(emr);
349     emr.xform = *xform;
350     emr.iMode = mode;
351
352     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
353     return next->funcs->pModifyWorldTransform( next, xform, mode );
354 }
355
356 BOOL EMFDRV_OffsetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
357 {
358     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pOffsetViewportOrgEx );
359     EMRSETVIEWPORTORGEX emr;
360     POINT prev;
361
362     GetViewportOrgEx( dev->hdc, &prev );
363
364     emr.emr.iType = EMR_SETVIEWPORTORGEX;
365     emr.emr.nSize = sizeof(emr);
366     emr.ptlOrigin.x = prev.x + x;
367     emr.ptlOrigin.y = prev.y + y;
368
369     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
370     return next->funcs->pOffsetViewportOrgEx( next, x, y, pt );
371 }
372
373 BOOL EMFDRV_OffsetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
374 {
375     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pOffsetWindowOrgEx );
376     EMRSETWINDOWORGEX emr;
377     POINT prev;
378
379     GetWindowOrgEx( dev->hdc, &prev );
380
381     emr.emr.iType = EMR_SETWINDOWORGEX;
382     emr.emr.nSize = sizeof(emr);
383     emr.ptlOrigin.x = prev.x + x;
384     emr.ptlOrigin.y = prev.y + y;
385
386     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
387     return next->funcs->pOffsetWindowOrgEx( next, x, y, pt );
388 }
389
390 DWORD EMFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags )
391 {
392     EMRSETMAPPERFLAGS emr;
393
394     emr.emr.iType = EMR_SETMAPPERFLAGS;
395     emr.emr.nSize = sizeof(emr);
396     emr.dwFlags   = flags;
397
398     return EMFDRV_WriteRecord( dev, &emr.emr ) ? flags : GDI_ERROR;
399 }
400
401 BOOL EMFDRV_AbortPath( PHYSDEV dev )
402 {
403     EMRABORTPATH emr;
404
405     emr.emr.iType = EMR_ABORTPATH;
406     emr.emr.nSize = sizeof(emr);
407
408     return EMFDRV_WriteRecord( dev, &emr.emr );
409 }
410
411 BOOL EMFDRV_BeginPath( PHYSDEV dev )
412 {
413     EMRBEGINPATH emr;
414
415     emr.emr.iType = EMR_BEGINPATH;
416     emr.emr.nSize = sizeof(emr);
417
418     return EMFDRV_WriteRecord( dev, &emr.emr );
419 }
420
421 BOOL EMFDRV_CloseFigure( PHYSDEV dev )
422 {
423     EMRCLOSEFIGURE emr;
424
425     emr.emr.iType = EMR_CLOSEFIGURE;
426     emr.emr.nSize = sizeof(emr);
427
428     return EMFDRV_WriteRecord( dev, &emr.emr );
429 }
430
431 BOOL EMFDRV_EndPath( PHYSDEV dev )
432 {
433     EMRENDPATH emr;
434
435     emr.emr.iType = EMR_ENDPATH;
436     emr.emr.nSize = sizeof(emr);
437
438     return EMFDRV_WriteRecord( dev, &emr.emr );
439 }
440
441 BOOL EMFDRV_FillPath( PHYSDEV dev )
442 {
443     EMRFILLPATH emr;
444
445     emr.emr.iType = EMR_FILLPATH;
446     emr.emr.nSize = sizeof(emr);
447     FIXME("Bounds\n");
448     emr.rclBounds.left = 0;
449     emr.rclBounds.top = 0;
450     emr.rclBounds.right = 0;
451     emr.rclBounds.bottom = 0;
452     return EMFDRV_WriteRecord( dev, &emr.emr );
453 }
454
455 BOOL EMFDRV_FlattenPath( PHYSDEV dev )
456 {
457     EMRFLATTENPATH emr;
458
459     emr.emr.iType = EMR_FLATTENPATH;
460     emr.emr.nSize = sizeof(emr);
461
462     return EMFDRV_WriteRecord( dev, &emr.emr );
463 }
464
465 BOOL EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode )
466 {
467     EMRSELECTCLIPPATH emr;
468
469     emr.emr.iType = EMR_SELECTCLIPPATH;
470     emr.emr.nSize = sizeof(emr);
471     emr.iMode = iMode;
472
473     return EMFDRV_WriteRecord( dev, &emr.emr );
474 }
475
476 BOOL EMFDRV_StrokeAndFillPath( PHYSDEV dev )
477 {
478     EMRSTROKEANDFILLPATH emr;
479
480     emr.emr.iType = EMR_STROKEANDFILLPATH;
481     emr.emr.nSize = sizeof(emr);
482     FIXME("Bounds\n");
483     emr.rclBounds.left = 0;
484     emr.rclBounds.top = 0;
485     emr.rclBounds.right = 0;
486     emr.rclBounds.bottom = 0;
487     return EMFDRV_WriteRecord( dev, &emr.emr );
488 }
489
490 BOOL EMFDRV_StrokePath( PHYSDEV dev )
491 {
492     EMRSTROKEPATH emr;
493
494     emr.emr.iType = EMR_STROKEPATH;
495     emr.emr.nSize = sizeof(emr);
496     FIXME("Bounds\n");
497     emr.rclBounds.left = 0;
498     emr.rclBounds.top = 0;
499     emr.rclBounds.right = 0;
500     emr.rclBounds.bottom = 0;
501     return EMFDRV_WriteRecord( dev, &emr.emr );
502 }
503
504 BOOL EMFDRV_WidenPath( PHYSDEV dev )
505 {
506     EMRWIDENPATH emr;
507
508     emr.emr.iType = EMR_WIDENPATH;
509     emr.emr.nSize = sizeof(emr);
510
511     return EMFDRV_WriteRecord( dev, &emr.emr );
512 }
513
514 INT EMFDRV_GetDeviceCaps(PHYSDEV dev, INT cap)
515 {
516     EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev;
517
518     return GetDeviceCaps( physDev->ref_dc, cap );
519 }