1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/layout/mathml/nsMathMLOperators.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,181 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#ifndef nsMathMLOperators_h___ 1.10 +#define nsMathMLOperators_h___ 1.11 + 1.12 +#include <stdint.h> 1.13 +#include "nsStringFwd.h" 1.14 + 1.15 +enum nsStretchDirection { 1.16 + NS_STRETCH_DIRECTION_UNSUPPORTED = -1, 1.17 + NS_STRETCH_DIRECTION_DEFAULT = 0, 1.18 + NS_STRETCH_DIRECTION_HORIZONTAL = 1, 1.19 + NS_STRETCH_DIRECTION_VERTICAL = 2 1.20 +}; 1.21 + 1.22 +typedef uint32_t nsOperatorFlags; 1.23 +enum { 1.24 + // define the bits used to handle the operator 1.25 + NS_MATHML_OPERATOR_MUTABLE = 1<<30, 1.26 + NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR = 1<<29, 1.27 + NS_MATHML_OPERATOR_EMBELLISH_ISOLATED = 1<<28, 1.28 + NS_MATHML_OPERATOR_CENTERED = 1<<27, 1.29 + NS_MATHML_OPERATOR_INVISIBLE = 1<<26, 1.30 + 1.31 + // define the bits used in the Operator Dictionary 1.32 + 1.33 + // the very last two bits tell us the form 1.34 + NS_MATHML_OPERATOR_FORM = 0x3, 1.35 + NS_MATHML_OPERATOR_FORM_INFIX = 1, 1.36 + NS_MATHML_OPERATOR_FORM_PREFIX = 2, 1.37 + NS_MATHML_OPERATOR_FORM_POSTFIX = 3, 1.38 + 1.39 + // the next 2 bits tell us the direction 1.40 + NS_MATHML_OPERATOR_DIRECTION = 0x3<<2, 1.41 + NS_MATHML_OPERATOR_DIRECTION_HORIZONTAL = 1<<2, 1.42 + NS_MATHML_OPERATOR_DIRECTION_VERTICAL = 2<<2, 1.43 + 1.44 + // other bits used in the Operator Dictionary 1.45 + NS_MATHML_OPERATOR_STRETCHY = 1<<4, 1.46 + NS_MATHML_OPERATOR_FENCE = 1<<5, 1.47 + NS_MATHML_OPERATOR_ACCENT = 1<<6, 1.48 + NS_MATHML_OPERATOR_LARGEOP = 1<<7, 1.49 + NS_MATHML_OPERATOR_SEPARATOR = 1<<8, 1.50 + NS_MATHML_OPERATOR_MOVABLELIMITS = 1<<9, 1.51 + NS_MATHML_OPERATOR_SYMMETRIC = 1<<10, 1.52 + NS_MATHML_OPERATOR_INTEGRAL = 1<<11, 1.53 + NS_MATHML_OPERATOR_MIRRORABLE = 1<<12, 1.54 + 1.55 + // Additional bits not stored in the dictionary 1.56 + NS_MATHML_OPERATOR_MINSIZE_ABSOLUTE = 1<<13, 1.57 + NS_MATHML_OPERATOR_MAXSIZE_ABSOLUTE = 1<<14, 1.58 + NS_MATHML_OPERATOR_LSPACE_ATTR = 1<<15, 1.59 + NS_MATHML_OPERATOR_RSPACE_ATTR = 1<<16 1.60 +}; 1.61 + 1.62 +#define NS_MATHML_OPERATOR_SIZE_INFINITY NS_IEEEPositiveInfinity() 1.63 + 1.64 +class nsMathMLOperators { 1.65 +public: 1.66 + static void AddRefTable(void); 1.67 + static void ReleaseTable(void); 1.68 + static void CleanUp(); 1.69 + 1.70 + // LookupOperator: 1.71 + // Given the string value of an operator and its form (last two bits of flags), 1.72 + // this method returns true if the operator is found in the Operator Dictionary. 1.73 + // Attributes of the operator are returned in the output parameters. 1.74 + // If the operator is not found under the supplied form but is found under a 1.75 + // different form, the method returns true as well. The caller can test the 1.76 + // output parameter aFlags to know exactly under which form the operator was 1.77 + // found in the Operator Dictionary. 1.78 + static bool 1.79 + LookupOperator(const nsString& aOperator, 1.80 + const nsOperatorFlags aForm, 1.81 + nsOperatorFlags* aFlags, 1.82 + float* aLeadingSpace, 1.83 + float* aTrailingSpace); 1.84 + 1.85 + // LookupOperators: 1.86 + // Helper to return all the forms under which an operator is listed in the 1.87 + // Operator Dictionary. The caller must pass arrays of size 4, and use 1.88 + // aFlags[NS_MATHML_OPERATOR_FORM_{INFIX|POSTFIX|PREFIX}], 1.89 + // aLeadingSpace[], etc, to access the attributes of the operator under a 1.90 + // particular form. If the operator wasn't found under a form, its entry 1.91 + // aFlags[form] is set to zero. 1.92 + static void 1.93 + LookupOperators(const nsString& aOperator, 1.94 + nsOperatorFlags* aFlags, 1.95 + float* aLeadingSpace, 1.96 + float* aTrailingSpace); 1.97 + 1.98 + // Helper functions used by the nsMathMLChar class. 1.99 + static bool 1.100 + IsMirrorableOperator(const nsString& aOperator); 1.101 + 1.102 + // Helper function used by the nsMathMLChar class. 1.103 + static nsStretchDirection GetStretchyDirection(const nsString& aOperator); 1.104 +}; 1.105 + 1.106 +//////////////////////////////////////////////////////////////////////////// 1.107 +// Macros that retrieve the bits used to handle operators 1.108 + 1.109 +#define NS_MATHML_OPERATOR_IS_MUTABLE(_flags) \ 1.110 + (NS_MATHML_OPERATOR_MUTABLE == ((_flags) & NS_MATHML_OPERATOR_MUTABLE)) 1.111 + 1.112 +#define NS_MATHML_OPERATOR_HAS_EMBELLISH_ANCESTOR(_flags) \ 1.113 + (NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR == ((_flags) & NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR)) 1.114 + 1.115 +#define NS_MATHML_OPERATOR_EMBELLISH_IS_ISOLATED(_flags) \ 1.116 + (NS_MATHML_OPERATOR_EMBELLISH_ISOLATED == ((_flags) & NS_MATHML_OPERATOR_EMBELLISH_ISOLATED)) 1.117 + 1.118 +#define NS_MATHML_OPERATOR_IS_CENTERED(_flags) \ 1.119 + (NS_MATHML_OPERATOR_CENTERED == ((_flags) & NS_MATHML_OPERATOR_CENTERED)) 1.120 + 1.121 +#define NS_MATHML_OPERATOR_IS_INVISIBLE(_flags) \ 1.122 + (NS_MATHML_OPERATOR_INVISIBLE == ((_flags) & NS_MATHML_OPERATOR_INVISIBLE)) 1.123 + 1.124 +#define NS_MATHML_OPERATOR_GET_FORM(_flags) \ 1.125 + ((_flags) & NS_MATHML_OPERATOR_FORM) 1.126 + 1.127 +#define NS_MATHML_OPERATOR_GET_DIRECTION(_flags) \ 1.128 + ((_flags) & NS_MATHML_OPERATOR_DIRECTION) 1.129 + 1.130 +#define NS_MATHML_OPERATOR_FORM_IS_INFIX(_flags) \ 1.131 + (NS_MATHML_OPERATOR_FORM_INFIX == ((_flags) & NS_MATHML_OPERATOR_FORM)) 1.132 + 1.133 +#define NS_MATHML_OPERATOR_FORM_IS_PREFIX(_flags) \ 1.134 + (NS_MATHML_OPERATOR_FORM_PREFIX == ((_flags) & NS_MATHML_OPERATOR_FORM)) 1.135 + 1.136 +#define NS_MATHML_OPERATOR_FORM_IS_POSTFIX(_flags) \ 1.137 + (NS_MATHML_OPERATOR_FORM_POSTFIX == ((_flags) & NS_MATHML_OPERATOR_FORM)) 1.138 + 1.139 +#define NS_MATHML_OPERATOR_IS_DIRECTION_VERTICAL(_flags) \ 1.140 + (NS_MATHML_OPERATOR_DIRECTION_VERTICAL == ((_flags) & NS_MATHML_OPERATOR_DIRECTION)) 1.141 + 1.142 +#define NS_MATHML_OPERATOR_IS_DIRECTION_HORIZONTAL(_flags) \ 1.143 + (NS_MATHML_OPERATOR_DIRECTION_HORIZONTAL == ((_flags) & NS_MATHML_OPERATOR_DIRECTION)) 1.144 + 1.145 +#define NS_MATHML_OPERATOR_IS_STRETCHY(_flags) \ 1.146 + (NS_MATHML_OPERATOR_STRETCHY == ((_flags) & NS_MATHML_OPERATOR_STRETCHY)) 1.147 + 1.148 +#define NS_MATHML_OPERATOR_IS_FENCE(_flags) \ 1.149 + (NS_MATHML_OPERATOR_FENCE == ((_flags) & NS_MATHML_OPERATOR_FENCE)) 1.150 + 1.151 +#define NS_MATHML_OPERATOR_IS_ACCENT(_flags) \ 1.152 + (NS_MATHML_OPERATOR_ACCENT == ((_flags) & NS_MATHML_OPERATOR_ACCENT)) 1.153 + 1.154 +#define NS_MATHML_OPERATOR_IS_LARGEOP(_flags) \ 1.155 + (NS_MATHML_OPERATOR_LARGEOP == ((_flags) & NS_MATHML_OPERATOR_LARGEOP)) 1.156 + 1.157 +#define NS_MATHML_OPERATOR_IS_SEPARATOR(_flags) \ 1.158 + (NS_MATHML_OPERATOR_SEPARATOR == ((_flags) & NS_MATHML_OPERATOR_SEPARATOR)) 1.159 + 1.160 +#define NS_MATHML_OPERATOR_IS_MOVABLELIMITS(_flags) \ 1.161 + (NS_MATHML_OPERATOR_MOVABLELIMITS == ((_flags) & NS_MATHML_OPERATOR_MOVABLELIMITS)) 1.162 + 1.163 +#define NS_MATHML_OPERATOR_IS_SYMMETRIC(_flags) \ 1.164 + (NS_MATHML_OPERATOR_SYMMETRIC == ((_flags) & NS_MATHML_OPERATOR_SYMMETRIC)) 1.165 + 1.166 +#define NS_MATHML_OPERATOR_IS_INTEGRAL(_flags) \ 1.167 + (NS_MATHML_OPERATOR_INTEGRAL == ((_flags) & NS_MATHML_OPERATOR_INTEGRAL)) 1.168 + 1.169 +#define NS_MATHML_OPERATOR_IS_MIRRORABLE(_flags) \ 1.170 + (NS_MATHML_OPERATOR_MIRRORABLE == ((_flags) & NS_MATHML_OPERATOR_MIRRORABLE)) 1.171 + 1.172 +#define NS_MATHML_OPERATOR_MINSIZE_IS_ABSOLUTE(_flags) \ 1.173 + (NS_MATHML_OPERATOR_MINSIZE_ABSOLUTE == ((_flags) & NS_MATHML_OPERATOR_MINSIZE_ABSOLUTE)) 1.174 + 1.175 +#define NS_MATHML_OPERATOR_MAXSIZE_IS_ABSOLUTE(_flags) \ 1.176 + (NS_MATHML_OPERATOR_MAXSIZE_ABSOLUTE == ((_flags) & NS_MATHML_OPERATOR_MAXSIZE_ABSOLUTE)) 1.177 + 1.178 +#define NS_MATHML_OPERATOR_HAS_LSPACE_ATTR(_flags) \ 1.179 + (NS_MATHML_OPERATOR_LSPACE_ATTR == ((_flags) & NS_MATHML_OPERATOR_LSPACE_ATTR)) 1.180 + 1.181 +#define NS_MATHML_OPERATOR_HAS_RSPACE_ATTR(_flags) \ 1.182 + (NS_MATHML_OPERATOR_RSPACE_ATTR == ((_flags) & NS_MATHML_OPERATOR_RSPACE_ATTR)) 1.183 + 1.184 +#endif /* nsMathMLOperators_h___ */