[CMAKE]
[reactos.git] / subsystems / win32 / win32k / include / dc.h
index 2d8700d..a3c685e 100644 (file)
 #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;
 
@@ -99,175 +106,166 @@ typedef struct _DC
      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 */