[WIN32K]
[reactos.git] / 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 "engobjects.h"
7 #include "brush.h"
8 #include "bitmaps.h"
9 #include "pdevobj.h"
10 #include "palette.h"
11 #include "region.h"
12
13 /* Constants ******************************************************************/
14
15 /* Get/SetBounds/Rect support. */
16 #define DCB_WINDOWMGR 0x8000 /* Queries the Windows bounding rectangle instead of the application's */
17
18 /* flFontState */
19 #define DC_DIRTYFONT_XFORM 1
20 #define DC_DIRTYFONT_LFONT 2
21 #define DC_UFI_MAPPING 4
22
23 /* fl */
24 #define DC_FL_PAL_BACK 1
25
26 #define DC_DISPLAY 1
27 #define DC_DIRECT 2
28 #define DC_CANCELED 4
29 #define DC_PERMANANT 0x08
30 #define DC_DIRTY_RAO 0x10
31 #define DC_ACCUM_WMGR 0x20
32 #define DC_ACCUM_APP 0x40
33 #define DC_RESET 0x80
34 #define DC_SYNCHRONIZEACCESS 0x100
35 #define DC_EPSPRINTINGESCAPE 0x200
36 #define DC_TEMPINFODC 0x400
37 #define DC_FULLSCREEN 0x800
38 #define DC_IN_CLONEPDEV 0x1000
39 #define DC_REDIRECTION 0x2000
40 #define DC_SHAREACCESS 0x4000
41
42 typedef enum
43 {
44 DCTYPE_DIRECT = 0,
45 DCTYPE_MEMORY = 1,
46 DCTYPE_INFO = 2,
47 } DCTYPE;
48
49
50 /* Type definitions ***********************************************************/
51
52 typedef struct _ROS_DC_INFO
53 {
54 HRGN hClipRgn; /* Clip region (may be 0) */
55 HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
56
57 BYTE bitsPerPixel;
58
59 CLIPOBJ *CombinedClip;
60
61 UNICODE_STRING DriverName;
62
63 } ROS_DC_INFO;
64
65 typedef struct _DCLEVEL
66 {
67 HPALETTE hpal;
68 struct _PALETTE * ppal;
69 PVOID pColorSpace; /* COLORSPACE* */
70 LONG lIcmMode;
71 LONG lSaveDepth;
72 DWORD unk1_00000000;
73 HGDIOBJ hdcSave;
74 POINTL ptlBrushOrigin;
75 PBRUSH pbrFill;
76 PBRUSH pbrLine;
77 PVOID plfnt; /* LFONTOBJ* (TEXTOBJ*) */
78 HGDIOBJ hPath; /* HPATH */
79 FLONG flPath;
80 LINEATTRS laPath; /* 0x20 bytes */
81 PVOID prgnClip; /* PROSRGNDATA */
82 PVOID prgnMeta;
83 COLORADJUSTMENT ca;
84 FLONG flFontState;
85 UNIVERSAL_FONT_ID ufi;
86 UNIVERSAL_FONT_ID ufiLoc[4]; /* Local List. */
87 UNIVERSAL_FONT_ID *pUFI;
88 ULONG uNumUFIs;
89 BOOL ufiSet;
90 FLONG fl;
91 FLONG flBrush;
92 MATRIX mxWorldToDevice;
93 MATRIX mxDeviceToWorld;
94 MATRIX mxWorldToPage;
95 FLOATOBJ efM11PtoD;
96 FLOATOBJ efM22PtoD;
97 FLOATOBJ efDxPtoD;
98 FLOATOBJ efDyPtoD;
99 FLOATOBJ efM11_TWIPS;
100 FLOATOBJ efM22_TWIPS;
101 FLOATOBJ efPr11;
102 FLOATOBJ efPr22;
103 PSURFACE pSurface;
104 SIZE sizl;
105 } DCLEVEL, *PDCLEVEL;
106
107 /* The DC object structure */
108 typedef struct _DC
109 {
110 /* Header for all gdi objects in the handle table.
111 Do not (re)move this. */
112 BASEOBJECT BaseObject;
113
114 DHPDEV dhpdev; /* <- PDEVOBJ.hPDev DHPDEV for device. */
115 INT dctype;
116 INT fs;
117 PPDEVOBJ ppdev;
118 PVOID hsem; /* PERESOURCE aka HSEMAPHORE */
119 FLONG flGraphicsCaps;
120 FLONG flGraphicsCaps2;
121 PDC_ATTR pdcattr;
122 DCLEVEL dclevel;
123 DC_ATTR dcattr;
124 HDC hdcNext;
125 HDC hdcPrev;
126 RECTL erclClip;
127 POINTL ptlDCOrig;
128 RECTL erclWindow;
129 RECTL erclBounds;
130 RECTL erclBoundsApp;
131 PREGION prgnAPI; /* PROSRGNDATA */
132 PREGION prgnVis; /* Visible region (must never be 0) */
133 PREGION prgnRao;
134 POINTL ptlFillOrigin;
135 EBRUSHOBJ eboFill;
136 EBRUSHOBJ eboLine;
137 EBRUSHOBJ eboText;
138 EBRUSHOBJ eboBackground;
139 HFONT hlfntCur;
140 FLONG flSimulationFlags;
141 LONG lEscapement;
142 PVOID prfnt; /* RFONT* */
143 XCLIPOBJ co; /* CLIPOBJ */
144 PVOID pPFFList; /* PPFF* */
145 PVOID pClrxFormLnk;
146 INT ipfdDevMax;
147 ULONG ulCopyCount;
148 PVOID pSurfInfo;
149 POINTL ptlDoBanding;
150
151 /* Reactos specific members */
152 ROS_DC_INFO rosdc;
153 } DC;
154
155 /* Internal functions *********************************************************/
156
157 #if 0
158 #define DC_LockDc(hDC) \
159 ((PDC) GDIOBJ_LockObj ((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC))
160 #define DC_UnlockDc(pDC) \
161 GDIOBJ_UnlockObjByPtr ((POBJ)pDC)
162 #endif
163
164 VOID NTAPI EngAcquireSemaphoreShared(IN HSEMAPHORE hsem);
165
166 PDC
167 FORCEINLINE
168 DC_LockDc(HDC hdc)
169 {
170 PDC pdc;
171 pdc = GDIOBJ_LockObj(hdc, GDILoObjType_LO_DC_TYPE);
172
173 /* Direct DC's need PDEV locking */
174 if(pdc && pdc->dctype == DCTYPE_DIRECT)
175 {
176 /* Acquire shared PDEV lock */
177 EngAcquireSemaphoreShared(pdc->ppdev->hsemDevLock);
178
179 /* Assign Surface */
180 pdc->dclevel.pSurface = PDEVOBJ_pSurface(pdc->ppdev);
181
182 }
183 return pdc;
184 }
185
186 void
187 FORCEINLINE
188 DC_UnlockDc(PDC pdc)
189 {
190 if(pdc->dctype == DCTYPE_DIRECT)
191 {
192 /* Release surface lock */
193 SURFACE_ShareUnlockSurface(pdc->dclevel.pSurface);
194 /* Release PDEV lock */
195 EngReleaseSemaphore(pdc->ppdev->hsemDevLock);
196 }
197
198 GDIOBJ_UnlockObjByPtr(&pdc->BaseObject);
199 }
200
201
202 extern PDC defaultDCstate;
203
204 NTSTATUS FASTCALL InitDcImpl(VOID);
205 PPDEVOBJ FASTCALL IntEnumHDev(VOID);
206 PDC NTAPI DC_AllocDcWithHandle();
207 VOID FASTCALL DC_InitDC(HDC DCToInit);
208 VOID FASTCALL DC_AllocateDcAttr(HDC);
209 VOID FASTCALL DC_FreeDcAttr(HDC);
210 BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody);
211 BOOL FASTCALL DC_SetOwnership(HDC hDC, PEPROCESS Owner);
212 VOID FASTCALL DC_LockDisplay(HDC);
213 VOID FASTCALL DC_UnlockDisplay(HDC);
214 BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
215
216 VOID FASTCALL DC_UpdateXforms(PDC dc);
217 BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
218 VOID FASTCALL DC_vUpdateViewportExt(PDC pdc);
219 VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL to);
220 VOID FASTCALL DC_vUpdateFillBrush(PDC pdc);
221 VOID FASTCALL DC_vUpdateLineBrush(PDC pdc);
222 VOID FASTCALL DC_vUpdateTextBrush(PDC pdc);
223 VOID FASTCALL DC_vUpdateBackgroundBrush(PDC pdc);
224
225 VOID NTAPI DC_vRestoreDC(IN PDC pdc, INT iSaveLevel);
226
227 BOOL FASTCALL DCU_SyncDcAttrtoUser(PDC);
228 BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC);
229 VOID FASTCALL DCU_SetDcUndeletable(HDC);
230 VOID NTAPI DC_vFreeDcAttr(PDC pdc);
231 VOID NTAPI DC_vInitDc(PDC pdc, DCTYPE dctype, PPDEVOBJ ppdev);
232
233 COLORREF FASTCALL IntGdiSetBkColor (HDC hDC, COLORREF Color);
234 INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode);
235 COLORREF APIENTRY IntGdiGetBkColor(HDC hDC);
236 INT APIENTRY IntGdiGetBkMode(HDC hDC);
237 COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color);
238 UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode);
239 UINT APIENTRY IntGdiGetTextAlign(HDC hDC);
240 COLORREF APIENTRY IntGdiGetTextColor(HDC hDC);
241 INT APIENTRY IntGdiSetStretchBltMode(HDC hDC, INT stretchBltMode);
242 VOID FASTCALL IntGdiReferencePdev(PPDEVOBJ pPDev);
243 VOID FASTCALL IntGdiUnreferencePdev(PPDEVOBJ pPDev, DWORD CleanUpType);
244 HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
245 BOOL FASTCALL IntGdiCleanDC(HDC hDC);
246 VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
247 BOOL FASTCALL MakeInfoDC(PDC,BOOL);
248 BOOL FASTCALL IntSetDefaultRegion(PDC);
249
250 VOID
251 FORCEINLINE
252 DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
253 {
254 PSURFACE psurfOld = pdc->dclevel.pSurface;
255 if (psurfOld)
256 SURFACE_ShareUnlockSurface(psurfOld);
257 if (psurfNew)
258 GDIOBJ_IncrementShareCount((POBJ)psurfNew);
259 pdc->dclevel.pSurface = psurfNew;
260 }
261
262 VOID
263 FORCEINLINE
264 DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill)
265 {
266 PBRUSH pbrFillOld = pdc->dclevel.pbrFill;
267 if (pbrFillOld)
268 BRUSH_ShareUnlockBrush(pbrFillOld);
269 if (pbrFill)
270 GDIOBJ_IncrementShareCount((POBJ)pbrFill);
271 pdc->dclevel.pbrFill = pbrFill;
272 }
273
274 VOID
275 FORCEINLINE
276 DC_vSelectLineBrush(PDC pdc, PBRUSH pbrLine)
277 {
278 PBRUSH pbrLineOld = pdc->dclevel.pbrLine;
279 if (pbrLineOld)
280 BRUSH_ShareUnlockBrush(pbrLineOld);
281 if (pbrLine)
282 GDIOBJ_IncrementShareCount((POBJ)pbrLine);
283 pdc->dclevel.pbrLine = pbrLine;
284 }
285
286 VOID
287 FORCEINLINE
288 DC_vSelectPalette(PDC pdc, PPALETTE ppal)
289 {
290 PPALETTE ppalOld = pdc->dclevel.ppal;
291 if (ppalOld)
292 PALETTE_ShareUnlockPalette(ppalOld);
293 if (ppal)
294 GDIOBJ_IncrementShareCount((POBJ)ppal);
295 pdc->dclevel.ppal = ppal;
296 }
297
298 #endif /* not __WIN32K_DC_H */