Blame src/hb-ot-math-table.hh

Packit Service 5bcba8
/*
Packit Service 5bcba8
 * Copyright © 2016  Igalia S.L.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 *  This is part of HarfBuzz, a text shaping library.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Permission is hereby granted, without written agreement and without
Packit Service 5bcba8
 * license or royalty fees, to use, copy, modify, and distribute this
Packit Service 5bcba8
 * software and its documentation for any purpose, provided that the
Packit Service 5bcba8
 * above copyright notice and the following two paragraphs appear in
Packit Service 5bcba8
 * all copies of this software.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
Packit Service 5bcba8
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
Packit Service 5bcba8
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
Packit Service 5bcba8
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
Packit Service 5bcba8
 * DAMAGE.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
Packit Service 5bcba8
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
Packit Service 5bcba8
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
Packit Service 5bcba8
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
Packit Service 5bcba8
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Packit Service 5bcba8
 *
Packit Service 5bcba8
 * Igalia Author(s): Frédéric Wang
Packit Service 5bcba8
 */
Packit Service 5bcba8
Packit Service 5bcba8
#ifndef HB_OT_MATH_TABLE_HH
Packit Service 5bcba8
#define HB_OT_MATH_TABLE_HH
Packit Service 5bcba8
Packit Service 5bcba8
#include "hb-open-type-private.hh"
Packit Service 5bcba8
#include "hb-ot-layout-common-private.hh"
Packit Service 5bcba8
#include "hb-ot-math.h"
Packit Service 5bcba8
Packit Service 5bcba8
namespace OT {
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
struct MathValueRecord
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline hb_position_t get_x_value (hb_font_t *font, const void *base) const
Packit Service 5bcba8
  { return font->em_scale_x (value) + (base+deviceTable).get_x_delta (font); }
Packit Service 5bcba8
  inline hb_position_t get_y_value (hb_font_t *font, const void *base) const
Packit Service 5bcba8
  { return font->em_scale_y (value) + (base+deviceTable).get_y_delta (font); }
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) && deviceTable.sanitize (c, base));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  SHORT			value;		/* The X or Y value in design units */
Packit Service 5bcba8
  OffsetTo<Device>	deviceTable;	/* Offset to the device table - from the
Packit Service 5bcba8
					 * beginning of parent table. May be NULL.
Packit Service 5bcba8
					 * Suggested format for device table is 1. */
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_STATIC (4);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathConstants
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize_math_value_records (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
Packit Service 5bcba8
    unsigned int count = ARRAY_LENGTH (mathValueRecords);
Packit Service 5bcba8
    for (unsigned int i = 0; i < count; i++)
Packit Service 5bcba8
      if (!mathValueRecords[i].sanitize (c, this))
Packit Service 5bcba8
	return_trace (false);
Packit Service 5bcba8
Packit Service 5bcba8
    return_trace (true);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) && sanitize_math_value_records(c));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline hb_position_t get_value (hb_ot_math_constant_t constant,
Packit Service 5bcba8
				  hb_font_t *font) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    switch (constant) {
Packit Service 5bcba8
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN:
Packit Service 5bcba8
      return percentScaleDown[constant - HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN];
Packit Service 5bcba8
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT:
Packit Service 5bcba8
      return font->em_scale_y (minHeight[constant - HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT]);
Packit Service 5bcba8
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT:
Packit Service 5bcba8
      return mathValueRecords[constant - HB_OT_MATH_CONSTANT_MATH_LEADING].get_x_value(font, this);
Packit Service 5bcba8
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_AXIS_HEIGHT:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_MATH_LEADING:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_STACK_GAP_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN:
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN:
Packit Service 5bcba8
      return mathValueRecords[constant - HB_OT_MATH_CONSTANT_MATH_LEADING].get_y_value(font, this);
Packit Service 5bcba8
Packit Service 5bcba8
    case HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT:
Packit Service 5bcba8
      return radicalDegreeBottomRaisePercent;
Packit Service 5bcba8
Packit Service 5bcba8
    default:
Packit Service 5bcba8
      return 0;
Packit Service 5bcba8
    }
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  SHORT percentScaleDown[2];
Packit Service 5bcba8
  USHORT minHeight[2];
Packit Service 5bcba8
  MathValueRecord mathValueRecords[51];
