layout/mathml/nsMathMLOperators.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

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___ */

mercurial