Merge trunk HEAD (r46369)
[reactos.git] / reactos / 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
12 /* Constants ******************************************************************/
13
14 /* Get/SetBounds/Rect support. */
15 #define DCB_WINDOWMGR 0x8000 /* Queries the Windows bounding rectangle instead of the application's */
16
17 /* flFontState */
18 #define DC_DIRTYFONT_XFORM 1
19 #define DC_DIRTYFONT_LFONT 2
20 #define DC_UFI_MAPPING 4
21
22 /* fl */
23 #define DC_FL_PAL_BACK 1
24
25 /* Type definitions ***********************************************************/
26
27 typedef struct _ROS_DC_INFO
28 {
29 HRGN hClipRgn; /* Clip region (may be 0) */
30 HRGN hVisRgn; /* Visible region (must never be 0) */
31 HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
32
33 BYTE bitsPerPixel;
34
35 CLIPOBJ *CombinedClip; /* Use XCLIPOBJ in DC. */
36
37 UNICODE_STRING DriverName;
38
39 } ROS_DC_INFO;
40
41 typedef struct _DCLEVEL
42 {
43 HPALETTE hpal;
44 struct _PALETTE * ppal;
45 PVOID pColorSpace; /* COLORSPACE* */
46 LONG lIcmMode;
47 LONG lSaveDepth;
48 DWORD unk1_00000000;
49 HGDIOBJ hdcSave;
50 POINTL ptlBrushOrigin;
51 PBRUSH pbrFill;
52 PBRUSH pbrLine;
53 PVOID plfnt; /* LFONTOBJ* (TEXTOBJ*) */
54 HGDIOBJ hPath; /* HPATH */
55 FLONG flPath;
56 LINEATTRS laPath; /* 0x20 bytes */
57 PVOID prgnClip; /* PROSRGNDATA */
58 PVOID prgnMeta;
59 COLORADJUSTMENT ca;
60 FLONG flFontState;
61 UNIVERSAL_FONT_ID ufi;
62 UNIVERSAL_FONT_ID ufiLoc[4]; /* Local List. */
63 UNIVERSAL_FONT_ID *pUFI;
64 ULONG uNumUFIs;
65 BOOL ufiSet;
66 FLONG fl;
67 FLONG flBrush;
68 MATRIX mxWorldToDevice;
69 MATRIX mxDeviceToWorld;
70 MATRIX mxWorldToPage;
71 FLOATOBJ efM11PtoD;
72 FLOATOBJ efM22PtoD;
73 FLOATOBJ efDxPtoD;
74 FLOATOBJ efDyPtoD;
75 FLOATOBJ efM11_TWIPS;
76 FLOATOBJ efM22_TWIPS;
77 FLOATOBJ efPr11;
78 FLOATOBJ efPr22;
79 PSURFACE pSurface;
80 SIZE sizl;
81 } DCLEVEL, *PDCLEVEL;
82
83 /* The DC object structure */
84 typedef struct _DC
85 {
86 /* Header for all gdi objects in the handle table.
87 Do not (re)move this. */
88 BASEOBJECT BaseObject;
89
90 DHPDEV dhpdev; /* <- PDEVOBJ.hPDev DHPDEV for device. */
91 INT dctype;
92 INT fs;
93 PPDEVOBJ ppdev;
94 PVOID hsem; /* PERESOURCE aka HSEMAPHORE */
95 FLONG flGraphicsCaps;
96 FLONG flGraphicsCaps2;
97 PDC_ATTR pdcattr;
98 DCLEVEL dclevel;
99 DC_ATTR dcattr;
100 HDC hdcNext;
101 HDC hdcPrev;
102 RECTL erclClip;
103 POINTL ptlDCOrig;
104 RECTL erclWindow;
105 RECTL erclBounds;
106 RECTL erclBoundsApp;
107 PVOID prgnAPI; /* PROSRGNDATA */
108 PVOID prgnVis;
109 PVOID prgnRao;
110 POINTL ptlFillOrigin;
111 EBRUSHOBJ eboFill;
112 EBRUSHOBJ eboLine;
113 EBRUSHOBJ eboText;
114 EBRUSHOBJ eboBackground;
115 HFONT hlfntCur;
116 FLONG flSimulationFlags;
117 LONG lEscapement;
118 PVOID prfnt; /* RFONT* */
119 XCLIPOBJ co; /* CLIPOBJ */
120 PVOID pPFFList; /* PPFF* */
121 PVOID pClrxFormLnk;
122 INT ipfdDevMax;
123 ULONG ulCopyCount;
124 PVOID pSurfInfo;
125 POINTL ptlDoBanding;
126
127 /* Reactos specific members */
128 ROS_DC_INFO rosdc;
129 } DC;
130
131 /* Internal functions *********************************************************/
132
133 #define DC_LockDc(hDC) \
134 ((PDC) GDIOBJ_LockObj ((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC))
135 #define DC_UnlockDc(pDC) \
136 GDIOBJ_UnlockObjByPtr ((POBJ)pDC)
137
138 extern PDC defaultDCstate;
139
140 NTSTATUS FASTCALL InitDcImpl(VOID);
141 PPDEVOBJ FASTCALL IntEnumHDev(VOID);
142 HDC FASTCALL DC_AllocDC(PUNICODE_STRING Driver);
143 VOID FASTCALL DC_InitDC(HDC DCToInit);
144 HDC FASTCALL DC_FindOpenDC(PUNICODE_STRING Driver);
145 VOID FASTCALL DC_AllocateDcAttr(HDC);
146 VOID FASTCALL DC_FreeDcAttr(HDC);
147 BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody);
148 BOOL FASTCALL DC_SetOwnership(HDC DC, PEPROCESS Owner);
149 VOID FASTCALL DC_LockDisplay(HDC);
150 VOID FASTCALL DC_UnlockDisplay(HDC);
151 BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
152
153 VOID FASTCALL DC_UpdateXforms(PDC dc);
154 BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
155 VOID FASTCALL DC_vUpdateViewportExt(PDC pdc);
156 VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL to);
157 VOID FASTCALL DC_vUpdateFillBrush(PDC pdc);
158 VOID FASTCALL DC_vUpdateLineBrush(PDC pdc);
159 VOID FASTCALL DC_vUpdateTextBrush(PDC pdc);
160 VOID FASTCALL DC_vUpdateBackgroundBrush(PDC pdc);
161
162 BOOL FASTCALL DCU_SyncDcAttrtoUser(PDC);
163 BOOL FASTCALL DCU_SynchDcAttrtoUser(HDC);
164 VOID FASTCALL DCU_SetDcUndeletable(HDC);
165
166 COLORREF FASTCALL IntGdiSetBkColor (HDC hDC, COLORREF Color);
167 INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode);
168 COLORREF APIENTRY IntGdiGetBkColor(HDC hDC);
169 INT APIENTRY IntGdiGetBkMode(HDC hDC);
170 COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color);
171 UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode);
172 UINT APIENTRY IntGdiGetTextAlign(HDC hDC);
173 COLORREF APIENTRY IntGdiGetTextColor(HDC hDC);
174 INT APIENTRY IntGdiSetStretchBltMode(HDC hDC, INT stretchBltMode);
175 VOID FASTCALL IntGdiReferencePdev(PPDEVOBJ pPDev);
176 VOID FASTCALL IntGdiUnreferencePdev(PPDEVOBJ pPDev, DWORD CleanUpType);
177 HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
178 BOOL FASTCALL IntGdiCleanDC(HDC hDC);
179 VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
180 INT FASTCALL IntGdiGetDeviceCaps(PDC,INT);
181
182 extern PPDEVOBJ pPrimarySurface;
183
184 VOID
185 FORCEINLINE
186 DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
187 {
188 PSURFACE psurfOld = pdc->dclevel.pSurface;
189 if (psurfOld)
190 SURFACE_ShareUnlockSurface(psurfOld);
191 if (psurfNew)
192 GDIOBJ_IncrementShareCount((POBJ)psurfNew);
193 pdc->dclevel.pSurface = psurfNew;
194 }
195
196 VOID
197 FORCEINLINE
198 DC_vSelectFillBrush(PDC pdc, PBRUSH pbrFill)
199 {
200 PBRUSH pbrFillOld = pdc->dclevel.pbrFill;
201 if (pbrFillOld)
202 BRUSH_ShareUnlockBrush(pbrFillOld);
203 if (pbrFill)
204 GDIOBJ_IncrementShareCount((POBJ)pbrFill);
205 pdc->dclevel.pbrFill = pbrFill;
206 }
207
208 VOID
209 FORCEINLINE
210 DC_vSelectLineBrush(PDC pdc, PBRUSH pbrLine)
211 {
212 PBRUSH pbrLineOld = pdc->dclevel.pbrLine;
213 if (pbrLineOld)
214 BRUSH_ShareUnlockBrush(pbrLineOld);
215 if (pbrLine)
216 GDIOBJ_IncrementShareCount((POBJ)pbrLine);
217 pdc->dclevel.pbrLine = pbrLine;
218 }
219
220 VOID
221 FORCEINLINE
222 DC_vSelectPalette(PDC pdc, PPALETTE ppal)
223 {
224 PPALETTE ppalOld = pdc->dclevel.ppal;
225 if (ppalOld)
226 PALETTE_ShareUnlockPalette(ppalOld);
227 if (ppal)
228 GDIOBJ_IncrementShareCount((POBJ)ppal);
229 pdc->dclevel.ppal = ppal;
230 }
231
232 BOOL FASTCALL
233 IntPrepareDriverIfNeeded(VOID);
234 extern PDEVOBJ PrimarySurface;
235
236 #endif /* not __WIN32K_DC_H */