layout/mathml/nsMathMLOperators.h

changeset 0
6474c204b198
     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___ */

mercurial