ReactOS 0.4.15-dev-8227-g32d615f
dc.c File Reference
#include <assert.h>
#include "enhmfdrv/enhmetafiledrv.h"
Include dependency graph for dc.c:

Go to the source code of this file.

Functions

static PHYSDEV get_emfdev (PHYSDEV path)
 
INT EMFDRV_SaveDC (PHYSDEV dev)
 
BOOL EMFDRV_RestoreDC (PHYSDEV dev, INT level)
 
UINT EMFDRV_SetTextAlign (PHYSDEV dev, UINT align)
 
BOOL EMFDRV_SetTextJustification (PHYSDEV dev, INT nBreakExtra, INT nBreakCount)
 
INT EMFDRV_SetBkMode (PHYSDEV dev, INT mode)
 
COLORREF EMFDRV_SetBkColor (PHYSDEV dev, COLORREF color)
 
COLORREF EMFDRV_SetTextColor (PHYSDEV dev, COLORREF color)
 
INT EMFDRV_SetROP2 (PHYSDEV dev, INT rop)
 
INT EMFDRV_SetPolyFillMode (PHYSDEV dev, INT mode)
 
INT EMFDRV_SetStretchBltMode (PHYSDEV dev, INT mode)
 
INT EMFDRV_SetArcDirection (PHYSDEV dev, INT arcDirection)
 
INT EMFDRV_ExcludeClipRect (PHYSDEV dev, INT left, INT top, INT right, INT bottom)
 
INT EMFDRV_IntersectClipRect (PHYSDEV dev, INT left, INT top, INT right, INT bottom)
 
INT EMFDRV_OffsetClipRgn (PHYSDEV dev, INT x, INT y)
 
INT EMFDRV_ExtSelectClipRgn (PHYSDEV dev, HRGN hrgn, INT mode)
 
INT EMFDRV_SetMapMode (PHYSDEV dev, INT mode)
 
BOOL EMFDRV_SetViewportExtEx (PHYSDEV dev, INT cx, INT cy, SIZE *size)
 
BOOL EMFDRV_SetWindowExtEx (PHYSDEV dev, INT cx, INT cy, SIZE *size)
 
BOOL EMFDRV_SetViewportOrgEx (PHYSDEV dev, INT x, INT y, POINT *pt)
 
BOOL EMFDRV_SetWindowOrgEx (PHYSDEV dev, INT x, INT y, POINT *pt)
 
BOOL EMFDRV_ScaleViewportExtEx (PHYSDEV dev, INT xNum, INT xDenom, INT yNum, INT yDenom, SIZE *size)
 
BOOL EMFDRV_ScaleWindowExtEx (PHYSDEV dev, INT xNum, INT xDenom, INT yNum, INT yDenom, SIZE *size)
 
DWORD EMFDRV_SetLayout (PHYSDEV dev, DWORD layout)
 
BOOL EMFDRV_SetWorldTransform (PHYSDEV dev, const XFORM *xform)
 
BOOL EMFDRV_ModifyWorldTransform (PHYSDEV dev, const XFORM *xform, DWORD mode)
 
BOOL EMFDRV_OffsetViewportOrgEx (PHYSDEV dev, INT x, INT y, POINT *pt)
 
BOOL EMFDRV_OffsetWindowOrgEx (PHYSDEV dev, INT x, INT y, POINT *pt)
 
DWORD EMFDRV_SetMapperFlags (PHYSDEV dev, DWORD flags)
 
BOOL EMFDRV_AbortPath (PHYSDEV dev)
 
BOOL EMFDRV_BeginPath (PHYSDEV dev)
 
BOOL EMFDRV_CloseFigure (PHYSDEV dev)
 
BOOL EMFDRV_EndPath (PHYSDEV dev)
 
BOOL EMFDRV_FlattenPath (PHYSDEV dev)
 
BOOL EMFDRV_SelectClipPath (PHYSDEV dev, INT iMode)
 
BOOL EMFDRV_WidenPath (PHYSDEV dev)
 
INT EMFDRV_GetDeviceCaps (PHYSDEV dev, INT cap)
 
static BOOL emfpathdrv_AbortPath (PHYSDEV dev)
 
static BOOL emfpathdrv_AngleArc (PHYSDEV dev, INT x, INT y, DWORD radius, FLOAT start, FLOAT sweep)
 
static BOOL emfpathdrv_Arc (PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend)
 
static BOOL emfpathdrv_ArcTo (PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend)
 
static BOOL emfpathdrv_BeginPath (PHYSDEV dev)
 
static BOOL emfpathdrv_Chord (PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend)
 
static BOOL emfpathdrv_CloseFigure (PHYSDEV dev)
 
static BOOL emfpathdrv_CreateDC (PHYSDEV *dev, LPCWSTR driver, LPCWSTR device, LPCWSTR output, const DEVMODEW *devmode)
 
static BOOL emfpathdrv_DeleteDC (PHYSDEV dev)
 
static BOOL emfpathdrv_Ellipse (PHYSDEV dev, INT x1, INT y1, INT x2, INT y2)
 
static BOOL emfpathdrv_EndPath (PHYSDEV dev)
 
static BOOL emfpathdrv_ExtTextOut (PHYSDEV dev, INT x, INT y, UINT flags, const RECT *rect, LPCWSTR str, UINT count, const INT *dx)
 
static BOOL emfpathdrv_LineTo (PHYSDEV dev, INT x, INT y)
 
static BOOL emfpathdrv_MoveTo (PHYSDEV dev, INT x, INT y)
 
static BOOL emfpathdrv_Pie (PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend)
 
