[YAROTOWS] Reintegrate the branch. For a brighter future.
[reactos.git] / reactos / subsystems / win32 / win32k / include / dc.h
index 97200ba..8150b16 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 */
 
-/* PDEVOBJ 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 ***********************************************************/
-
-// FIXME: move me to an appropriate header
-typedef struct _GDIPOINTER /* should stay private to ENG? No, part of PDEVOBJ aka HDEV aka PDEV. */
-{
-  /* private GDI pointer handling information, required for software emulation */
-  BOOL     Enabled;
-  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 _PDEVOBJ
+/* 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
 {
-  BASEOBJECT  BaseObject;
-
-  struct _PDEVOBJ *ppdevNext;
-  INT           cPdevRefs;
-  INT           cPdevOpenRefs;
-  struct _PDEVOBJ *ppdevParent;
-  FLONG         flFlags;
-  PERESOURCE    hsemDevLock;    /* Device lock. */
-
-  PVOID         pvGammaRamp;    /* Gamma ramp pointer. */
-
-  HSURF         FillPatterns[HS_DDI_MAX];
-
-  ULONG         DxDd_nCount;
+  DCTYPE_DIRECT = 0,
+  DCTYPE_MEMORY = 1,
+  DCTYPE_INFO = 2,
+} DCTYPE;
 
-  DHPDEV        hPDev;          /* DHPDEV for device. */
-  PVOID         ppalSurf;       /* PEPALOBJ/PPALGDI for this device. */
-  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;
-} PDEVOBJ, *PPDEVOBJ;
 
+/* Type definitions ***********************************************************/
 
 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;
 
   CLIPOBJ     *CombinedClip;
-  XLATEOBJ    *XlateBrush;
-  XLATEOBJ    *XlatePen;
 
   UNICODE_STRING    DriverName;
 
 } ROS_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;
-
 typedef struct _DCLEVEL
 {
   HPALETTE          hpal;
-  struct _PALGDI  * ppal;
+  struct _PALETTE  * ppal;
   PVOID             pColorSpace; /* COLORSPACE* */
   LONG              lIcmMode;
   LONG              lSaveDepth;
@@ -186,9 +126,9 @@ typedef struct _DC
   RECTL       erclWindow;
   RECTL       erclBounds;
   RECTL       erclBoundsApp;
-  PVOID       prgnAPI; /* PROSRGNDATA */
-  PVOID       prgnVis;
-  PVOID       prgnRao;
+  PROSRGNDATA prgnAPI; /* PROSRGNDATA */
+  PROSRGNDATA prgnVis; /* Visible region (must never be 0) */
+  PROSRGNDATA prgnRao;
   POINTL      ptlFillOrigin;
   EBRUSHOBJ   eboFill;
   EBRUSHOBJ   eboLine;
@@ -208,16 +148,7 @@ typedef struct _DC
 
   /* Reactos specific members */
   ROS_DC_INFO rosdc;
-} 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;
-
+} DC;
 
 /* Internal functions *********************************************************/
 
@@ -230,33 +161,34 @@ extern PDC defaultDCstate;
 
 NTSTATUS FASTCALL InitDcImpl(VOID);
 PPDEVOBJ FASTCALL IntEnumHDev(VOID);
-HDC  FASTCALL DC_AllocDC(PUNICODE_STRING  Driver);
+PDC NTAPI DC_AllocDcWithHandle();
 VOID FASTCALL DC_InitDC(HDC  DCToInit);
-HDC  FASTCALL DC_FindOpenDC(PUNICODE_STRING  Driver);
-VOID FASTCALL DC_FreeDC(HDC);
 VOID FASTCALL DC_AllocateDcAttr(HDC);
 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);
@@ -272,11 +204,8 @@ 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);
-HPEN FASTCALL IntGdiSelectPen(PDC,HPEN);
-HBRUSH FASTCALL IntGdiSelectBrush(PDC,HBRUSH);
-INT FASTCALL IntGdiGetDeviceCaps(PDC,INT);
-
-extern PPDEVOBJ pPrimarySurface;
+BOOL FASTCALL MakeInfoDC(PDC,BOOL);
+BOOL FASTCALL IntSetDefaultRegion(PDC);
 
 VOID
 FORCEINLINE
@@ -285,15 +214,47 @@ DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
     PSURFACE psurfOld = pdc->dclevel.pSurface;
     if (psurfOld)
         SURFACE_ShareUnlockSurface(psurfOld);
-    
     if (psurfNew)
         GDIOBJ_IncrementShareCount((POBJ)psurfNew);
-
     pdc->dclevel.pSurface = psurfNew;
 }
 
-BOOL FASTCALL
-IntPrepareDriverIfNeeded();
-extern PDEVOBJ PrimarySurface;
+VOID
+FORCEINLINE
+DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill)
+{
+    PBRUSH pbrFillOld = pdc->dclevel.pbrFill;
+    if (pbrFillOld)
+        BRUSH_ShareUnlockBrush(pbrFillOld);
+    if (pbrFill)
+        GDIOBJ_IncrementShareCount((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_IncrementShareCount((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_IncrementShareCount((POBJ)ppal);
+    pdc->dclevel.ppal = ppal;
+}
+
+extern PBRUSH pbrDefaultBrush ;
 
 #endif /* not __WIN32K_DC_H */