blob: 633a4d11f2beb46255f28f1418adb7004bebb142 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_OPENTYPE_OPEN_TYPE_MATH_SUPPORT_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_OPENTYPE_OPEN_TYPE_MATH_SUPPORT_H_
#include "base/optional.h"
#include "third_party/blink/renderer/platform/fonts/opentype/open_type_math_stretch_data.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
class HarfBuzzFace;
class PLATFORM_EXPORT OpenTypeMathSupport {
public:
static bool HasMathData(const HarfBuzzFace*);
// These constants are defined in the OpenType MATH table:
// https://docs.microsoft.com/en-us/typography/opentype/spec/math#mathconstants-table
// Their values match the indices in the MathConstants subtable.
enum MathConstants {
kScriptPercentScaleDown = 0,
kScriptScriptPercentScaleDown = 1,
kDelimitedSubFormulaMinHeight = 2,
kDisplayOperatorMinHeight = 3,
kMathLeading = 4,
kAxisHeight = 5,
kAccentBaseHeight = 6,
kFlattenedAccentBaseHeight = 7,
kSubscriptShiftDown = 8,
kSubscriptTopMax = 9,
kSubscriptBaselineDropMin = 10,
kSuperscriptShiftUp = 11,
kSuperscriptShiftUpCramped = 12,
kSuperscriptBottomMin = 13,
kSuperscriptBaselineDropMax = 14,
kSubSuperscriptGapMin = 15,
kSuperscriptBottomMaxWithSubscript = 16,
kSpaceAfterScript = 17,
kUpperLimitGapMin = 18,
kUpperLimitBaselineRiseMin = 19,
kLowerLimitGapMin = 20,
kLowerLimitBaselineDropMin = 21,
kStackTopShiftUp = 22,
kStackTopDisplayStyleShiftUp = 23,
kStackBottomShiftDown = 24,
kStackBottomDisplayStyleShiftDown = 25,
kStackGapMin = 26,
kStackDisplayStyleGapMin = 27,
kStretchStackTopShiftUp = 28,
kStretchStackBottomShiftDown = 29,
kStretchStackGapAboveMin = 30,
kStretchStackGapBelowMin = 31,
kFractionNumeratorShiftUp = 32,
kFractionNumeratorDisplayStyleShiftUp = 33,
kFractionDenominatorShiftDown = 34,
kFractionDenominatorDisplayStyleShiftDown = 35,
kFractionNumeratorGapMin = 36,
kFractionNumDisplayStyleGapMin = 37,
kFractionRuleThickness = 38,
kFractionDenominatorGapMin = 39,
kFractionDenomDisplayStyleGapMin = 40,
kSkewedFractionHorizontalGap = 41,
kSkewedFractionVerticalGap = 42,
kOverbarVerticalGap = 43,
kOverbarRuleThickness = 44,
kOverbarExtraAscender = 45,
kUnderbarVerticalGap = 46,
kUnderbarRuleThickness = 47,
kUnderbarExtraDescender = 48,
kRadicalVerticalGap = 49,
kRadicalDisplayStyleVerticalGap = 50,
kRadicalRuleThickness = 51,
kRadicalExtraAscender = 52,
kRadicalKernBeforeDegree = 53,
kRadicalKernAfterDegree = 54,
kRadicalDegreeBottomRaisePercent = 55
};
// Returns the value of the requested math constant or null if the font does
// not have any OpenType MATH table. All values are 16.16 fixed-point values
// converted to float except percentages (kScriptPercentScaleDown,
// kScriptScriptPercentScaleDown and kRadicalDegreeBottomRaisePercent) which
// are represented by a number between 0 and 1.
// https://docs.microsoft.com/en-us/typography/opentype/spec/math#mathconstants-table
static base::Optional<float> MathConstant(const HarfBuzzFace*, MathConstants);
// Returns the italic correction corresponding to the specified glyph or null
// if the font does not have any OpenType MATH table. This value provides an
// estimation of how much the glyph is slanted, which can be used e.g. when
// attaching scripts to the glyph.
// https://docs.microsoft.com/en-us/typography/opentype/spec/math#mathitalicscorrectioninfo-table
static base::Optional<float> MathItalicCorrection(const HarfBuzzFace*, Glyph);
// Returns a vector of GlyphVariantRecords corresponding to the specified
// glyph and stretch axis. The base glyph is always added as the first item.
// https://docs.microsoft.com/en-us/typography/opentype/spec/math#mathvariants-table
static Vector<OpenTypeMathStretchData::GlyphVariantRecord>
GetGlyphVariantRecords(const HarfBuzzFace*,
Glyph base_glyph,
OpenTypeMathStretchData::StretchAxis);
// Returns a vector of GlyphPartRecords corresponding to the specified
// glyph and stretch axis or an empty vector if there is no such construction.
// If the italic_correction parameter is specified and a construction is
// available, then it is set to the italic correction of the glyph assembly.
// https://docs.microsoft.com/en-us/typography/opentype/spec/math#mathvariants-table
static Vector<OpenTypeMathStretchData::GlyphPartRecord> GetGlyphPartRecords(
const HarfBuzzFace*,
Glyph base_glyph,
OpenTypeMathStretchData::StretchAxis,
float* italic_correction = nullptr);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_OPENTYPE_OPEN_TYPE_MATH_SUPPORT_H_