static BOOL emfpathdrv_PolyBezier (PHYSDEV dev, const POINT *pts, DWORD count)
 
static BOOL emfpathdrv_PolyBezierTo (PHYSDEV dev, const POINT *pts, DWORD count)
 
static BOOL emfpathdrv_PolyDraw (PHYSDEV dev, const POINT *pts, const BYTE *types, DWORD count)
 
static BOOL emfpathdrv_PolyPolygon (PHYSDEV dev, const POINT *pts, const INT *counts, UINT polygons)
 
static BOOL emfpathdrv_PolyPolyline (PHYSDEV dev, const POINT *pts, const DWORD *counts, DWORD polylines)
 
static BOOL emfpathdrv_Polygon (PHYSDEV dev, const POINT *pts, INT count)
 
static BOOL emfpathdrv_Polyline (PHYSDEV dev, const POINT *pts, INT count)
 
static BOOL emfpathdrv_PolylineTo (PHYSDEV dev, const POINT *pts, INT count)
 
static BOOL emfpathdrv_Rectangle (PHYSDEV dev, INT x1, INT y1, INT x2, INT y2)
 
static BOOL emfpathdrv_RoundRect (PHYSDEV dev, INT x1, INT y1, INT x2, INT y2, INT ell_width, INT ell_height)
 

Variables

static const struct gdi_dc_funcs emfpath_driver
 

Function Documentation

◆ EMFDRV_AbortPath()

BOOL EMFDRV_AbortPath ( PHYSDEV  dev)

Definition at line 417 of file dc.c.

418{
419 EMRABORTPATH emr;
420
421 emr.emr.iType = EMR_ABORTPATH;
422 emr.emr.nSize = sizeof(emr);
423
424 return EMFDRV_WriteRecord( dev, &emr.emr );
425}
BOOL EMFDRV_WriteRecord(PHYSDEV dev, EMR *emr) DECLSPEC_HIDDEN
Definition: init.c:194
DWORD iType
Definition: wingdi.h:1690
DWORD nSize
Definition: wingdi.h:1691
#define EMR_ABORTPATH
Definition: wingdi.h:142

◆ EMFDRV_BeginPath()

BOOL EMFDRV_BeginPath ( PHYSDEV  dev)

Definition at line 427 of file dc.c.

428{
429 EMFDRV_PDEVICE *physDev = get_emf_physdev( dev );
430 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pBeginPath );
431 EMRBEGINPATH emr;
432 DC *dc = get_physdev_dc( dev );
433
434 emr.emr.iType = EMR_BEGINPATH;
435 emr.emr.nSize = sizeof(emr);
436
437 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
438 if (physDev->path) return TRUE; /* already open */
439
440 if (!next->funcs->pBeginPath( next )) return FALSE;
441 push_dc_driver( &dc->physDev, &physDev->pathdev, &emfpath_driver );
442 physDev->path = TRUE;
443 return TRUE;
444}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static EMFDRV_PDEVICE * get_emf_physdev(PHYSDEV dev)
#define GET_NEXT_PHYSDEV(dev, func)
Definition: gdi_driver.h:215
static const WCHAR dc[]
static unsigned __int64 next
Definition: rand_nt.c:6
Definition: polytest.cpp:41
struct gdi_physdev pathdev
static const struct gdi_dc_funcs emfpath_driver
Definition: dc.c:31
#define EMR_BEGINPATH
Definition: wingdi.h:133

◆ EMFDRV_CloseFigure()

BOOL EMFDRV_CloseFigure ( PHYSDEV  dev)

Definition at line 446 of file dc.c.

447{
448 EMRCLOSEFIGURE emr;
449
451 emr.emr.nSize = sizeof(emr);
452
453 EMFDRV_WriteRecord( dev, &emr.emr );
454 return FALSE; /* always fails without a path */
455}
#define EMR_CLOSEFIGURE
Definition: wingdi.h:135

◆ EMFDRV_EndPath()

BOOL EMFDRV_EndPath ( PHYSDEV  dev)

Definition at line 457 of file dc.c.

458{
459 EMRENDPATH emr;
460
461 emr.emr.iType = EMR_ENDPATH;
462 emr.emr.nSize = sizeof(emr);
463
464 EMFDRV_WriteRecord( dev, &emr.emr );
465 return FALSE; /* always fails without a path */
466}
#define EMR_ENDPATH
Definition: wingdi.h:134

◆ EMFDRV_ExcludeClipRect()

INT EMFDRV_ExcludeClipRect ( PHYSDEV  dev,
INT  left,
INT  top,
INT  right,
INT  bottom 
)

Definition at line 164 of file dc.c.

165{
166 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pExcludeClipRect );
168
170 emr.emr.nSize = sizeof(emr);
171 emr.rclClip.left = left;
172 emr.rclClip.top = top;
173 emr.rclClip.right = right;
174 emr.rclClip.bottom = bottom;
175 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return ERROR;
176 return next->funcs->pExcludeClipRect( next, left, top, right, bottom );
177}
#define ERROR(name)
Definition: error_private.h:53
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLdouble GLdouble right
Definition: glext.h:10859
GLint left
Definition: glext.h:7726
GLint GLint bottom
Definition: glext.h:7726
long bottom
Definition: polytest.cpp:53
long right
Definition: polytest.cpp:53
long top
Definition: polytest.cpp:53
long left
Definition: polytest.cpp:53
#define EMR_EXCLUDECLIPRECT
Definition: wingdi.h:103

◆ EMFDRV_ExtSelectClipRgn()

INT EMFDRV_ExtSelectClipRgn ( PHYSDEV  dev,
HRGN  hrgn,
INT  mode 
)

Definition at line 207 of file dc.c.