Packit Service 5bcba8
  SHORT radicalDegreeBottomRaisePercent;
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_STATIC (214);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathItalicsCorrectionInfo
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  coverage.sanitize (c, this) &&
Packit Service 5bcba8
		  italicsCorrection.sanitize (c, this));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline hb_position_t get_value (hb_codepoint_t glyph,
Packit Service 5bcba8
				  hb_font_t *font) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    unsigned int index = (this+coverage).get_coverage (glyph);
Packit Service 5bcba8
    return italicsCorrection[index].get_x_value (font, this);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  OffsetTo<Coverage>       coverage;		/* Offset to Coverage table -
Packit Service 5bcba8
						 * from the beginning of
Packit Service 5bcba8
						 * MathItalicsCorrectionInfo
Packit Service 5bcba8
						 * table. */
Packit Service 5bcba8
  ArrayOf<MathValueRecord> italicsCorrection;	/* Array of MathValueRecords
Packit Service 5bcba8
						 * defining italics correction
Packit Service 5bcba8
						 * values for each
Packit Service 5bcba8
						 * covered glyph. */
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY (4, italicsCorrection);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathTopAccentAttachment
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  topAccentCoverage.sanitize (c, this) &&
Packit Service 5bcba8
		  topAccentAttachment.sanitize (c, this));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline hb_position_t get_value (hb_codepoint_t glyph,
Packit Service 5bcba8
				  hb_font_t *font) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    unsigned int index = (this+topAccentCoverage).get_coverage (glyph);
Packit Service 5bcba8
    if (index == NOT_COVERED)
Packit Service 5bcba8
      return font->get_glyph_h_advance (glyph) / 2;
Packit Service 5bcba8
    return topAccentAttachment[index].get_x_value(font, this);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  OffsetTo<Coverage>       topAccentCoverage;   /* Offset to Coverage table -
Packit Service 5bcba8
						 * from the beginning of
Packit Service 5bcba8
						 * MathTopAccentAttachment
Packit Service 5bcba8
						 * table. */
Packit Service 5bcba8
  ArrayOf<MathValueRecord> topAccentAttachment; /* Array of MathValueRecords
Packit Service 5bcba8
						 * defining top accent
Packit Service 5bcba8
						 * attachment points for each
Packit Service 5bcba8
						 * covered glyph. */
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY (2 + 2, topAccentAttachment);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathKern
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize_math_value_records (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    unsigned int count = 2 * heightCount + 1;
Packit Service 5bcba8
    for (unsigned int i = 0; i < count; i++)
Packit Service 5bcba8
      if (!mathValueRecords[i].sanitize (c, this)) return_trace (false);
Packit Service 5bcba8
    return_trace (true);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  c->check_array (mathValueRecords,
Packit Service 5bcba8
				  mathValueRecords[0].static_size,
Packit Service 5bcba8
				  2 * heightCount + 1) &&
Packit Service 5bcba8
		  sanitize_math_value_records (c));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline hb_position_t get_value (hb_position_t correction_height, hb_font_t *font) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    const MathValueRecord* correctionHeight = mathValueRecords;
Packit Service 5bcba8
    const MathValueRecord* kernValue = mathValueRecords + heightCount;
Packit Service 5bcba8
    int sign = font->y_scale < 0 ? -1 : +1;
Packit Service 5bcba8
Packit Service 5bcba8
    /* The description of the MathKern table is a ambiguous, but interpreting
Packit Service 5bcba8
     * "between the two heights found at those indexes" for 0 < i < len as
Packit Service 5bcba8
     *
Packit Service 5bcba8
     *   correctionHeight[i-1] < correction_height <= correctionHeight[i]
Packit Service 5bcba8
     *
Packit Service 5bcba8
     * makes the result consistent with the limit cases and we can just use the
Packit Service 5bcba8
     * binary search algorithm of std::upper_bound:
Packit Service 5bcba8
     */
Packit Service 5bcba8
    unsigned int i = 0;
Packit Service 5bcba8
    unsigned int count = heightCount;
Packit Service 5bcba8
    while (count > 0)
