/*
 * Copyright © 2011,2012  Google, Inc.
 *
 *  This is part of HarfBuzz, a text shaping library.
 *
 * Permission is hereby granted, without written agreement and without
 * license or royalty fees, to use, copy, modify, and distribute this
 * software and its documentation for any purpose, provided that the
 * above copyright notice and the following two paragraphs appear in
 * all copies of this software.
 *
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 *
 * Google Author(s): Behdad Esfahbod
 */

#ifndef HB_OT_HHEA_TABLE_HH
#define HB_OT_HHEA_TABLE_HH

#include "hb-open-type.hh"

/*
 * hhea -- Horizontal Header
 * https://docs.microsoft.com/en-us/typography/opentype/spec/hhea
 * vhea -- Vertical Header
 * https://docs.microsoft.com/en-us/typography/opentype/spec/vhea
 */
#define HB_OT_TAG_hhea HB_TAG('h','h','e','a')
#define HB_OT_TAG_vhea HB_TAG('v','h','e','a')


namespace OT {


template <typename T>
struct _hea
{
  inline bool sanitize (hb_sanitize_context_t *c) const
  {
    TRACE_SANITIZE (this);
    return_trace (c->check_struct (this) && likely (version.major == 1));
  }

  public:
  FixedVersion<>version;		/* 0x00010000u for version 1.0. */
  FWORD		ascender;		/* Typographic ascent. */
  FWORD		descender;		/* Typographic descent. */
  FWORD		lineGap;		/* Typographic line gap. */
  UFWORD	advanceMax;		/* Maximum advance width/height value in
					 * metrics table. */
  FWORD		minLeadingBearing;	/* Minimum left/top sidebearing value in
					 * metrics table. */
  FWORD		minTrailingBearing;	/* Minimum right/bottom sidebearing value;
					 * calculated as Min(aw - lsb -
					 * (xMax - xMin)) for horizontal. */
  FWORD		maxExtent;		/* horizontal: Max(lsb + (xMax - xMin)),
					 * vertical: minLeadingBearing+(yMax-yMin). */
  HBINT16		caretSlopeRise;		/* Used to calculate the slope of the
					 * cursor (rise/run); 1 for vertical caret,
					 * 0 for horizontal.*/
  HBINT16		caretSlopeRun;		/* 0 for vertical caret, 1 for horizontal. */
  HBINT16		caretOffset;		/* The amount by which a slanted
					 * highlight on a glyph needs
					 * to be shifted to produce the
					 * best appearance. Set to 0 for
					 * non-slanted fonts. */
  HBINT16		reserved1;		/* Set to 0. */
  HBINT16		reserved2;		/* Set to 0. */
  HBINT16		reserved3;		/* Set to 0. */
  HBINT16		reserved4;		/* Set to 0. */
  HBINT16		metricDataFormat;	/* 0 for current format. */
  HBUINT16	numberOfLongMetrics;	/* Number of LongMetric entries in metric
					 * table. */
  public:
  DEFINE_SIZE_STATIC (36);
};

struct hhea : _hea<hhea> {
  static const hb_tag_t tableTag	= HB_OT_TAG_hhea;
};
struct vhea : _hea<vhea> {
  static const hb_tag_t tableTag	= HB_OT_TAG_vhea;
};


} /* namespace OT */


#endif /* HB_OT_HHEA_TABLE_HH */