208{
209 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pExtSelectClipRgn );
211 DWORD size, rgnsize;
212 BOOL ret;
213
214 if (!hrgn)
215 {
216 if (mode != RGN_COPY) return ERROR;
217 rgnsize = 0;
218 }
219 else rgnsize = GetRegionData( hrgn, 0, NULL );
220
221 size = rgnsize + offsetof(EMREXTSELECTCLIPRGN,RgnData);
222 emr = HeapAlloc( GetProcessHeap(), 0, size );
223 if (rgnsize) GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData );
224
226 emr->emr.nSize = size;
227 emr->cbRgnData = rgnsize;
228 emr->iMode = mode;
229
230 ret = EMFDRV_WriteRecord( dev, &emr->emr );
231 HeapFree( GetProcessHeap(), 0, emr );
232 return ret ? next->funcs->pExtSelectClipRgn( next, hrgn, mode ) : ERROR;
233}
static HRGN hrgn
#define NULL
Definition: types.h:112
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizeiptr size
Definition: glext.h:5919
GLenum mode
Definition: glext.h:6217
#define offsetof(TYPE, MEMBER)
int ret
#define EMR_EXTSELECTCLIPRGN
Definition: wingdi.h:148
#define RGN_COPY
Definition: wingdi.h:357
DWORD WINAPI GetRegionData(_In_ HRGN hrgn, _In_ DWORD nCount, _Out_writes_bytes_to_opt_(nCount, return) LPRGNDATA lpRgnData)

◆ EMFDRV_FlattenPath()

BOOL EMFDRV_FlattenPath ( PHYSDEV  dev)

Definition at line 468 of file dc.c.

469{
470 EMRFLATTENPATH emr;
471
473 emr.emr.nSize = sizeof(emr);
474
475 return EMFDRV_WriteRecord( dev, &emr.emr );
476}
#define EMR_FLATTENPATH
Definition: wingdi.h:139

◆ EMFDRV_GetDeviceCaps()

INT EMFDRV_GetDeviceCaps ( PHYSDEV  dev,
INT  cap 
)

Definition at line 510 of file dc.c.

511{
512 EMFDRV_PDEVICE *physDev = get_emf_physdev( dev );
513
514 return GetDeviceCaps( physDev->ref_dc, cap );
515}
GLenum cap
Definition: glext.h:9639
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)

◆ EMFDRV_IntersectClipRect()

INT EMFDRV_IntersectClipRect ( PHYSDEV  dev,
INT  left,
INT  top,
INT  right,
INT  bottom 
)

Definition at line 179 of file dc.c.

180{
181 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pIntersectClipRect );
183
185 emr.emr.nSize = sizeof(emr);
186 emr.rclClip.left = left;
187 emr.rclClip.top = top;
188 emr.rclClip.right = right;
189 emr.rclClip.bottom = bottom;
190 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return ERROR;
191 return next->funcs->pIntersectClipRect( next, left, top, right, bottom );
192}
#define EMR_INTERSECTCLIPRECT
Definition: wingdi.h:104

◆ EMFDRV_ModifyWorldTransform()

BOOL EMFDRV_ModifyWorldTransform ( PHYSDEV  dev,
const XFORM xform,
DWORD  mode 
)

Definition at line 358 of file dc.c.

359{
360 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pModifyWorldTransform );
362
364 emr.emr.nSize = sizeof(emr);
365 emr.xform = *xform;
366 emr.iMode = mode;
367
368 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
369 return next->funcs->pModifyWorldTransform( next, xform, mode );
370}
#define EMR_MODIFYWORLDTRANSFORM
Definition: wingdi.h:110

◆ EMFDRV_OffsetClipRgn()

INT EMFDRV_OffsetClipRgn ( PHYSDEV  dev,
INT  x,
INT  y 
)

Definition at line 194 of file dc.c.

195{
196 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pOffsetClipRgn );
198
200 emr.emr.nSize = sizeof(emr);
201 emr.ptlOffset.x = x;
202 emr.ptlOffset.y = y;
203 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return ERROR;
204 return next->funcs->pOffsetClipRgn( next, x, y );
205}
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
LONG y
Definition: windef.h:330
LONG x
Definition: windef.h:329
#define EMR_OFFSETCLIPRGN
Definition: wingdi.h:100

◆ EMFDRV_OffsetViewportOrgEx()

BOOL EMFDRV_OffsetViewportOrgEx ( PHYSDEV  dev,
INT  x,
INT  y,
POINT pt 
)

Definition at line 372 of file dc.c.

373{
374 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pOffsetViewportOrgEx );
376 POINT prev;
377
378 GetViewportOrgEx( dev->hdc, &prev );
379
381 emr.emr.nSize = sizeof(emr);
382 emr.ptlOrigin.x = prev.x + x;
383 emr.ptlOrigin.y = prev.y + y;
384
385 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
386 return next->funcs->pOffsetViewportOrgEx( next, x, y, pt );
387}
#define pt(x, y)
Definition: drawing.c:79
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define EMR_SETVIEWPORTORGEX
Definition: wingdi.h:86
BOOL WINAPI GetViewportOrgEx(_In_ HDC, _Out_ LPPOINT)
Definition: coord.c:383

◆ EMFDRV_OffsetWindowOrgEx()

BOOL EMFDRV_OffsetWindowOrgEx ( PHYSDEV  dev,
INT  x,
INT  y,
POINT pt 
)

Definition at line 389 of file dc.c.

