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