Blame src/hb-ot-var-avar-table.hh

Packit 874993
/*
Packit 874993
 * Copyright © 2017  Google, Inc.
Packit 874993
 *
Packit 874993
 *  This is part of HarfBuzz, a text shaping library.
Packit 874993
 *
Packit 874993
 * Permission is hereby granted, without written agreement and without
Packit 874993
 * license or royalty fees, to use, copy, modify, and distribute this
Packit 874993
 * software and its documentation for any purpose, provided that the
Packit 874993
 * above copyright notice and the following two paragraphs appear in
Packit 874993
 * all copies of this software.
Packit 874993
 *
Packit 874993
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
Packit 874993
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
Packit 874993
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
Packit 874993
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
Packit 874993
 * DAMAGE.
Packit 874993
 *
Packit 874993
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
Packit 874993
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
Packit 874993
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
Packit 874993
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
Packit 874993
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Packit 874993
 *
Packit 874993
 * Google Author(s): Behdad Esfahbod
Packit 874993
 */
Packit 874993
Packit 874993
#ifndef HB_OT_VAR_AVAR_TABLE_HH
Packit 874993
#define HB_OT_VAR_AVAR_TABLE_HH
Packit 874993
Packit 874993
#include "hb-open-type-private.hh"
Packit 874993
Packit 874993
namespace OT {
Packit 874993
Packit 874993
Packit 874993
struct AxisValueMap
Packit 874993
{
Packit 874993
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit 874993
  {
Packit 874993
    TRACE_SANITIZE (this);
Packit 874993
    return_trace (c->check_struct (this));
Packit 874993
  }
Packit 874993
Packit 874993
  public:
Packit 874993
  F2DOT14	fromCoord;	/* A normalized coordinate value obtained using
Packit 874993
				 * default normalization. */
Packit 874993
  F2DOT14	toCoord;	/* The modified, normalized coordinate value. */
Packit 874993
Packit 874993
  public:
Packit 874993
  DEFINE_SIZE_STATIC (4);
Packit 874993
};
Packit 874993
Packit 874993
struct SegmentMaps : ArrayOf<AxisValueMap>
Packit 874993
{
Packit 874993
  inline int map (int value) const
Packit 874993
  {
Packit 874993
    /* The following special-cases are not part of OpenType, which requires
Packit 874993
     * that at least -1, 0, and +1 must be mapped. But we include these as
Packit 874993
     * part of a better error recovery scheme. */
Packit 874993
Packit 874993
    if (len < 2)
Packit 874993
    {
Packit 874993
      if (!len)
Packit 874993
	return value;
Packit 874993
      else /* len == 1*/
Packit 874993
	return value - array[0].fromCoord + array[0].toCoord;
Packit 874993
    }
Packit 874993
Packit 874993
    if (value <= array[0].fromCoord)
Packit 874993
      return value - array[0].fromCoord + array[0].toCoord;
Packit 874993
Packit 874993
    unsigned int i;
Packit 874993
    unsigned int count = len;
Packit 874993
    for (i = 1; i < count && value > array[i].fromCoord; i++)
Packit 874993
      ;
Packit 874993
Packit 874993
    if (value >= array[i].fromCoord)
Packit 874993
      return value - array[i].fromCoord + array[i].toCoord;
Packit 874993
Packit 874993
    if (unlikely (array[i-1].fromCoord == array[i].fromCoord))
Packit 874993
      return array[i-1].toCoord;
Packit 874993
Packit 874993
    int denom = array[i].fromCoord - array[i-1].fromCoord;
Packit 874993
    return array[i-1].toCoord +
Packit 874993
	   ((array[i].toCoord - array[i-1].toCoord) *
Packit 874993
	    (value - array[i-1].fromCoord) + denom/2) / denom;
Packit 874993
  }
Packit 874993
Packit 874993
  DEFINE_SIZE_ARRAY (2, array);
Packit 874993
};
Packit 874993
Packit 874993
/*
Packit 874993
 * avar — Axis Variations Table
Packit 874993
 */
Packit 874993
Packit 874993
#define HB_OT_TAG_avar HB_TAG('a','v','a','r')
Packit 874993
Packit 874993
struct avar
Packit 874993
{
Packit 874993
  static const hb_tag_t tableTag	= HB_OT_TAG_avar;
Packit 874993
Packit 874993
  inline bool sanitize (hb_sanitize_context_t *c) const
Packit 874993
  {
Packit 874993
    TRACE_SANITIZE (this);
Packit 874993
    if (unlikely (!(version.sanitize (c) &&
Packit 874993
		    version.major == 1 &&
Packit 874993
		    c->check_struct (this))))
Packit 874993
      return_trace (false);
Packit 874993
Packit 874993
    const SegmentMaps *map = &axisSegmentMapsZ;
Packit 874993
    unsigned int count = axisCount;
Packit 874993
    for (unsigned int i = 0; i < count; i++)
Packit 874993
    {
Packit 874993
      if (unlikely (!map->sanitize (c)))
Packit 874993
        return_trace (false);
Packit 874993
      map = &StructAfter<SegmentMaps> (*map);
Packit 874993
    }
Packit 874993
Packit 874993
    return_trace (true);
Packit 874993
  }
Packit 874993
Packit 874993
  inline void map_coords (int *coords, unsigned int coords_length) const
Packit 874993
  {
Packit 874993
    unsigned int count = MIN<unsigned int> (coords_length, axisCount);
Packit 874993
Packit 874993
    const SegmentMaps *map = &axisSegmentMapsZ;
Packit 874993
    for (unsigned int i = 0; i < count; i++)
Packit 874993
    {
Packit 874993
      coords[i] = map->map (coords[i]);
Packit 874993
      map = &StructAfter<SegmentMaps> (*map);
Packit 874993
    }
Packit 874993
  }
Packit 874993
Packit 874993
  protected:
Packit 874993
  FixedVersion<>version;	/* Version of the avar table
Packit 874993
				 * initially set to 0x00010000u */
Packit 874993
  USHORT	reserved;	/* This field is permanently reserved. Set to 0. */
Packit 874993
  USHORT	axisCount;	/* The number of variation axes in the font. This
Packit 874993
				 * must be the same number as axisCount in the
Packit 874993
				 * 'fvar' table. */
Packit 874993
  SegmentMaps	axisSegmentMapsZ;
Packit 874993
Packit 874993
  public:
Packit 874993
  DEFINE_SIZE_MIN (8);
Packit 874993
};
Packit 874993
Packit 874993
} /* namespace OT */
Packit 874993
Packit 874993
Packit 874993
#endif /* HB_OT_VAR_AVAR_TABLE_HH */