390{
391 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pOffsetWindowOrgEx );
393 POINT prev;
394
395 GetWindowOrgEx( dev->hdc, &prev );
396
398 emr.emr.nSize = sizeof(emr);
399 emr.ptlOrigin.x = prev.x + x;
400 emr.ptlOrigin.y = prev.y + y;
401
402 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
403 return next->funcs->pOffsetWindowOrgEx( next, x, y, pt );
404}
BOOL WINAPI GetWindowOrgEx(_In_ HDC, _Out_ LPPOINT)
Definition: coord.c:439
#define EMR_SETWINDOWORGEX
Definition: wingdi.h:84

◆ EMFDRV_RestoreDC()

BOOL EMFDRV_RestoreDC ( PHYSDEV  dev,
INT  level 
)

Definition at line 48 of file dc.c.

49{
50 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pRestoreDC );
52 DC *dc = get_physdev_dc( dev );
53 EMRRESTOREDC emr;
54 BOOL ret;
55
57 emr.emr.nSize = sizeof(emr);
58
59 if (level < 0)
60 emr.iRelative = level;
61 else
62 emr.iRelative = level - dc->saveLevel - 1;
63
64 physDev->restoring++;
65 ret = next->funcs->pRestoreDC( next, level );
66 physDev->restoring--;
67
68 if (ret) EMFDRV_WriteRecord( dev, &emr.emr );
69 return ret;
70}
GLint level
Definition: gl.h:1546
LONG iRelative
Definition: wingdi.h:2151
#define EMR_RESTOREDC
Definition: wingdi.h:108

◆ EMFDRV_SaveDC()

INT EMFDRV_SaveDC ( PHYSDEV  dev)

Definition at line 33 of file dc.c.

34{
35 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSaveDC );
36 INT ret = next->funcs->pSaveDC( next );
37
38 if (ret)
39 {
40 EMRSAVEDC emr;
41 emr.emr.iType = EMR_SAVEDC;
42 emr.emr.nSize = sizeof(emr);
43 EMFDRV_WriteRecord( dev, &emr.emr );
44 }
45 return ret;
46}
int32_t INT
Definition: typedefs.h:58
#define EMR_SAVEDC
Definition: wingdi.h:107

◆ EMFDRV_ScaleViewportExtEx()

BOOL EMFDRV_ScaleViewportExtEx ( PHYSDEV  dev,
INT  xNum,
INT  xDenom,
INT  yNum,
INT  yDenom,
SIZE size 
)

Definition at line 303 of file dc.c.

304{
305 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pScaleViewportExtEx );
307
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 FALSE;
316 return next->funcs->pScaleViewportExtEx( next, xNum, xDenom, yNum, yDenom, size );
317}
#define EMR_SCALEVIEWPORTEXTEX
Definition: wingdi.h:105

◆ EMFDRV_ScaleWindowExtEx()

BOOL EMFDRV_ScaleWindowExtEx ( PHYSDEV  dev,
INT  xNum,
INT  xDenom,
INT  yNum,
INT  yDenom,
SIZE size 
)

Definition at line 319 of file dc.c.

320{
321 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pScaleWindowExtEx );
323
325 emr.emr.nSize = sizeof(emr);
326 emr.xNum = xNum;
327 emr.xDenom = xDenom;
328 emr.yNum = yNum;
329 emr.yDenom = yDenom;
330
331 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
332 return next->funcs->pScaleWindowExtEx( next, xNum, xDenom, yNum, yDenom, size );
333}
#define EMR_SCALEWINDOWEXTEX
Definition: wingdi.h:106

◆ EMFDRV_SelectClipPath()

BOOL EMFDRV_SelectClipPath ( PHYSDEV  dev,
INT  iMode 
)

Definition at line 478 of file dc.c.

479{
480 // PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectClipPath ); This HACK breaks test_emf_clipping
482 // BOOL ret = FALSE;
483 // HRGN hrgn;
484
486 emr.emr.nSize = sizeof(emr);
487 emr.iMode = iMode;
488
489 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
490/* hrgn = PathToRegion( dev->hdc );
491 if (hrgn)
492 {
493 ret = next->funcs->pExtSelectClipRgn( next, hrgn, iMode );
494 DeleteObject( hrgn );
495 } ERR("EMFDRV_SelectClipPath ret %d\n",ret);
496 return ret;*/
497 return TRUE;
498}
_In_ ULONG iMode
Definition: winddi.h:3520
#define EMR_SELECTCLIPPATH
Definition: wingdi.h:141

◆ EMFDRV_SetArcDirection()

INT EMFDRV_SetArcDirection ( PHYSDEV  dev,
INT  arcDirection 
)

Definition at line 154 of file dc.c.

155{
157
159 emr.emr.nSize = sizeof(emr);
160 emr.iArcDirection = arcDirection;
161 return EMFDRV_WriteRecord(dev, &emr.emr) ? arcDirection : 0;
162}
#define EMR_SETARCDIRECTION
Definition: wingdi.h:131

◆ EMFDRV_SetBkColor()

COLORREF EMFDRV_SetBkColor ( PHYSDEV  dev,
COLORREF  color 
)

Definition at line 100 of file dc.c.

101{
102 EMRSETBKCOLOR emr;
103 EMFDRV_PDEVICE *physDev = get_emf_physdev( dev );
104
105 if (physDev->restoring) return color; /* don't output records during RestoreDC */
106
108 emr.emr.nSize = sizeof(emr);
109 emr.crColor = color;
110 return EMFDRV_WriteRecord( dev, &emr.emr ) ? color : CLR_INVALID;
111}
GLuint color
Definition: glext.h:6243
COLORREF crColor
Definition: wingdi.h:2181
#define EMR_SETBKCOLOR
Definition: wingdi.h:99
#define CLR_INVALID
Definition: wingdi.h:883