Packit Service 5bcba8
    {
Packit Service 5bcba8
      unsigned int half = count / 2;
Packit Service 5bcba8
      hb_position_t height = correctionHeight[i + half].get_y_value(font, this);
Packit Service 5bcba8
      if (sign * height < sign * correction_height)
Packit Service 5bcba8
      {
Packit Service 5bcba8
	i += half + 1;
Packit Service 5bcba8
	count -= half + 1;
Packit Service 5bcba8
      } else
Packit Service 5bcba8
	count = half;
Packit Service 5bcba8
    }
Packit Service 5bcba8
    return kernValue[i].get_x_value(font, this);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  USHORT	  heightCount;
Packit Service 5bcba8
  MathValueRecord mathValueRecords[VAR]; /* Array of correction heights at
Packit Service 5bcba8
					  * which the kern value changes.
Packit Service 5bcba8
					  * Sorted by the height value in
Packit Service 5bcba8
					  * design units (heightCount entries),
Packit Service 5bcba8
					  * Followed by:
Packit Service 5bcba8
					  * Array of kern values corresponding
Packit Service 5bcba8
					  * to heights. (heightCount+1 entries).
Packit Service 5bcba8
					  */
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY (2, mathValueRecords);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathKernInfoRecord
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
Packit Service 5bcba8
    unsigned int count = ARRAY_LENGTH (mathKern);
Packit Service 5bcba8
    for (unsigned int i = 0; i < count; i++)
Packit Service 5bcba8
      if (unlikely (!mathKern[i].sanitize (c, base)))
Packit Service 5bcba8
	return_trace (false);
Packit Service 5bcba8
Packit Service 5bcba8
    return_trace (true);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline hb_position_t get_kerning (hb_ot_math_kern_t kern,
Packit Service 5bcba8
				    hb_position_t correction_height,
Packit Service 5bcba8
				    hb_font_t *font,
Packit Service 5bcba8
				    const void *base) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    unsigned int idx = kern;
Packit Service 5bcba8
    if (unlikely (idx >= ARRAY_LENGTH (mathKern))) return 0;
Packit Service 5bcba8
    return (base+mathKern[idx]).get_value (correction_height, font);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  /* Offset to MathKern table for each corner -
Packit Service 5bcba8
   * from the beginning of MathKernInfo table. May be NULL. */
Packit Service 5bcba8
  OffsetTo<MathKern> mathKern[4];
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_STATIC (8);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathKernInfo
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  mathKernCoverage.sanitize (c, this) &&
Packit Service 5bcba8
		  mathKernInfoRecords.sanitize (c, this));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline hb_position_t get_kerning (hb_codepoint_t glyph,
Packit Service 5bcba8
				    hb_ot_math_kern_t kern,
Packit Service 5bcba8
				    hb_position_t correction_height,
Packit Service 5bcba8
				    hb_font_t *font) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    unsigned int index = (this+mathKernCoverage).get_coverage (glyph);
Packit Service 5bcba8
    return mathKernInfoRecords[index].get_kerning (kern, correction_height, font, this);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  OffsetTo<Coverage>		mathKernCoverage;    /* Offset to Coverage table -
Packit Service 5bcba8
						      * from the beginning of the
Packit Service 5bcba8
						      * MathKernInfo table. */
Packit Service 5bcba8
  ArrayOf<MathKernInfoRecord>	mathKernInfoRecords; /* Array of
Packit Service 5bcba8
						      * MathKernInfoRecords,
Packit Service 5bcba8
						      * per-glyph information for
Packit Service 5bcba8
						      * mathematical positioning
Packit Service 5bcba8
						      * of subscripts and
Packit Service 5bcba8
						      * superscripts. */
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY (4, mathKernInfoRecords);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathGlyphInfo
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  mathItalicsCorrectionInfo.sanitize (c, this) &&
Packit Service 5bcba8
		  mathTopAccentAttachment.sanitize (c, this) &&
Packit Service 5bcba8
		  extendedShapeCoverage.sanitize (c, this) &&
Packit Service 5bcba8
		  mathKernInfo.sanitize(c, this));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline hb_position_t
Packit Service 5bcba8
  get_italics_correction (hb_codepoint_t  glyph, hb_font_t *font) const
Packit Service 5bcba8
  { return (this+mathItalicsCorrectionInfo).get_value (glyph, font); }
