#ifndef __WIN32K_DC_H
#define __WIN32K_DC_H
+typedef struct _DC *PDC;
+
+#include "engobjects.h"
#include "brush.h"
#include "bitmaps.h"
+#include "pdevobj.h"
+#include "palette.h"
+#include "region.h"
/* Constants ******************************************************************/
-// Get/SetBounds/Rect support.
-#define DCB_WINDOWMGR 0x8000 // Queries the Windows bounding rectangle instead of the application's
+/* Get/SetBounds/Rect support. */
+#define DCB_WINDOWMGR 0x8000 /* Queries the Windows bounding rectangle instead of the application's */
+
+/* flFontState */
+#define DC_DIRTYFONT_XFORM 1
+#define DC_DIRTYFONT_LFONT 2
+#define DC_UFI_MAPPING 4
+
+/* fl */
+#define DC_FL_PAL_BACK 1
+
+#define DC_DISPLAY 1
+#define DC_DIRECT 2
+#define DC_CANCELED 4
+#define DC_PERMANANT 0x08
+#define DC_DIRTY_RAO 0x10
+#define DC_ACCUM_WMGR 0x20
+#define DC_ACCUM_APP 0x40
+#define DC_RESET 0x80
+#define DC_SYNCHRONIZEACCESS 0x100
+#define DC_EPSPRINTINGESCAPE 0x200
+#define DC_TEMPINFODC 0x400
+#define DC_FULLSCREEN 0x800
+#define DC_IN_CLONEPDEV 0x1000
+#define DC_REDIRECTION 0x2000
+#define DC_SHAREACCESS 0x4000
+
+typedef enum
+{
+ DCTYPE_DIRECT = 0,
+ DCTYPE_MEMORY = 1,
+ DCTYPE_INFO = 2,
+} DCTYPE;
-// GDIDEVICE flags
-#define PDEV_DISPLAY 0x00000001 // Display device
-#define PDEV_HARDWARE_POINTER 0x00000002 // Supports hardware cursor
-#define PDEV_SOFTWARE_POINTER 0x00000004
-#define PDEV_GOTFONTS 0x00000040 // Has font driver
-#define PDEV_PRINTER 0x00000080
-#define PDEV_ALLOCATEDBRUSHES 0x00000100
-#define PDEV_HTPAL_IS_DEVPAL 0x00000200
-#define PDEV_DISABLED 0x00000400
-#define PDEV_SYNCHRONIZE_ENABLED 0x00000800
-#define PDEV_FONTDRIVER 0x00002000 // Font device
-#define PDEV_GAMMARAMP_TABLE 0x00004000
-#define PDEV_UMPD 0x00008000
-#define PDEV_SHARED_DEVLOCK 0x00010000
-#define PDEV_META_DEVICE 0x00020000
-#define PDEV_DRIVER_PUNTED_CALL 0x00040000 // Driver calls back to GDI engine
-#define PDEV_CLONE_DEVICE 0x00080000
/* Type definitions ***********************************************************/
-typedef struct _WIN_DC_INFO
+typedef struct _ROS_DC_INFO
{
HRGN hClipRgn; /* Clip region (may be 0) */
- HRGN hVisRgn; /* Should me to DC. Visible region (must never be 0) */
HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
- HBITMAP hBitmap;
-
- BYTE bitsPerPixel;
-} WIN_DC_INFO;
-// EXtended CLip and Window Region Object
-typedef struct _XCLIPOBJ
-{
- WNDOBJ eClipWnd;
- PVOID pClipRgn; // prgnRao_ or (prgnVis_ if (prgnRao_ == z))
- DWORD Unknown1[16];
- DWORD nComplexity; // count/mode based on # of rect in regions scan.
- PVOID pUnknown; // UnK pointer to a large drawing structure.
- // We will use it for CombinedClip ptr.
-} XCLIPOBJ, *PXCLIPOBJ;
+ CLIPOBJ *CombinedClip;
+} ROS_DC_INFO;
typedef struct _DCLEVEL
{
HPALETTE hpal;
- struct _PALGDI * ppal;
- PVOID pColorSpace; // COLORSPACE*
+ struct _PALETTE * ppal;
+ PVOID pColorSpace; /* COLORSPACE* */
LONG lIcmMode;
LONG lSaveDepth;
DWORD unk1_00000000;
HGDIOBJ hdcSave;
POINTL ptlBrushOrigin;
- PGDIBRUSHOBJ pbrFill;
- PGDIBRUSHOBJ pbrLine;
- PVOID plfnt; // LFONTOBJ* (TEXTOBJ*)
- HGDIOBJ hPath; // HPATH
+ PBRUSH pbrFill;
+ PBRUSH pbrLine;
+ PVOID plfnt; /* LFONTOBJ* (TEXTOBJ*) */
+ HGDIOBJ hPath; /* HPATH */
FLONG flPath;
- LINEATTRS laPath; // 0x20 bytes
- PVOID prgnClip; // PROSRGNDATA
- PVOID prgnMeta;
+ 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 ufiLoc[4]; /* Local List. */
UNIVERSAL_FONT_ID *pUFI;
ULONG uNumUFIs;
BOOL ufiSet;
FLONG fl;
FLONG flBrush;
- MATRIX_S mxWorldToDevice;
- MATRIX_S mxDeviceToWorld;
- MATRIX_S mxWorldToPage;
- EFLOAT_S efM11PtoD;
- EFLOAT_S efM22PtoD;
- EFLOAT_S efDxPtoD;
- EFLOAT_S efDyPtoD;
- EFLOAT_S efM11_TWIPS;
- EFLOAT_S efM22_TWIPS;
- EFLOAT_S efPr11;
- EFLOAT_S efPr22;
- PBITMAPOBJ pSurface; // SURFACE*
+ 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;
Do not (re)move this. */
BASEOBJECT BaseObject;
- DHPDEV PDev; // <- GDIDEVICE.hPDev DHPDEV for device.
- INT DC_Type;
- INT DC_Flags;
- PVOID pPDev; // PGDIDEVICE aka PDEVOBJ
- PVOID hSem; // PERESOURCE aka HSEMAPHORE
- FLONG flGraphics;
- FLONG flGraphics2;
- PDC_ATTR pDc_Attr;
- DCLEVEL DcLevel;
- DC_ATTR Dc_Attr;
- HDC hNext;
- HDC hPrev;
+ DHPDEV dhpdev; /* <- PDEVOBJ.hPDev DHPDEV for device. */
+ INT dctype;
+ INT fs;
+ PPDEVOBJ ppdev;
+ PVOID hsem; /* PERESOURCE aka HSEMAPHORE */
+ FLONG flGraphicsCaps;
+ FLONG flGraphicsCaps2;
+ PDC_ATTR pdcattr;
+ DCLEVEL dclevel;
+ DC_ATTR dcattr;
+ HDC hdcNext;
+ HDC hdcPrev;
RECTL erclClip;
POINTL ptlDCOrig;
RECTL erclWindow;
RECTL erclBounds;
RECTL erclBoundsApp;
- PVOID prgnAPI; // PROSRGNDATA
- PVOID prgnVis;
- PVOID prgnRao;
+ PREGION prgnAPI;
+ PREGION prgnVis; /* Visible region (must never be 0) */
+ PREGION prgnRao;
POINTL ptlFillOrigin;
- unsigned eboFill_[23]; // EBRUSHOBJ
- unsigned eboLine_[23];
- unsigned eboText_[23];
- unsigned eboBackground_[23];
+ EBRUSHOBJ eboFill;
+ EBRUSHOBJ eboLine;
+ EBRUSHOBJ eboText;
+ EBRUSHOBJ eboBackground;
HFONT hlfntCur;
FLONG flSimulationFlags;
LONG lEscapement;
- PVOID prfnt; // RFONT*
- XCLIPOBJ co; // CLIPOBJ
- PVOID pPFFList; // PPFF*
- PVOID ClrxFormLnk;
+ PVOID prfnt; /* RFONT* */
+ XCLIPOBJ co; /* CLIPOBJ */
+ PVOID pPFFList; /* PPFF* */
+ PVOID pClrxFormLnk;
INT ipfdDevMax;
ULONG ulCopyCount;
PVOID pSurfInfo;
POINTL ptlDoBanding;
/* Reactos specific members */
- WIN_DC_INFO w;
- CLIPOBJ *CombinedClip;
- XLATEOBJ *XlateBrush;
- XLATEOBJ *XlatePen;
-
- UNICODE_STRING DriverName;
-} DC, *PDC;
-
-typedef struct _GRAPHICS_DEVICE
-{
- CHAR szNtDeviceName[CCHDEVICENAME]; // Yes char AscII
- CHAR szWinDeviceName[CCHDEVICENAME]; // <- chk GetMonitorInfoW MxIxEX.szDevice
- struct _GRAPHICS_DEVICE * pNextGraphicsDevice;
- DWORD StateFlags; // See DISPLAY_DEVICE_*
-} GRAPHICS_DEVICE, *PGRAPHICS_DEVICE;
-
-typedef struct _GDIPOINTER /* should stay private to ENG? No, part of GDIDEVICE aka HDEV aka PDEV. */
-{
- /* private GDI pointer handling information, required for software emulation */
- BOOL Enabled;
- POINTL Pos;
- SIZEL Size;
- POINTL HotSpot;
- XLATEOBJ *XlateObject;
- HSURF ColorSurface;
- HSURF MaskSurface;
- HSURF SaveSurface;
- int ShowPointer; /* counter negtive do not show the mouse postive show the mouse */
-
- /* public pointer information */
- RECTL Exclude; /* required publicly for SPS_ACCEPT_EXCLUDE */
- PGD_MOVEPOINTER MovePointer;
- ULONG Status;
-} GDIPOINTER, *PGDIPOINTER;
-
-typedef struct _GDIDEVICE
-{
- BASEOBJECT BaseObject;
-
- struct _GDIDEVICE *ppdevNext;
- INT cPdevRefs;
- INT cPdevOpenRefs;
- struct _GDIDEVICE *ppdevParent;
- FLONG flFlags;
- PERESOURCE hsemDevLock; // Device lock.
-
- PVOID pvGammaRamp; // Gamma ramp pointer.
-
- DHPDEV hPDev; // DHPDEV for device.
-
- HSURF FillPatterns[HS_DDI_MAX];
-
- ULONG DxDd_nCount;
-
- DEVINFO DevInfo;
- GDIINFO GDIInfo;
- HSURF pSurface; // SURFACE for this device.
- HANDLE hSpooler; // Handle to spooler, if spooler dev driver.
- ULONG DisplayNumber;
- PVOID pGraphicsDev; // PGRAPHICS_DEVICE
-
- DEVMODEW DMW;
- PVOID pdmwDev; // Ptr->DEVMODEW.dmSize + dmDriverExtra == alloc size.
-
- FLONG DxDd_Flags; // DxDD active status flags.
-
- PFILE_OBJECT VideoFileObject;
- BOOLEAN PreparedDriver;
- GDIPOINTER Pointer;
- /* Stuff to keep track of software cursors; win32k gdi part */
- UINT SafetyRemoveLevel; /* at what level was the cursor removed?
- 0 for not removed */
- UINT SafetyRemoveCount;
-
- DRIVER_FUNCTIONS DriverFunctions;
- struct _EDD_DIRECTDRAW_GLOBAL * pEDDgpl;
-} GDIDEVICE, *PGDIDEVICE;
+ ROS_DC_INFO rosdc;
+} DC;
/* Internal functions *********************************************************/
-#define DC_LockDc(hDC) \
- ((PDC) GDIOBJ_LockObj ((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC))
-#define DC_UnlockDc(pDC) \
- GDIOBJ_UnlockObjByPtr ((POBJ)pDC)
-
extern PDC defaultDCstate;
-NTSTATUS FASTCALL InitDcImpl(VOID);
-PGDIDEVICE FASTCALL IntEnumHDev(VOID);
-HDC FASTCALL DC_AllocDC(PUNICODE_STRING Driver);
+INIT_FUNCTION NTSTATUS NTAPI InitDcImpl(VOID);
+PPDEVOBJ FASTCALL IntEnumHDev(VOID);
+PDC NTAPI DC_AllocDcWithHandle(VOID);
VOID FASTCALL DC_InitDC(HDC DCToInit);
-HDC FASTCALL DC_FindOpenDC(PUNICODE_STRING Driver);
-VOID FASTCALL DC_FreeDC(HDC);
-VOID FASTCALL DC_AllocateDcAttr(HDC);
+BOOL NTAPI DC_bAllocDcAttr(PDC pdc);
VOID FASTCALL DC_FreeDcAttr(HDC);
BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody);
-HDC FASTCALL DC_GetNextDC (PDC pDC);
-VOID FASTCALL DC_SetNextDC (PDC pDC, HDC hNextDC);
-BOOL FASTCALL DC_SetOwnership(HDC DC, PEPROCESS Owner);
+BOOL FASTCALL DC_SetOwnership(HDC hDC, PEPROCESS Owner);
VOID FASTCALL DC_LockDisplay(HDC);
VOID FASTCALL DC_UnlockDisplay(HDC);
-VOID FASTCALL IntGdiCopyFromSaveState(PDC, PDC, HDC);
-VOID FASTCALL IntGdiCopyToSaveState(PDC, PDC);
BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
VOID FASTCALL DC_UpdateXforms(PDC dc);
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_vUpdateFillBrush(PDC pdc);
+VOID FASTCALL DC_vUpdateLineBrush(PDC pdc);
+VOID FASTCALL DC_vUpdateTextBrush(PDC pdc);
+VOID FASTCALL DC_vUpdateBackgroundBrush(PDC pdc);
+VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2);
+VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdc1, RECT rc1, PDC pdc2, RECT rc2);
+
+VOID NTAPI DC_vRestoreDC(IN PDC pdc, INT iSaveLevel);
BOOL FASTCALL DCU_SyncDcAttrtoUser(PDC);
BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC);
VOID FASTCALL DCU_SetDcUndeletable(HDC);
-
-VOID FASTCALL IntGetViewportExtEx(PDC dc, LPSIZE pt);
-VOID FASTCALL IntGetViewportOrgEx(PDC dc, LPPOINT pt);
-VOID FASTCALL IntGetWindowExtEx(PDC dc, LPSIZE pt);
-VOID FASTCALL IntGetWindowOrgEx(PDC dc, LPPOINT pt);
+VOID NTAPI DC_vFreeDcAttr(PDC pdc);
+VOID NTAPI DC_vInitDc(PDC pdc, DCTYPE dctype, PPDEVOBJ ppdev);
COLORREF FASTCALL IntGdiSetBkColor (HDC hDC, COLORREF Color);
INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode);
-COLORREF STDCALL IntGdiGetBkColor(HDC hDC);
-INT STDCALL IntGdiGetBkMode(HDC hDC);
+COLORREF APIENTRY IntGdiGetBkColor(HDC hDC);
+INT APIENTRY IntGdiGetBkMode(HDC hDC);
COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color);
UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode);
-UINT STDCALL IntGdiGetTextAlign(HDC hDC);
-COLORREF STDCALL IntGdiGetTextColor(HDC hDC);
-INT STDCALL IntGdiSetStretchBltMode(HDC hDC, INT stretchBltMode);
-VOID FASTCALL IntGdiReferencePdev(PGDIDEVICE pPDev);
-VOID FASTCALL IntGdiUnreferencePdev(PGDIDEVICE pPDev, DWORD CleanUpType);
+UINT APIENTRY IntGdiGetTextAlign(HDC hDC);
+COLORREF APIENTRY IntGdiGetTextColor(HDC hDC);
+INT APIENTRY IntGdiSetStretchBltMode(HDC hDC, INT stretchBltMode);
+VOID FASTCALL IntGdiReferencePdev(PPDEVOBJ pPDev);
+VOID FASTCALL IntGdiUnreferencePdev(PPDEVOBJ pPDev, DWORD CleanUpType);
HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
BOOL FASTCALL IntGdiCleanDC(HDC hDC);
+VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
+BOOL FASTCALL MakeInfoDC(PDC,BOOL);
+BOOL FASTCALL IntSetDefaultRegion(PDC);
+BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner);
+
+FORCEINLINE
+PDC
+DC_LockDc(HDC hdc)
+{
+ //if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) return NULL; ???
+ return GDIOBJ_LockObject(hdc, GDIObjType_DC_TYPE);
+}
+
+FORCEINLINE
+VOID
+DC_UnlockDc(PDC pdc)
+{
+ GDIOBJ_vUnlockObject(&pdc->BaseObject);
+}
-extern PGDIDEVICE pPrimarySurface;
+VOID
+FORCEINLINE
+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;
+}
+
+VOID
+FORCEINLINE
+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;
+}
+
+VOID
+FORCEINLINE
+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;
+}
+
+VOID
+FORCEINLINE
+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 PBRUSH pbrDefaultBrush ;
#endif /* not __WIN32K_DC_H */