◆ EMFDRV_SetBkMode()

INT EMFDRV_SetBkMode ( PHYSDEV  dev,
INT  mode 
)

Definition at line 91 of file dc.c.

92{
93 EMRSETBKMODE emr;
95 emr.emr.nSize = sizeof(emr);
96 emr.iMode = mode;
97 return EMFDRV_WriteRecord( dev, &emr.emr ) ? mode : 0;
98}
#define EMR_SETBKMODE
Definition: wingdi.h:92

◆ EMFDRV_SetLayout()

DWORD EMFDRV_SetLayout ( PHYSDEV  dev,
DWORD  layout 
)

Definition at line 335 of file dc.c.

336{
337 EMRSETLAYOUT emr;
338
339 emr.emr.iType = EMR_SETLAYOUT;
340 emr.emr.nSize = sizeof(emr);
341 emr.iMode = layout;
342 return EMFDRV_WriteRecord( dev, &emr.emr ) ? layout : GDI_ERROR;
343}
static DWORD layout
Definition: bitmap.c:46
#define GDI_ERROR
Definition: wingdi.h:1309

◆ EMFDRV_SetMapMode()

INT EMFDRV_SetMapMode ( PHYSDEV  dev,
INT  mode 
)

Definition at line 235 of file dc.c.

236{
237 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetMapMode );
238 EMRSETMAPMODE emr;
240 emr.emr.nSize = sizeof(emr);
241 emr.iMode = mode;
242
243 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0;
244 return next->funcs->pSetMapMode( next, mode );
245}
#define EMR_SETMAPMODE
Definition: wingdi.h:91

◆ EMFDRV_SetMapperFlags()

DWORD EMFDRV_SetMapperFlags ( PHYSDEV  dev,
DWORD  flags 
)

Definition at line 406 of file dc.c.

407{
409
411 emr.emr.nSize = sizeof(emr);
412 emr.dwFlags = flags;
413
414 return EMFDRV_WriteRecord( dev, &emr.emr ) ? flags : GDI_ERROR;
415}
GLbitfield flags
Definition: glext.h:7161
#define EMR_SETMAPPERFLAGS
Definition: wingdi.h:90

◆ EMFDRV_SetPolyFillMode()

INT EMFDRV_SetPolyFillMode ( PHYSDEV  dev,
INT  mode 
)

Definition at line 136 of file dc.c.

137{
140 emr.emr.nSize = sizeof(emr);
141 emr.iMode = mode;
142 return EMFDRV_WriteRecord( dev, &emr.emr ) ? mode : 0;
143}
#define EMR_SETPOLYFILLMODE
Definition: wingdi.h:93

◆ EMFDRV_SetROP2()

INT EMFDRV_SetROP2 ( PHYSDEV  dev,
INT  rop 
)

Definition at line 127 of file dc.c.

128{
129 EMRSETROP2 emr;
130 emr.emr.iType = EMR_SETROP2;
131 emr.emr.nSize = sizeof(emr);
132 emr.iMode = rop;
133 return EMFDRV_WriteRecord( dev, &emr.emr ) ? rop : 0;
134}
static int rop(int rop, int src, int dst)
Definition: nanoxwin.c:124
#define EMR_SETROP2
Definition: wingdi.h:94

◆ EMFDRV_SetStretchBltMode()

INT EMFDRV_SetStretchBltMode ( PHYSDEV  dev,
INT  mode 
)

Definition at line 145 of file dc.c.

146{
149 emr.emr.nSize = sizeof(emr);
150 emr.iMode = mode;
151 return EMFDRV_WriteRecord( dev, &emr.emr ) ? mode : 0;
152}
#define EMR_SETSTRETCHBLTMODE
Definition: wingdi.h:95

◆ EMFDRV_SetTextAlign()

UINT EMFDRV_SetTextAlign ( PHYSDEV  dev,
UINT  align 
)

Definition at line 72 of file dc.c.

73{
76 emr.emr.nSize = sizeof(emr);
77 emr.iMode = align;
78 return EMFDRV_WriteRecord( dev, &emr.emr ) ? align : GDI_ERROR;
79}
int align(int length, int align)
Definition: dsound8.c:36
#define EMR_SETTEXTALIGN
Definition: wingdi.h:96

◆ EMFDRV_SetTextColor()

COLORREF EMFDRV_SetTextColor ( PHYSDEV  dev,
COLORREF  color 
)

Definition at line 114 of file dc.c.

115{
116 EMRSETTEXTCOLOR emr;
117 EMFDRV_PDEVICE *physDev = get_emf_physdev( dev );
118
119 if (physDev->restoring) return color; /* don't output records during RestoreDC */
120
122 emr.emr.nSize = sizeof(emr);
123 emr.crColor = color;
124 return EMFDRV_WriteRecord( dev, &emr.emr ) ? color : CLR_INVALID;
125}
#define EMR_SETTEXTCOLOR
Definition: wingdi.h:98

◆ EMFDRV_SetTextJustification()

BOOL EMFDRV_SetTextJustification ( PHYSDEV  dev,
INT  nBreakExtra,
INT  nBreakCount 
)

Definition at line 81 of file dc.c.

82{
84 emr.emr.iType = EMR_SETTEXTJUSTIFICATION;
85 emr.emr.nSize = sizeof(emr);
86 emr.nBreakExtra = nBreakExtra;
87 emr.nBreakCount = nBreakCount;
88 return EMFDRV_WriteRecord(dev, &emr.emr);
89}

◆ EMFDRV_SetViewportExtEx()

BOOL EMFDRV_SetViewportExtEx ( PHYSDEV  dev,
INT  cx,
INT  cy,
SIZE size 
)

