8578f8e7070e8eb05557d99cebe08c63a5e1675f
[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 /* Update Surface if needed */
180 if(pdc->dclevel.pSurface != pdc->ppdev->pSurface)
181 {
182 if(pdc->dclevel.pSurface) SURFACE_ShareUnlockSurface(pdc->dclevel.pSurface);
183 pdc->dclevel.pSurface = PDEVOBJ_pSurface(pdc->ppdev);
184 }
185 }
186 return pdc;
187 }
188
189 void
190 FORCEINLINE
191 DC_UnlockDc(PDC pdc)
192 {
193 if(pdc->dctype == DCTYPE_DIRECT)
194 {
195 /* Release PDEV lock */
196 EngReleaseSemaphore(pdc->ppdev->hsemDevLock);
197 }
198
199 GDIOBJ_UnlockObjByPtr(&pdc->BaseObject);
200 }
201
202
203 extern PDC defaultDCstate;
204
205 NTSTATUS FASTCALL InitDcImpl(VOID);
206 PPDEVOBJ FASTCALL IntEnumHDev(VOID);
207 PDC NTAPI DC_AllocDcWithHandle();
208 VOID FASTCALL DC_InitDC(HDC DCToInit);
209 VOID FASTCALL DC_AllocateDcAttr(HDC);
210 VOID FASTCALL DC_FreeDcAttr(HDC);
211 BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody);
212 BOOL FASTCALL DC_SetOwnership(HDC hDC, PEPROCESS Owner);
213 VOID FASTCALL DC_LockDisplay(HDC);
214 VOID FASTCALL DC_UnlockDisplay(HDC);
215 BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
216
217 VOID FASTCALL DC_UpdateXforms(PDC dc);
218 BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
219 VOID FASTCALL DC_vUpdateViewportExt(PDC pdc);
220 VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL to);
221 VOID FASTCALL DC_vUpdateFillBrush(PDC pdc);
222 VOID FASTCALL DC_vUpdateLineBrush(PDC pdc);
223 VOID FASTCALL DC_vUpdateTextBrush(PDC pdc);
224 VOID FASTCALL DC_vUpdateBackgroundBrush(PDC pdc);
225
226 VOID NTAPI DC_vRestoreDC(IN PDC pdc, INT iSaveLevel);
227
228 BOOL FASTCALL DCU_SyncDcAttrtoUser(PDC);
229 BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC);
230 VOID FASTCALL DCU_SetDcUndeletable(HDC);
231 VOID NTAPI DC_vFreeDcAttr(PDC pdc);
232 VOID NTAPI DC_vInitDc(PDC pdc, DCTYPE dctype, PPDEVOBJ ppdev);
233
234 COLORREF FASTCALL IntGdiSetBkColor (HDC hDC, COLORREF Color);
235 INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode);
236 COLORREF APIENTRY IntGdiGetBkColor(HDC hDC);
237 INT APIENTRY IntGdiGetBkMode(HDC hDC);
238 COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color);
239 UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode);
240 UINT APIENTRY IntGdiGetTextAlign(HDC hDC);
241 COLORREF APIENTRY IntGdiGetTextColor(HDC hDC);
242 INT APIENTRY IntGdiSetStretchBltMode(HDC hDC, INT stretchBltMode);
243 VOID FASTCALL IntGdiReferencePdev(PPDEVOBJ pPDev);
244 VOID FASTCALL IntGdiUnreferencePdev(PPDEVOBJ pPDev, DWORD CleanUpType);
245 HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
246 BOOL FASTCALL IntGdiCleanDC(HDC hDC);
247 VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
248 BOOL FASTCALL MakeInfoDC(PDC,BOOL);
249 BOOL FASTCALL IntSetDefaultRegion(PDC);
250
251 VOID
252 FORCEINLINE
253 DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
254 {
255 PSURFACE psurfOld = pdc->dclevel.pSurface;
256 if (psurfOld)
257 SURFACE_ShareUnlockSurface(psurfOld);
258 if (psurfNew)
259 GDIOBJ_IncrementShareCount((POBJ)psurfNew);
260 pdc->dclevel.pSurface = psurfNew;
261 }
262
263 VOID
264 FORCEINLINE
265 DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill)
266 {
267 PBRUSH pbrFillOld = pdc->dclevel.pbrFill;
268 if (pbrFillOld)
269 BRUSH_ShareUnlockBrush(pbrFillOld);
270 if (pbrFill)
271 GDIOBJ_IncrementShareCount((POBJ)pbrFill);
272 pdc->dclevel.pbrFill = pbrFill;
273 }
274
275 VOID
276 FORCEINLINE
277 DC_vSelectLineBrush(PDC pdc, PBRUSH pbrLine)
278 {
279 PBRUSH pbrLineOld = pdc->dclevel.pbrLine;
280 if (pbrLineOld)
281 BRUSH_ShareUnlockBrush(pbrLineOld);
282 if (pbrLine)
283 GDIOBJ_IncrementShareCount((POBJ)pbrLine);
284 pdc->dclevel.pbrLine = pbrLine;
285 }
286
287 VOID
288 FORCEINLINE
289 DC_vSelectPalette(PDC pdc, PPALETTE ppal)
290 {
291 PPALETTE ppalOld = pdc->dclevel.ppal;
292 if (ppalOld)
293 PALETTE_ShareUnlockPalette(ppalOld);
294 if (ppal)
295 GDIOBJ_IncrementShareCount((POBJ)ppal);
296 pdc->dclevel.ppal = ppal;
297 }
298
299 #endif /* not __WIN32K_DC_H */