123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #ifndef GFX_MATH_TABLE_H
- #define GFX_MATH_TABLE_H
- #include "gfxFont.h"
- /**
- * Used by |gfxFont| to represent the MATH table of an OpenType font.
- * Each |gfxFont| owns at most one |gfxMathTable| instance.
- */
- class gfxMathTable
- {
- public:
- /**
- * @param aFace The HarfBuzz face containing the math table.
- * @param aSize The font size to pass to HarfBuzz.
- */
- gfxMathTable(hb_face_t *aFace, gfxFloat aSize);
- /**
- * Releases our reference to the MATH table and cleans up everything else.
- */
- ~gfxMathTable();
- enum MathConstant {
- // The order of the constants must match the order of the fields
- // defined in the MATH table.
- ScriptPercentScaleDown,
- ScriptScriptPercentScaleDown,
- DelimitedSubFormulaMinHeight,
- DisplayOperatorMinHeight,
- MathLeading,
- AxisHeight,
- AccentBaseHeight,
- FlattenedAccentBaseHeight,
- SubscriptShiftDown,
- SubscriptTopMax,
- SubscriptBaselineDropMin,
- SuperscriptShiftUp,
- SuperscriptShiftUpCramped,
- SuperscriptBottomMin,
- SuperscriptBaselineDropMax,
- SubSuperscriptGapMin,
- SuperscriptBottomMaxWithSubscript,
- SpaceAfterScript,
- UpperLimitGapMin,
- UpperLimitBaselineRiseMin,
- LowerLimitGapMin,
- LowerLimitBaselineDropMin,
- StackTopShiftUp,
- StackTopDisplayStyleShiftUp,
- StackBottomShiftDown,
- StackBottomDisplayStyleShiftDown,
- StackGapMin,
- StackDisplayStyleGapMin,
- StretchStackTopShiftUp,
- StretchStackBottomShiftDown,
- StretchStackGapAboveMin,
- StretchStackGapBelowMin,
- FractionNumeratorShiftUp,
- FractionNumeratorDisplayStyleShiftUp,
- FractionDenominatorShiftDown,
- FractionDenominatorDisplayStyleShiftDown,
- FractionNumeratorGapMin,
- FractionNumDisplayStyleGapMin,
- FractionRuleThickness,
- FractionDenominatorGapMin,
- FractionDenomDisplayStyleGapMin,
- SkewedFractionHorizontalGap,
- SkewedFractionVerticalGap,
- OverbarVerticalGap,
- OverbarRuleThickness,
- OverbarExtraAscender,
- UnderbarVerticalGap,
- UnderbarRuleThickness,
- UnderbarExtraDescender,
- RadicalVerticalGap,
- RadicalDisplayStyleVerticalGap,
- RadicalRuleThickness,
- RadicalExtraAscender,
- RadicalKernBeforeDegree,
- RadicalKernAfterDegree,
- RadicalDegreeBottomRaisePercent
- };
- /**
- * Returns the value of the specified constant from the MATH table.
- */
- gfxFloat Constant(MathConstant aConstant) const;
- /**
- * Returns the value of the specified constant in app units.
- */
- nscoord Constant(MathConstant aConstant,
- uint32_t aAppUnitsPerDevPixel) const
- {
- return NSToCoordRound(Constant(aConstant) * aAppUnitsPerDevPixel);
- }
- /**
- * If the MATH table contains an italic correction for that glyph, this
- * function returns the corresponding value. Otherwise it returns 0.
- */
- gfxFloat
- ItalicsCorrection(uint32_t aGlyphID) const;
- /**
- * @param aGlyphID glyph index of the character we want to stretch
- * @param aVertical direction of the stretching (vertical/horizontal)
- * @param aSize the desired size variant
- *
- * Returns the glyph index of the desired size variant or 0 if there is not
- * any such size variant.
- */
- uint32_t VariantsSize(uint32_t aGlyphID, bool aVertical,
- uint16_t aSize) const;
- /**
- * @param aGlyphID glyph index of the character we want to stretch
- * @param aVertical direction of the stretching (vertical/horizontal)
- * @param aGlyphs pre-allocated buffer of 4 elements where the glyph
- * indexes (or 0 for absent parts) will be stored. The parts are stored in
- * the order expected by the nsMathMLChar: Top (or Left), Middle, Bottom
- * (or Right), Glue.
- *
- * Tries to fill-in aGlyphs with the relevant glyph indexes and returns
- * whether the operation was successful. The function returns false if
- * there is not any assembly for the character we want to stretch or if
- * the format is not supported by the nsMathMLChar code.
- *
- */
- bool VariantsParts(uint32_t aGlyphID, bool aVertical,
- uint32_t aGlyphs[4]) const;
- private:
- // size-specific font object, owned by the gfxMathTable
- hb_font_t *mHBFont;
- static const unsigned int kMaxCachedSizeCount = 10;
- struct MathVariantCacheEntry {
- uint32_t glyphID;
- bool vertical;
- uint32_t sizes[kMaxCachedSizeCount];
- uint32_t parts[4];
- bool arePartsValid;
- };
- mutable MathVariantCacheEntry mMathVariantCache;
- void ClearCache() const;
- void UpdateMathVariantCache(uint32_t aGlyphID, bool aVertical) const;
- };
- #endif
|