Definition at line 247 of file dc.c.

248{
249 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetViewportExtEx );
251
253 emr.emr.nSize = sizeof(emr);
254 emr.szlExtent.cx = cx;
255 emr.szlExtent.cy = cy;
256
257 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
258 return next->funcs->pSetViewportExtEx( next, cx, cy, size );
259}
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
#define EMR_SETVIEWPORTEXTEX
Definition: wingdi.h:85

◆ EMFDRV_SetViewportOrgEx()

BOOL EMFDRV_SetViewportOrgEx ( PHYSDEV  dev,
INT  x,
INT  y,
POINT pt 
)

Definition at line 275 of file dc.c.

276{
277 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetViewportOrgEx );
279
281 emr.emr.nSize = sizeof(emr);
282 emr.ptlOrigin.x = x;
283 emr.ptlOrigin.y = y;
284
285 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
286 return next->funcs->pSetViewportOrgEx( next, x, y, pt );
287}

◆ EMFDRV_SetWindowExtEx()

BOOL EMFDRV_SetWindowExtEx ( PHYSDEV  dev,
INT  cx,
INT  cy,
SIZE size 
)

Definition at line 261 of file dc.c.

262{
263 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetWindowExtEx );
265
267 emr.emr.nSize = sizeof(emr);
268 emr.szlExtent.cx = cx;
269 emr.szlExtent.cy = cy;
270
271 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
272 return next->funcs->pSetWindowExtEx( next, cx, cy, size );
273}
#define EMR_SETWINDOWEXTEX
Definition: wingdi.h:83

◆ EMFDRV_SetWindowOrgEx()

BOOL EMFDRV_SetWindowOrgEx ( PHYSDEV  dev,
INT  x,
INT  y,
POINT pt 
)

Definition at line 289 of file dc.c.

290{
291 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetWindowOrgEx );
293
295 emr.emr.nSize = sizeof(emr);
296 emr.ptlOrigin.x = x;
297 emr.ptlOrigin.y = y;
298
299 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
300 return next->funcs->pSetWindowOrgEx( next, x, y, pt );
301}

◆ EMFDRV_SetWorldTransform()

BOOL EMFDRV_SetWorldTransform ( PHYSDEV  dev,
const XFORM xform 
)

Definition at line 345 of file dc.c.

346{
347 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetWorldTransform );
349
351 emr.emr.nSize = sizeof(emr);
352 emr.xform = *xform;
353
354 if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
355 return next->funcs->pSetWorldTransform( next, xform );
356}
#define EMR_SETWORLDTRANSFORM
Definition: wingdi.h:109

◆ EMFDRV_WidenPath()

BOOL EMFDRV_WidenPath ( PHYSDEV  dev)

Definition at line 500 of file dc.c.

501{
502 EMRWIDENPATH emr;
503
504 emr.emr.iType = EMR_WIDENPATH;
505 emr.emr.nSize = sizeof(emr);
506
507 return EMFDRV_WriteRecord( dev, &emr.emr );
508}
#define EMR_WIDENPATH
Definition: wingdi.h:140

◆ emfpathdrv_AbortPath()

static BOOL emfpathdrv_AbortPath ( PHYSDEV  dev)
static

Definition at line 521 of file dc.c.

522{
523 PHYSDEV emfdev = get_emfdev( dev );
524 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pAbortPath );
525 DC *dc = get_physdev_dc( dev );
526
527 emfpath_driver.pDeleteDC( pop_dc_driver( dc, &emfpath_driver ));
528 emfdev->funcs->pAbortPath( emfdev );
529 return next->funcs->pAbortPath( next );
530}
const struct gdi_dc_funcs * funcs
Definition: gdi_driver.h:31
static PHYSDEV get_emfdev(PHYSDEV path)
Definition: dc.c:26

◆ emfpathdrv_AngleArc()

static BOOL emfpathdrv_AngleArc ( PHYSDEV  dev,
INT  x,
INT  y,
DWORD  radius,
FLOAT  start,
FLOAT  sweep 
)
static

Definition at line 535 of file dc.c.

536{
537 PHYSDEV emfdev = get_emfdev( dev );
538 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pAngleArc );
539
540 return (emfdev->funcs->pAngleArc( emfdev, x, y, radius, start, sweep ) &&
541 next->funcs->pAngleArc( next, x, y, radius, start, sweep ));
542}
GLuint start
Definition: gl.h:1545

◆ emfpathdrv_Arc()

static BOOL emfpathdrv_Arc ( PHYSDEV  dev,
INT  left,
INT  top,
INT  right,
INT  bottom,
INT  xstart,
INT  ystart,
INT  xend,
INT  yend 
)
static

Definition at line 547 of file dc.c.

549{
550 PHYSDEV emfdev = get_emfdev( dev );
551 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pArc );
552
553 return (emfdev->funcs->pArc( emfdev, left, top, right, bottom, xstart, ystart, xend, yend ) &&
554 next->funcs->pArc( next, left, top, right, bottom, xstart, ystart, xend, yend ));
555}

◆ emfpathdrv_ArcTo()

static BOOL emfpathdrv_ArcTo ( PHYSDEV  dev,
INT  left,
INT  top,
INT  right,
INT  bottom,
INT  xstart,
INT  ystart,
INT  xend,
INT  yend 
)
static

Definition at line 560 of file dc.c.

562{
563 PHYSDEV emfdev = get_emfdev( dev );
564 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pArcTo );
565
566 return (emfdev->funcs->pArcTo( emfdev, left, top, right, bottom, xstart, ystart, xend, yend ) &&
567 next->funcs->pArcTo( next, left, top, right, bottom, xstart, ystart, xend, yend ));
568}

