15#define DIRTY_DEFAULT DIRTY_CHARSET|DIRTY_BACKGROUND|DIRTY_TEXT|DIRTY_LINE|DIRTY_FILL
45#define gmxWorldToDeviceDefault gmxWorldToPageDefault
46#define gmxDeviceToWorldDefault gmxWorldToPageDefault
82 DPRINT1(
"Could not allocate a DC.\n");
89 pdc->pdcattr = &pdc->dcattr;
94 DPRINT1(
"Could not insert DC into handle table.\n");
124 ASSERT(pdc->dclevel.ppal);
135 pdc->dctype = dctype;
137 pdc->dhpdev = ppdev->
dhpdev;
144 pdc->pdcattr = &pdc->dcattr;
145 pdc->dcattr.pvLDC =
NULL;
154 pdc->dclevel.sizl.cx = 1;
155 pdc->dclevel.sizl.cy = 1;
165 pdc->erclWindow.left = 0;
166 pdc->erclWindow.top = 0;
167 pdc->erclWindow.right = pdc->dclevel.sizl.cx;
168 pdc->erclWindow.bottom = pdc->dclevel.sizl.cy;
175 pdc->erclBounds.left = 0x7fffffff;
176 pdc->erclBounds.top = 0x7fffffff;
177 pdc->erclBounds.right = 0x80000000;
178 pdc->erclBounds.bottom = 0x80000000;
179 pdc->erclBoundsApp.left = 0xffffffff;
180 pdc->erclBoundsApp.top = 0xfffffffc;
181 pdc->erclBoundsApp.right = 0x00007ffc;
182 pdc->erclBoundsApp.bottom = 0x00000333;
183 pdc->erclClip = pdc->erclBounds;
189 pdc->dclevel.pSurface =
NULL;
191 pdc->erclBounds.left = 0;
192 pdc->erclBounds.top = 0;
193 pdc->erclBounds.right = 0;
194 pdc->erclBounds.bottom = 0;
195 pdc->erclBoundsApp = pdc->erclBounds;
196 pdc->erclClip = pdc->erclWindow;
206 pdc->dclevel.efM11PtoD =
gef16;
207 pdc->dclevel.efM22PtoD =
gef16;
208 pdc->dclevel.efDxPtoD =
gef0;
209 pdc->dclevel.efDyPtoD =
gef0;
210 pdc->dclevel.efM11_TWIPS =
gef0;
211 pdc->dclevel.efM22_TWIPS =
gef0;
212 pdc->dclevel.efPr11 =
gef0;
213 pdc->dclevel.efPr22 =
gef0;
214 pdc->dcattr.mxWorldToDevice = pdc->dclevel.mxWorldToDevice;
215 pdc->dcattr.mxDeviceToWorld = pdc->dclevel.mxDeviceToWorld;
216 pdc->dcattr.mxWorldToPage = pdc->dclevel.mxWorldToPage;
217 pdc->dcattr.efM11PtoD = pdc->dclevel.efM11PtoD;
218 pdc->dcattr.efM22PtoD = pdc->dclevel.efM22PtoD;
219 pdc->dcattr.efDxPtoD = pdc->dclevel.efDxPtoD;
220 pdc->dcattr.efDyPtoD = pdc->dclevel.efDyPtoD;
221 pdc->dcattr.iMapMode =
MM_TEXT;
222 pdc->dcattr.dwLayout = 0;
228 pdc->ptlDCOrig.x = 0;
229 pdc->ptlDCOrig.y = 0;
230 pdc->dcattr.lWindowOrgx = 0;
231 pdc->dcattr.ptlWindowOrg.x = 0;
232 pdc->dcattr.ptlWindowOrg.y = 0;
233 pdc->dcattr.szlWindowExt.cx = 1;
234 pdc->dcattr.szlWindowExt.cy = 1;
235 pdc->dcattr.ptlViewportOrg.x = 0;
236 pdc->dcattr.ptlViewportOrg.y = 0;
237 pdc->dcattr.szlViewportExt.cx = 1;
238 pdc->dcattr.szlViewportExt.cy = 1;
243 pdc->dcattr.szlVirtualDeviceSize.cx = 0;
244 pdc->dcattr.szlVirtualDeviceSize.cy = 0;
249 pdc->dclevel.prgnClip =
NULL;
250 pdc->dclevel.prgnMeta =
NULL;
266 pdc->dclevel.hPath =
NULL;
267 pdc->dclevel.flPath = 0;
271 pdc->dcattr.crBackgroundClr =
RGB(0xff, 0xff, 0xff);
272 pdc->dcattr.ulBackgroundClr =
RGB(0xff, 0xff, 0xff);
273 pdc->dcattr.crForegroundClr =
RGB(0, 0, 0);
274 pdc->dcattr.ulForegroundClr =
RGB(0, 0, 0);
275 pdc->dcattr.crBrushClr =
RGB(0xff, 0xff, 0xff);
276 pdc->dcattr.ulBrushClr =
RGB(0xff, 0xff, 0xff);
277 pdc->dcattr.crPenClr =
RGB(0, 0, 0);
278 pdc->dcattr.ulPenClr =
RGB(0, 0, 0);
285 pdc->dclevel.ptlBrushOrigin.x = 0;
286 pdc->dclevel.ptlBrushOrigin.y = 0;
287 pdc->dcattr.ptlBrushOrigin = pdc->dclevel.ptlBrushOrigin;
297 pdc->dcattr.jBkMode = 2;
298 pdc->dcattr.lBkMode = 2;
300 pdc->dcattr.lFillMode = 1;
301 pdc->dcattr.jStretchBltMode = 1;
302 pdc->dcattr.lStretchBltMode = 1;
303 pdc->ptlFillOrigin.x = 0;
304 pdc->ptlFillOrigin.y = 0;
307 pdc->dcattr.ptlCurrent.x = 0;
308 pdc->dcattr.ptlCurrent.y = 0;
309 pdc->dcattr.ptfxCurrent.x = 0;
310 pdc->dcattr.ptfxCurrent.y = 0;
313 pdc->dclevel.lIcmMode = 0;
314 pdc->dcattr.lIcmMode = 0;
315 pdc->dcattr.hcmXform =
NULL;
316 pdc->dcattr.flIcmFlags = 0;
319 pdc->dcattr.pvLIcm =
NULL;
320 pdc->dcattr.hColorSpace =
NULL;
321 pdc->dclevel.pColorSpace =
NULL;
322 pdc->pClrxFormLnk =
NULL;
326 pdc->hlfntCur =
NULL;
327 pdc->pPFFList =
NULL;
328 pdc->flSimulationFlags = 0;
329 pdc->lEscapement = 0;
331 pdc->dcattr.flFontMapper = 0;
332 pdc->dcattr.flTextAlign = 0;
333 pdc->dcattr.lTextAlign = 0;
334 pdc->dcattr.lTextExtra = 0;
335 pdc->dcattr.lRelAbs = 1;
336 pdc->dcattr.lBreakExtra = 0;
337 pdc->dcattr.cBreak = 0;
345 pdc->ulCopyCount = -1;
346 pdc->ptlDoBanding.x = 0;
347 pdc->ptlDoBanding.y = 0;
348 pdc->dclevel.lSaveDepth = 1;
349 pdc->dclevel.hdcSave =
NULL;
351 pdc->dcattr.iCS_CP = 0;
352 pdc->pSurfInfo =
NULL;
359 PDC pdc = (
PDC)ObjectBody;
380 if (pdc->dclevel.plfnt)
384 if (pdc->dclevel.prgnClip)
386 if (pdc->dclevel.prgnMeta)
398 if (pdc->dclevel.hPath)
400 DPRINT(
"DC_vCleanup Path\n");
402 pdc->dclevel.hPath = 0;
403 pdc->dclevel.flPath = 0;
405 if (pdc->dclevel.pSurface)
419 if (pdc->dclevel.hPath)
440 if (pdc->pdcattr != &pdc->dcattr)
445 if (pdc->pdcattr == &pdc->dcattr)
462 DPRINT1(
"GreSetDCOwner: Could not lock DC\n");
480 pdc->dhpdev = ppdev->
dhpdev;
511 PDC pdcFirst, pdcSecond;
512 const RECT *prcFirst, *prcSecond;
525 if((
ULONG_PTR)pdcDest->ppdev->hsemDevLock >=
558 if (pdcFirst->ppdev->pSurface != pdcFirst->dclevel.pSurface)
567 prcFirst = &pdcFirst->erclClip;
577 pdcFirst->fs |= DC_PREPARED;
589 if (pdcSecond->ppdev->pSurface != pdcSecond->dclevel.pSurface)
598 prcSecond = &pdcSecond->erclClip;
607 pdcSecond->fs |= DC_PREPARED;
622 pdc1->fs &= ~DC_PREPARED;
633 pdc2->fs &= ~DC_PREPARED;
654 DPRINT(
"GreOpenDCW(%S, iType=%lu)\n",
661 DPRINT1(
"Didn't find a suitable PDEV\n");
665 DPRINT(
"GreOpenDCW - ppdev = %p\n", ppdev);
670 DPRINT1(
"Could not Allocate a DC\n");
674 hdc = pdc->BaseObject.hHmgr;
678 if (pUMdhpdev) *pUMdhpdev = ppdev->
dhpdev;
708 WORD dmSize, dmDriverExtra;
716 RtlInitEmptyUnicodeString(&ustrDevice, awcDevice,
sizeof(awcDevice));
722 ProbeForRead(pustrDevice->Buffer, pustrDevice->Length, 1);
732 dmSize = pdmInit->dmSize;
733 dmDriverExtra = pdmInit->dmDriverExtra;
734 Size = dmSize + dmDriverExtra;
741 pdmAllocated->dmSize = dmSize;
742 pdmAllocated->dmDriverExtra = dmDriverExtra;
786 pUMdhpdev ? &dhpdev :
NULL);
789 if (
hdc && pUMdhpdev)
795 *(
HANDLE*)pUMdhpdev = dhpdev;
824 DPRINT(
"NtGdiCreateCompatibleDC(0x%p)\n",
hdc);
833 DPRINT1(
"Could not lock source DC %p\n",
hdc);
852 DPRINT1(
"Didn't find a suitable PDEV\n");
861 DPRINT1(
"Could not allocate a new DC\n");
865 hdcNew = pdcNew->BaseObject.hHmgr;
877 DPRINT(
"Leave NtGdiCreateCompatibleDC hdcNew = %p\n", hdcNew);
896 if (DCToDelete ==
NULL)
917 DPRINT1(
"No, you naughty application!\n");
941 DPRINT1(
"Attempted to Delete 0x%p currently being destroyed!!!\n",
hDC);
985 pdc->dclevel.pSurface =
NULL;
989 if (
sizl.cx == pdc->dclevel.sizl.cx &&
990 sizl.cy == pdc->dclevel.sizl.cy )
993 pdc->dclevel.sizl.cx =
sizl.cx;
994 pdc->dclevel.sizl.cy =
sizl.cy;
1002 pdc->fs &= ~DC_TEMPINFODC;
1005 pdc->pSurfInfo =
NULL;
1008 (
pSurface->SurfObj.sizlBitmap.cx == pdc->dclevel.sizl.cx &&
1009 pSurface->SurfObj.sizlBitmap.cy == pdc->dclevel.sizl.cy) )
1012 pdc->dclevel.sizl.cx =
pSurface->SurfObj.sizlBitmap.cx;
1013 pdc->dclevel.sizl.cy =
pSurface->SurfObj.sizlBitmap.cy;
#define UlongToHandle(ul)
_Inout_ PVCB _In_ BOOLEAN Force
VOID FASTCALL CLIPPING_UpdateGCRegion(PDC pDC)
VOID FASTCALL GdiSelectVisRgn(HDC hdc, PREGION prgn)
VOID FASTCALL UpdateVisRgn(PDC pdc)
FORCEINLINE VOID DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
BOOL FASTCALL IntSetDefaultRegion(PDC)
VOID FASTCALL DC_vUpdateLineBrush(PDC pdc)
FORCEINLINE VOID DC_vSelectPalette(PDC pdc, PPALETTE ppal)
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
VOID FASTCALL DC_vUpdateTextBrush(PDC pdc)
VOID NTAPI DC_vFreeDcAttr(PDC pdc)
VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL To)
VOID FASTCALL DC_vUpdateFillBrush(PDC pdc)
VOID NTAPI DC_vRestoreDC(IN PDC pdc, INT iSaveLevel)
FORCEINLINE VOID DC_vSelectLineBrush(PDC pdc, PBRUSH pbrLine)
BOOL NTAPI DC_bAllocDcAttr(PDC pdc)
FORCEINLINE PDC DC_LockDc(HDC hdc)
FORCEINLINE VOID DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill)
VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdcDest, const RECT *rcDest, PDC pdcSrc, const RECT *rcSrc)
HDC FASTCALL IntGdiCreateDC(PUNICODE_STRING Driver, PUNICODE_STRING pustrDevice, PVOID pUMdhpdev, CONST PDEVMODEW pdmInit, BOOL CreateAsIC)
VOID NTAPI DC_vCleanup(PVOID ObjectBody)
static void DC_vUpdateDC(PDC pdc)
VOID NTAPI DC_vSetOwner(PDC pdc, ULONG ulOwner)
VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2)
const MATRIX gmxWorldToPageDefault
__kernel_entry HDC APIENTRY NtGdiOpenDCW(_In_opt_ PUNICODE_STRING pustrDevice, _In_ DEVMODEW *pdmInit, _In_ PUNICODE_STRING pustrLogAddr, _In_ ULONG iType, _In_ BOOL bDisplay, _In_opt_ HANDLE hspool, _At_((PUMDHPDEV *) pUMdhpdev, _Out_) PVOID pUMdhpdev)
BOOL APIENTRY NtGdiDeleteObjectApp(HANDLE hobj)
BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner)
BOOL APIENTRY NtGdiMakeInfoDC(IN HDC hdc, IN BOOL bSet)
PDC NTAPI DC_AllocDcWithHandle(GDILOOBJTYPE eDcObjType)
HDC NTAPI GreOpenDCW(PUNICODE_STRING pustrDevice, DEVMODEW *pdmInit, PUNICODE_STRING pustrLogAddr, ULONG iType, BOOL bDisplay, HANDLE hspool, VOID *pDriverInfo2, PVOID *pUMdhpdev)
HDC APIENTRY NtGdiCreateCompatibleDC(HDC hdc)
BOOL FASTCALL IntGdiDeleteDC(HDC hDC, BOOL Force)
HDC APIENTRY GreCreateCompatibleDC(HDC hdc, BOOL bAltDc)
#define gmxDeviceToWorldDefault
HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC)
#define gmxWorldToDeviceDefault
PSURFACE psurfDefaultBitmap
VOID NTAPI DC_vInitDc(PDC pdc, DCTYPE dctype, PPDEVOBJ ppdev)
void DC_InitHack(PDC pdc)
BOOL FASTCALL MakeInfoDC(PDC pdc, BOOL bSet)
NTSTATUS NTAPI InitDcImpl(VOID)
#define ERROR_INVALID_HANDLE
VOID NTAPI EBRUSHOBJ_vInitFromDC(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
VOID NTAPI EBRUSHOBJ_vCleanup(EBRUSHOBJ *pebo)
#define ExAllocatePoolWithTag(hernya, size, tag)
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
static const FLOATOBJ gef16
static const FLOATOBJ gef0
NTSTATUS FASTCALL TextIntRealizeFont(HFONT FontHandle, PTEXTOBJ pTextObj)
INT FASTCALL ftGdiGetTextCharsetInfo(PDC Dc, LPFONTSIGNATURE lpSig, DWORD dwFlags)
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
#define BRUSH_ShareLockBrush(hBrush)
#define BRUSH_ShareUnlockBrush(pBrush)
#define GDI_OBJECT_TYPE_DC
#define GDI_HANDLE_GET_TYPE(h)
#define GDI_HANDLE_IS_STOCKOBJ(h)
@ GDILoObjType_LO_DC_TYPE
@ GDILoObjType_LO_ALTDC_TYPE
enum GDILoObjType GDILOOBJTYPE
#define EXCEPTION_EXECUTE_HANDLER
#define ExFreePoolWithTag(_P, _T)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define GDI_OBJ_HMGR_POWNED
#define PAGE_TO_DEVICE_SCALE_IDENTITY
#define DC_PRIMARY_DISPLAY
#define GDI_OBJ_HMGR_PUBLIC
#define GDI_OBJ_HMGR_NONE
#define PAGE_TO_DEVICE_IDENTITY
#define WORLD_TO_PAGE_IDENTITY
PPDEVOBJ NTAPI EngpGetPDEV(_In_opt_ PUNICODE_STRING pustrDeviceName)
PSIZEL FASTCALL PDEVOBJ_sizl(PPDEVOBJ ppdev, PSIZEL psizl)
VOID NTAPI PDEVOBJ_vRelease(_Inout_ PPDEVOBJ ppdev)
PSURFACE NTAPI PDEVOBJ_pSurface(PPDEVOBJ ppdev)
FORCEINLINE VOID PDEVOBJ_vReference(_In_ PPDEVOBJ ppdev)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
#define RTL_CONSTANT_STRING(s)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_UNSUCCESSFUL
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
_Must_inspect_result_ _In_ WDFDRIVER Driver
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
VOID FASTCALL IntEngFreeClipResources(XCLIPOBJ *Clip)
VOID FASTCALL IntEngInitClipObj(XCLIPOBJ *Clip)
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
_Requires_lock_held_ ppdev BOOL NTAPI MouseSafetyOnDrawStart(_Inout_ PPDEVOBJ ppdev, _In_ LONG HazardX1, _In_ LONG HazardY1, _In_ LONG HazardX2, _In_ LONG HazardY2)
_Requires_lock_held_ ppdev BOOL NTAPI MouseSafetyOnDrawEnd(_Inout_ PPDEVOBJ ppdev)
#define SURFACE_ShareUnlockSurface(pBMObj)
#define SURFACE_ShareLockSurface(hBMObj)
BOOL NTAPI GreSetObjectOwner(HGDIOBJ hobj, ULONG ulOwner)
VOID NTAPI GDIOBJ_vFreeObject(POBJ pobj)
HGDIOBJ NTAPI GDIOBJ_hInsertObject(POBJ pobj, ULONG ulOwner)
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
VOID NTAPI GDIOBJ_vSetObjectOwner(POBJ pobj, ULONG ulNewOwner)
ULONG NTAPI GreGetObjectOwner(HGDIOBJ hobj)
POBJ NTAPI GDIOBJ_AllocateObject(UCHAR objt, ULONG cjSize, FLONG fl)
BOOL NTAPI GreIsHandleValid(HGDIOBJ hobj)
#define PALETTE_ShareLockPalette(hpal)
BOOL FASTCALL PATH_Delete(HPATH hPath)
PBRUSH FASTCALL PEN_ShareLockPen(HPEN hobj)
VOID FASTCALL REGION_Delete(PREGION pRgn)
PREGION FASTCALL IntSysCreateRectpRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
#define LFONT_ShareLockFont(hfont)
#define LFONT_ShareUnlockFont(plfnt)
_In_ DD_SURFACE_LOCAL * pSurface
ENGAPI VOID APIENTRY EngAcquireSemaphore(_Inout_ HSEMAPHORE hsem)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
#define POOL_RAISE_IF_ALLOCATION_FAILURE