Packit Service 5bcba8
Packit Service 5bcba8
  inline hb_position_t
Packit Service 5bcba8
  get_top_accent_attachment (hb_codepoint_t  glyph, hb_font_t *font) const
Packit Service 5bcba8
  { return (this+mathTopAccentAttachment).get_value (glyph, font); }
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool is_extended_shape (hb_codepoint_t glyph) const
Packit Service 5bcba8
  { return (this+extendedShapeCoverage).get_coverage (glyph) != NOT_COVERED; }
Packit Service 5bcba8
Packit Service 5bcba8
  inline hb_position_t get_kerning (hb_codepoint_t glyph,
Packit Service 5bcba8
				    hb_ot_math_kern_t kern,
Packit Service 5bcba8
				    hb_position_t correction_height,
Packit Service 5bcba8
				    hb_font_t *font) const
Packit Service 5bcba8
  { return (this+mathKernInfo).get_kerning (glyph, kern, correction_height, font); }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  /* Offset to MathItalicsCorrectionInfo table -
Packit Service 5bcba8
   * from the beginning of MathGlyphInfo table. */
Packit Service 5bcba8
  OffsetTo<MathItalicsCorrectionInfo> mathItalicsCorrectionInfo;
Packit Service 5bcba8
Packit Service 5bcba8
  /* Offset to MathTopAccentAttachment table -
Packit Service 5bcba8
   * from the beginning of MathGlyphInfo table. */
Packit Service 5bcba8
  OffsetTo<MathTopAccentAttachment> mathTopAccentAttachment;
Packit Service 5bcba8
Packit Service 5bcba8
  /* Offset to coverage table for Extended Shape glyphs -
Packit Service 5bcba8
   * from the beginning of MathGlyphInfo table. When the left or right glyph of
Packit Service 5bcba8
   * a box is an extended shape variant, the (ink) box (and not the default
Packit Service 5bcba8
   * position defined by values in MathConstants table) should be used for
Packit Service 5bcba8
   * vertical positioning purposes. May be NULL.. */
Packit Service 5bcba8
  OffsetTo<Coverage> extendedShapeCoverage;
Packit Service 5bcba8
Packit Service 5bcba8
   /* Offset to MathKernInfo table -
Packit Service 5bcba8
    * from the beginning of MathGlyphInfo table. */