◆ emfpathdrv_BeginPath()

static BOOL emfpathdrv_BeginPath ( PHYSDEV  dev)
static

Definition at line 573 of file dc.c.

574{
575 PHYSDEV emfdev = get_emfdev( dev );
576 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pBeginPath );
577
578 return (emfdev->funcs->pBeginPath( emfdev ) && next->funcs->pBeginPath( next ));
579}

◆ emfpathdrv_Chord()

static BOOL emfpathdrv_Chord ( PHYSDEV  dev,
INT  left,
INT  top,
INT  right,
INT  bottom,
INT  xstart,
INT  ystart,
INT  xend,
INT  yend 
)
static

Definition at line 584 of file dc.c.

586{
587 PHYSDEV emfdev = get_emfdev( dev );
588 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pChord );
589
590 return (emfdev->funcs->pChord( emfdev, left, top, right, bottom, xstart, ystart, xend, yend ) &&
591 next->funcs->pChord( next, left, top, right, bottom, xstart, ystart, xend, yend ));
592}

◆ emfpathdrv_CloseFigure()

static BOOL emfpathdrv_CloseFigure ( PHYSDEV  dev)
static

Definition at line 597 of file dc.c.

598{
599 PHYSDEV emfdev = get_emfdev( dev );
600 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pCloseFigure );
601
602 emfdev->funcs->pCloseFigure( emfdev );
603 return next->funcs->pCloseFigure( next );
604}

◆ emfpathdrv_CreateDC()

static BOOL emfpathdrv_CreateDC ( PHYSDEV dev,
LPCWSTR  driver,
LPCWSTR  device,
LPCWSTR  output,
const DEVMODEW devmode 
)
static

Definition at line 609 of file dc.c.

611{
612 assert( 0 ); /* should never be called */
613 return TRUE;
614}
#define assert(x)
Definition: debug.h:53

◆ emfpathdrv_DeleteDC()

static BOOL emfpathdrv_DeleteDC ( PHYSDEV  dev)
static

Definition at line 619 of file dc.c.

620{
622
623 physdev->path = FALSE;
624 return TRUE;
625}

◆ emfpathdrv_Ellipse()

static BOOL emfpathdrv_Ellipse ( PHYSDEV  dev,
INT  x1,
INT  y1,
INT  x2,
INT  y2 
)
static

Definition at line 630 of file dc.c.

631{
632 PHYSDEV emfdev = get_emfdev( dev );
633 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pEllipse );
634
635 return (emfdev->funcs->pEllipse( emfdev, x1, y1, x2, y2 ) &&
636 next->funcs->pEllipse( next, x1, y1, x2, y2 ));
637}
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG _In_ LONG x2
Definition: winddi.h:3710
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG y1
Definition: winddi.h:3709
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG x1
Definition: winddi.h:3708
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG _In_ LONG _In_ LONG y2
Definition: winddi.h:3711

◆ emfpathdrv_EndPath()

static BOOL emfpathdrv_EndPath ( PHYSDEV  dev)
static

Definition at line 642 of file dc.c.

643{
644 PHYSDEV emfdev = get_emfdev( dev );
645 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pEndPath );
646 DC *dc = get_physdev_dc( dev );
647
648 emfpath_driver.pDeleteDC( pop_dc_driver( dc, &emfpath_driver ));
649 emfdev->funcs->pEndPath( emfdev );
650 return next->funcs->pEndPath( next );
651}

◆ emfpathdrv_ExtTextOut()

static BOOL emfpathdrv_ExtTextOut ( PHYSDEV  dev,
INT  x,
INT  y,
UINT  flags,
const RECT rect,
LPCWSTR  str,
UINT  count,
const INT dx 
)
static

Definition at line 656 of file dc.c.

658{
659 PHYSDEV emfdev = get_emfdev( dev );
660 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pExtTextOut );
661
662 return (emfdev->funcs->pExtTextOut( emfdev, x, y, flags, rect, str, count, dx ) &&
663 next->funcs->pExtTextOut( next, x, y, flags, rect, str, count, dx ));
664}
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint dx
Definition: linetemp.h:97
const WCHAR * str
& rect
Definition: startmenu.cpp:1413

◆ emfpathdrv_LineTo()

static BOOL emfpathdrv_LineTo ( PHYSDEV  dev,
INT  x,
INT  y 
)
static

Definition at line 669 of file dc.c.

670{
671 PHYSDEV emfdev = get_emfdev( dev );
672 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pLineTo );
673
674 return (emfdev->funcs->pLineTo( emfdev, x, y ) && next->funcs->pLineTo( next, x, y ));
675}

◆ emfpathdrv_MoveTo()

static BOOL emfpathdrv_MoveTo ( PHYSDEV  dev,
INT  x,
INT  y 
)
static

Definition at line 680 of file dc.c.

681{
682 PHYSDEV emfdev = get_emfdev( dev );
683 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pMoveTo );
684
685 return (emfdev->funcs->pMoveTo( emfdev, x, y ) && next->funcs->pMoveTo( next, x, y ));
686}

◆ emfpathdrv_Pie()

static BOOL emfpathdrv_Pie ( PHYSDEV  dev,
INT  left,
INT  top,
INT  right,
INT  bottom,
INT  xstart,
INT  ystart,
INT  xend,
INT  yend 
)
static

Definition at line 691 of file dc.c.

693{
694 PHYSDEV emfdev = get_emfdev( dev );
695 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPie );
696
697 return (emfdev->funcs->pPie( emfdev, left, top, right, bottom, xstart, ystart, xend, yend ) &&
698 next->funcs->pPie( next, left, top, right, bottom, xstart, ystart, xend, yend ));
699}

