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