3 #include "gdi_private.h"
4 #undef SetWorldTransform
17 static INT
NULL_SaveDC(PHYSDEV dev
) { return 1; }
18 static BOOL
NULL_RestoreDC(PHYSDEV dev
, INT level
) { return TRUE
; }
19 static INT
NULL_SetMapMode(PHYSDEV dev
, INT iMode
) { return 1; }
20 static HFONT
NULL_SelectFont(PHYSDEV dev
, HFONT hFont
, UINT
*aa_flags
) { return NULL
; }
21 static BOOL
NULL_SetWindowExtEx(PHYSDEV dev
, INT cx
, INT cy
, SIZE
*size
) { return TRUE
; }
22 static BOOL
NULL_SetViewportExtEx(PHYSDEV dev
, INT cx
, INT cy
, SIZE
*size
) { return TRUE
; }
23 static BOOL
NULL_SetWindowOrgEx(PHYSDEV dev
, INT x
, INT y
, POINT
*pt
) { return TRUE
; }
24 static BOOL
NULL_SetViewportOrgEx(PHYSDEV dev
, INT x
, INT y
, POINT
*pt
) { return TRUE
; }
25 static INT
NULL_ExtSelectClipRgn(PHYSDEV dev
, HRGN hrgn
, INT iMode
) { return 1; }
26 static INT
NULL_IntersectClipRect(PHYSDEV dev
, INT left
, INT top
, INT right
, INT bottom
) { return 1; }
27 static INT
NULL_OffsetClipRgn(PHYSDEV dev
, INT x
, INT y
) { return SIMPLEREGION
; }
28 static INT
NULL_ExcludeClipRect(PHYSDEV dev
, INT left
, INT top
, INT right
, INT bottom
) { return 1; }
30 static const struct gdi_dc_funcs DummyPhysDevFuncs
=
32 (PVOID
)NULL_Unused
, //INT (*pAbortDoc)(PHYSDEV);
33 (PVOID
)NULL_Unused
, //BOOL (*pAbortPath)(PHYSDEV);
34 (PVOID
)NULL_Unused
, //BOOL (*pAlphaBlend)(PHYSDEV,struct bitblt_coords*,PHYSDEV,struct bitblt_coords*,BLENDFUNCTION);
35 (PVOID
)NULL_Unused
, //BOOL (*pAngleArc)(PHYSDEV,INT,INT,DWORD,FLOAT,FLOAT);
36 (PVOID
)NULL_Unused
, //BOOL (*pArc)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
37 (PVOID
)NULL_Unused
, //BOOL (*pArcTo)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
38 (PVOID
)NULL_Unused
, //BOOL (*pBeginPath)(PHYSDEV);
39 (PVOID
)NULL_Unused
, //DWORD (*pBlendImage)(PHYSDEV,BITMAPINFO*,const struct gdi_image_bits*,struct bitblt_coords*,struct bitblt_coords*,BLENDFUNCTION);
40 (PVOID
)NULL_Unused
, //BOOL (*pChord)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
41 (PVOID
)NULL_Unused
, //BOOL (*pCloseFigure)(PHYSDEV);
42 (PVOID
)NULL_Unused
, //BOOL (*pCreateCompatibleDC)(PHYSDEV,PHYSDEV*);
43 (PVOID
)NULL_Unused
, //BOOL (*pCreateDC)(PHYSDEV*,LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*);
44 (PVOID
)NULL_Unused
, //BOOL (*pDeleteDC)(PHYSDEV);
45 (PVOID
)NULL_Unused
, //BOOL (*pDeleteObject)(PHYSDEV,HGDIOBJ);
46 (PVOID
)NULL_Unused
, //DWORD (*pDeviceCapabilities)(LPSTR,LPCSTR,LPCSTR,WORD,LPSTR,LPDEVMODEA);
47 (PVOID
)NULL_Unused
, //BOOL (*pEllipse)(PHYSDEV,INT,INT,INT,INT);
48 (PVOID
)NULL_Unused
, //INT (*pEndDoc)(PHYSDEV);
49 (PVOID
)NULL_Unused
, //INT (*pEndPage)(PHYSDEV);
50 (PVOID
)NULL_Unused
, //BOOL (*pEndPath)(PHYSDEV);
51 (PVOID
)NULL_Unused
, //BOOL (*pEnumFonts)(PHYSDEV,LPLOGFONTW,FONTENUMPROCW,LPARAM);
52 (PVOID
)NULL_Unused
, //INT (*pEnumICMProfiles)(PHYSDEV,ICMENUMPROCW,LPARAM);
53 NULL_ExcludeClipRect
, //INT (*pExcludeClipRect)(PHYSDEV,INT,INT,INT,INT);
54 (PVOID
)NULL_Unused
, //INT (*pExtDeviceMode)(LPSTR,HWND,LPDEVMODEA,LPSTR,LPSTR,LPDEVMODEA,LPSTR,DWORD);
55 (PVOID
)NULL_Unused
, //INT (*pExtEscape)(PHYSDEV,INT,INT,LPCVOID,INT,LPVOID);
56 (PVOID
)NULL_Unused
, //BOOL (*pExtFloodFill)(PHYSDEV,INT,INT,COLORREF,UINT);
57 NULL_ExtSelectClipRgn
, //INT (*pExtSelectClipRgn)(PHYSDEV,HRGN,INT);
58 (PVOID
)NULL_Unused
, //BOOL (*pExtTextOut)(PHYSDEV,INT,INT,UINT,const RECT*,LPCWSTR,UINT,const INT*);
59 (PVOID
)NULL_Unused
, //BOOL (*pFillPath)(PHYSDEV);
60 (PVOID
)NULL_Unused
, //BOOL (*pFillRgn)(PHYSDEV,HRGN,HBRUSH);
61 (PVOID
)NULL_Unused
, //BOOL (*pFlattenPath)(PHYSDEV);
62 (PVOID
)NULL_Unused
, //BOOL (*pFontIsLinked)(PHYSDEV);
63 (PVOID
)NULL_Unused
, //BOOL (*pFrameRgn)(PHYSDEV,HRGN,HBRUSH,INT,INT);
64 (PVOID
)NULL_Unused
, //BOOL (*pGdiComment)(PHYSDEV,UINT,const BYTE*);
65 (PVOID
)NULL_Unused
, //BOOL (*pGdiRealizationInfo)(PHYSDEV,void*);
66 (PVOID
)NULL_Unused
, //UINT (*pGetBoundsRect)(PHYSDEV,RECT*,UINT);
67 (PVOID
)NULL_Unused
, //BOOL (*pGetCharABCWidths)(PHYSDEV,UINT,UINT,LPABC);
68 (PVOID
)NULL_Unused
, //BOOL (*pGetCharABCWidthsI)(PHYSDEV,UINT,UINT,WORD*,LPABC);
69 (PVOID
)NULL_Unused
, //BOOL (*pGetCharWidth)(PHYSDEV,UINT,UINT,LPINT);
70 (PVOID
)NULL_Unused
, //INT (*pGetDeviceCaps)(PHYSDEV,INT);
71 (PVOID
)NULL_Unused
, //BOOL (*pGetDeviceGammaRamp)(PHYSDEV,LPVOID);
72 (PVOID
)NULL_Unused
, //DWORD (*pGetFontData)(PHYSDEV,DWORD,DWORD,LPVOID,DWORD);
73 (PVOID
)NULL_Unused
, //DWORD (*pGetFontUnicodeRanges)(PHYSDEV,LPGLYPHSET);
74 (PVOID
)NULL_Unused
, //DWORD (*pGetGlyphIndices)(PHYSDEV,LPCWSTR,INT,LPWORD,DWORD);
75 (PVOID
)NULL_Unused
, //DWORD (*pGetGlyphOutline)(PHYSDEV,UINT,UINT,LPGLYPHMETRICS,DWORD,LPVOID,const MAT2*);
76 (PVOID
)NULL_Unused
, //BOOL (*pGetICMProfile)(PHYSDEV,LPDWORD,LPWSTR);
77 (PVOID
)NULL_Unused
, //DWORD (*pGetImage)(PHYSDEV,BITMAPINFO*,struct gdi_image_bits*,struct bitblt_coords*);
78 (PVOID
)NULL_Unused
, //DWORD (*pGetKerningPairs)(PHYSDEV,DWORD,LPKERNINGPAIR);
79 (PVOID
)NULL_Unused
, //COLORREF (*pGetNearestColor)(PHYSDEV,COLORREF);
80 (PVOID
)NULL_Unused
, //UINT (*pGetOutlineTextMetrics)(PHYSDEV,UINT,LPOUTLINETEXTMETRICW);
81 (PVOID
)NULL_Unused
, //COLORREF (*pGetPixel)(PHYSDEV,INT,INT);
82 (PVOID
)NULL_Unused
, //UINT (*pGetSystemPaletteEntries)(PHYSDEV,UINT,UINT,LPPALETTEENTRY);
83 (PVOID
)NULL_Unused
, //UINT (*pGetTextCharsetInfo)(PHYSDEV,LPFONTSIGNATURE,DWORD);
84 (PVOID
)NULL_Unused
, //BOOL (*pGetTextExtentExPoint)(PHYSDEV,LPCWSTR,INT,LPINT);
85 (PVOID
)NULL_Unused
, //BOOL (*pGetTextExtentExPointI)(PHYSDEV,const WORD*,INT,LPINT);
86 (PVOID
)NULL_Unused
, //INT (*pGetTextFace)(PHYSDEV,INT,LPWSTR);
87 (PVOID
)NULL_Unused
, //BOOL (*pGetTextMetrics)(PHYSDEV,TEXTMETRICW*);
88 (PVOID
)NULL_Unused
, //BOOL (*pGradientFill)(PHYSDEV,TRIVERTEX*,ULONG,void*,ULONG,ULONG);
89 NULL_IntersectClipRect
, //INT (*pIntersectClipRect)(PHYSDEV,INT,INT,INT,INT);
90 (PVOID
)NULL_Unused
, //BOOL (*pInvertRgn)(PHYSDEV,HRGN);
91 (PVOID
)NULL_Unused
, //BOOL (*pLineTo)(PHYSDEV,INT,INT);
92 (PVOID
)NULL_Unused
, //BOOL (*pModifyWorldTransform)(PHYSDEV,const XFORM*,DWORD);
93 (PVOID
)NULL_Unused
, //BOOL (*pMoveTo)(PHYSDEV,INT,INT);
94 NULL_OffsetClipRgn
, //INT (*pOffsetClipRgn)(PHYSDEV,INT,INT);
95 (PVOID
)NULL_Unused
, //BOOL (*pOffsetViewportOrgEx)(PHYSDEV,INT,INT,POINT*);
96 (PVOID
)NULL_Unused
, //BOOL (*pOffsetWindowOrgEx)(PHYSDEV,INT,INT,POINT*);
97 (PVOID
)NULL_Unused
, //BOOL (*pPaintRgn)(PHYSDEV,HRGN);
98 (PVOID
)NULL_Unused
, //BOOL (*pPatBlt)(PHYSDEV,struct bitblt_coords*,DWORD);
99 (PVOID
)NULL_Unused
, //BOOL (*pPie)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
100 (PVOID
)NULL_Unused
, //BOOL (*pPolyBezier)(PHYSDEV,const POINT*,DWORD);
101 (PVOID
)NULL_Unused
, //BOOL (*pPolyBezierTo)(PHYSDEV,const POINT*,DWORD);
102 (PVOID
)NULL_Unused
, //BOOL (*pPolyDraw)(PHYSDEV,const POINT*,const BYTE *,DWORD);
103 (PVOID
)NULL_Unused
, //BOOL (*pPolyPolygon)(PHYSDEV,const POINT*,const INT*,UINT);
104 (PVOID
)NULL_Unused
, //BOOL (*pPolyPolyline)(PHYSDEV,const POINT*,const DWORD*,DWORD);
105 (PVOID
)NULL_Unused
, //BOOL (*pPolygon)(PHYSDEV,const POINT*,INT);
106 (PVOID
)NULL_Unused
, //BOOL (*pPolyline)(PHYSDEV,const POINT*,INT);
107 (PVOID
)NULL_Unused
, //BOOL (*pPolylineTo)(PHYSDEV,const POINT*,INT);
108 (PVOID
)NULL_Unused
, //DWORD (*pPutImage)(PHYSDEV,HRGN,BITMAPINFO*,const struct gdi_image_bits*,struct bitblt_coords*,struct bitblt_coords*,DWORD);
109 (PVOID
)NULL_Unused
, //UINT (*pRealizeDefaultPalette)(PHYSDEV);
110 (PVOID
)NULL_Unused
, //UINT (*pRealizePalette)(PHYSDEV,HPALETTE,BOOL);
111 (PVOID
)NULL_Unused
, //BOOL (*pRectangle)(PHYSDEV,INT,INT,INT,INT);
112 (PVOID
)NULL_Unused
, //HDC (*pResetDC)(PHYSDEV,const DEVMODEW*);
113 NULL_RestoreDC
, //BOOL (*pRestoreDC)(PHYSDEV,INT);
114 (PVOID
)NULL_Unused
, //BOOL (*pRoundRect)(PHYSDEV,INT,INT,INT,INT,INT,INT);
115 NULL_SaveDC
, //INT (*pSaveDC)(PHYSDEV);
116 (PVOID
)NULL_Unused
, //BOOL (*pScaleViewportExtEx)(PHYSDEV,INT,INT,INT,INT,SIZE*);
117 (PVOID
)NULL_Unused
, //BOOL (*pScaleWindowExtEx)(PHYSDEV,INT,INT,INT,INT,SIZE*);
118 (PVOID
)NULL_Unused
, //HBITMAP (*pSelectBitmap)(PHYSDEV,HBITMAP);
119 (PVOID
)NULL_Unused
, //HBRUSH (*pSelectBrush)(PHYSDEV,HBRUSH,const struct brush_pattern*);
120 (PVOID
)NULL_Unused
, //BOOL (*pSelectClipPath)(PHYSDEV,INT);
121 NULL_SelectFont
, //HFONT (*pSelectFont)(PHYSDEV,HFONT,UINT*);
122 (PVOID
)NULL_Unused
, //HPALETTE (*pSelectPalette)(PHYSDEV,HPALETTE,BOOL);
123 (PVOID
)NULL_Unused
, //HPEN (*pSelectPen)(PHYSDEV,HPEN,const struct brush_pattern*);
124 (PVOID
)NULL_Unused
, //INT (*pSetArcDirection)(PHYSDEV,INT);
125 (PVOID
)NULL_Unused
, //COLORREF (*pSetBkColor)(PHYSDEV,COLORREF);
126 (PVOID
)NULL_Unused
, //INT (*pSetBkMode)(PHYSDEV,INT);
127 (PVOID
)NULL_Unused
, //UINT (*pSetBoundsRect)(PHYSDEV,RECT*,UINT);
128 (PVOID
)NULL_Unused
, //COLORREF (*pSetDCBrushColor)(PHYSDEV, COLORREF);
129 (PVOID
)NULL_Unused
, //COLORREF (*pSetDCPenColor)(PHYSDEV, COLORREF);
130 (PVOID
)NULL_Unused
, //INT (*pSetDIBitsToDevice)(PHYSDEV,INT,INT,DWORD,DWORD,INT,INT,UINT,UINT,LPCVOID,BITMAPINFO*,UINT);
131 (PVOID
)NULL_Unused
, //VOID (*pSetDeviceClipping)(PHYSDEV,HRGN);
132 (PVOID
)NULL_Unused
, //BOOL (*pSetDeviceGammaRamp)(PHYSDEV,LPVOID);
133 (PVOID
)NULL_Unused
, //DWORD (*pSetLayout)(PHYSDEV,DWORD);
134 NULL_SetMapMode
, //INT (*pSetMapMode)(PHYSDEV,INT);
135 (PVOID
)NULL_Unused
, //DWORD (*pSetMapperFlags)(PHYSDEV,DWORD);
136 (PVOID
)NULL_Unused
, //COLORREF (*pSetPixel)(PHYSDEV,INT,INT,COLORREF);
137 (PVOID
)NULL_Unused
, //INT (*pSetPolyFillMode)(PHYSDEV,INT);
138 (PVOID
)NULL_Unused
, //INT (*pSetROP2)(PHYSDEV,INT);
139 (PVOID
)NULL_Unused
, //INT (*pSetRelAbs)(PHYSDEV,INT);
140 (PVOID
)NULL_Unused
, //INT (*pSetStretchBltMode)(PHYSDEV,INT);
141 (PVOID
)NULL_Unused
, //UINT (*pSetTextAlign)(PHYSDEV,UINT);
142 (PVOID
)NULL_Unused
, //INT (*pSetTextCharacterExtra)(PHYSDEV,INT);
143 (PVOID
)NULL_Unused
, //COLORREF (*pSetTextColor)(PHYSDEV,COLORREF);
144 (PVOID
)NULL_Unused
, //BOOL (*pSetTextJustification)(PHYSDEV,INT,INT);
145 NULL_SetViewportExtEx
, //BOOL (*pSetViewportExtEx)(PHYSDEV,INT,INT,SIZE*);
146 NULL_SetViewportOrgEx
, //BOOL (*pSetViewportOrgEx)(PHYSDEV,INT,INT,POINT*);
147 NULL_SetWindowExtEx
, //BOOL (*pSetWindowExtEx)(PHYSDEV,INT,INT,SIZE*);
148 NULL_SetWindowOrgEx
, //BOOL (*pSetWindowOrgEx)(PHYSDEV,INT,INT,POINT*);
149 (PVOID
)NULL_Unused
, //BOOL (*pSetWorldTransform)(PHYSDEV,const XFORM*);
150 (PVOID
)NULL_Unused
, //INT (*pStartDoc)(PHYSDEV,const DOCINFOW*);
151 (PVOID
)NULL_Unused
, //INT (*pStartPage)(PHYSDEV);
152 (PVOID
)NULL_Unused
, //BOOL (*pStretchBlt)(PHYSDEV,struct bitblt_coords*,PHYSDEV,struct bitblt_coords*,DWORD);
153 (PVOID
)NULL_Unused
, //INT (*pStretchDIBits)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT,const void*,BITMAPINFO*,UINT,DWORD);
154 (PVOID
)NULL_Unused
, //BOOL (*pStrokeAndFillPath)(PHYSDEV);
155 (PVOID
)NULL_Unused
, //BOOL (*pStrokePath)(PHYSDEV);
156 (PVOID
)NULL_Unused
, //BOOL (*pUnrealizePalette)(HPALETTE);
157 (PVOID
)NULL_Unused
, //BOOL (*pWidenPath)(PHYSDEV);
158 (PVOID
)NULL_Unused
, //struct opengl_funcs * (*wine_get_wgl_driver)(PHYSDEV,UINT);
167 /* Get the GDI object type */
170 case OBJ_PEN
: return GDILoObjType_LO_PEN_TYPE
;
171 case OBJ_BRUSH
: return GDILoObjType_LO_BRUSH_TYPE
;
172 case OBJ_DC
: return GDILoObjType_LO_DC_TYPE
;
173 case OBJ_METADC
: return GDILoObjType_LO_METADC16_TYPE
;
174 case OBJ_PAL
: return GDILoObjType_LO_PALETTE_TYPE
;
175 case OBJ_FONT
: return GDILoObjType_LO_FONT_TYPE
;
176 case OBJ_BITMAP
: return GDILoObjType_LO_BITMAP_TYPE
;
177 case OBJ_REGION
: return GDILoObjType_LO_REGION_TYPE
;
178 case OBJ_METAFILE
: return GDILoObjType_LO_METAFILE16_TYPE
;
179 case OBJ_MEMDC
: return GDILoObjType_LO_DC_TYPE
;
180 case OBJ_EXTPEN
: return GDILoObjType_LO_EXTPEN_TYPE
;
181 case OBJ_ENHMETADC
: return GDILoObjType_LO_ALTDC_TYPE
;
182 case OBJ_ENHMETAFILE
: return GDILoObjType_LO_METAFILE_TYPE
;
183 case OBJ_COLORSPACE
: return GDILoObjType_LO_ICMLCS_TYPE
;
192 const struct gdi_obj_funcs
*funcs
)
194 GDILOOBJTYPE eObjType
;
196 /* Get the GDI object type */
197 eObjType
= ConvertObjectType(wType
);
198 if ((eObjType
!= GDILoObjType_LO_METAFILE_TYPE
) &&
199 (eObjType
!= GDILoObjType_LO_METAFILE16_TYPE
) &&
200 (eObjType
!= GDILoObjType_LO_METADC16_TYPE
))
202 /* This is not supported! */
207 /* Insert the client object */
208 return GdiCreateClientObj(pvObject
, eObjType
);
212 free_gdi_handle(HGDIOBJ hobj
)
214 /* Should be a client object */
215 return GdiDeleteClientObj(hobj
);
223 GDILOOBJTYPE eObjType
;
225 /* Check if the object type matches */
226 eObjType
= ConvertObjectType(wType
);
227 if ((eObjType
== 0) || (GDI_HANDLE_GET_TYPE(hobj
) != eObjType
))
232 /* Check if we have an ALTDC */
233 if (eObjType
== GDILoObjType_LO_ALTDC_TYPE
)
235 /* Object is stored as LDC */
236 return GdiGetLDC(hobj
);
239 /* Check for client objects */
240 if ((eObjType
== GDILoObjType_LO_METAFILE_TYPE
) ||
241 (eObjType
== GDILoObjType_LO_METAFILE16_TYPE
) ||
242 (eObjType
== GDILoObjType_LO_METADC16_TYPE
))
244 return GdiGetClientObjLink(hobj
);
247 /* This should never happen! */
253 GDI_ReleaseObj(HGDIOBJ hobj
)
255 /* We don't do any reference-counting */
259 alloc_dc_ptr(WORD magic
)
263 /* Allocate the Wine DC */
264 pWineDc
= HeapAlloc(GetProcessHeap(), 0, sizeof(*pWineDc
));
270 ZeroMemory(pWineDc
, sizeof(*pWineDc
));
271 pWineDc
->refcount
= 1;
272 pWineDc
->hFont
= GetStockObject(SYSTEM_FONT
);
273 pWineDc
->hBrush
= GetStockObject(WHITE_BRUSH
);
274 pWineDc
->hPen
= GetStockObject(BLACK_PEN
);
275 pWineDc
->hPalette
= GetStockObject(DEFAULT_PALETTE
);
277 if (magic
== OBJ_ENHMETADC
)
279 /* We create a metafile DC, but we ignore the reference DC, this is
280 handled by the wine code */
281 pWineDc
->hdc
= NtGdiCreateMetafileDC(NULL
);
282 if (pWineDc
->hdc
== NULL
)
284 HeapFree(GetProcessHeap(), 0, pWineDc
);
288 /* Set the Wine DC as LDC */
289 GdiSetLDC(pWineDc
->hdc
, pWineDc
);
291 else if (magic
== OBJ_METADC
)
293 pWineDc
->hdc
= GdiCreateClientObj(pWineDc
, GDILoObjType_LO_METADC16_TYPE
);
294 if (pWineDc
->hdc
== NULL
)
296 HeapFree(GetProcessHeap(), 0, pWineDc
);
302 // nothing else supported!
306 pWineDc
->physDev
= &pWineDc
->NullPhysDev
;
307 pWineDc
->NullPhysDev
.funcs
= &DummyPhysDevFuncs
;
308 pWineDc
->NullPhysDev
.next
= NULL
;
310 pWineDc
->NullPhysDev
.hdc
= pWineDc
->hdc
;
315 free_dc_ptr(WINEDC
* pWineDc
)
317 /* Invoke the DeleteDC callback to clean up the DC */
318 pWineDc
->physDev
->funcs
->pDeleteDC(pWineDc
->physDev
);
321 if (GDI_HANDLE_GET_TYPE(pWineDc
->hdc
) == GDILoObjType_LO_ALTDC_TYPE
)
323 /* Get rid of the LDC */
324 ASSERT((WINEDC
*)GdiGetLDC(pWineDc
->hdc
) == pWineDc
);
325 GdiSetLDC(pWineDc
->hdc
, NULL
);
328 NtGdiDeleteObjectApp(pWineDc
->hdc
);
330 else if (GDI_HANDLE_GET_TYPE(pWineDc
->hdc
) == GDILoObjType_LO_METADC16_TYPE
)
332 GdiDeleteClientObj(pWineDc
->hdc
);
335 /* Free the Wine DC */
336 HeapFree(GetProcessHeap(), 0, pWineDc
);
342 /* Check for EMF DC */
343 if (GDI_HANDLE_GET_TYPE(hdc
) == GDILoObjType_LO_ALTDC_TYPE
)
345 /* The Wine DC is stored as the LDC */
346 return (WINEDC
*)GdiGetLDC(hdc
);
349 /* Check for METADC16 */
350 if (GDI_HANDLE_GET_TYPE(hdc
) == GDILoObjType_LO_METADC16_TYPE
)
352 return GdiGetClientObjLink(hdc
);
359 release_dc_ptr(WINEDC
* dc
)
361 /* We don't do any reference-counting */
368 const struct gdi_dc_funcs
*funcs
)
370 physdev
->funcs
= funcs
;
371 physdev
->next
= *dev
;
372 physdev
->hdc
= CONTAINING_RECORD(dev
, WINEDC
, physDev
)->hdc
;
377 GDI_hdc_using_object(
381 /* Record that we have an object in use by a METADC. We simply link the
382 object to the HDC that we use. Wine API does not give us a way to
383 respond to failure, so we silently ignore it */
384 if (!GdiCreateClientObjLink(hobj
, hdc
))
386 /* Ignore failure, and return */
387 DPRINT1("Failed to create link for selected METADC object.\n");
393 GDI_hdc_not_using_object(
399 /* Remove the HDC link for the object */
400 hdcLink
= GdiRemoveClientObjLink(hobj
);
401 ASSERT(hdcLink
== hdc
);
406 const BITMAPINFO
* info
,
414 get_brush_bitmap_info(
423 /* Call win32k to get the bitmap handle and color usage */
424 hbmp
= NtGdiGetObjectBitmapHandle(hbr
, puUsage
);
432 /* Initialize the BITMAPINFO */
433 ZeroMemory(pbmi
, sizeof(*pbmi
));
434 pbmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
436 /* Retrieve information about the bitmap */
437 if (!GetDIBits(hdc
, hbmp
, 0, 0, NULL
, pbmi
, *puUsage
))
440 /* Now allocate a buffer for the bits */
441 *ppvBits
= HeapAlloc(GetProcessHeap(), 0, pbmi
->bmiHeader
.biSizeImage
);
442 if (*ppvBits
== NULL
)
445 /* Retrieve the bitmap bits */
446 if (!GetDIBits(hdc
, hbmp
, 0, pbmi
->bmiHeader
.biHeight
, *ppvBits
, pbmi
, *puUsage
))
448 HeapFree(GetProcessHeap(), 0, *ppvBits
);
453 /* GetDIBits doesn't set biClrUsed, but wine code needs it, so we set it */
454 if (pbmi
->bmiHeader
.biBitCount
<= 8)
456 pbmi
->bmiHeader
.biClrUsed
= 1 << pbmi
->bmiHeader
.biBitCount
;
464 SetVirtualResolution(
466 DWORD cxVirtualDevicePixel
,
467 DWORD cyVirtualDevicePixel
,
468 DWORD cxVirtualDeviceMm
,
469 DWORD cyVirtualDeviceMm
)
471 return NtGdiSetVirtualResolution(hdc
,
472 cxVirtualDevicePixel
,
473 cyVirtualDevicePixel
,
483 return NtGdiDeleteColorSpace(hcs
);
488 SetWorldTransformForMetafile(
490 _Out_ CONST XFORM
*pxform
)
492 if (GDI_HANDLE_GET_TYPE(hdc
) == GDILoObjType_LO_METADC16_TYPE
)
495 //HANDLE_METADC(BOOL, ModifyWorldTransform, FALSE, hdc, pxform, MWT_SET);
496 /* Get the physdev */
497 physdev
= GetPhysDev(hdc
);
500 DPRINT1("Failed to get physdev for meta DC %p\n", hdc
);
504 physdev
->funcs
->pSetWorldTransform(physdev
, pxform
);
510 return SetWorldTransform(hdc
, pxform
);
532 /******************************************************************************/
537 struct bitblt_coords
*coords
,
546 coords
->log_width
= cx
;
547 coords
->log_height
= cy
;
548 coords
->layout
= GetLayout(hdc
);
558 pWineDc
= get_dc_ptr(hdc
);
564 return pWineDc
->physDev
;
570 _In_ PHYSDEV physdev
,
578 struct bitblt_coords coords
;
580 InitBitBltCoords(&coords
, hdc
, xLeft
, yTop
, cx
, cy
);
582 return physdev
->funcs
->pPatBlt(physdev
, &coords
, dwRop
);
588 _In_ PHYSDEV physdev
,
601 struct bitblt_coords coordsDst
, coordsSrc
;
602 struct gdi_physdev physdevSrc
= {0};
604 /* Source cannot be a metafile */
605 if (GDI_HANDLE_GET_TYPE(hdcSrc
) != GDILoObjType_LO_DC_TYPE
)
608 /* Source physdev uses only hdc and func */
609 physdevSrc
.hdc
= hdcSrc
;
611 InitBitBltCoords(&coordsDst
, hdcDst
, xDst
, yDst
, cxDst
, cyDst
);
612 InitBitBltCoords(&coordsSrc
, hdcSrc
, xSrc
, ySrc
, cxSrc
, cySrc
);
614 return physdev
->funcs
->pStretchBlt(physdev
, &coordsDst
, &physdevSrc
, &coordsSrc
, dwRop
);
619 DRIVER_RestoreDC(PHYSDEV physdev
, INT level
)
621 WINEDC
*pWineDc
= get_dc_ptr(physdev
->hdc
);
623 if (GDI_HANDLE_GET_TYPE(physdev
->hdc
) == GDILoObjType_LO_ALTDC_TYPE
)
625 /* The Restore DC function needs the save level to be set correctly.
626 Note that wine's level is 0 based, while our's is (like win) 1 based. */
627 pWineDc
->saveLevel
= GetDCDWord(physdev
->hdc
, GdiGetEMFRestorDc
, 0) - 1;
629 /* Fail if the level is not valid */
630 if ((abs(level
) > pWineDc
->saveLevel
) || (level
== 0))
634 return physdev
->funcs
->pRestoreDC(physdev
,level
);
639 DRIVER_SelectFont(PHYSDEV physdev
, HFONT hFont
, UINT
*aa_flags
)
641 WINEDC
*pWineDc
= get_dc_ptr(physdev
->hdc
);
644 if (!physdev
->funcs
->pSelectFont(physdev
, hFont
, aa_flags
))
647 hOldFont
= pWineDc
->hFont
;
648 pWineDc
->hFont
= hFont
;
654 DRIVER_SelectPen(PHYSDEV physdev
, HPEN hpen
, const struct brush_pattern
*pattern
)
656 WINEDC
*pWineDc
= get_dc_ptr(physdev
->hdc
);
659 if (!physdev
->funcs
->pSelectPen(physdev
, hpen
, pattern
))
662 hOldPen
= pWineDc
->hPen
;
663 pWineDc
->hPen
= hpen
;
669 DRIVER_SelectBrush(PHYSDEV physdev
, HBRUSH hbrush
, const struct brush_pattern
*pattern
)
671 WINEDC
*pWineDc
= get_dc_ptr(physdev
->hdc
);
674 if (!physdev
->funcs
->pSelectBrush(physdev
, hbrush
, pattern
))
677 hOldBrush
= pWineDc
->hBrush
;
678 pWineDc
->hBrush
= hbrush
;
685 _In_ PHYSDEV physdev
,
686 _In_ DCFUNC eFunction
,
691 /* Note that this is a hack that relies on some assumptions regarding the
692 Windows ABI. It relies on the fact that all vararg functions put their
693 parameters on the stack in the correct order. Additionally it relies
694 on the fact that none of the functions we handle here, pass any 64
695 bit arguments on a 32 bit architecture. */
696 #define _va_arg_n(p,t,i) (*(t*)((intptr_t*)(p) + i))
700 case DCFUNC_AbortPath
:
701 return physdev
->funcs
->pAbortPath(physdev
);
703 return physdev
->funcs
->pArc(physdev
,
704 _va_arg_n(argptr
, INT
, 0), // left
705 _va_arg_n(argptr
, INT
, 1), // top
706 _va_arg_n(argptr
, INT
, 2), // right
707 _va_arg_n(argptr
, INT
, 3), // bottom
708 _va_arg_n(argptr
, INT
, 4), // xstart
709 _va_arg_n(argptr
, INT
, 5), // ystart
710 _va_arg_n(argptr
, INT
, 6), // xend
711 _va_arg_n(argptr
, INT
, 7)); // yend
712 case DCFUNC_BeginPath
:
713 return physdev
->funcs
->pBeginPath(physdev
);
715 return physdev
->funcs
->pChord(physdev
,
716 _va_arg_n(argptr
, INT
, 0),
717 _va_arg_n(argptr
, INT
, 1),
718 _va_arg_n(argptr
, INT
, 2),
719 _va_arg_n(argptr
, INT
, 3),
720 _va_arg_n(argptr
, INT
, 4),
721 _va_arg_n(argptr
, INT
, 5),
722 _va_arg_n(argptr
, INT
, 6),
723 _va_arg_n(argptr
, INT
, 7));
724 case DCFUNC_CloseFigure
:
725 return physdev
->funcs
->pCloseFigure(physdev
);
727 return physdev
->funcs
->pEllipse(physdev
,
728 _va_arg_n(argptr
, INT
, 0),
729 _va_arg_n(argptr
, INT
, 1),
730 _va_arg_n(argptr
, INT
, 2),
731 _va_arg_n(argptr
, INT
, 3));
733 return physdev
->funcs
->pEndPath(physdev
);
734 case DCFUNC_ExcludeClipRect
:
735 return physdev
->funcs
->pExcludeClipRect(physdev
,
736 _va_arg_n(argptr
, INT
, 0),
737 _va_arg_n(argptr
, INT
, 1),
738 _va_arg_n(argptr
, INT
, 2),
739 _va_arg_n(argptr
, INT
, 3));
740 case DCFUNC_ExtEscape
:
741 ASSERT(physdev
->funcs
->pExtEscape
!= NULL
);
742 return physdev
->funcs
->pExtEscape(physdev
,
743 _va_arg_n(argptr
, INT
, 0),
744 _va_arg_n(argptr
, INT
, 1),
745 _va_arg_n(argptr
, LPCVOID
, 2),
746 _va_arg_n(argptr
, INT
, 3),
747 _va_arg_n(argptr
, LPVOID
, 4));
748 case DCFUNC_ExtFloodFill
:
749 return physdev
->funcs
->pExtFloodFill(physdev
,
750 _va_arg_n(argptr
, INT
, 0),
751 _va_arg_n(argptr
, INT
, 1),
752 _va_arg_n(argptr
, COLORREF
, 2),
753 _va_arg_n(argptr
, UINT
, 3));
754 case DCFUNC_ExtSelectClipRgn
:
755 return physdev
->funcs
->pExtSelectClipRgn(physdev
,
756 _va_arg_n(argptr
, HRGN
, 0), // hrgn
757 _va_arg_n(argptr
, INT
, 1)); // iMode
758 case DCFUNC_ExtTextOut
:
759 return physdev
->funcs
->pExtTextOut(physdev
,
760 _va_arg_n(argptr
, INT
, 0),// x
761 _va_arg_n(argptr
, INT
, 1),// y
762 _va_arg_n(argptr
, UINT
, 2),// fuOptions
763 _va_arg_n(argptr
, const RECT
*, 3),// lprc,
764 _va_arg_n(argptr
, LPCWSTR
, 4),// lpString,
765 _va_arg_n(argptr
, UINT
, 5),// cchString,
766 _va_arg_n(argptr
, const INT
*, 6));// lpDx);
767 case DCFUNC_FillPath
:
768 return physdev
->funcs
->pFillPath(physdev
);
770 return physdev
->funcs
->pFillRgn(physdev
,
771 _va_arg_n(argptr
, HRGN
, 0),
772 _va_arg_n(argptr
, HBRUSH
, 1));
773 case DCFUNC_FlattenPath
:
774 return physdev
->funcs
->pFlattenPath(physdev
);
775 case DCFUNC_FrameRgn
:
776 return physdev
->funcs
->pFrameRgn(physdev
,
777 _va_arg_n(argptr
, HRGN
, 0),
778 _va_arg_n(argptr
, HBRUSH
, 1),
779 _va_arg_n(argptr
, INT
, 2),
780 _va_arg_n(argptr
, INT
, 3));
781 case DCFUNC_GetDeviceCaps
:
782 return physdev
->funcs
->pGetDeviceCaps(physdev
, va_arg(argptr
, INT
));
783 case DCFUNC_GdiComment
:
784 return physdev
->funcs
->pGdiComment(physdev
,
785 _va_arg_n(argptr
, UINT
, 0),
786 _va_arg_n(argptr
, const BYTE
*, 1));
787 case DCFUNC_IntersectClipRect
:
788 return physdev
->funcs
->pIntersectClipRect(physdev
,
789 _va_arg_n(argptr
, INT
, 0),
790 _va_arg_n(argptr
, INT
, 1),
791 _va_arg_n(argptr
, INT
, 2),
792 _va_arg_n(argptr
, INT
, 3));
793 case DCFUNC_InvertRgn
:
794 return physdev
->funcs
->pInvertRgn(physdev
,
795 va_arg(argptr
, HRGN
));
797 return physdev
->funcs
->pLineTo(physdev
,
798 _va_arg_n(argptr
, INT
, 0),
799 _va_arg_n(argptr
, INT
, 1));
800 case DCFUNC_ModifyWorldTransform
:
801 return physdev
->funcs
->pModifyWorldTransform(physdev
,
802 _va_arg_n(argptr
, const XFORM
*, 0),
803 _va_arg_n(argptr
, DWORD
, 1));
805 return physdev
->funcs
->pMoveTo(physdev
,
806 _va_arg_n(argptr
, INT
, 0),
807 _va_arg_n(argptr
, INT
, 1));
808 case DCFUNC_OffsetClipRgn
:
809 return physdev
->funcs
->pOffsetClipRgn(physdev
,
810 _va_arg_n(argptr
, INT
, 0), // hrgn
811 _va_arg_n(argptr
, INT
, 1)); // iMode
812 case DCFUNC_OffsetViewportOrgEx
:
813 return physdev
->funcs
->pOffsetViewportOrgEx(physdev
,
814 _va_arg_n(argptr
, INT
, 0), // X
815 _va_arg_n(argptr
, INT
, 1), // Y
816 _va_arg_n(argptr
, LPPOINT
, 2)); // lpPoint
817 case DCFUNC_OffsetWindowOrgEx
:
818 return physdev
->funcs
->pOffsetWindowOrgEx(physdev
,
819 _va_arg_n(argptr
, INT
, 0), // X
820 _va_arg_n(argptr
, INT
, 1), // Y
821 _va_arg_n(argptr
, LPPOINT
, 2)); // lpPoint
823 return DRIVER_PatBlt(physdev
,
825 _va_arg_n(argptr
, INT
, 0),
826 _va_arg_n(argptr
, INT
, 1),
827 _va_arg_n(argptr
, INT
, 2),
828 _va_arg_n(argptr
, INT
, 3),
829 _va_arg_n(argptr
, DWORD
, 4));
831 return physdev
->funcs
->pPie(physdev
,
832 _va_arg_n(argptr
, INT
, 0),
833 _va_arg_n(argptr
, INT
, 1),
834 _va_arg_n(argptr
, INT
, 2),
835 _va_arg_n(argptr
, INT
, 3),
836 _va_arg_n(argptr
, INT
, 4),
837 _va_arg_n(argptr
, INT
, 5),
838 _va_arg_n(argptr
, INT
, 6),
839 _va_arg_n(argptr
, INT
, 7));
840 case DCFUNC_PolyBezier
:
841 return physdev
->funcs
->pPolyBezier(physdev
,
842 _va_arg_n(argptr
, const POINT
*, 0),
843 _va_arg_n(argptr
, DWORD
, 1));
844 case DCFUNC_PolyBezierTo
:
845 return physdev
->funcs
->pPolyBezierTo(physdev
,
846 _va_arg_n(argptr
, const POINT
*, 0),
847 _va_arg_n(argptr
, DWORD
, 1));
848 case DCFUNC_PolyDraw
:
849 DPRINT1("DCFUNC_PolyDraw not implemented\n");;
851 return physdev
->funcs
->pPolyDraw(physdev
,
852 _va_arg_n(argptr
, const POINT
*, 1),
853 _va_arg_n(argptr
, const BYTE
*, 1),
854 _va_arg_n(argptr
, DWORD
, 2));
856 return physdev
->funcs
->pPolygon(physdev
,
857 _va_arg_n(argptr
, const POINT
*, 0),
858 _va_arg_n(argptr
, INT
, 1));
859 case DCFUNC_Polyline
:
860 return physdev
->funcs
->pPolyline(physdev
,
861 _va_arg_n(argptr
, const POINT
*, 0),
862 _va_arg_n(argptr
, INT
, 1));
863 case DCFUNC_PolylineTo
:
864 DPRINT1("DCFUNC_PolylineTo not implemented\n");;
866 return physdev
->funcs
->pPolylineTo(physdev
,
867 _va_arg_n(argptr
, const POINT
*, 0),
868 _va_arg_n(argptr
, INT
, 1));
869 case DCFUNC_PolyPolygon
:
870 return physdev
->funcs
->pPolyPolygon(physdev
,
871 _va_arg_n(argptr
, const POINT
*, 0),
872 _va_arg_n(argptr
, const INT
*, 1),
873 _va_arg_n(argptr
, DWORD
, 2));
874 case DCFUNC_PolyPolyline
:
875 return physdev
->funcs
->pPolyPolyline(physdev
,
876 _va_arg_n(argptr
, const POINT
*, 0),
877 _va_arg_n(argptr
, const DWORD
*, 1),
878 _va_arg_n(argptr
, DWORD
, 2));
879 case DCFUNC_RealizePalette
:
880 if (GDI_HANDLE_GET_TYPE(physdev
->hdc
) != GDILoObjType_LO_METADC16_TYPE
)
885 return physdev
->funcs
->pRealizePalette(physdev
, NULL
, FALSE
);
886 case DCFUNC_Rectangle
:
887 return physdev
->funcs
->pRectangle(physdev
,
888 _va_arg_n(argptr
, INT
, 0),
889 _va_arg_n(argptr
, INT
, 1),
890 _va_arg_n(argptr
, INT
, 2),
891 _va_arg_n(argptr
, INT
, 3));
892 case DCFUNC_RestoreDC
:
893 return DRIVER_RestoreDC(physdev
, va_arg(argptr
, INT
));
894 case DCFUNC_RoundRect
:
895 return physdev
->funcs
->pRoundRect(physdev
,
896 _va_arg_n(argptr
, INT
, 0),
897 _va_arg_n(argptr
, INT
, 1),
898 _va_arg_n(argptr
, INT
, 2),
899 _va_arg_n(argptr
, INT
, 3),
900 _va_arg_n(argptr
, INT
, 4),
901 _va_arg_n(argptr
, INT
, 5));
904 return physdev
->funcs
->pSaveDC(physdev
);
905 case DCFUNC_ScaleViewportExtEx
:
906 return physdev
->funcs
->pScaleViewportExtEx(physdev
,
907 _va_arg_n(argptr
, INT
, 0), // xNum
908 _va_arg_n(argptr
, INT
, 1), // xDenom
909 _va_arg_n(argptr
, INT
, 2), // yNum
910 _va_arg_n(argptr
, INT
, 3), // yDenom
911 _va_arg_n(argptr
, LPSIZE
, 4)); // lpSize
912 case DCFUNC_ScaleWindowExtEx
:
913 return physdev
->funcs
->pScaleWindowExtEx(physdev
,
914 _va_arg_n(argptr
, INT
, 0), // xNum
915 _va_arg_n(argptr
, INT
, 1), // xDenom
916 _va_arg_n(argptr
, INT
, 2), // yNum
917 _va_arg_n(argptr
, INT
, 3), // yDenom
918 _va_arg_n(argptr
, LPSIZE
, 4)); // lpSize
919 case DCFUNC_SelectBrush
:
920 return (DWORD_PTR
)DRIVER_SelectBrush(physdev
, va_arg(argptr
, HBRUSH
), NULL
);
921 case DCFUNC_SelectClipPath
:
922 return physdev
->funcs
->pSelectClipPath(physdev
, va_arg(argptr
, INT
));
923 case DCFUNC_SelectFont
:
924 return (DWORD_PTR
)DRIVER_SelectFont(physdev
, va_arg(argptr
, HFONT
), &aa_flags
);
925 case DCFUNC_SelectPalette
:
926 return (DWORD_PTR
)physdev
->funcs
->pSelectPalette(physdev
,
927 _va_arg_n(argptr
, HPALETTE
, 0),
928 _va_arg_n(argptr
, BOOL
, 1));
929 case DCFUNC_SelectPen
:
930 return (DWORD_PTR
)DRIVER_SelectPen(physdev
, va_arg(argptr
, HPEN
), NULL
);
931 case DCFUNC_SetDCBrushColor
:
932 return physdev
->funcs
->pSetDCBrushColor(physdev
, va_arg(argptr
, COLORREF
));
933 case DCFUNC_SetDCPenColor
:
934 return physdev
->funcs
->pSetDCPenColor(physdev
, va_arg(argptr
, COLORREF
));
935 case DCFUNC_SetDIBitsToDevice
:
936 return physdev
->funcs
->pSetDIBitsToDevice(physdev
,
937 _va_arg_n(argptr
, INT
, 0),
938 _va_arg_n(argptr
, INT
, 1),
939 _va_arg_n(argptr
, DWORD
, 2),
940 _va_arg_n(argptr
, DWORD
, 3),
941 _va_arg_n(argptr
, INT
, 4),
942 _va_arg_n(argptr
, INT
, 5),
943 _va_arg_n(argptr
, UINT
, 6),
944 _va_arg_n(argptr
, UINT
, 7),
945 _va_arg_n(argptr
, LPCVOID
, 8),
946 _va_arg_n(argptr
, BITMAPINFO
*, 9),
947 _va_arg_n(argptr
, UINT
, 10));
948 case DCFUNC_SetBkColor
:
949 return physdev
->funcs
->pSetBkColor(physdev
, va_arg(argptr
, COLORREF
));
950 case DCFUNC_SetBkMode
:
951 return physdev
->funcs
->pSetBkMode(physdev
, va_arg(argptr
, INT
));
952 case DCFUNC_SetLayout
:
953 // FIXME: MF16 is UNIMPLEMENTED
954 return physdev
->funcs
->pSetLayout(physdev
,
955 _va_arg_n(argptr
, DWORD
, 0));
956 //case DCFUNC_SetMapMode:
957 // return physdev->funcs->pSetMapMode(physdev, va_arg(argptr, INT));
958 case DCFUNC_SetPixel
:
959 return physdev
->funcs
->pSetPixel(physdev
,
960 _va_arg_n(argptr
, INT
, 0),
961 _va_arg_n(argptr
, INT
, 1),
962 _va_arg_n(argptr
, COLORREF
, 2));
963 case DCFUNC_SetPolyFillMode
:
964 return physdev
->funcs
->pSetPolyFillMode(physdev
, va_arg(argptr
, INT
));
966 return physdev
->funcs
->pSetROP2(physdev
, va_arg(argptr
, INT
));
967 case DCFUNC_SetStretchBltMode
:
968 return physdev
->funcs
->pSetStretchBltMode(physdev
, va_arg(argptr
, INT
));
969 case DCFUNC_SetTextAlign
:
970 return physdev
->funcs
->pSetTextAlign(physdev
, va_arg(argptr
, UINT
));
971 case DCFUNC_SetTextCharacterExtra
:
972 return physdev
->funcs
->pSetTextCharacterExtra(physdev
, va_arg(argptr
, INT
));
973 case DCFUNC_SetTextColor
:
974 return physdev
->funcs
->pSetTextColor(physdev
, va_arg(argptr
, COLORREF
));
975 case DCFUNC_SetTextJustification
:
976 return physdev
->funcs
->pSetTextJustification(physdev
,
977 _va_arg_n(argptr
, INT
, 0),
978 _va_arg_n(argptr
, INT
, 1));
979 case DCFUNC_SetViewportExtEx
:
980 return physdev
->funcs
->pSetViewportExtEx(physdev
,
981 _va_arg_n(argptr
, INT
, 0), // nXExtent
982 _va_arg_n(argptr
, INT
, 1), // nYExtent
983 _va_arg_n(argptr
, LPSIZE
, 2)); // lpSize
984 case DCFUNC_SetViewportOrgEx
:
985 return physdev
->funcs
->pSetViewportOrgEx(physdev
,
986 _va_arg_n(argptr
, INT
, 0), // X
987 _va_arg_n(argptr
, INT
, 1), // Y
988 _va_arg_n(argptr
, LPPOINT
, 2)); // lpPoint
989 case DCFUNC_SetWindowExtEx
:
990 return physdev
->funcs
->pSetWindowExtEx(physdev
,
991 _va_arg_n(argptr
, INT
, 0), // nXExtent
992 _va_arg_n(argptr
, INT
, 1), // nYExtent
993 _va_arg_n(argptr
, LPSIZE
, 2)); // lpSize
994 case DCFUNC_SetWindowOrgEx
:
995 return physdev
->funcs
->pSetWindowOrgEx(physdev
,
996 _va_arg_n(argptr
, INT
, 0), // X
997 _va_arg_n(argptr
, INT
, 1), // Y
998 _va_arg_n(argptr
, LPPOINT
, 2)); // lpPoint
999 case DCFUNC_StretchBlt
:
1000 return DRIVER_StretchBlt(physdev
,
1002 _va_arg_n(argptr
, INT
, 0),
1003 _va_arg_n(argptr
, INT
, 1),
1004 _va_arg_n(argptr
, INT
, 2),
1005 _va_arg_n(argptr
, INT
, 3),
1006 _va_arg_n(argptr
, HDC
, 4),
1007 _va_arg_n(argptr
, INT
, 5),
1008 _va_arg_n(argptr
, INT
, 6),
1009 _va_arg_n(argptr
, INT
, 7),
1010 _va_arg_n(argptr
, INT
, 8),
1011 _va_arg_n(argptr
, DWORD
, 9));
1012 case DCFUNC_StrokeAndFillPath
:
1013 return physdev
->funcs
->pStrokeAndFillPath(physdev
);
1014 case DCFUNC_StrokePath
:
1015 return physdev
->funcs
->pStrokePath(physdev
);
1016 case DCFUNC_WidenPath
:
1017 return physdev
->funcs
->pWidenPath(physdev
);
1020 /* These are not implemented in wine */
1021 case DCFUNC_AlphaBlend
:
1022 case DCFUNC_AngleArc
:
1024 case DCFUNC_GradientFill
:
1025 case DCFUNC_MaskBlt
:
1026 case DCFUNC_PathToRegion
:
1028 case DCFUNC_TransparentBlt
:
1040 _In_ DCFUNC eFunction
,
1041 _Out_ PDWORD_PTR pdwResult
,
1042 _In_ DWORD_PTR dwError
,
1049 /* Handle only METADC16 and ALTDC */
1050 if ((GDI_HANDLE_GET_TYPE(hdc
) != GDILoObjType_LO_ALTDC_TYPE
) &&
1051 (GDI_HANDLE_GET_TYPE(hdc
) != GDILoObjType_LO_METADC16_TYPE
))
1053 /* Let the caller handle it */
1057 physdev
= GetPhysDev(hdc
);
1058 if (physdev
== NULL
)
1060 SetLastError(ERROR_INVALID_HANDLE
);
1061 *pdwResult
= dwError
;
1065 va_start(argptr
, hdc
);
1066 *pdwResult
= DRIVER_Dispatch(physdev
, eFunction
, argptr
);
1069 /* Return TRUE to indicate that we want to return from the parent */
1070 return ((GDI_HANDLE_GET_TYPE(hdc
) == GDILoObjType_LO_METADC16_TYPE
) ||
1071 (*pdwResult
== dwError
));
1076 METADC_GetAndSetDCDWord(
1077 _Out_ DWORD
* pdwResult
,
1079 _In_ UINT uFunction
,
1082 _In_ USHORT usMF16Id
,
1087 /* Ignore these, we let wine code handle this */
1088 UNREFERENCED_PARAMETER(ulMFId
);
1089 UNREFERENCED_PARAMETER(usMF16Id
);
1091 physdev
= GetPhysDev(hdc
);
1092 if (physdev
== NULL
)
1094 SetLastError(ERROR_INVALID_HANDLE
);
1095 *pdwResult
= dwError
;
1099 /* Check the function */
1102 case GdiGetSetMapMode
:
1103 *pdwResult
= physdev
->funcs
->pSetMapMode(physdev
, dwIn
);
1106 case GdiGetSetArcDirection
:
1107 if (GDI_HANDLE_GET_TYPE(physdev
->hdc
) == GDILoObjType_LO_METADC16_TYPE
)
1110 *pdwResult
= physdev
->funcs
->pSetArcDirection(physdev
, dwIn
);
1113 case GdiGetSetRelAbs
:
1114 if (GDI_HANDLE_GET_TYPE(physdev
->hdc
) == GDILoObjType_LO_METADC16_TYPE
)
1115 *pdwResult
= physdev
->funcs
->pSetRelAbs(physdev
, dwIn
);
1128 /* Return TRUE to indicate that we want to return from the parent */
1129 return ((GDI_HANDLE_GET_TYPE(hdc
) == GDILoObjType_LO_METADC16_TYPE
) ||
1130 (*pdwResult
== dwError
));
1135 METADC_DeleteObject(HGDIOBJ hobj
)
1137 GDILOOBJTYPE eObjectType
;
1141 /* Check for one of the types we actually handle here */
1142 eObjectType
= GDI_HANDLE_GET_TYPE(hobj
);
1143 if ((eObjectType
!= GDILoObjType_LO_BRUSH_TYPE
) &&
1144 (eObjectType
!= GDILoObjType_LO_PEN_TYPE
) &&
1145 (eObjectType
!= GDILoObjType_LO_EXTPEN_TYPE
) &&
1146 (eObjectType
!= GDILoObjType_LO_PALETTE_TYPE
) &&
1147 (eObjectType
!= GDILoObjType_LO_FONT_TYPE
))
1152 /* Check if we have a client object link and remove it if it was found.
1153 The link is the HDC that the object was selected into. */
1154 hdc
= GdiRemoveClientObjLink(hobj
);
1157 /* The link was not found, so we are not handling this object here */
1161 /* Get the physdev */
1162 physdev
= GetPhysDev(hdc
);
1163 if (physdev
== NULL
)
1165 /* This happens, when the METADC is already closed, when we delete
1166 the object. Simply ignore it */
1167 DPRINT1("METADC was already closed, cannot delete object. Ignoring.\n");
1171 physdev
->funcs
->pDeleteObject(physdev
, hobj
);
1179 /* Only ALTDCs are supported */
1180 if (GDI_HANDLE_GET_TYPE(hdc
) != GDILoObjType_LO_ALTDC_TYPE
)
1182 DPRINT1("Trying to delete METADC %p\n", hdc
);
1185 // FIXME call the driver?
1186 return NtGdiDeleteObjectApp(hdc
);
1195 _In_ LPCSTR lpvInData
,
1196 _Out_ LPVOID lpvOutData
)
1200 /* Do not record MFCOMMENT */
1201 if (nEscape
== MFCOMMENT
)
1203 // HACK required by wine code...
1207 METADC_Dispatch(DCFUNC_ExtEscape
,
1216 return (INT
)dwResult
;