Packit Service 5bcba8
  OffsetTo<MathKernInfo> mathKernInfo;
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_STATIC (8);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathGlyphVariantRecord
Packit Service 5bcba8
{
Packit Service 5bcba8
  friend struct MathGlyphConstruction;
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  GlyphID variantGlyph;       /* Glyph ID for the variant. */
Packit Service 5bcba8
  USHORT  advanceMeasurement; /* Advance width/height, in design units, of the
Packit Service 5bcba8
			       * variant, in the direction of requested
Packit Service 5bcba8
			       * glyph extension. */
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_STATIC (4);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct PartFlags : USHORT
Packit Service 5bcba8
{
Packit Service 5bcba8
  enum Flags {
Packit Service 5bcba8
    Extender	= 0x0001u, /* If set, the part can be skipped or repeated. */
Packit Service 5bcba8
Packit Service 5bcba8
    Defined	= 0x0001u, /* All defined flags. */
Packit Service 5bcba8
  };
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_STATIC (2);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathGlyphPartRecord
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline void extract (hb_ot_math_glyph_part_t &out,
Packit Service 5bcba8
		       int scale,
Packit Service 5bcba8
		       hb_font_t *font) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    out.glyph			= glyph;
Packit Service 5bcba8
Packit Service 5bcba8
    out.start_connector_length	= font->em_scale (startConnectorLength, scale);
Packit Service 5bcba8
    out.end_connector_length	= font->em_scale (endConnectorLength, scale);
Packit Service 5bcba8
    out.full_advance		= font->em_scale (fullAdvance, scale);
Packit Service 5bcba8
Packit Service 5bcba8
    ASSERT_STATIC ((unsigned int) HB_MATH_GLYPH_PART_FLAG_EXTENDER ==
Packit Service 5bcba8
		   (unsigned int) PartFlags::Extender);
Packit Service 5bcba8
Packit Service 5bcba8
    out.flags = (hb_ot_math_glyph_part_flags_t)
Packit Service 5bcba8
		(unsigned int)
Packit Service 5bcba8
		(partFlags & PartFlags::Defined);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  GlyphID   glyph;		  /* Glyph ID for the part. */
Packit Service 5bcba8
  USHORT    startConnectorLength; /* Advance width/ height of the straight bar
Packit Service 5bcba8
				   * connector material, in design units, is at
Packit Service 5bcba8
				   * the beginning of the glyph, in the
Packit Service 5bcba8
				   * direction of the extension. */
Packit Service 5bcba8
  USHORT    endConnectorLength;   /* Advance width/ height of the straight bar
Packit Service 5bcba8
				   * connector material, in design units, is at
Packit Service 5bcba8
				   * the end of the glyph, in the direction of
Packit Service 5bcba8
				   * the extension. */
Packit Service 5bcba8
  USHORT    fullAdvance;	  /* Full advance width/height for this part,
Packit Service 5bcba8
				   * in the direction of the extension.
Packit Service 5bcba8
				   * In design units. */
Packit Service 5bcba8
  PartFlags partFlags;		  /* Part qualifiers. */
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_STATIC (10);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathGlyphAssembly
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  italicsCorrection.sanitize(c, this) &&
Packit Service 5bcba8
		  partRecords.sanitize(c));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline unsigned int get_parts (hb_direction_t direction,
Packit Service 5bcba8
				 hb_font_t *font,
Packit Service 5bcba8
				 unsigned int start_offset,
Packit Service 5bcba8
				 unsigned int *parts_count, /* IN/OUT */
Packit Service 5bcba8
				 hb_ot_math_glyph_part_t *parts /* OUT */,
Packit Service 5bcba8
				 hb_position_t *italics_correction /* OUT */) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    if (parts_count)
Packit Service 5bcba8
    {
Packit Service 5bcba8
      int scale = font->dir_scale (direction);
Packit Service 5bcba8
      const MathGlyphPartRecord *arr =
Packit Service 5bcba8
	    partRecords.sub_array (start_offset, parts_count);
Packit Service 5bcba8
      unsigned int count = *parts_count;
Packit Service 5bcba8
      for (unsigned int i = 0; i < count; i++)
Packit Service 5bcba8
	arr[i].extract (parts[i], scale, font);
Packit Service 5bcba8
    }
Packit Service 5bcba8
Packit Service 5bcba8
    if (italics_correction)
Packit Service 5bcba8
      *italics_correction = italicsCorrection.get_x_value (font, this);
Packit Service 5bcba8
Packit Service 5bcba8
    return partRecords.len;
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  MathValueRecord	   italicsCorrection; /* Italics correction of this
Packit Service 5bcba8
					       * MathGlyphAssembly. Should not
Packit Service 5bcba8
					       * depend on the assembly size. */
Packit Service 5bcba8
  ArrayOf<MathGlyphPartRecord> partRecords;   /* Array of part records, from
Packit Service 5bcba8
					       * left to right and bottom to
Packit Service 5bcba8
					       * top. */
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY (6, partRecords);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathGlyphConstruction
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  glyphAssembly.sanitize(c, this) &&
Packit Service 5bcba8
		  mathGlyphVariantRecord.sanitize(c));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline const MathGlyphAssembly &get_assembly (void) const
Packit Service 5bcba8
  { return this+glyphAssembly; }
Packit Service 5bcba8
Packit Service 5bcba8
  inline unsigned int get_variants (hb_direction_t direction,
Packit Service 5bcba8
				    hb_font_t *font,
Packit Service 5bcba8
				    unsigned int start_offset,
Packit Service 5bcba8
				    unsigned int *variants_count, /* IN/OUT */
Packit Service 5bcba8
				    hb_ot_math_glyph_variant_t *variants /* OUT */) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    if (variants_count)
Packit Service 5bcba8
    {
Packit Service 5bcba8
      int scale = font->dir_scale (direction);
Packit Service 5bcba8
      const MathGlyphVariantRecord *arr =
Packit Service 5bcba8
	    mathGlyphVariantRecord.sub_array (start_offset, variants_count);
Packit Service 5bcba8
      unsigned int count = *variants_count;
Packit Service 5bcba8
      for (unsigned int i = 0; i < count; i++)
Packit Service 5bcba8
      {
Packit Service 5bcba8
	variants[i].glyph = arr[i].variantGlyph;
Packit Service 5bcba8
	variants[i].advance = font->em_scale (arr[i].advanceMeasurement, scale);
Packit Service 5bcba8
      }
Packit Service 5bcba8
    }
