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;
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 BRUSH_ShareUnlockBrush(pBrush)
HDC APIENTRY NtGdiCreateCompatibleDC(HDC hdc)
VOID WINAPI EngReleaseSemaphore(IN HSEMAPHORE hsem)
BOOL NTAPI GreSetObjectOwner(HGDIOBJ hobj, ULONG ulOwner)
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
VOID FASTCALL IntEngInitClipObj(XCLIPOBJ *Clip)
BOOL NTAPI GreIsHandleValid(HGDIOBJ hobj)
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
VOID NTAPI EBRUSHOBJ_vCleanup(EBRUSHOBJ *pebo)
VOID FASTCALL DC_vUpdateLineBrush(PDC pdc)
FORCEINLINE PDC DC_LockDc(HDC hdc)
FORCEINLINE VOID DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
VOID FASTCALL GdiSelectVisRgn(HDC hdc, PREGION prgn)
BOOL APIENTRY NtGdiDeleteObjectApp(HANDLE hobj)
#define SURFACE_ShareUnlockSurface(pBMObj)
PDC NTAPI DC_AllocDcWithHandle(GDILOOBJTYPE eDcObjType)
FORCEINLINE VOID PDEVOBJ_vReference(_In_ PPDEVOBJ ppdev)
#define BRUSH_ShareLockBrush(hBrush)
FORCEINLINE VOID DC_vSelectPalette(PDC pdc, PPALETTE ppal)
PSURFACE NTAPI PDEVOBJ_pSurface(PPDEVOBJ ppdev)
static void DC_vUpdateDC(PDC pdc)
#define PAGE_TO_DEVICE_IDENTITY
PSURFACE psurfDefaultBitmap
#define ERROR_INVALID_HANDLE
#define LFONT_ShareUnlockFont(plfnt)
VOID FASTCALL UpdateVisRgn(PDC pdc)
#define gmxDeviceToWorldDefault
IN PVOID IN PVOID IN USHORT IN USHORT Size
BOOL FASTCALL MakeInfoDC(PDC pdc, BOOL bSet)
HDC APIENTRY GreCreateCompatibleDC(HDC hdc, BOOL bAltDc)
_Requires_lock_held_ ppdev BOOL NTAPI MouseSafetyOnDrawEnd(_Inout_ PPDEVOBJ ppdev)
ULONG NTAPI GreGetObjectOwner(HGDIOBJ hobj)
#define SURFACE_ShareLockSurface(hBMObj)
FORCEINLINE VOID DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define DC_PRIMARY_DISPLAY
VOID FASTCALL IntEngFreeClipResources(XCLIPOBJ *Clip)
PREGION FASTCALL IntSysCreateRectpRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
VOID NTAPI DC_vCleanup(PVOID ObjectBody)
NTSTATUS FASTCALL TextIntRealizeFont(HFONT FontHandle, PTEXTOBJ pTextObj)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define EXCEPTION_EXECUTE_HANDLER
_Requires_lock_held_ ppdev BOOL NTAPI MouseSafetyOnDrawStart(_Inout_ PPDEVOBJ ppdev, _In_ LONG HazardX1, _In_ LONG HazardY1, _In_ LONG HazardX2, _In_ LONG HazardY2)
ENGAPI VOID APIENTRY EngAcquireSemaphore(_Inout_ HSEMAPHORE hsem)
#define GDI_HANDLE_IS_STOCKOBJ(h)
BOOL NTAPI DC_bAllocDcAttr(PDC pdc)
#define PALETTE_ShareLockPalette(hpal)
#define GDI_HANDLE_GET_TYPE(h)
HDC NTAPI GreOpenDCW(PUNICODE_STRING pustrDevice, DEVMODEW *pdmInit, PUNICODE_STRING pustrLogAddr, ULONG iType, BOOL bDisplay, HANDLE hspool, VOID *pDriverInfo2, PVOID *pUMdhpdev)
VOID FASTCALL DC_vUpdateTextBrush(PDC pdc)
#define _SEH2_YIELD(STMT_)
_In_ DD_SURFACE_LOCAL * pSurface
#define UlongToHandle(ul)
#define DC_FLAG_DIRTY_RAO
VOID FASTCALL CLIPPING_UpdateGCRegion(PDC pDC)
PSIZEL FASTCALL PDEVOBJ_sizl(PPDEVOBJ ppdev, PSIZEL psizl)
static const FLOATOBJ gef0
#define STATUS_UNSUCCESSFUL
#define ExAllocatePoolWithTag(hernya, size, tag)
#define GDI_OBJECT_TYPE_DC
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
#define GDI_OBJ_HMGR_POWNED
#define WORLD_TO_PAGE_IDENTITY
static const FLOATOBJ gef16
VOID FASTCALL SetLastNtError(NTSTATUS Status)
BOOL FASTCALL IntSetDefaultRegion(PDC)
NTSTATUS NTAPI InitDcImpl(VOID)
#define PAGE_TO_DEVICE_SCALE_IDENTITY
#define DC_FLAG_PERMANENT
BOOL APIENTRY NtGdiMakeInfoDC(IN HDC hdc, IN BOOL bSet)
VOID NTAPI DC_vInitDc(PDC pdc, DCTYPE dctype, PPDEVOBJ ppdev)
VOID NTAPI EBRUSHOBJ_vInitFromDC(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC)
HDC FASTCALL IntGdiCreateDC(PUNICODE_STRING Driver, PUNICODE_STRING pustrDevice, PVOID pUMdhpdev, CONST PDEVMODEW pdmInit, BOOL CreateAsIC)
VOID NTAPI DC_vSetOwner(PDC pdc, ULONG ulOwner)
#define GDI_OBJ_HMGR_PUBLIC
BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner)
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
#define LFONT_ShareLockFont(hfont)
#define gmxWorldToDeviceDefault
VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdcDest, const RECT *rcDest, PDC pdcSrc, const RECT *rcSrc)
VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2)
#define GDI_OBJ_HMGR_NONE
__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)
const MATRIX gmxWorldToPageDefault
#define RtlZeroMemory(Destination, Length)
BOOL FASTCALL IntGdiDeleteDC(HDC hDC, BOOL Force)
VOID NTAPI GDIOBJ_vSetObjectOwner(POBJ pobj, ULONG ulNewOwner)
#define RtlCopyMemory(Destination, Source, Length)
VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL To)
void DC_InitHack(PDC pdc)
#define _SEH2_EXCEPT(...)
#define POOL_RAISE_IF_ALLOCATION_FAILURE
#define ExFreePoolWithTag(_P, _T)
#define _SEH2_GetExceptionCode()
VOID NTAPI PDEVOBJ_vRelease(_Inout_ PPDEVOBJ ppdev)
enum GDILoObjType GDILOOBJTYPE
INT FASTCALL ftGdiGetTextCharsetInfo(PDC Dc, LPFONTSIGNATURE lpSig, DWORD dwFlags)
PBRUSH FASTCALL PEN_ShareLockPen(HPEN hobj)
_Must_inspect_result_ _In_ WDFDRIVER Driver
VOID FASTCALL REGION_Delete(PREGION pRgn)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
FORCEINLINE VOID DC_vSelectLineBrush(PDC pdc, PBRUSH pbrLine)
BOOL FASTCALL PATH_Delete(HPATH hPath)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
POBJ NTAPI GDIOBJ_AllocateObject(UCHAR objt, ULONG cjSize, FLONG fl)
VOID NTAPI DC_vRestoreDC(IN PDC pdc, INT iSaveLevel)
VOID NTAPI GDIOBJ_vFreeObject(POBJ pobj)
PPDEVOBJ NTAPI EngpGetPDEV(_In_opt_ PUNICODE_STRING pustrDeviceName)
#define DC_FLAG_TEMPINFODC
VOID FASTCALL DC_vUpdateFillBrush(PDC pdc)
_Inout_ PVCB _In_ BOOLEAN Force
#define RTL_CONSTANT_STRING(s)
HGDIOBJ NTAPI GDIOBJ_hInsertObject(POBJ pobj, ULONG ulOwner)
VOID NTAPI DC_vFreeDcAttr(PDC pdc)