◆ emfpathdrv_PolyBezier()

static BOOL emfpathdrv_PolyBezier ( PHYSDEV  dev,
const POINT pts,
DWORD  count 
)
static

Definition at line 704 of file dc.c.

705{
706 PHYSDEV emfdev = get_emfdev( dev );
707 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolyBezier );
708
709 return (emfdev->funcs->pPolyBezier( emfdev, pts, count ) &&
710 next->funcs->pPolyBezier( next, pts, count ));
711}

◆ emfpathdrv_PolyBezierTo()

static BOOL emfpathdrv_PolyBezierTo ( PHYSDEV  dev,
const POINT pts,
DWORD  count 
)
static

Definition at line 716 of file dc.c.

717{
718 PHYSDEV emfdev = get_emfdev( dev );
719 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolyBezierTo );
720
721 return (emfdev->funcs->pPolyBezierTo( emfdev, pts, count ) &&
722 next->funcs->pPolyBezierTo( next, pts, count ));
723}

◆ emfpathdrv_PolyDraw()

static BOOL emfpathdrv_PolyDraw ( PHYSDEV  dev,
const POINT pts,
const BYTE types,
DWORD  count 
)
static

Definition at line 728 of file dc.c.

729{
730 PHYSDEV emfdev = get_emfdev( dev );
731 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolyDraw );
732
733 return (emfdev->funcs->pPolyDraw( emfdev, pts, types, count ) &&
734 next->funcs->pPolyDraw( next, pts, types, count ));
735}
Definition: cmds.c:130

◆ emfpathdrv_Polygon()

static BOOL emfpathdrv_Polygon ( PHYSDEV  dev,
const POINT pts,
INT  count 
)
static

Definition at line 764 of file dc.c.

765{
766 PHYSDEV emfdev = get_emfdev( dev );
767 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolygon );
768
769 return (emfdev->funcs->pPolygon( emfdev, pts, count ) &&
770 next->funcs->pPolygon( next, pts, count ));
771}

◆ emfpathdrv_Polyline()

static BOOL emfpathdrv_Polyline ( PHYSDEV  dev,
const POINT pts,
INT  count 
)
static

Definition at line 776 of file dc.c.

777{
778 PHYSDEV emfdev = get_emfdev( dev );
779 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolyline );
780
781 return (emfdev->funcs->pPolyline( emfdev, pts, count ) &&
782 next->funcs->pPolyline( next, pts, count ));
783}

◆ emfpathdrv_PolylineTo()

static BOOL emfpathdrv_PolylineTo ( PHYSDEV  dev,
const POINT pts,
INT  count 
)
static

Definition at line 788 of file dc.c.

789{
790 PHYSDEV emfdev = get_emfdev( dev );
791 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolylineTo );
792
793 return (emfdev->funcs->pPolylineTo( emfdev, pts, count ) &&
794 next->funcs->pPolylineTo( next, pts, count ));
795}

◆ emfpathdrv_PolyPolygon()

static BOOL emfpathdrv_PolyPolygon ( PHYSDEV  dev,
const POINT pts,
const INT counts,
UINT  polygons 
)
static

Definition at line 740 of file dc.c.

741{
742 PHYSDEV emfdev = get_emfdev( dev );
743 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolyPolygon );
744
745 return (emfdev->funcs->pPolyPolygon( emfdev, pts, counts, polygons ) &&
746 next->funcs->pPolyPolygon( next, pts, counts, polygons ));
747}

◆ emfpathdrv_PolyPolyline()

static BOOL emfpathdrv_PolyPolyline ( PHYSDEV  dev,
const POINT pts,
const DWORD counts,
DWORD  polylines 
)
static

Definition at line 752 of file dc.c.

753{
754 PHYSDEV emfdev = get_emfdev( dev );
755 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolyPolyline );
756
757 return (emfdev->funcs->pPolyPolyline( emfdev, pts, counts, polylines ) &&
758 next->funcs->pPolyPolyline( next, pts, counts, polylines ));
759}

◆ emfpathdrv_Rectangle()

static BOOL emfpathdrv_Rectangle ( PHYSDEV  dev,
INT  x1,
INT  y1,
INT  x2,
INT  y2 
)
static

Definition at line 800 of file dc.c.

801{
802 PHYSDEV emfdev = get_emfdev( dev );
803 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pRectangle );
804
805 return (emfdev->funcs->pRectangle( emfdev, x1, y1, x2, y2 ) &&
806 next->funcs->pRectangle( next, x1, y1, x2, y2 ));
807}

◆ emfpathdrv_RoundRect()

static BOOL emfpathdrv_RoundRect ( PHYSDEV  dev,
INT  x1,
INT  y1,
INT  x2,
INT  y2,
INT  ell_width,
INT  ell_height 
)
static

Definition at line 812 of file dc.c.

814{
815 PHYSDEV emfdev = get_emfdev( dev );
816 PHYSDEV next = GET_NEXT_PHYSDEV( dev, pRoundRect );
817
818 return (emfdev->funcs->pRoundRect( emfdev, x1, y1, x2, y2, ell_width, ell_height ) &&
819 next->funcs->pRoundRect( next, x1, y1, x2, y2, ell_width, ell_height ));
820}

◆ get_emfdev()

Variable Documentation

◆ emfpath_driver

static const struct gdi_dc_funcs emfpath_driver
static

Definition at line 31 of file dc.c.

Referenced by EMFDRV_BeginPath(), emfpathdrv_AbortPath(), and emfpathdrv_EndPath().