Packit Service 5bcba8
    return mathGlyphVariantRecord.len;
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  /* Offset to MathGlyphAssembly table for this shape - from the beginning of
Packit Service 5bcba8
     MathGlyphConstruction table. May be NULL. */
Packit Service 5bcba8
  OffsetTo<MathGlyphAssembly>	  glyphAssembly;
Packit Service 5bcba8
Packit Service 5bcba8
  /* MathGlyphVariantRecords for alternative variants of the glyphs. */
Packit Service 5bcba8
  ArrayOf<MathGlyphVariantRecord> mathGlyphVariantRecord;
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY (4, mathGlyphVariantRecord);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct MathVariants
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline bool sanitize_offsets (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    unsigned int count = vertGlyphCount + horizGlyphCount;
Packit Service 5bcba8
    for (unsigned int i = 0; i < count; i++)
Packit Service 5bcba8
      if (!glyphConstruction[i].sanitize (c, this)) return_trace (false);
Packit Service 5bcba8
    return_trace (true);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (c->check_struct (this) &&
Packit Service 5bcba8
		  vertGlyphCoverage.sanitize (c, this) &&
Packit Service 5bcba8
		  horizGlyphCoverage.sanitize (c, this) &&
Packit Service 5bcba8
		  c->check_array (glyphConstruction,
Packit Service 5bcba8
				  glyphConstruction[0].static_size,
Packit Service 5bcba8
				  vertGlyphCount + horizGlyphCount) &&
Packit Service 5bcba8
		  sanitize_offsets (c));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline hb_position_t get_min_connector_overlap (hb_direction_t direction,
Packit Service 5bcba8
						  hb_font_t *font) const
Packit Service 5bcba8
  { return font->em_scale_dir (minConnectorOverlap, direction); }
Packit Service 5bcba8
Packit Service 5bcba8
  inline unsigned int get_glyph_variants (hb_codepoint_t glyph,
Packit Service 5bcba8
					  hb_direction_t direction,
Packit Service 5bcba8
					  hb_font_t *font,
Packit Service 5bcba8
					  unsigned int start_offset,
Packit Service 5bcba8
					  unsigned int *variants_count, /* IN/OUT */
Packit Service 5bcba8
					  hb_ot_math_glyph_variant_t *variants /* OUT */) const
Packit Service 5bcba8
  { return get_glyph_construction (glyph, direction, font)
Packit Service 5bcba8
	   .get_variants (direction, font, start_offset, variants_count, variants); }
Packit Service 5bcba8
Packit Service 5bcba8
  inline unsigned int get_glyph_parts (hb_codepoint_t glyph,
Packit Service 5bcba8
				       hb_direction_t direction,
Packit Service 5bcba8
				       hb_font_t *font,
Packit Service 5bcba8
				       unsigned int start_offset,
Packit Service 5bcba8
				       unsigned int *parts_count, /* IN/OUT */
Packit Service 5bcba8
				       hb_ot_math_glyph_part_t *parts /* OUT */,
Packit Service 5bcba8
				       hb_position_t *italics_correction /* OUT */) const
Packit Service 5bcba8
  { return get_glyph_construction (glyph, direction, font)
Packit Service 5bcba8
	   .get_assembly ()
Packit Service 5bcba8
	   .get_parts (direction, font,
Packit Service 5bcba8
		       start_offset, parts_count, parts,
Packit Service 5bcba8
		       italics_correction); }
Packit Service 5bcba8
Packit Service 5bcba8
  private:
Packit Service 5bcba8
  inline const MathGlyphConstruction &
Packit Service 5bcba8
		get_glyph_construction (hb_codepoint_t glyph,
Packit Service 5bcba8
					hb_direction_t direction,
Packit Service 5bcba8
					hb_font_t *font) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    bool vertical = HB_DIRECTION_IS_VERTICAL (direction);
Packit Service 5bcba8
    unsigned int count = vertical ? vertGlyphCount : horizGlyphCount;
Packit Service 5bcba8
    const OffsetTo<Coverage> &coverage = vertical ? vertGlyphCoverage
Packit Service 5bcba8
						  : horizGlyphCoverage;
Packit Service 5bcba8
Packit Service 5bcba8
    unsigned int index = (this+coverage).get_coverage (glyph);
Packit Service 5bcba8
    if (unlikely (index >= count)) return Null(MathGlyphConstruction);
Packit Service 5bcba8
Packit Service 5bcba8
    if (!vertical)
Packit Service 5bcba8
      index += vertGlyphCount;
Packit Service 5bcba8
Packit Service 5bcba8
    return this+glyphConstruction[index];
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  USHORT	     minConnectorOverlap; /* Minimum overlap of connecting
Packit Service 5bcba8
					   * glyphs during glyph construction,
Packit Service 5bcba8
					   * in design units. */
Packit Service 5bcba8
  OffsetTo<Coverage> vertGlyphCoverage;   /* Offset to Coverage table -
Packit Service 5bcba8
					   * from the beginning of MathVariants
Packit Service 5bcba8
					   * table. */
Packit Service 5bcba8
  OffsetTo<Coverage> horizGlyphCoverage;  /* Offset to Coverage table -
Packit Service 5bcba8
					   * from the beginning of MathVariants
Packit Service 5bcba8
					   * table. */
Packit Service 5bcba8
  USHORT	     vertGlyphCount;      /* Number of glyphs for which
Packit Service 5bcba8
					   * information is provided for
Packit Service 5bcba8
					   * vertically growing variants. */
Packit Service 5bcba8
  USHORT	     horizGlyphCount;     /* Number of glyphs for which
Packit Service 5bcba8
					   * information is provided for
Packit Service 5bcba8
					   * horizontally growing variants. */
Packit Service 5bcba8
Packit Service 5bcba8
  /* Array of offsets to MathGlyphConstruction tables - from the beginning of
Packit Service 5bcba8
     the MathVariants table, for shapes growing in vertical/horizontal
Packit Service 5bcba8
     direction. */
Packit Service 5bcba8
  OffsetTo<MathGlyphConstruction> glyphConstruction[VAR];
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY (10, glyphConstruction);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
/*
Packit Service 5bcba8
 * MATH -- The MATH Table
Packit Service 5bcba8
 */
Packit Service 5bcba8
Packit Service 5bcba8
struct MATH
Packit Service 5bcba8
{
Packit Service 5bcba8
  static const hb_tag_t tableTag	= HB_OT_TAG_MATH;
Packit Service 5bcba8
Packit Service 5bcba8
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    TRACE_SANITIZE (this);
Packit Service 5bcba8
    return_trace (version.sanitize (c) &&
Packit Service 5bcba8
		  likely (version.major == 1) &&
Packit Service 5bcba8
		  mathConstants.sanitize (c, this) &&
Packit Service 5bcba8
		  mathGlyphInfo.sanitize (c, this) &&
Packit Service 5bcba8
		  mathVariants.sanitize (c, this));
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline hb_position_t get_constant (hb_ot_math_constant_t  constant,
Packit Service 5bcba8
				     hb_font_t		   *font) const
Packit Service 5bcba8
  { return (this+mathConstants).get_value (constant, font); }
Packit Service 5bcba8
Packit Service 5bcba8
  inline const MathGlyphInfo &get_math_glyph_info (void) const
Packit Service 5bcba8
  { return this+mathGlyphInfo; }
Packit Service 5bcba8
Packit Service 5bcba8
  inline const MathVariants &get_math_variants (void) const
Packit Service 5bcba8
  { return this+mathVariants; }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  FixedVersion<>version;		/* Version of the MATH table
Packit Service 5bcba8
					 * initially set to 0x00010000u */
Packit Service 5bcba8
  OffsetTo<MathConstants> mathConstants;/* MathConstants table */
Packit Service 5bcba8
  OffsetTo<MathGlyphInfo> mathGlyphInfo;/* MathGlyphInfo table */
Packit Service 5bcba8
  OffsetTo<MathVariants>  mathVariants;	/* MathVariants table */
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_STATIC (10);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
} /* namespace OT */
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
#endif /* HB_OT_MATH_TABLE_HH */