2 * Enhanced MetaFile driver dc value functions
4 * Copyright 1999 Huw D M Davies
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.
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.
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
21 #include "enhmfdrv/enhmetafiledrv.h"
22 #include "wine/debug.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(enhmetafile);
26 INT CDECL EMFDRV_SaveDC( PHYSDEV dev )
28 EMFDRV_PDEVICE* physDev = (EMFDRV_PDEVICE*)dev;
29 INT ret = save_dc_state( physDev->hdc );
34 emr.emr.iType = EMR_SAVEDC;
35 emr.emr.nSize = sizeof(emr);
36 EMFDRV_WriteRecord( dev, &emr.emr );
41 BOOL CDECL EMFDRV_RestoreDC( PHYSDEV dev, INT level )
43 EMFDRV_PDEVICE* physDev = (EMFDRV_PDEVICE*)dev;
44 DC *dc = get_dc_ptr( physDev->hdc );
48 emr.emr.iType = EMR_RESTOREDC;
49 emr.emr.nSize = sizeof(emr);
52 emr.iRelative = level;
54 emr.iRelative = level - dc->saveLevel - 1;
58 ret = restore_dc_state( physDev->hdc, level );
61 if (ret) EMFDRV_WriteRecord( dev, &emr.emr );
65 UINT CDECL EMFDRV_SetTextAlign( PHYSDEV dev, UINT align )
68 emr.emr.iType = EMR_SETTEXTALIGN;
69 emr.emr.nSize = sizeof(emr);
71 return EMFDRV_WriteRecord( dev, &emr.emr ) ? align : GDI_ERROR;
74 BOOL CDECL EMFDRV_SetTextJustification(PHYSDEV dev, INT nBreakExtra, INT nBreakCount)
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);
84 INT CDECL EMFDRV_SetBkMode( PHYSDEV dev, INT mode )
87 emr.emr.iType = EMR_SETBKMODE;
88 emr.emr.nSize = sizeof(emr);
90 return EMFDRV_WriteRecord( dev, &emr.emr ) ? mode : 0;
93 COLORREF CDECL EMFDRV_SetBkColor( PHYSDEV dev, COLORREF color )
96 EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE *)dev;
98 if (physDev->restoring) return color; /* don't output records during RestoreDC */
100 emr.emr.iType = EMR_SETBKCOLOR;
101 emr.emr.nSize = sizeof(emr);
103 return EMFDRV_WriteRecord( dev, &emr.emr ) ? color : CLR_INVALID;
107 COLORREF CDECL EMFDRV_SetTextColor( PHYSDEV dev, COLORREF color )
110 EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE *)dev;
112 if (physDev->restoring) return color; /* don't output records during RestoreDC */
114 emr.emr.iType = EMR_SETTEXTCOLOR;
115 emr.emr.nSize = sizeof(emr);
117 return EMFDRV_WriteRecord( dev, &emr.emr ) ? color : CLR_INVALID;
120 INT CDECL EMFDRV_SetROP2( PHYSDEV dev, INT rop )
123 emr.emr.iType = EMR_SETROP2;
124 emr.emr.nSize = sizeof(emr);
126 return EMFDRV_WriteRecord( dev, &emr.emr ) ? rop : 0;
129 INT CDECL EMFDRV_SetPolyFillMode( PHYSDEV dev, INT mode )
131 EMRSETPOLYFILLMODE emr;
132 emr.emr.iType = EMR_SETPOLYFILLMODE;
133 emr.emr.nSize = sizeof(emr);
135 return EMFDRV_WriteRecord( dev, &emr.emr ) ? mode : 0;
138 INT CDECL EMFDRV_SetStretchBltMode( PHYSDEV dev, INT mode )
140 EMRSETSTRETCHBLTMODE emr;
141 emr.emr.iType = EMR_SETSTRETCHBLTMODE;
142 emr.emr.nSize = sizeof(emr);
144 return EMFDRV_WriteRecord( dev, &emr.emr ) ? mode : 0;
147 INT CDECL EMFDRV_SetArcDirection(PHYSDEV dev, INT arcDirection)
149 EMRSETARCDIRECTION emr;
151 emr.emr.iType = EMR_SETARCDIRECTION;
152 emr.emr.nSize = sizeof(emr);
153 emr.iArcDirection = arcDirection;
154 return EMFDRV_WriteRecord(dev, &emr.emr) ? arcDirection : 0;
157 INT CDECL EMFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
159 EMREXCLUDECLIPRECT emr;
160 emr.emr.iType = EMR_EXCLUDECLIPRECT;
161 emr.emr.nSize = sizeof(emr);
162 emr.rclClip.left = left;
163 emr.rclClip.top = top;
164 emr.rclClip.right = right;
165 emr.rclClip.bottom = bottom;
166 return EMFDRV_WriteRecord( dev, &emr.emr );
169 INT CDECL EMFDRV_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom)
171 EMRINTERSECTCLIPRECT emr;
172 emr.emr.iType = EMR_INTERSECTCLIPRECT;
173 emr.emr.nSize = sizeof(emr);
174 emr.rclClip.left = left;
175 emr.rclClip.top = top;
176 emr.rclClip.right = right;
177 emr.rclClip.bottom = bottom;
178 return EMFDRV_WriteRecord( dev, &emr.emr );
181 INT CDECL EMFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y )
183 EMROFFSETCLIPRGN emr;
184 emr.emr.iType = EMR_OFFSETCLIPRGN;
185 emr.emr.nSize = sizeof(emr);
188 return EMFDRV_WriteRecord( dev, &emr.emr );
191 INT CDECL EMFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode )
193 EMREXTSELECTCLIPRGN *emr;
199 if (mode != RGN_COPY) return ERROR;
202 else rgnsize = GetRegionData( hrgn, 0, NULL );
204 size = rgnsize + offsetof(EMREXTSELECTCLIPRGN,RgnData);
205 emr = HeapAlloc( GetProcessHeap(), 0, size );
206 if (rgnsize) GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData );
208 emr->emr.iType = EMR_EXTSELECTCLIPRGN;
209 emr->emr.nSize = size;
210 emr->cbRgnData = rgnsize;
213 ret = EMFDRV_WriteRecord( dev, &emr->emr );
214 HeapFree( GetProcessHeap(), 0, emr );
215 return ret ? SIMPLEREGION : ERROR;
218 INT CDECL EMFDRV_SetMapMode( PHYSDEV dev, INT mode )
220 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetMapMode );
222 emr.emr.iType = EMR_SETMAPMODE;
223 emr.emr.nSize = sizeof(emr);
226 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
227 return next->funcs->pSetMapMode( next, mode );
230 BOOL CDECL EMFDRV_SetViewportExtEx( PHYSDEV dev, INT cx, INT cy, SIZE *size )
232 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetViewportExtEx );
233 EMRSETVIEWPORTEXTEX emr;
235 emr.emr.iType = EMR_SETVIEWPORTEXTEX;
236 emr.emr.nSize = sizeof(emr);
237 emr.szlExtent.cx = cx;
238 emr.szlExtent.cy = cy;
240 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
241 return next->funcs->pSetViewportExtEx( next, cx, cy, size );
244 BOOL CDECL EMFDRV_SetWindowExtEx( PHYSDEV dev, INT cx, INT cy, SIZE *size )
246 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetWindowExtEx );
247 EMRSETWINDOWEXTEX emr;
249 emr.emr.iType = EMR_SETWINDOWEXTEX;
250 emr.emr.nSize = sizeof(emr);
251 emr.szlExtent.cx = cx;
252 emr.szlExtent.cy = cy;
254 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
255 return next->funcs->pSetWindowExtEx( next, cx, cy, size );
258 BOOL CDECL EMFDRV_SetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
260 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetViewportOrgEx );
261 EMRSETVIEWPORTORGEX emr;
263 emr.emr.iType = EMR_SETVIEWPORTORGEX;
264 emr.emr.nSize = sizeof(emr);
268 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
269 return next->funcs->pSetViewportOrgEx( next, x, y, pt );
272 BOOL CDECL EMFDRV_SetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
274 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetWindowOrgEx );
275 EMRSETWINDOWORGEX emr;
277 emr.emr.iType = EMR_SETWINDOWORGEX;
278 emr.emr.nSize = sizeof(emr);
282 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
283 return next->funcs->pSetWindowOrgEx( next, x, y, pt );
286 BOOL CDECL EMFDRV_ScaleViewportExtEx( PHYSDEV dev, INT xNum, INT xDenom, INT yNum, INT yDenom, SIZE *size )
288 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pScaleViewportExtEx );
289 EMRSCALEVIEWPORTEXTEX emr;
291 emr.emr.iType = EMR_SCALEVIEWPORTEXTEX;
292 emr.emr.nSize = sizeof(emr);
298 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
299 return next->funcs->pScaleViewportExtEx( next, xNum, xDenom, yNum, yDenom, size );
302 BOOL CDECL EMFDRV_ScaleWindowExtEx( PHYSDEV dev, INT xNum, INT xDenom, INT yNum, INT yDenom, SIZE *size )
304 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pScaleWindowExtEx );
305 EMRSCALEWINDOWEXTEX emr;
307 emr.emr.iType = EMR_SCALEWINDOWEXTEX;
308 emr.emr.nSize = sizeof(emr);
314 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
315 return next->funcs->pScaleWindowExtEx( next, xNum, xDenom, yNum, yDenom, size );
318 DWORD CDECL EMFDRV_SetLayout( PHYSDEV dev, DWORD layout )
322 emr.emr.iType = EMR_SETLAYOUT;
323 emr.emr.nSize = sizeof(emr);
325 return EMFDRV_WriteRecord( dev, &emr.emr ) ? layout : GDI_ERROR;
328 BOOL CDECL EMFDRV_SetWorldTransform( PHYSDEV dev, const XFORM *xform)
330 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetWorldTransform );
331 EMRSETWORLDTRANSFORM emr;
333 emr.emr.iType = EMR_SETWORLDTRANSFORM;
334 emr.emr.nSize = sizeof(emr);
337 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
338 return next->funcs->pSetWorldTransform( next, xform );
341 BOOL CDECL EMFDRV_ModifyWorldTransform( PHYSDEV dev, const XFORM *xform, DWORD mode)
343 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pModifyWorldTransform );
344 EMRMODIFYWORLDTRANSFORM emr;
346 emr.emr.iType = EMR_MODIFYWORLDTRANSFORM;
347 emr.emr.nSize = sizeof(emr);
351 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
352 return next->funcs->pModifyWorldTransform( next, xform, mode );
355 BOOL CDECL EMFDRV_OffsetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
357 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pOffsetViewportOrgEx );
358 EMRSETVIEWPORTORGEX emr;
359 EMFDRV_PDEVICE* physDev = (EMFDRV_PDEVICE*)dev;
361 GetViewportOrgEx(physDev->hdc, pt);
363 emr.emr.iType = EMR_SETVIEWPORTORGEX;
364 emr.emr.nSize = sizeof(emr);
365 emr.ptlOrigin.x = pt->x + x;
366 emr.ptlOrigin.y = pt->y + y;
368 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
369 return next->funcs->pOffsetViewportOrgEx( next, x, y, pt );
372 BOOL CDECL EMFDRV_OffsetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
374 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pOffsetWindowOrgEx );
375 EMRSETWINDOWORGEX emr;
376 EMFDRV_PDEVICE* physDev = (EMFDRV_PDEVICE*)dev;
378 GetWindowOrgEx(physDev->hdc, pt);
380 emr.emr.iType = EMR_SETWINDOWORGEX;
381 emr.emr.nSize = sizeof(emr);
382 emr.ptlOrigin.x = pt->x + x;
383 emr.ptlOrigin.y = pt->y + y;
385 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
386 return next->funcs->pOffsetWindowOrgEx( next, x, y, pt );
389 DWORD CDECL EMFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags )
391 EMRSETMAPPERFLAGS emr;
393 emr.emr.iType = EMR_SETMAPPERFLAGS;
394 emr.emr.nSize = sizeof(emr);
397 return EMFDRV_WriteRecord( dev, &emr.emr ) ? flags : GDI_ERROR;
400 BOOL CDECL EMFDRV_AbortPath( PHYSDEV dev )
404 emr.emr.iType = EMR_ABORTPATH;
405 emr.emr.nSize = sizeof(emr);
407 return EMFDRV_WriteRecord( dev, &emr.emr );
410 BOOL CDECL EMFDRV_BeginPath( PHYSDEV dev )
414 emr.emr.iType = EMR_BEGINPATH;
415 emr.emr.nSize = sizeof(emr);
417 return EMFDRV_WriteRecord( dev, &emr.emr );
420 BOOL CDECL EMFDRV_CloseFigure( PHYSDEV dev )
424 emr.emr.iType = EMR_CLOSEFIGURE;
425 emr.emr.nSize = sizeof(emr);
427 return EMFDRV_WriteRecord( dev, &emr.emr );
430 BOOL CDECL EMFDRV_EndPath( PHYSDEV dev )
434 emr.emr.iType = EMR_ENDPATH;
435 emr.emr.nSize = sizeof(emr);
437 return EMFDRV_WriteRecord( dev, &emr.emr );
440 BOOL CDECL EMFDRV_FillPath( PHYSDEV dev )
444 emr.emr.iType = EMR_FILLPATH;
445 emr.emr.nSize = sizeof(emr);
447 emr.rclBounds.left = 0;
448 emr.rclBounds.top = 0;
449 emr.rclBounds.right = 0;
450 emr.rclBounds.bottom = 0;
451 return EMFDRV_WriteRecord( dev, &emr.emr );
454 BOOL CDECL EMFDRV_FlattenPath( PHYSDEV dev )
458 emr.emr.iType = EMR_FLATTENPATH;
459 emr.emr.nSize = sizeof(emr);
461 return EMFDRV_WriteRecord( dev, &emr.emr );
464 BOOL CDECL EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode )
466 EMRSELECTCLIPPATH emr;
468 emr.emr.iType = EMR_SELECTCLIPPATH;
469 emr.emr.nSize = sizeof(emr);
472 return EMFDRV_WriteRecord( dev, &emr.emr );
475 BOOL CDECL EMFDRV_StrokeAndFillPath( PHYSDEV dev )
477 EMRSTROKEANDFILLPATH emr;
479 emr.emr.iType = EMR_STROKEANDFILLPATH;
480 emr.emr.nSize = sizeof(emr);
482 emr.rclBounds.left = 0;
483 emr.rclBounds.top = 0;
484 emr.rclBounds.right = 0;
485 emr.rclBounds.bottom = 0;
486 return EMFDRV_WriteRecord( dev, &emr.emr );
489 BOOL CDECL EMFDRV_StrokePath( PHYSDEV dev )
493 emr.emr.iType = EMR_STROKEPATH;
494 emr.emr.nSize = sizeof(emr);
496 emr.rclBounds.left = 0;
497 emr.rclBounds.top = 0;
498 emr.rclBounds.right = 0;
499 emr.rclBounds.bottom = 0;
500 return EMFDRV_WriteRecord( dev, &emr.emr );
503 BOOL CDECL EMFDRV_WidenPath( PHYSDEV dev )
507 emr.emr.iType = EMR_WIDENPATH;
508 emr.emr.nSize = sizeof(emr);
510 return EMFDRV_WriteRecord( dev, &emr.emr );
513 INT CDECL EMFDRV_GetDeviceCaps(PHYSDEV dev, INT cap)
515 EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev;
520 return physDev->horzres;
522 return physDev->vertres;
524 return physDev->logpixelsx;
526 return physDev->logpixelsy;
528 return physDev->horzsize;
530 return physDev->vertsize;
532 return physDev->bitspixel;
534 return physDev->textcaps;
536 return physDev->rastercaps;
538 return physDev->technology;
540 return physDev->planes;
542 return physDev->numcolors;
544 FIXME("Unimplemented cap %d\n", cap);