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