reactos/win32ss/gdi/ntgdi/dc.h
Oleg Dubinskiy 31139c253f
[WIN32SS][NTDDRAW][NTGDI] Implement some DxEng* callbacks (#3638)
Implement the following DxEng* functions:
- DxEngAltLockSurface
- DxEngDeleteSurface
- DxEngReferenceHdev
- DxEngSelectBitmap
- DxEngSetBitmapOwner
- DxEngUnreferenceHdev

Update their prototypes and call the appropriate win32k functions
inside them, since they are already implemented. Also get rid of
now unused IntGdi(Un)ReferencePdev, whose were called only by dxeng,
and whose are not used anymore. In Windows, DxEng(Un)ReferenceHdev calls
PDEVOBJ_vReferencePDEV and PDEVOBJ_vDeferencePDEV directly (those
correspond to our PDEVOBJ_vReference and PDEVOBJ_vRelease accordingly).

Required by MS DirectDraw stack (ddraw.dll & dxg.sys). CORE-17561
2022-06-01 00:58:35 +03:00

300 lines
8 KiB
C

#ifndef __WIN32K_DC_H
#define __WIN32K_DC_H
/* Constants ******************************************************************/
/* flFontState */
enum _FONT_STATE
{
DC_DIRTYFONT_XFORM = 1,
DC_DIRTYFONT_LFONT = 2,
DC_UFI_MAPPING = 4
};
/* fl */
#define DC_FL_PAL_BACK 1
typedef enum _DCFLAGS
{
DC_DISPLAY = 0x0001,
DC_DIRECT = 0x0002,
DC_CANCELED = 0x0004,
DC_PERMANANT = 0x0008,
DC_DIRTY_RAO = 0x0010,
DC_ACCUM_WMGR = 0x0020,
DC_ACCUM_APP = 0x0040,
DC_RESET = 0x0080,
DC_SYNCHRONIZEACCESS = 0x0100,
DC_EPSPRINTINGESCAPE = 0x0200,
DC_TEMPINFODC = 0x0400,
DC_FULLSCREEN = 0x0800,
DC_IN_CLONEPDEV = 0x1000,
DC_REDIRECTION = 0x2000,
DC_SHAREACCESS = 0x4000,
#if DBG
DC_PREPARED = 0x8000
#endif
} DCFLAGS;
typedef enum _DCTYPE
{
DCTYPE_DIRECT = 0, /* Normal device context */
DCTYPE_MEMORY = 1, /* Memory device context */
DCTYPE_INFO = 2, /* Information context */
} DCTYPE;
/* Type definitions ***********************************************************/
typedef struct _DCLEVEL
{
HPALETTE hpal;
struct _PALETTE * ppal;
PVOID pColorSpace; /* COLORSPACE* */
LONG lIcmMode;
LONG lSaveDepth;
DWORD unk1_00000000;
HGDIOBJ hdcSave;
POINTL ptlBrushOrigin;
PBRUSH pbrFill;
PBRUSH pbrLine;
_Notnull_ struct _LFONT * plfnt; /* LFONT* (TEXTOBJ*) */
HGDIOBJ hPath; /* HPATH */
FLONG flPath;
LINEATTRS laPath; /* 0x20 bytes */
PREGION prgnClip;
PREGION prgnMeta;
COLORADJUSTMENT ca;
FLONG flFontState;
UNIVERSAL_FONT_ID ufi;
UNIVERSAL_FONT_ID ufiLoc[4]; /* Local List. */
UNIVERSAL_FONT_ID *pUFI;
ULONG uNumUFIs;
BOOL ufiSet;
FLONG fl;
FLONG flBrush;
MATRIX mxWorldToDevice;
MATRIX mxDeviceToWorld;
MATRIX mxWorldToPage;
FLOATOBJ efM11PtoD;
FLOATOBJ efM22PtoD;
FLOATOBJ efDxPtoD;
FLOATOBJ efDyPtoD;
FLOATOBJ efM11_TWIPS;
FLOATOBJ efM22_TWIPS;
FLOATOBJ efPr11;
FLOATOBJ efPr22;
PSURFACE pSurface;
SIZE sizl;
} DCLEVEL, *PDCLEVEL;
/* The DC object structure */
typedef struct _DC
{
/* Header for all gdi objects in the handle table.
Do not (re)move this. */
BASEOBJECT BaseObject;
DHPDEV dhpdev; /* <- PDEVOBJ.hPDev DHPDEV for device. */
DCTYPE dctype;
INT fs;
PPDEVOBJ ppdev;
PVOID hsem; /* PERESOURCE aka HSEMAPHORE */
FLONG flGraphicsCaps;
FLONG flGraphicsCaps2;
_Notnull_ PDC_ATTR pdcattr;
DCLEVEL dclevel;
DC_ATTR dcattr;
HDC hdcNext;
HDC hdcPrev;
RECTL erclClip;
POINTL ptlDCOrig;
RECTL erclWindow;
RECTL erclBounds;
RECTL erclBoundsApp;
PREGION prgnAPI;
_Notnull_ PREGION prgnVis; /* Visible region (must never be 0) */
PREGION prgnRao;
POINTL ptlFillOrigin;
EBRUSHOBJ eboFill;
EBRUSHOBJ eboLine;
EBRUSHOBJ eboText;
EBRUSHOBJ eboBackground;
HFONT hlfntCur;
FLONG flSimulationFlags;
LONG lEscapement;
PVOID prfnt; /* RFONT* */
XCLIPOBJ co; /* CLIPOBJ */
PVOID pPFFList; /* PPFF* */
PVOID pClrxFormLnk;
INT ipfdDevMax;
ULONG ulCopyCount;
PVOID pSurfInfo;
POINTL ptlDoBanding;
} DC;
// typedef struct _DC *PDC;
extern PDC defaultDCstate;
/* Internal functions *********************************************************/
/* dcobjs.c */
VOID FASTCALL DC_vUpdateFillBrush(PDC pdc);
VOID FASTCALL DC_vUpdateLineBrush(PDC pdc);
VOID FASTCALL DC_vUpdateTextBrush(PDC pdc);
VOID FASTCALL DC_vUpdateBackgroundBrush(PDC pdc);
HFONT
NTAPI
DC_hSelectFont(
_In_ PDC pdc,
_In_ HFONT hlfntNew);
HPALETTE
NTAPI
GdiSelectPalette(
_In_ HDC hDC,
_In_ HPALETTE hpal,
_In_ BOOL ForceBackground);
/* dcutil.c */
COLORREF
FASTCALL
IntGdiSetBkColor(
_In_ HDC hDC,
_In_ COLORREF Color);
INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode);
COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color);
UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode);
VOID FASTCALL DCU_SetDcUndeletable(HDC);
BOOL FASTCALL IntSetDefaultRegion(PDC);
ULONG TranslateCOLORREF(PDC pdc, COLORREF crColor);
int FASTCALL GreSetStretchBltMode(HDC hdc, int iStretchMode);
int FASTCALL GreGetBkMode(HDC);
int FASTCALL GreGetMapMode(HDC);
COLORREF FASTCALL GreGetTextColor(HDC);
COLORREF FASTCALL GreGetBkColor(HDC);
COLORREF FASTCALL IntSetDCBrushColor(HDC,COLORREF);
COLORREF FASTCALL IntSetDCPenColor(HDC,COLORREF);
int FASTCALL GreGetGraphicsMode(HDC);
BOOL FASTCALL GreSetBrushOrg(HDC,INT,INT,LPPOINT);
CODE_SEG("INIT") NTSTATUS NTAPI InitDcImpl(VOID);
PPDEVOBJ FASTCALL IntEnumHDev(VOID);
PDC NTAPI DC_AllocDcWithHandle(GDILOOBJTYPE eDcObjType);
BOOL NTAPI DC_bAllocDcAttr(PDC pdc);
VOID NTAPI DC_vCleanup(PVOID ObjectBody);
BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
VOID FASTCALL DC_vUpdateViewportExt(PDC pdc);
VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL To);
VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2);
VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdcDest, const RECT* rcDest, PDC pdcSrc, const RECT* rcSrc);
VOID NTAPI DC_vRestoreDC(IN PDC pdc, INT iSaveLevel);
VOID NTAPI DC_vFreeDcAttr(PDC pdc);
VOID NTAPI DC_vInitDc(PDC pdc, DCTYPE dctype, PPDEVOBJ ppdev);
HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
BOOL FASTCALL IntGdiCleanDC(HDC hDC);
VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
VOID FASTCALL IntUpdateBoundsRect(PDC,PRECTL);
BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner);
HDC APIENTRY GreCreateCompatibleDC(HDC hdc, BOOL bAltDc);
VOID
NTAPI
DC_vSetBrushOrigin(PDC pdc, LONG x, LONG y);
FORCEINLINE
PDC
DC_LockDc(HDC hdc)
{
PDC pdc;
pdc = (PDC)GDIOBJ_LockObject(hdc, GDIObjType_DC_TYPE);
if (pdc)
{
ASSERT((GDI_HANDLE_GET_TYPE(pdc->BaseObject.hHmgr) == GDILoObjType_LO_DC_TYPE) ||
(GDI_HANDLE_GET_TYPE(pdc->BaseObject.hHmgr) == GDILoObjType_LO_ALTDC_TYPE));
ASSERT(pdc->dclevel.plfnt != NULL);
ASSERT(GDI_HANDLE_GET_TYPE(((POBJ)pdc->dclevel.plfnt)->hHmgr) == GDILoObjType_LO_FONT_TYPE);
}
return pdc;
}
FORCEINLINE
VOID
DC_UnlockDc(PDC pdc)
{
ASSERT(pdc->dclevel.plfnt != NULL);
ASSERT(GDI_HANDLE_GET_TYPE(((POBJ)pdc->dclevel.plfnt)->hHmgr) == GDILoObjType_LO_FONT_TYPE);
GDIOBJ_vUnlockObject(&pdc->BaseObject);
}
FORCEINLINE
VOID
DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
{
PSURFACE psurfOld = pdc->dclevel.pSurface;
if (psurfOld)
{
psurfOld->hdc = NULL;
SURFACE_ShareUnlockSurface(psurfOld);
}
if (psurfNew)
GDIOBJ_vReferenceObjectByPointer((POBJ)psurfNew);
pdc->dclevel.pSurface = psurfNew;
}
FORCEINLINE
VOID
DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill)
{
PBRUSH pbrFillOld = pdc->dclevel.pbrFill;
if (pbrFillOld)
BRUSH_ShareUnlockBrush(pbrFillOld);
if (pbrFill)
GDIOBJ_vReferenceObjectByPointer((POBJ)pbrFill);
pdc->dclevel.pbrFill = pbrFill;
}
FORCEINLINE
VOID
DC_vSelectLineBrush(PDC pdc, PBRUSH pbrLine)
{
PBRUSH pbrLineOld = pdc->dclevel.pbrLine;
if (pbrLineOld)
BRUSH_ShareUnlockBrush(pbrLineOld);
if (pbrLine)
GDIOBJ_vReferenceObjectByPointer((POBJ)pbrLine);
pdc->dclevel.pbrLine = pbrLine;
}
FORCEINLINE
VOID
DC_vSelectPalette(PDC pdc, PPALETTE ppal)
{
PPALETTE ppalOld = pdc->dclevel.ppal;
if (ppalOld)
PALETTE_ShareUnlockPalette(ppalOld);
if (ppal)
GDIOBJ_vReferenceObjectByPointer((POBJ)ppal);
pdc->dclevel.ppal = ppal;
}
extern _Notnull_ PBRUSH pbrDefaultBrush;
extern _Notnull_ PSURFACE psurfDefaultBitmap;
#define ASSERT_DC_PREPARED(pdc) NT_ASSERT((pdc)->fs & DC_PREPARED)
#endif /* not __WIN32K_DC_H */