|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #ifndef nsMathMLOperators_h___ |
|
7 #define nsMathMLOperators_h___ |
|
8 |
|
9 #include <stdint.h> |
|
10 #include "nsStringFwd.h" |
|
11 |
|
12 enum nsStretchDirection { |
|
13 NS_STRETCH_DIRECTION_UNSUPPORTED = -1, |
|
14 NS_STRETCH_DIRECTION_DEFAULT = 0, |
|
15 NS_STRETCH_DIRECTION_HORIZONTAL = 1, |
|
16 NS_STRETCH_DIRECTION_VERTICAL = 2 |
|
17 }; |
|
18 |
|
19 typedef uint32_t nsOperatorFlags; |
|
20 enum { |
|
21 // define the bits used to handle the operator |
|
22 NS_MATHML_OPERATOR_MUTABLE = 1<<30, |
|
23 NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR = 1<<29, |
|
24 NS_MATHML_OPERATOR_EMBELLISH_ISOLATED = 1<<28, |
|
25 NS_MATHML_OPERATOR_CENTERED = 1<<27, |
|
26 NS_MATHML_OPERATOR_INVISIBLE = 1<<26, |
|
27 |
|
28 // define the bits used in the Operator Dictionary |
|
29 |
|
30 // the very last two bits tell us the form |
|
31 NS_MATHML_OPERATOR_FORM = 0x3, |
|
32 NS_MATHML_OPERATOR_FORM_INFIX = 1, |
|
33 NS_MATHML_OPERATOR_FORM_PREFIX = 2, |
|
34 NS_MATHML_OPERATOR_FORM_POSTFIX = 3, |
|
35 |
|
36 // the next 2 bits tell us the direction |
|
37 NS_MATHML_OPERATOR_DIRECTION = 0x3<<2, |
|
38 NS_MATHML_OPERATOR_DIRECTION_HORIZONTAL = 1<<2, |
|
39 NS_MATHML_OPERATOR_DIRECTION_VERTICAL = 2<<2, |
|
40 |
|
41 // other bits used in the Operator Dictionary |
|
42 NS_MATHML_OPERATOR_STRETCHY = 1<<4, |
|
43 NS_MATHML_OPERATOR_FENCE = 1<<5, |
|
44 NS_MATHML_OPERATOR_ACCENT = 1<<6, |
|
45 NS_MATHML_OPERATOR_LARGEOP = 1<<7, |
|
46 NS_MATHML_OPERATOR_SEPARATOR = 1<<8, |
|
47 NS_MATHML_OPERATOR_MOVABLELIMITS = 1<<9, |
|
48 NS_MATHML_OPERATOR_SYMMETRIC = 1<<10, |
|
49 NS_MATHML_OPERATOR_INTEGRAL = 1<<11, |
|
50 NS_MATHML_OPERATOR_MIRRORABLE = 1<<12, |
|
51 |
|
52 // Additional bits not stored in the dictionary |
|
53 NS_MATHML_OPERATOR_MINSIZE_ABSOLUTE = 1<<13, |
|
54 NS_MATHML_OPERATOR_MAXSIZE_ABSOLUTE = 1<<14, |
|
55 NS_MATHML_OPERATOR_LSPACE_ATTR = 1<<15, |
|
56 NS_MATHML_OPERATOR_RSPACE_ATTR = 1<<16 |
|
57 }; |
|
58 |
|
59 #define NS_MATHML_OPERATOR_SIZE_INFINITY NS_IEEEPositiveInfinity() |
|
60 |
|
61 class nsMathMLOperators { |
|
62 public: |
|
63 static void AddRefTable(void); |
|
64 static void ReleaseTable(void); |
|
65 static void CleanUp(); |
|
66 |
|
67 // LookupOperator: |
|
68 // Given the string value of an operator and its form (last two bits of flags), |
|
69 // this method returns true if the operator is found in the Operator Dictionary. |
|
70 // Attributes of the operator are returned in the output parameters. |
|
71 // If the operator is not found under the supplied form but is found under a |
|
72 // different form, the method returns true as well. The caller can test the |
|
73 // output parameter aFlags to know exactly under which form the operator was |
|
74 // found in the Operator Dictionary. |
|
75 static bool |
|
76 LookupOperator(const nsString& aOperator, |
|
77 const nsOperatorFlags aForm, |
|
78 nsOperatorFlags* aFlags, |
|
79 float* aLeadingSpace, |
|
80 float* aTrailingSpace); |
|
81 |
|
82 // LookupOperators: |
|
83 // Helper to return all the forms under which an operator is listed in the |
|
84 // Operator Dictionary. The caller must pass arrays of size 4, and use |
|
85 // aFlags[NS_MATHML_OPERATOR_FORM_{INFIX|POSTFIX|PREFIX}], |
|
86 // aLeadingSpace[], etc, to access the attributes of the operator under a |
|
87 // particular form. If the operator wasn't found under a form, its entry |
|
88 // aFlags[form] is set to zero. |
|
89 static void |
|
90 LookupOperators(const nsString& aOperator, |
|
91 nsOperatorFlags* aFlags, |
|
92 float* aLeadingSpace, |
|
93 float* aTrailingSpace); |
|
94 |
|
95 // Helper functions used by the nsMathMLChar class. |
|
96 static bool |
|
97 IsMirrorableOperator(const nsString& aOperator); |
|
98 |
|
99 // Helper function used by the nsMathMLChar class. |
|
100 static nsStretchDirection GetStretchyDirection(const nsString& aOperator); |
|
101 }; |
|
102 |
|
103 //////////////////////////////////////////////////////////////////////////// |
|
104 // Macros that retrieve the bits used to handle operators |
|
105 |
|
106 #define NS_MATHML_OPERATOR_IS_MUTABLE(_flags) \ |
|
107 (NS_MATHML_OPERATOR_MUTABLE == ((_flags) & NS_MATHML_OPERATOR_MUTABLE)) |
|
108 |
|
109 #define NS_MATHML_OPERATOR_HAS_EMBELLISH_ANCESTOR(_flags) \ |
|
110 (NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR == ((_flags) & NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR)) |
|
111 |
|
112 #define NS_MATHML_OPERATOR_EMBELLISH_IS_ISOLATED(_flags) \ |
|
113 (NS_MATHML_OPERATOR_EMBELLISH_ISOLATED == ((_flags) & NS_MATHML_OPERATOR_EMBELLISH_ISOLATED)) |
|
114 |
|
115 #define NS_MATHML_OPERATOR_IS_CENTERED(_flags) \ |
|
116 (NS_MATHML_OPERATOR_CENTERED == ((_flags) & NS_MATHML_OPERATOR_CENTERED)) |
|
117 |
|
118 #define NS_MATHML_OPERATOR_IS_INVISIBLE(_flags) \ |
|
119 (NS_MATHML_OPERATOR_INVISIBLE == ((_flags) & NS_MATHML_OPERATOR_INVISIBLE)) |
|
120 |
|
121 #define NS_MATHML_OPERATOR_GET_FORM(_flags) \ |
|
122 ((_flags) & NS_MATHML_OPERATOR_FORM) |
|
123 |
|
124 #define NS_MATHML_OPERATOR_GET_DIRECTION(_flags) \ |
|
125 ((_flags) & NS_MATHML_OPERATOR_DIRECTION) |
|
126 |
|
127 #define NS_MATHML_OPERATOR_FORM_IS_INFIX(_flags) \ |
|
128 (NS_MATHML_OPERATOR_FORM_INFIX == ((_flags) & NS_MATHML_OPERATOR_FORM)) |
|
129 |
|
130 #define NS_MATHML_OPERATOR_FORM_IS_PREFIX(_flags) \ |
|
131 (NS_MATHML_OPERATOR_FORM_PREFIX == ((_flags) & NS_MATHML_OPERATOR_FORM)) |
|
132 |
|
133 #define NS_MATHML_OPERATOR_FORM_IS_POSTFIX(_flags) \ |
|
134 (NS_MATHML_OPERATOR_FORM_POSTFIX == ((_flags) & NS_MATHML_OPERATOR_FORM)) |
|
135 |
|
136 #define NS_MATHML_OPERATOR_IS_DIRECTION_VERTICAL(_flags) \ |
|
137 (NS_MATHML_OPERATOR_DIRECTION_VERTICAL == ((_flags) & NS_MATHML_OPERATOR_DIRECTION)) |
|
138 |
|
139 #define NS_MATHML_OPERATOR_IS_DIRECTION_HORIZONTAL(_flags) \ |
|
140 (NS_MATHML_OPERATOR_DIRECTION_HORIZONTAL == ((_flags) & NS_MATHML_OPERATOR_DIRECTION)) |
|
141 |
|
142 #define NS_MATHML_OPERATOR_IS_STRETCHY(_flags) \ |
|
143 (NS_MATHML_OPERATOR_STRETCHY == ((_flags) & NS_MATHML_OPERATOR_STRETCHY)) |
|
144 |
|
145 #define NS_MATHML_OPERATOR_IS_FENCE(_flags) \ |
|
146 (NS_MATHML_OPERATOR_FENCE == ((_flags) & NS_MATHML_OPERATOR_FENCE)) |
|
147 |
|
148 #define NS_MATHML_OPERATOR_IS_ACCENT(_flags) \ |
|
149 (NS_MATHML_OPERATOR_ACCENT == ((_flags) & NS_MATHML_OPERATOR_ACCENT)) |
|
150 |
|
151 #define NS_MATHML_OPERATOR_IS_LARGEOP(_flags) \ |
|
152 (NS_MATHML_OPERATOR_LARGEOP == ((_flags) & NS_MATHML_OPERATOR_LARGEOP)) |
|
153 |
|
154 #define NS_MATHML_OPERATOR_IS_SEPARATOR(_flags) \ |
|
155 (NS_MATHML_OPERATOR_SEPARATOR == ((_flags) & NS_MATHML_OPERATOR_SEPARATOR)) |
|
156 |
|
157 #define NS_MATHML_OPERATOR_IS_MOVABLELIMITS(_flags) \ |
|
158 (NS_MATHML_OPERATOR_MOVABLELIMITS == ((_flags) & NS_MATHML_OPERATOR_MOVABLELIMITS)) |
|
159 |
|
160 #define NS_MATHML_OPERATOR_IS_SYMMETRIC(_flags) \ |
|
161 (NS_MATHML_OPERATOR_SYMMETRIC == ((_flags) & NS_MATHML_OPERATOR_SYMMETRIC)) |
|
162 |
|
163 #define NS_MATHML_OPERATOR_IS_INTEGRAL(_flags) \ |
|
164 (NS_MATHML_OPERATOR_INTEGRAL == ((_flags) & NS_MATHML_OPERATOR_INTEGRAL)) |
|
165 |
|
166 #define NS_MATHML_OPERATOR_IS_MIRRORABLE(_flags) \ |
|
167 (NS_MATHML_OPERATOR_MIRRORABLE == ((_flags) & NS_MATHML_OPERATOR_MIRRORABLE)) |
|
168 |
|
169 #define NS_MATHML_OPERATOR_MINSIZE_IS_ABSOLUTE(_flags) \ |
|
170 (NS_MATHML_OPERATOR_MINSIZE_ABSOLUTE == ((_flags) & NS_MATHML_OPERATOR_MINSIZE_ABSOLUTE)) |
|
171 |
|
172 #define NS_MATHML_OPERATOR_MAXSIZE_IS_ABSOLUTE(_flags) \ |
|
173 (NS_MATHML_OPERATOR_MAXSIZE_ABSOLUTE == ((_flags) & NS_MATHML_OPERATOR_MAXSIZE_ABSOLUTE)) |
|
174 |
|
175 #define NS_MATHML_OPERATOR_HAS_LSPACE_ATTR(_flags) \ |
|
176 (NS_MATHML_OPERATOR_LSPACE_ATTR == ((_flags) & NS_MATHML_OPERATOR_LSPACE_ATTR)) |
|
177 |
|
178 #define NS_MATHML_OPERATOR_HAS_RSPACE_ATTR(_flags) \ |
|
179 (NS_MATHML_OPERATOR_RSPACE_ATTR == ((_flags) & NS_MATHML_OPERATOR_RSPACE_ATTR)) |
|
180 |
|
181 #endif /* nsMathMLOperators_h___ */ |