wined3d: Remove COM from the shader implementation.
[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     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 CDECL 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( physDev->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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL 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 CDECL EMFDRV_OffsetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
357 {
358     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pOffsetViewportOrgEx );
359     EMRSETVIEWPORTORGEX emr;
360     EMFDRV_PDEVICE* physDev = (EMFDRV_PDEVICE*)dev;
361     POINT prev;
362
363     GetViewportOrgEx(physDev->hdc, &prev);
364
365     emr.emr.iType = EMR_SETVIEWPORTORGEX;
366     emr.emr.nSize = sizeof(emr);
367     emr.ptlOrigin.x = prev.x + x;
368     emr.ptlOrigin.y = prev.y + y;
369
370     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
371     return next->funcs->pOffsetViewportOrgEx( next, x, y, pt );
372 }
373
374 BOOL CDECL EMFDRV_OffsetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
375 {
376     PHYSDEV next = GET_NEXT_PHYSDEV( dev, pOffsetWindowOrgEx );
377     EMRSETWINDOWORGEX emr;
378     EMFDRV_PDEVICE* physDev = (EMFDRV_PDEVICE*)dev;
379     POINT prev;
380
381     GetWindowOrgEx(physDev->hdc, &prev);
382
383     emr.emr.iType = EMR_SETWINDOWORGEX;
384     emr.emr.nSize = sizeof(emr);
385     emr.ptlOrigin.x = prev.x + x;
386     emr.ptlOrigin.y = prev.y + y;
387
388     if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
389     return next->funcs->pOffsetWindowOrgEx( next, x, y, pt );
390 }
391
392 DWORD CDECL EMFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags )
393 {
394     EMRSETMAPPERFLAGS emr;
395
396     emr.emr.iType = EMR_SETMAPPERFLAGS;
397     emr.emr.nSize = sizeof(emr);
398     emr.dwFlags   = flags;
399
400     return EMFDRV_WriteRecord( dev, &emr.emr ) ? flags : GDI_ERROR;
401 }
402
403 BOOL CDECL EMFDRV_AbortPath( PHYSDEV dev )
404 {
405     EMRABORTPATH emr;
406
407     emr.emr.iType = EMR_ABORTPATH;
408     emr.emr.nSize = sizeof(emr);
409
410     return EMFDRV_WriteRecord( dev, &emr.emr );
411 }
412
413 BOOL CDECL EMFDRV_BeginPath( PHYSDEV dev )
414 {
415     EMRBEGINPATH emr;
416
417     emr.emr.iType = EMR_BEGINPATH;
418     emr.emr.nSize = sizeof(emr);
419
420     return EMFDRV_WriteRecord( dev, &emr.emr );
421 }
422
423 BOOL CDECL EMFDRV_CloseFigure( PHYSDEV dev )
424 {
425     EMRCLOSEFIGURE emr;
426
427     emr.emr.iType = EMR_CLOSEFIGURE;
428     emr.emr.nSize = sizeof(emr);
429
430     return EMFDRV_WriteRecord( dev, &emr.emr );
431 }
432
433 BOOL CDECL EMFDRV_EndPath( PHYSDEV dev )
434 {
435     EMRENDPATH emr;
436
437     emr.emr.iType = EMR_ENDPATH;
438     emr.emr.nSize = sizeof(emr);
439
440     return EMFDRV_WriteRecord( dev, &emr.emr );
441 }
442
443 BOOL CDECL EMFDRV_FillPath( PHYSDEV dev )
444 {
445     EMRFILLPATH emr;
446
447     emr.emr.iType = EMR_FILLPATH;
448     emr.emr.nSize = sizeof(emr);
449     FIXME("Bounds\n");
450     emr.rclBounds.left = 0;
451     emr.rclBounds.top = 0;
452     emr.rclBounds.right = 0;
453     emr.rclBounds.bottom = 0;
454     return EMFDRV_WriteRecord( dev, &emr.emr );
455 }
456
457 BOOL CDECL EMFDRV_FlattenPath( PHYSDEV dev )
458 {
459     EMRFLATTENPATH emr;
460
461     emr.emr.iType = EMR_FLATTENPATH;
462     emr.emr.nSize = sizeof(emr);
463
464     return EMFDRV_WriteRecord( dev, &emr.emr );
465 }
466
467 BOOL CDECL EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode )
468 {
469     EMRSELECTCLIPPATH emr;
470
471     emr.emr.iType = EMR_SELECTCLIPPATH;
472     emr.emr.nSize = sizeof(emr);
473     emr.iMode = iMode;
474
475     return EMFDRV_WriteRecord( dev, &emr.emr );
476 }
477
478 BOOL CDECL EMFDRV_StrokeAndFillPath( PHYSDEV dev )
479 {
480     EMRSTROKEANDFILLPATH emr;
481
482     emr.emr.iType = EMR_STROKEANDFILLPATH;
483     emr.emr.nSize = sizeof(emr);
484     FIXME("Bounds\n");
485     emr.rclBounds.left = 0;
486     emr.rclBounds.top = 0;
487     emr.rclBounds.right = 0;
488     emr.rclBounds.bottom = 0;
489     return EMFDRV_WriteRecord( dev, &emr.emr );
490 }
491
492 BOOL CDECL EMFDRV_StrokePath( PHYSDEV dev )
493 {
494     EMRSTROKEPATH emr;
495
496     emr.emr.iType = EMR_STROKEPATH;
497     emr.emr.nSize = sizeof(emr);
498     FIXME("Bounds\n");
499     emr.rclBounds.left = 0;
500     emr.rclBounds.top = 0;
501     emr.rclBounds.right = 0;
502     emr.rclBounds.bottom = 0;
503     return EMFDRV_WriteRecord( dev, &emr.emr );
504 }
505
506 BOOL CDECL EMFDRV_WidenPath( PHYSDEV dev )
507 {
508     EMRWIDENPATH emr;
509
510     emr.emr.iType = EMR_WIDENPATH;
511     emr.emr.nSize = sizeof(emr);
512
513     return EMFDRV_WriteRecord( dev, &emr.emr );
514 }
515
516 INT CDECL EMFDRV_GetDeviceCaps(PHYSDEV dev, INT cap)
517 {
518     EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev;
519
520     switch(cap) {
521
522     case HORZRES:
523         return physDev->horzres;
524     case VERTRES:
525         return physDev->vertres;
526     case LOGPIXELSX:
527         return physDev->logpixelsx;
528     case LOGPIXELSY:
529         return physDev->logpixelsy;
530     case HORZSIZE:
531         return physDev->horzsize;
532     case VERTSIZE:
533         return physDev->vertsize;
534     case BITSPIXEL:
535         return physDev->bitspixel;
536     case TEXTCAPS:
537         return physDev->textcaps;
538     case RASTERCAPS:
539         return physDev->rastercaps;
540     case TECHNOLOGY:
541         return physDev->technology;
542     case PLANES:
543         return physDev->planes;
544     case NUMCOLORS:
545         return physDev->numcolors;
546     default:
547         FIXME("Unimplemented cap %d\n", cap);
548         return 0;
549     }
550 }