Sync to trunk r40610
[reactos.git] / reactos / subsystems / win32 / win32k / include / dc.h
1 #ifndef __WIN32K_DC_H
2 #define __WIN32K_DC_H
3
4 #include "brush.h"
5 #include "bitmaps.h"
6 #include "pdevobj.h"
7
8 /* Constants ******************************************************************/
9
10 /* Get/SetBounds/Rect support. */
11 #define DCB_WINDOWMGR 0x8000 /* Queries the Windows bounding rectangle instead of the application's */
12
13 /* Type definitions ***********************************************************/
14
15 typedef struct _ROS_DC_INFO
16 {
17 HRGN hClipRgn; /* Clip region (may be 0) */
18 HRGN hVisRgn; /* Should me to DC. Visible region (must never be 0) */
19 HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
20
21 BYTE bitsPerPixel;
22
23 CLIPOBJ *CombinedClip;
24 XLATEOBJ *XlateBrush;
25 XLATEOBJ *XlatePen;
26
27 UNICODE_STRING DriverName;
28
29 } ROS_DC_INFO;
30
31 /* EXtended CLip and Window Region Object */
32 typedef struct _XCLIPOBJ
33 {
34 WNDOBJ eClipWnd;
35 PVOID pClipRgn; /* prgnRao_ or (prgnVis_ if (prgnRao_ == z)) */
36 DWORD Unknown1[16];
37 DWORD nComplexity; /* count/mode based on # of rect in regions scan. */
38 PVOID pUnknown; /* UnK pointer to a large drawing structure. */
39 /* We will use it for CombinedClip ptr. */
40 } XCLIPOBJ, *PXCLIPOBJ;
41
42 typedef struct _DCLEVEL
43 {
44 HPALETTE hpal;
45 struct _PALETTE * ppal;
46 PVOID pColorSpace; /* COLORSPACE* */
47 LONG lIcmMode;
48 LONG lSaveDepth;
49 DWORD unk1_00000000;
50 HGDIOBJ hdcSave;
51 POINTL ptlBrushOrigin;
52 PBRUSH pbrFill;
53 PBRUSH pbrLine;
54 PVOID plfnt; /* LFONTOBJ* (TEXTOBJ*) */
55 HGDIOBJ hPath; /* HPATH */
56 FLONG flPath;
57 LINEATTRS laPath; /* 0x20 bytes */
58 PVOID prgnClip; /* PROSRGNDATA */
59 PVOID prgnMeta;
60 COLORADJUSTMENT ca;
61 FLONG flFontState;
62 UNIVERSAL_FONT_ID ufi;
63 UNIVERSAL_FONT_ID ufiLoc[4]; /* Local List. */
64 UNIVERSAL_FONT_ID *pUFI;
65 ULONG uNumUFIs;
66 BOOL ufiSet;
67 FLONG fl;
68 FLONG flBrush;
69 MATRIX mxWorldToDevice;
70 MATRIX mxDeviceToWorld;
71 MATRIX mxWorldToPage;
72 FLOATOBJ efM11PtoD;
73 FLOATOBJ efM22PtoD;
74 FLOATOBJ efDxPtoD;
75 FLOATOBJ efDyPtoD;
76 FLOATOBJ efM11_TWIPS;
77 FLOATOBJ efM22_TWIPS;
78 FLOATOBJ efPr11;
79 FLOATOBJ efPr22;
80 PSURFACE pSurface;
81 SIZE sizl;
82 } DCLEVEL, *PDCLEVEL;
83
84 /* The DC object structure */
85 typedef struct _DC
86 {
87 /* Header for all gdi objects in the handle table.
88 Do not (re)move this. */
89 BASEOBJECT BaseObject;
90
91 DHPDEV dhpdev; /* <- PDEVOBJ.hPDev DHPDEV for device. */
92 INT dctype;
93 INT fs;
94 PPDEVOBJ ppdev;
95 PVOID hsem; /* PERESOURCE aka HSEMAPHORE */
96 FLONG flGraphicsCaps;
97 FLONG flGraphicsCaps2;
98 PDC_ATTR pdcattr;
99 DCLEVEL dclevel;
100 DC_ATTR dcattr;
101 HDC hdcNext;
102 HDC hdcPrev;
103 RECTL erclClip;
104 POINTL ptlDCOrig;
105 RECTL erclWindow;
106 RECTL erclBounds;
107 RECTL erclBoundsApp;
108 PVOID prgnAPI; /* PROSRGNDATA */
109 PVOID prgnVis;
110 PVOID prgnRao;
111 POINTL ptlFillOrigin;
112 EBRUSHOBJ eboFill;
113 EBRUSHOBJ eboLine;
114 EBRUSHOBJ eboText;
115 EBRUSHOBJ eboBackground;
116 HFONT hlfntCur;
117 FLONG flSimulationFlags;
118 LONG lEscapement;
119 PVOID prfnt; /* RFONT* */
120 XCLIPOBJ co; /* CLIPOBJ */
121 PVOID pPFFList; /* PPFF* */
122 PVOID pClrxFormLnk;
123 INT ipfdDevMax;
124 ULONG ulCopyCount;
125 PVOID pSurfInfo;
126 POINTL ptlDoBanding;
127
128 /* Reactos specific members */
129 ROS_DC_INFO rosdc;
130 } DC, *PDC;
131
132 /* Internal functions *********************************************************/
133
134 #define DC_LockDc(hDC) \
135 ((PDC) GDIOBJ_LockObj ((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC))
136 #define DC_UnlockDc(pDC) \
137 GDIOBJ_UnlockObjByPtr ((POBJ)pDC)
138
139 extern PDC defaultDCstate;
140
141 NTSTATUS FASTCALL InitDcImpl(VOID);
142 PPDEVOBJ FASTCALL IntEnumHDev(VOID);
143 HDC FASTCALL DC_AllocDC(PUNICODE_STRING Driver);
144 VOID FASTCALL DC_InitDC(HDC DCToInit);
145 HDC FASTCALL DC_FindOpenDC(PUNICODE_STRING Driver);
146 VOID FASTCALL DC_FreeDC(HDC);
147 VOID FASTCALL DC_AllocateDcAttr(HDC);
148 VOID FASTCALL DC_FreeDcAttr(HDC);
149 BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody);
150 BOOL FASTCALL DC_SetOwnership(HDC DC, PEPROCESS Owner);
151 VOID FASTCALL DC_LockDisplay(HDC);
152 VOID FASTCALL DC_UnlockDisplay(HDC);
153 BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
154
155 VOID FASTCALL DC_UpdateXforms(PDC dc);
156 BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
157 VOID FASTCALL DC_vUpdateViewportExt(PDC pdc);
158 VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst);
159 VOID FASTCALL DC_vUpdateFillBrush(PDC pdc);
160 VOID FASTCALL DC_vUpdateLineBrush(PDC pdc);
161 VOID FASTCALL DC_vUpdateTextBrush(PDC pdc);
162 VOID FASTCALL DC_vUpdateBackgroundBrush(PDC pdc);
163
164 BOOL FASTCALL DCU_SyncDcAttrtoUser(PDC);
165 BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC);
166 VOID FASTCALL DCU_SetDcUndeletable(HDC);
167
168 COLORREF FASTCALL IntGdiSetBkColor (HDC hDC, COLORREF Color);
169 INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode);
170 COLORREF APIENTRY IntGdiGetBkColor(HDC hDC);
171 INT APIENTRY IntGdiGetBkMode(HDC hDC);
172 COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color);
173 UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode);
174 UINT APIENTRY IntGdiGetTextAlign(HDC hDC);
175 COLORREF APIENTRY IntGdiGetTextColor(HDC hDC);
176 INT APIENTRY IntGdiSetStretchBltMode(HDC hDC, INT stretchBltMode);
177 VOID FASTCALL IntGdiReferencePdev(PPDEVOBJ pPDev);
178 VOID FASTCALL IntGdiUnreferencePdev(PPDEVOBJ pPDev, DWORD CleanUpType);
179 HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
180 BOOL FASTCALL IntGdiCleanDC(HDC hDC);
181 VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
182 INT FASTCALL IntGdiGetDeviceCaps(PDC,INT);
183
184 extern PPDEVOBJ pPrimarySurface;
185
186 VOID
187 FORCEINLINE
188 DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
189 {
190 PSURFACE psurfOld = pdc->dclevel.pSurface;
191 if (psurfOld)
192 SURFACE_ShareUnlockSurface(psurfOld);
193 if (psurfNew)
194 GDIOBJ_IncrementShareCount((POBJ)psurfNew);
195 pdc->dclevel.pSurface = psurfNew;
196 }
197
198 VOID
199 FORCEINLINE
200 DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill)
201 {
202 PBRUSH pbrFillOld = pdc->dclevel.pbrFill;
203 if (pbrFillOld)
204 BRUSH_ShareUnlockBrush(pbrFillOld);
205 if (pbrFill)
206 GDIOBJ_IncrementShareCount((POBJ)pbrFill);
207 pdc->dclevel.pbrFill = pbrFill;
208 }
209
210 VOID
211 FORCEINLINE
212 DC_vSelectLineBrush(PDC pdc, PBRUSH pbrLine)
213 {
214 PBRUSH pbrLineOld = pdc->dclevel.pbrLine;
215 if (pbrLineOld)
216 BRUSH_ShareUnlockBrush(pbrLineOld);
217 if (pbrLine)
218 GDIOBJ_IncrementShareCount((POBJ)pbrLine);
219 pdc->dclevel.pbrLine = pbrLine;
220 }
221
222 BOOL FASTCALL
223 IntPrepareDriverIfNeeded();
224 extern PDEVOBJ PrimarySurface;
225
226 #endif /* not __WIN32K_DC_H */