[WIN32SS]
[reactos.git] / reactos / win32ss / gdi / ntgdi / coord.h
1 #pragma once
2
3 #define IntLPtoDP(pdc, ppt, count) DC_vXformWorldToDevice(pdc, count, (PPOINTL)(ppt), (PPOINTL)(ppt));
4 #define CoordLPtoDP(pdc, ppt) DC_vXformWorldToDevice(pdc, 1, (PPOINTL)(ppt), (PPOINTL)(ppt));
5 #define IntDPtoLP(pdc, ppt, count) DC_vXformDeviceToWorld(pdc, count, (PPOINTL)(ppt), (PPOINTL)(ppt));
6 #define CoordDPtoLP(pdc, ppt) DC_vXformDeviceToWorld(pdc, 1, (PPOINTL)(ppt), (PPOINTL)(ppt));
7
8 #define XForm2MatrixS(m, x) XFormToMatrix(m, (XFORML*)x)
9 #define MatrixS2XForm(x, m) MatrixToXForm((XFORML*)x, m)
10
11 FORCEINLINE
12 void
13 XFormToMatrix(
14 MATRIX *pmx,
15 const XFORML *pxform)
16 {
17 XFORMOBJ xo;
18 XFORMOBJ_vInit(&xo, pmx);
19 XFORMOBJ_iSetXform(&xo, pxform);
20 }
21
22 FORCEINLINE
23 void
24 MatrixToXForm(
25 XFORML *pxform,
26 const MATRIX *pmx)
27 {
28 XFORMOBJ xo;
29 XFORMOBJ_vInit(&xo, (MATRIX*)pmx);
30 XFORMOBJ_iGetXform(&xo, pxform);
31 }
32
33 FORCEINLINE
34 void
35 InvertXform(
36 XFORML *pxformDest,
37 const XFORML *pxformSource)
38 {
39 XFORMOBJ xo;
40 MATRIX mx;
41
42 XFORMOBJ_vInit(&xo, &mx);
43 XFORMOBJ_iSetXform(&xo, pxformSource);
44 XFORMOBJ_iInverse(&xo, &xo);
45 XFORMOBJ_iGetXform(&xo, pxformDest);
46 }
47
48 VOID
49 FASTCALL
50 DC_vFixIsotropicMapping(PDC pdc);
51
52 VOID
53 FASTCALL
54 DC_vUpdateWorldToDevice(PDC pdc);
55
56 VOID
57 FASTCALL
58 DC_vUpdateDeviceToWorld(PDC pdc);
59
60 PSIZEL
61 FORCEINLINE
62 DC_pszlViewportExt(PDC pdc)
63 {
64 PDC_ATTR pdcattr = pdc->pdcattr;
65
66 /* Check if we need isotropic fixup */
67 if ((pdcattr->flXform & PAGE_EXTENTS_CHANGED) &&
68 (pdcattr->iMapMode == MM_ISOTROPIC))
69 {
70 /* Fixup viewport extension */
71 DC_vFixIsotropicMapping(pdc);
72 }
73
74 return &pdcattr->szlViewportExt;
75 }
76
77 PMATRIX
78 FORCEINLINE
79 DC_pmxWorldToPage(PDC pdc)
80 {
81 return &pdc->pdcattr->mxWorldToPage;
82 }
83
84 PMATRIX
85 FORCEINLINE
86 DC_pmxWorldToDevice(PDC pdc)
87 {
88 /* Check if world or page xform was changed */
89 if (pdc->pdcattr->flXform & (PAGE_XLATE_CHANGED|PAGE_EXTENTS_CHANGED|WORLD_XFORM_CHANGED))
90 {
91 /* Update the world-to-device xform */
92 DC_vUpdateWorldToDevice(pdc);
93 }
94
95 return &pdc->pdcattr->mxWorldToDevice;
96 }
97
98 PMATRIX
99 FORCEINLINE
100 DC_pmxDeviceToWorld(PDC pdc)
101 {
102 /* Check if the device-to-world xform is invalid */
103 if (pdc->pdcattr->flXform & DEVICE_TO_WORLD_INVALID)
104 {
105 /* Update the world-to-device xform */
106 DC_vUpdateDeviceToWorld(pdc);
107 }
108
109 return &pdc->pdcattr->mxDeviceToWorld;
110 }
111
112 VOID
113 FORCEINLINE
114 DC_vXformDeviceToWorld(
115 IN PDC pdc,
116 IN ULONG cNumPoints,
117 IN PPOINTL pptlDest,
118 IN PPOINTL pptlSource)
119 {
120 XFORMOBJ xo;
121 PMATRIX pmx;
122
123 pmx = DC_pmxDeviceToWorld(pdc);
124 XFORMOBJ_vInit(&xo, pmx);
125 XFORMOBJ_bApplyXform(&xo, XF_LTOL, cNumPoints, pptlDest, pptlSource);
126 }
127
128 VOID
129 FORCEINLINE
130 DC_vXformWorldToDevice(
131 IN PDC pdc,
132 IN ULONG cNumPoints,
133 IN PPOINTL pptlDest,
134 IN PPOINTL pptlSource)
135 {
136 XFORMOBJ xo;
137 PMATRIX pmx;
138
139 pmx = DC_pmxWorldToDevice(pdc);
140 XFORMOBJ_vInit(&xo, pmx);
141 XFORMOBJ_bApplyXform(&xo, XF_LTOL, cNumPoints, pptlDest, pptlSource);
142 }
143
144 int APIENTRY IntGdiSetMapMode(PDC, int);
145
146 BOOL NTAPI
147 IntGdiCombineTransform(
148 XFORML *pxformDest,
149 XFORML *pxform1,
150 XFORML *pxform2);
151
152 BOOL
153 NTAPI
154 GreModifyWorldTransform(
155 PDC pdc,
156 const XFORML *pXForm,
157 DWORD dwMode);
158
159 VOID FASTCALL IntMirrorWindowOrg(PDC);
160 void FASTCALL IntFixIsotropicMapping(PDC);
161 LONG FASTCALL IntCalcFillOrigin(PDC);
162 PPOINTL FASTCALL IntptlBrushOrigin(PDC pdc,LONG,LONG);