5c61c6c4b42b9e5bf456b12d0321272763e4249c
[reactos.git] / win32ss / gdi / eng / floatobj.h
1 #pragma once
2
3 #if defined(_M_IX86)
4
5 FORCEINLINE
6 BOOL
7 _FLOATOBJ_Equal(FLOATOBJ *pf1, FLOATOBJ *pf2)
8 {
9 EFLOAT_S *pef1 = (EFLOAT_S*)pf1;
10 EFLOAT_S *pef2 = (EFLOAT_S*)pf2;
11 return (pef1->lMant == pef2->lMant && pef1->lExp == pef2->lExp);
12 }
13
14 FORCEINLINE
15 LONG
16 _FLOATOBJ_GetLong(FLOATOBJ *pf)
17 {
18 EFLOAT_S *pef = (EFLOAT_S*)pf;
19 return pef->lMant >> (32 - pef->lExp);
20 }
21
22 FORCEINLINE
23 LONG
24 _FLOATOBJ_GetFix(FLOATOBJ *pf)
25 {
26 EFLOAT_S *pef = (EFLOAT_S*)pf;
27 LONG Shift = (28 - pef->lExp);
28 return (Shift >= 0 ? pef->lMant >> Shift : pef->lMant << -Shift);
29 }
30
31 FORCEINLINE
32 BOOL
33 _FLOATOBJ_IsLong(FLOATOBJ *pf)
34 {
35 EFLOAT_S *pef = (EFLOAT_S*)pf;
36 ULONG ulShift = pef->lExp;
37 if (ulShift < 32)
38 return ((pef->lMant << ulShift) == 0);
39 else
40 return (ulShift == 32);
41 }
42
43 FORCEINLINE
44 BOOL
45 _FLOATOBJ_Equal0(FLOATOBJ *pf)
46 {
47 EFLOAT_S *pef = (EFLOAT_S*)pf;
48 return (pef->lMant == 0 && pef->lExp == 0);
49 }
50
51 FORCEINLINE
52 BOOL
53 _FLOATOBJ_Equal1(FLOATOBJ *pf)
54 {
55 EFLOAT_S *pef = (EFLOAT_S*)pf;
56 return (pef->lMant == 0x40000000 && pef->lExp == 2);
57 }
58
59 extern const FLOATOBJ gef0;
60 extern const FLOATOBJ gef1;
61 extern const FLOATOBJ gef16;
62
63 #define FLOATOBJ_0 {0x00000000, 0x00000000}
64 #define FLOATOBJ_1 {0x40000000, 0x00000002}
65 #define FLOATOBJ_16 {0x40000000, 0x00000006}
66 #define FLOATOBJ_1_16 {0x40000000, 0xfffffffe}
67
68 #define FLOATOBJ_Set0(fo) do { (fo)->ul1 = 0; (fo)->ul2 = 0; } while (0)
69 #define FLOATOBJ_Set1(fo) do { (fo)->ul1 = 0x40000000; (fo)->ul2 = 2; } while (0)
70
71 #else
72
73 #define _FLOATOBJ_Equal(pf,pf1) (*(pf) == *(pf1))
74 #define _FLOATOBJ_GetLong(pf) ((LONG)*(pf))
75 #define _FLOATOBJ_IsLong(pf) ((FLOAT)((LONG)*(pf)) == *(pf))
76 #define _FLOATOBJ_Equal0(pf) (*(pf) == 0.)
77 #define _FLOATOBJ_Equal1(pf) (*(pf) == 1.)
78 #define _FLOATOBJ_GetFix(pf) ((LONG)(*(pf) * 16.))
79
80 #define FLOATOBJ_0 0.
81 #define FLOATOBJ_1 1.
82 #define FLOATOBJ_16 16.
83 #define FLOATOBJ_1_16 (1./16.)
84
85 static const FLOATOBJ gef0 = 0.;
86 static const FLOATOBJ gef1 = 1.;
87 static const FLOATOBJ gef16 = 16.;
88
89 #define FLOATOBJ_Set0(fo) *(fo) = 0;
90 #define FLOATOBJ_Set1(fo) *(fo) = 1;
91
92 #endif