1 #ifndef __WIN32K_DC_H 2 #define __WIN32K_DC_H 3 4 /* Constants ******************************************************************/ 5 6 /* flFontState */ 7 enum _FONT_STATE 8 { 9 DC_DIRTYFONT_XFORM = 1, 10 DC_DIRTYFONT_LFONT = 2, 11 DC_UFI_MAPPING = 4 12 }; 13 14 /* fl */ 15 #define DC_FL_PAL_BACK 1 16 17 typedef enum _DCFLAGS 18 { 19 DC_DISPLAY = 0x0001, 20 DC_DIRECT = 0x0002, 21 DC_CANCELED = 0x0004, 22 DC_PERMANANT = 0x0008, 23 DC_DIRTY_RAO = 0x0010, 24 DC_ACCUM_WMGR = 0x0020, 25 DC_ACCUM_APP = 0x0040, 26 DC_RESET = 0x0080, 27 DC_SYNCHRONIZEACCESS = 0x0100, 28 DC_EPSPRINTINGESCAPE = 0x0200, 29 DC_TEMPINFODC = 0x0400, 30 DC_FULLSCREEN = 0x0800, 31 DC_IN_CLONEPDEV = 0x1000, 32 DC_REDIRECTION = 0x2000, 33 DC_SHAREACCESS = 0x4000, 34 #if DBG 35 DC_PREPARED = 0x8000 36 #endif 37 } DCFLAGS; 38 39 typedef enum _DCTYPE 40 { 41 DCTYPE_DIRECT = 0, /* Normal device context */ 42 DCTYPE_MEMORY = 1, /* Memory device context */ 43 DCTYPE_INFO = 2, /* Information context */ 44 } DCTYPE; 45 46 47 /* Type definitions ***********************************************************/ 48 49 typedef struct _DCLEVEL 50 { 51 HPALETTE hpal; 52 struct _PALETTE * ppal; 53 PVOID pColorSpace; /* COLORSPACE* */ 54 LONG lIcmMode; 55 LONG lSaveDepth; 56 DWORD unk1_00000000; 57 HGDIOBJ hdcSave; 58 POINTL ptlBrushOrigin; 59 PBRUSH pbrFill; 60 PBRUSH pbrLine; 61 _Notnull_ struct _LFONT * plfnt; /* LFONT* (TEXTOBJ*) */ 62 HGDIOBJ hPath; /* HPATH */ 63 FLONG flPath; 64 LINEATTRS laPath; /* 0x20 bytes */ 65 PREGION prgnClip; 66 PREGION prgnMeta; 67 COLORADJUSTMENT ca; 68 FLONG flFontState; 69 UNIVERSAL_FONT_ID ufi; 70 UNIVERSAL_FONT_ID ufiLoc[4]; /* Local List. */ 71 UNIVERSAL_FONT_ID *pUFI; 72 ULONG uNumUFIs; 73 BOOL ufiSet; 74 FLONG fl; 75 FLONG flBrush; 76 MATRIX mxWorldToDevice; 77 MATRIX mxDeviceToWorld; 78 MATRIX mxWorldToPage; 79 FLOATOBJ efM11PtoD; 80 FLOATOBJ efM22PtoD; 81 FLOATOBJ efDxPtoD; 82 FLOATOBJ efDyPtoD; 83 FLOATOBJ efM11_TWIPS; 84 FLOATOBJ efM22_TWIPS; 85 FLOATOBJ efPr11; 86 FLOATOBJ efPr22; 87 PSURFACE pSurface; 88 SIZE sizl; 89 } DCLEVEL, *PDCLEVEL; 90 91 /* 92 * The DC object structure. 93 * See also: https://reactos.org/wiki/Techwiki:Win32k/DC 94 */ 95 typedef struct _DC 96 { 97 /* Header for all gdi objects in the handle table. 98 Do not (re)move this. */ 99 BASEOBJECT BaseObject; 100 101 DHPDEV dhpdev; /* <- PDEVOBJ.hPDev DHPDEV for device. */ 102 DCTYPE dctype; 103 INT fs; 104 PPDEVOBJ ppdev; 105 PVOID hsem; /* PERESOURCE aka HSEMAPHORE */ 106 FLONG flGraphicsCaps; 107 FLONG flGraphicsCaps2; 108 _Notnull_ PDC_ATTR pdcattr; 109 DCLEVEL dclevel; 110 DC_ATTR dcattr; 111 HDC hdcNext; 112 HDC hdcPrev; 113 RECTL erclClip; 114 POINTL ptlDCOrig; 115 RECTL erclWindow; 116 RECTL erclBounds; 117 RECTL erclBoundsApp; 118 PREGION prgnAPI; 119 _Notnull_ PREGION prgnVis; /* Visible region (must never be 0) */ 120 PREGION prgnRao; 121 POINTL ptlFillOrigin; 122 EBRUSHOBJ eboFill; 123 EBRUSHOBJ eboLine; 124 EBRUSHOBJ eboText; 125 EBRUSHOBJ eboBackground; 126 HFONT hlfntCur; 127 FLONG flSimulationFlags; 128 LONG lEscapement; 129 PVOID prfnt; /* RFONT* */ 130 XCLIPOBJ co; /* CLIPOBJ */ 131 PVOID pPFFList; /* PPFF* */ 132 PVOID pClrxFormLnk; 133 INT ipfdDevMax; 134 ULONG ulCopyCount; 135 PVOID pSurfInfo; 136 POINTL ptlDoBanding; 137 } DC; 138 // typedef struct _DC *PDC; 139 140 extern PDC defaultDCstate; 141 142 /* Internal functions *********************************************************/ 143 144 /* dcobjs.c */ 145 146 VOID FASTCALL DC_vUpdateFillBrush(PDC pdc); 147 VOID FASTCALL DC_vUpdateLineBrush(PDC pdc); 148 VOID FASTCALL DC_vUpdateTextBrush(PDC pdc); 149 VOID FASTCALL DC_vUpdateBackgroundBrush(PDC pdc); 150 151 HFONT 152 NTAPI 153 DC_hSelectFont( 154 _In_ PDC pdc, 155 _In_ HFONT hlfntNew); 156 157 HPALETTE 158 NTAPI 159 GdiSelectPalette( 160 _In_ HDC hDC, 161 _In_ HPALETTE hpal, 162 _In_ BOOL ForceBackground); 163 164 /* dcutil.c */ 165 166 COLORREF 167 FASTCALL 168 IntGdiSetBkColor( 169 _In_ HDC hDC, 170 _In_ COLORREF Color); 171 172 INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode); 173 COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color); 174 UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode); 175 VOID FASTCALL DCU_SetDcUndeletable(HDC); 176 BOOL FASTCALL IntSetDefaultRegion(PDC); 177 ULONG TranslateCOLORREF(PDC pdc, COLORREF crColor); 178 int FASTCALL GreSetStretchBltMode(HDC hdc, int iStretchMode); 179 int FASTCALL GreGetBkMode(HDC); 180 int FASTCALL GreGetMapMode(HDC); 181 COLORREF FASTCALL GreGetTextColor(HDC); 182 COLORREF FASTCALL GreGetBkColor(HDC); 183 COLORREF FASTCALL IntSetDCBrushColor(HDC,COLORREF); 184 COLORREF FASTCALL IntSetDCPenColor(HDC,COLORREF); 185 int FASTCALL GreGetGraphicsMode(HDC); 186 BOOL FASTCALL GreSetBrushOrg(HDC,INT,INT,LPPOINT); 187 188 CODE_SEG("INIT") NTSTATUS NTAPI InitDcImpl(VOID); 189 PPDEVOBJ FASTCALL IntEnumHDev(VOID); 190 PDC NTAPI DC_AllocDcWithHandle(GDILOOBJTYPE eDcObjType); 191 BOOL NTAPI DC_bAllocDcAttr(PDC pdc); 192 VOID NTAPI DC_vCleanup(PVOID ObjectBody); 193 BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL); 194 195 BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest); 196 VOID FASTCALL DC_vUpdateViewportExt(PDC pdc); 197 VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL To); 198 VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2); 199 VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdcDest, const RECT* rcDest, PDC pdcSrc, const RECT* rcSrc); 200 201 VOID NTAPI DC_vRestoreDC(IN PDC pdc, INT iSaveLevel); 202 203 VOID NTAPI DC_vFreeDcAttr(PDC pdc); 204 VOID NTAPI DC_vInitDc(PDC pdc, DCTYPE dctype, PPDEVOBJ ppdev); 205 206 HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC); 207 BOOL FASTCALL IntGdiCleanDC(HDC hDC); 208 VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS); 209 VOID FASTCALL IntUpdateBoundsRect(PDC,PRECTL); 210 211 BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner); 212 HDC APIENTRY GreCreateCompatibleDC(HDC hdc, BOOL bAltDc); 213 214 VOID 215 NTAPI 216 DC_vSetBrushOrigin(PDC pdc, LONG x, LONG y); 217 218 FORCEINLINE 219 PDC 220 DC_LockDc(HDC hdc) 221 { 222 PDC pdc; 223 224 pdc = (PDC)GDIOBJ_LockObject(hdc, GDIObjType_DC_TYPE); 225 if (pdc) 226 { 227 ASSERT((GDI_HANDLE_GET_TYPE(pdc->BaseObject.hHmgr) == GDILoObjType_LO_DC_TYPE) || 228 (GDI_HANDLE_GET_TYPE(pdc->BaseObject.hHmgr) == GDILoObjType_LO_ALTDC_TYPE)); 229 ASSERT(pdc->dclevel.plfnt != NULL); 230 ASSERT(GDI_HANDLE_GET_TYPE(((POBJ)pdc->dclevel.plfnt)->hHmgr) == GDILoObjType_LO_FONT_TYPE); 231 } 232 233 return pdc; 234 } 235 236 FORCEINLINE 237 VOID 238 DC_UnlockDc(PDC pdc) 239 { 240 ASSERT(pdc->dclevel.plfnt != NULL); 241 ASSERT(GDI_HANDLE_GET_TYPE(((POBJ)pdc->dclevel.plfnt)->hHmgr) == GDILoObjType_LO_FONT_TYPE); 242 243 GDIOBJ_vUnlockObject(&pdc->BaseObject); 244 } 245 246 FORCEINLINE 247 VOID 248 DC_vSelectSurface(PDC pdc, PSURFACE psurfNew) 249 { 250 PSURFACE psurfOld = pdc->dclevel.pSurface; 251 if (psurfOld) 252 { 253 psurfOld->hdc = NULL; 254 SURFACE_ShareUnlockSurface(psurfOld); 255 } 256 if (psurfNew) 257 GDIOBJ_vReferenceObjectByPointer((POBJ)psurfNew); 258 pdc->dclevel.pSurface = psurfNew; 259 } 260 261 FORCEINLINE 262 VOID 263 DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill) 264 { 265 PBRUSH pbrFillOld = pdc->dclevel.pbrFill; 266 if (pbrFillOld) 267 BRUSH_ShareUnlockBrush(pbrFillOld); 268 if (pbrFill) 269 GDIOBJ_vReferenceObjectByPointer((POBJ)pbrFill); 270 pdc->dclevel.pbrFill = pbrFill; 271 } 272 273 FORCEINLINE 274 VOID 275 DC_vSelectLineBrush(PDC pdc, PBRUSH pbrLine) 276 { 277 PBRUSH pbrLineOld = pdc->dclevel.pbrLine; 278 if (pbrLineOld) 279 BRUSH_ShareUnlockBrush(pbrLineOld); 280 if (pbrLine) 281 GDIOBJ_vReferenceObjectByPointer((POBJ)pbrLine); 282 pdc->dclevel.pbrLine = pbrLine; 283 } 284 285 FORCEINLINE 286 VOID 287 DC_vSelectPalette(PDC pdc, PPALETTE ppal) 288 { 289 PPALETTE ppalOld = pdc->dclevel.ppal; 290 if (ppalOld) 291 PALETTE_ShareUnlockPalette(ppalOld); 292 if (ppal) 293 GDIOBJ_vReferenceObjectByPointer((POBJ)ppal); 294 pdc->dclevel.ppal = ppal; 295 } 296 297 extern _Notnull_ PBRUSH pbrDefaultBrush; 298 extern _Notnull_ PSURFACE psurfDefaultBitmap; 299 300 #define ASSERT_DC_PREPARED(pdc) NT_ASSERT((pdc)->fs & DC_PREPARED) 301 302 #endif /* not __WIN32K_DC_H */ 303