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