a3c685e0dbb7dcd74a8e0c79bf503e89a32587ee
[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 } ROS_DC_INFO;
59
60 typedef struct _DCLEVEL
61 {
62 HPALETTE hpal;
63 struct _PALETTE * ppal;
64 PVOID pColorSpace; /* COLORSPACE* */
65 LONG lIcmMode;
66 LONG lSaveDepth;
67 DWORD unk1_00000000;
68 HGDIOBJ hdcSave;
69 POINTL ptlBrushOrigin;
70 PBRUSH pbrFill;
71 PBRUSH pbrLine;
72 PVOID plfnt; /* LFONTOBJ* (TEXTOBJ*) */
73 HGDIOBJ hPath; /* HPATH */
74 FLONG flPath;
75 LINEATTRS laPath; /* 0x20 bytes */
76 PREGION prgnClip;
77 PREGION prgnMeta;
78 COLORADJUSTMENT ca;
79 FLONG flFontState;
80 UNIVERSAL_FONT_ID ufi;
81 UNIVERSAL_FONT_ID ufiLoc[4]; /* Local List. */
82 UNIVERSAL_FONT_ID *pUFI;
83 ULONG uNumUFIs;
84 BOOL ufiSet;
85 FLONG fl;
86 FLONG flBrush;
87 MATRIX mxWorldToDevice;
88 MATRIX mxDeviceToWorld;
89 MATRIX mxWorldToPage;
90 FLOATOBJ efM11PtoD;
91 FLOATOBJ efM22PtoD;
92 FLOATOBJ efDxPtoD;
93 FLOATOBJ efDyPtoD;
94 FLOATOBJ efM11_TWIPS;
95 FLOATOBJ efM22_TWIPS;
96 FLOATOBJ efPr11;
97 FLOATOBJ efPr22;
98 PSURFACE pSurface;
99 SIZE sizl;
100 } DCLEVEL, *PDCLEVEL;
101
102 /* The DC object structure */
103 typedef struct _DC
104 {
105 /* Header for all gdi objects in the handle table.
106 Do not (re)move this. */
107 BASEOBJECT BaseObject;
108
109 DHPDEV dhpdev; /* <- PDEVOBJ.hPDev DHPDEV for device. */
110 INT dctype;
111 INT fs;
112 PPDEVOBJ ppdev;
113 PVOID hsem; /* PERESOURCE aka HSEMAPHORE */
114 FLONG flGraphicsCaps;
115 FLONG flGraphicsCaps2;
116 PDC_ATTR pdcattr;
117 DCLEVEL dclevel;
118 DC_ATTR dcattr;
119 HDC hdcNext;
120 HDC hdcPrev;
121 RECTL erclClip;
122 POINTL ptlDCOrig;
123 RECTL erclWindow;
124 RECTL erclBounds;
125 RECTL erclBoundsApp;
126 PREGION prgnAPI;
127 PREGION prgnVis; /* Visible region (must never be 0) */
128 PREGION prgnRao;
129 POINTL ptlFillOrigin;
130 EBRUSHOBJ eboFill;
131 EBRUSHOBJ eboLine;
132 EBRUSHOBJ eboText;
133 EBRUSHOBJ eboBackground;
134 HFONT hlfntCur;
135 FLONG flSimulationFlags;
136 LONG lEscapement;
137 PVOID prfnt; /* RFONT* */
138 XCLIPOBJ co; /* CLIPOBJ */
139 PVOID pPFFList; /* PPFF* */
140 PVOID pClrxFormLnk;
141 INT ipfdDevMax;
142 ULONG ulCopyCount;
143 PVOID pSurfInfo;
144 POINTL ptlDoBanding;
145
146 /* Reactos specific members */
147 ROS_DC_INFO rosdc;
148 } DC;
149
150 /* Internal functions *********************************************************/
151
152 extern PDC defaultDCstate;
153
154 INIT_FUNCTION NTSTATUS NTAPI InitDcImpl(VOID);
155 PPDEVOBJ FASTCALL IntEnumHDev(VOID);
156 PDC NTAPI DC_AllocDcWithHandle(VOID);
157 VOID FASTCALL DC_InitDC(HDC DCToInit);
158 BOOL NTAPI DC_bAllocDcAttr(PDC pdc);
159 VOID FASTCALL DC_FreeDcAttr(HDC);
160 BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody);
161 BOOL FASTCALL DC_SetOwnership(HDC hDC, PEPROCESS Owner);
162 VOID FASTCALL DC_LockDisplay(HDC);
163 VOID FASTCALL DC_UnlockDisplay(HDC);
164 BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
165
166 VOID FASTCALL DC_UpdateXforms(PDC dc);
167 BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
168 VOID FASTCALL DC_vUpdateViewportExt(PDC pdc);
169 VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL to);
170 VOID FASTCALL DC_vUpdateFillBrush(PDC pdc);
171 VOID FASTCALL DC_vUpdateLineBrush(PDC pdc);
172 VOID FASTCALL DC_vUpdateTextBrush(PDC pdc);
173 VOID FASTCALL DC_vUpdateBackgroundBrush(PDC pdc);
174 VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2);
175 VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdc1, RECT rc1, PDC pdc2, RECT rc2);
176
177 VOID NTAPI DC_vRestoreDC(IN PDC pdc, INT iSaveLevel);
178
179 BOOL FASTCALL DCU_SyncDcAttrtoUser(PDC);
180 BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC);
181 VOID FASTCALL DCU_SetDcUndeletable(HDC);
182 VOID NTAPI DC_vFreeDcAttr(PDC pdc);
183 VOID NTAPI DC_vInitDc(PDC pdc, DCTYPE dctype, PPDEVOBJ ppdev);
184
185 COLORREF FASTCALL IntGdiSetBkColor (HDC hDC, COLORREF Color);
186 INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode);
187 COLORREF APIENTRY IntGdiGetBkColor(HDC hDC);
188 INT APIENTRY IntGdiGetBkMode(HDC hDC);
189 COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color);
190 UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode);
191 UINT APIENTRY IntGdiGetTextAlign(HDC hDC);
192 COLORREF APIENTRY IntGdiGetTextColor(HDC hDC);
193 INT APIENTRY IntGdiSetStretchBltMode(HDC hDC, INT stretchBltMode);
194 VOID FASTCALL IntGdiReferencePdev(PPDEVOBJ pPDev);
195 VOID FASTCALL IntGdiUnreferencePdev(PPDEVOBJ pPDev, DWORD CleanUpType);
196 HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
197 BOOL FASTCALL IntGdiCleanDC(HDC hDC);
198 VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
199 BOOL FASTCALL MakeInfoDC(PDC,BOOL);
200 BOOL FASTCALL IntSetDefaultRegion(PDC);
201 BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner);
202
203 FORCEINLINE
204 PDC
205 DC_LockDc(HDC hdc)
206 {
207 //if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) return NULL; ???
208 return GDIOBJ_LockObject(hdc, GDIObjType_DC_TYPE);
209 }
210
211 FORCEINLINE
212 VOID
213 DC_UnlockDc(PDC pdc)
214 {
215 GDIOBJ_vUnlockObject(&pdc->BaseObject);
216 }
217
218 VOID
219 FORCEINLINE
220 DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
221 {
222 PSURFACE psurfOld = pdc->dclevel.pSurface;
223 if (psurfOld)
224 {
225 psurfOld->hdc = NULL;
226 SURFACE_ShareUnlockSurface(psurfOld);
227 }
228 if (psurfNew)
229 GDIOBJ_vReferenceObjectByPointer((POBJ)psurfNew);
230 pdc->dclevel.pSurface = psurfNew;
231 }
232
233 VOID
234 FORCEINLINE
235 DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill)
236 {
237 PBRUSH pbrFillOld = pdc->dclevel.pbrFill;
238 if (pbrFillOld)
239 BRUSH_ShareUnlockBrush(pbrFillOld);
240 if (pbrFill)
241 GDIOBJ_vReferenceObjectByPointer((POBJ)pbrFill);
242 pdc->dclevel.pbrFill = pbrFill;
243 }
244
245 VOID
246 FORCEINLINE
247 DC_vSelectLineBrush(PDC pdc, PBRUSH pbrLine)
248 {
249 PBRUSH pbrLineOld = pdc->dclevel.pbrLine;
250 if (pbrLineOld)
251 BRUSH_ShareUnlockBrush(pbrLineOld);
252 if (pbrLine)
253 GDIOBJ_vReferenceObjectByPointer((POBJ)pbrLine);
254 pdc->dclevel.pbrLine = pbrLine;
255 }
256
257 VOID
258 FORCEINLINE
259 DC_vSelectPalette(PDC pdc, PPALETTE ppal)
260 {
261 PPALETTE ppalOld = pdc->dclevel.ppal;
262 if (ppalOld)
263 PALETTE_ShareUnlockPalette(ppalOld);
264 if (ppal)
265 GDIOBJ_vReferenceObjectByPointer((POBJ)ppal);
266 pdc->dclevel.ppal = ppal;
267 }
268
269 extern PBRUSH pbrDefaultBrush ;
270
271 #endif /* not __WIN32K_DC_H */