[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 CLIPOBJ *CombinedClip;
58
59 UNICODE_STRING DriverName;
60
61 } ROS_DC_INFO;
62
63 typedef struct _DCLEVEL
64 {
65 HPALETTE hpal;
66 struct _PALETTE * ppal;
67 PVOID pColorSpace; /* COLORSPACE* */
68 LONG lIcmMode;
69 LONG lSaveDepth;
70 DWORD unk1_00000000;
71 HGDIOBJ hdcSave;
72 POINTL ptlBrushOrigin;
73 PBRUSH pbrFill;
74 PBRUSH pbrLine;
75 PVOID plfnt; /* LFONTOBJ* (TEXTOBJ*) */
76 HGDIOBJ hPath; /* HPATH */
77 FLONG flPath;
78 LINEATTRS laPath; /* 0x20 bytes */
79 PVOID prgnClip; /* PROSRGNDATA */
80 PVOID prgnMeta;
81 COLORADJUSTMENT ca;
82 FLONG flFontState;
83 UNIVERSAL_FONT_ID ufi;
84 UNIVERSAL_FONT_ID ufiLoc[4]; /* Local List. */
85 UNIVERSAL_FONT_ID *pUFI;
86 ULONG uNumUFIs;
87 BOOL ufiSet;
88 FLONG fl;
89 FLONG flBrush;
90 MATRIX mxWorldToDevice;
91 MATRIX mxDeviceToWorld;
92 MATRIX mxWorldToPage;
93 FLOATOBJ efM11PtoD;
94 FLOATOBJ efM22PtoD;
95 FLOATOBJ efDxPtoD;
96 FLOATOBJ efDyPtoD;
97 FLOATOBJ efM11_TWIPS;
98 FLOATOBJ efM22_TWIPS;
99 FLOATOBJ efPr11;
100 FLOATOBJ efPr22;
101 PSURFACE pSurface;
102 SIZE sizl;
103 } DCLEVEL, *PDCLEVEL;
104
105 /* The DC object structure */
106 typedef struct _DC
107 {
108 /* Header for all gdi objects in the handle table.
109 Do not (re)move this. */
110 BASEOBJECT BaseObject;
111
112 DHPDEV dhpdev; /* <- PDEVOBJ.hPDev DHPDEV for device. */
113 INT dctype;
114 INT fs;
115 PPDEVOBJ ppdev;
116 PVOID hsem; /* PERESOURCE aka HSEMAPHORE */
117 FLONG flGraphicsCaps;
118 FLONG flGraphicsCaps2;
119 PDC_ATTR pdcattr;
120 DCLEVEL dclevel;
121 DC_ATTR dcattr;
122 HDC hdcNext;
123 HDC hdcPrev;
124 RECTL erclClip;
125 POINTL ptlDCOrig;
126 RECTL erclWindow;
127 RECTL erclBounds;
128 RECTL erclBoundsApp;
129 PREGION prgnAPI; /* PROSRGNDATA */
130 PREGION prgnVis; /* Visible region (must never be 0) */
131 PREGION prgnRao;
132 POINTL ptlFillOrigin;
133 EBRUSHOBJ eboFill;
134 EBRUSHOBJ eboLine;
135 EBRUSHOBJ eboText;
136 EBRUSHOBJ eboBackground;
137 HFONT hlfntCur;
138 FLONG flSimulationFlags;
139 LONG lEscapement;
140 PVOID prfnt; /* RFONT* */
141 XCLIPOBJ co; /* CLIPOBJ */
142 PVOID pPFFList; /* PPFF* */
143 PVOID pClrxFormLnk;
144 INT ipfdDevMax;
145 ULONG ulCopyCount;
146 PVOID pSurfInfo;
147 POINTL ptlDoBanding;
148
149 /* Reactos specific members */
150 ROS_DC_INFO rosdc;
151 } DC;
152
153 /* Internal functions *********************************************************/
154
155 #if 1
156 #define DC_LockDc(hDC) \
157 ((PDC) GDIOBJ_LockObj ((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC))
158 #define DC_UnlockDc(pDC) \
159 GDIOBJ_UnlockObjByPtr ((POBJ)pDC)
160 #else
161
162 VOID NTAPI EngAcquireSemaphoreShared(IN HSEMAPHORE hsem);
163
164 PDC
165 FORCEINLINE
166 DC_LockDc(HDC hdc)
167 {
168 PDC pdc;
169 pdc = GDIOBJ_LockObj(hdc, GDILoObjType_LO_DC_TYPE);
170
171 /* Direct DC's need PDEV locking */
172 if(pdc && pdc->dctype == DCTYPE_DIRECT)
173 {
174 /* Acquire shared PDEV lock */
175 EngAcquireSemaphoreShared(pdc->ppdev->hsemDevLock);
176
177 /* Update Surface if needed */
178 if(pdc->dclevel.pSurface != pdc->ppdev->pSurface)
179 {
180 if(pdc->dclevel.pSurface) SURFACE_ShareUnlockSurface(pdc->dclevel.pSurface);
181 pdc->dclevel.pSurface = PDEVOBJ_pSurface(pdc->ppdev);
182 }
183 }
184 return pdc;
185 }
186
187 void
188 FORCEINLINE
189 DC_UnlockDc(PDC pdc)
190 {
191 if(pdc->dctype == DCTYPE_DIRECT)
192 {
193 /* Release PDEV lock */
194 EngReleaseSemaphore(pdc->ppdev->hsemDevLock);
195 }
196
197 GDIOBJ_UnlockObjByPtr(&pdc->BaseObject);
198 }
199 #endif
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 VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2);
225 VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdc1, RECT rc1, PDC pdc2, RECT rc2);
226
227 VOID NTAPI DC_vRestoreDC(IN PDC pdc, INT iSaveLevel);
228
229 BOOL FASTCALL DCU_SyncDcAttrtoUser(PDC);
230 BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC);
231 VOID FASTCALL DCU_SetDcUndeletable(HDC);
232 VOID NTAPI DC_vFreeDcAttr(PDC pdc);
233 VOID NTAPI DC_vInitDc(PDC pdc, DCTYPE dctype, PPDEVOBJ ppdev);
234
235 COLORREF FASTCALL IntGdiSetBkColor (HDC hDC, COLORREF Color);
236 INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode);
237 COLORREF APIENTRY IntGdiGetBkColor(HDC hDC);
238 INT APIENTRY IntGdiGetBkMode(HDC hDC);
239 COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color);
240 UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode);
241 UINT APIENTRY IntGdiGetTextAlign(HDC hDC);
242 COLORREF APIENTRY IntGdiGetTextColor(HDC hDC);
243 INT APIENTRY IntGdiSetStretchBltMode(HDC hDC, INT stretchBltMode);
244 VOID FASTCALL IntGdiReferencePdev(PPDEVOBJ pPDev);
245 VOID FASTCALL IntGdiUnreferencePdev(PPDEVOBJ pPDev, DWORD CleanUpType);
246 HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
247 BOOL FASTCALL IntGdiCleanDC(HDC hDC);
248 VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
249 BOOL FASTCALL MakeInfoDC(PDC,BOOL);
250 BOOL FASTCALL IntSetDefaultRegion(PDC);
251
252 VOID
253 FORCEINLINE
254 DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
255 {
256 PSURFACE psurfOld = pdc->dclevel.pSurface;
257 if (psurfOld)
258 SURFACE_ShareUnlockSurface(psurfOld);
259 if (psurfNew)
260 GDIOBJ_IncrementShareCount((POBJ)psurfNew);
261 pdc->dclevel.pSurface = psurfNew;
262 }
263
264 VOID
265 FORCEINLINE
266 DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill)
267 {
268 PBRUSH pbrFillOld = pdc->dclevel.pbrFill;
269 if (pbrFillOld)
270 BRUSH_ShareUnlockBrush(pbrFillOld);
271 if (pbrFill)
272 GDIOBJ_IncrementShareCount((POBJ)pbrFill);
273 pdc->dclevel.pbrFill = pbrFill;
274 }
275
276 VOID
277 FORCEINLINE
278 DC_vSelectLineBrush(PDC pdc, PBRUSH pbrLine)
279 {
280 PBRUSH pbrLineOld = pdc->dclevel.pbrLine;
281 if (pbrLineOld)
282 BRUSH_ShareUnlockBrush(pbrLineOld);
283 if (pbrLine)
284 GDIOBJ_IncrementShareCount((POBJ)pbrLine);
285 pdc->dclevel.pbrLine = pbrLine;
286 }
287
288 VOID
289 FORCEINLINE
290 DC_vSelectPalette(PDC pdc, PPALETTE ppal)
291 {
292 PPALETTE ppalOld = pdc->dclevel.ppal;
293 if (ppalOld)
294 PALETTE_ShareUnlockPalette(ppalOld);
295 if (ppal)
296 GDIOBJ_IncrementShareCount((POBJ)ppal);
297 pdc->dclevel.ppal = ppal;
298 }
299
300 extern PBRUSH pbrDefaultBrush ;
301
302 #endif /* not __WIN32K_DC_H */