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

Packit Service 5bcba8
/*
Packit Service 5bcba8
 * Copyright © 2017  Google, Inc.
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
 * Google Author(s): Behdad Esfahbod
Packit Service 5bcba8
 */
Packit Service 5bcba8
Packit Service 5bcba8
#ifndef HB_OT_VAR_AVAR_TABLE_HH
Packit Service 5bcba8
#define HB_OT_VAR_AVAR_TABLE_HH
Packit Service 5bcba8
Packit Service 5bcba8
#include "hb-open-type-private.hh"
Packit Service 5bcba8
Packit Service 5bcba8
namespace OT {
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
struct AxisValueMap
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
  public:
Packit Service 5bcba8
  F2DOT14	fromCoord;	/* A normalized coordinate value obtained using
Packit Service 5bcba8
				 * default normalization. */
Packit Service 5bcba8
  F2DOT14	toCoord;	/* The modified, normalized coordinate value. */
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_STATIC (4);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
struct SegmentMaps : ArrayOf<AxisValueMap>
Packit Service 5bcba8
{
Packit Service 5bcba8
  inline int map (int value) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    /* The following special-cases are not part of OpenType, which requires
Packit Service 5bcba8
     * that at least -1, 0, and +1 must be mapped. But we include these as
Packit Service 5bcba8
     * part of a better error recovery scheme. */
Packit Service 5bcba8
Packit Service 5bcba8
    if (len < 2)
Packit Service 5bcba8
    {
Packit Service 5bcba8
      if (!len)
Packit Service 5bcba8
	return value;
Packit Service 5bcba8
      else /* len == 1*/
Packit Service 5bcba8
	return value - array[0].fromCoord + array[0].toCoord;
Packit Service 5bcba8
    }
Packit Service 5bcba8
Packit Service 5bcba8
    if (value <= array[0].fromCoord)
Packit Service 5bcba8
      return value - array[0].fromCoord + array[0].toCoord;
Packit Service 5bcba8
Packit Service 5bcba8
    unsigned int i;
Packit Service 5bcba8
    unsigned int count = len;
Packit Service 5bcba8
    for (i = 1; i < count && value > array[i].fromCoord; i++)
Packit Service 5bcba8
      ;
Packit Service 5bcba8
Packit Service 5bcba8
    if (value >= array[i].fromCoord)
Packit Service 5bcba8
      return value - array[i].fromCoord + array[i].toCoord;
Packit Service 5bcba8
Packit Service 5bcba8
    if (unlikely (array[i-1].fromCoord == array[i].fromCoord))
Packit Service 5bcba8
      return array[i-1].toCoord;
Packit Service 5bcba8
Packit Service 5bcba8
    int denom = array[i].fromCoord - array[i-1].fromCoord;
Packit Service 5bcba8
    return array[i-1].toCoord +
Packit Service 5bcba8
	   ((array[i].toCoord - array[i-1].toCoord) *
Packit Service 5bcba8
	    (value - array[i-1].fromCoord) + denom/2) / denom;
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  DEFINE_SIZE_ARRAY (2, array);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
/*
Packit Service 5bcba8
 * avar — Axis Variations Table
Packit Service 5bcba8
 */
Packit Service 5bcba8
Packit Service 5bcba8
#define HB_OT_TAG_avar HB_TAG('a','v','a','r')
Packit Service 5bcba8
Packit Service 5bcba8
struct avar
Packit Service 5bcba8
{
Packit Service 5bcba8
  static const hb_tag_t tableTag	= HB_OT_TAG_avar;
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
    if (unlikely (!(version.sanitize (c) &&
Packit Service 5bcba8
		    version.major == 1 &&
Packit Service 5bcba8
		    c->check_struct (this))))
Packit Service 5bcba8
      return_trace (false);
Packit Service 5bcba8
Packit Service 5bcba8
    const SegmentMaps *map = &axisSegmentMapsZ;
Packit Service 5bcba8
    unsigned int count = axisCount;
Packit Service 5bcba8
    for (unsigned int i = 0; i < count; i++)
Packit Service 5bcba8
    {
Packit Service 5bcba8
      if (unlikely (!map->sanitize (c)))
Packit Service 5bcba8
        return_trace (false);
Packit Service 5bcba8
      map = &StructAfter<SegmentMaps> (*map);
Packit Service 5bcba8
    }
Packit Service 5bcba8
Packit Service 5bcba8
    return_trace (true);
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  inline void map_coords (int *coords, unsigned int coords_length) const
Packit Service 5bcba8
  {
Packit Service 5bcba8
    unsigned int count = MIN<unsigned int> (coords_length, axisCount);
Packit Service 5bcba8
Packit Service 5bcba8
    const SegmentMaps *map = &axisSegmentMapsZ;
Packit Service 5bcba8
    for (unsigned int i = 0; i < count; i++)
Packit Service 5bcba8
    {
Packit Service 5bcba8
      coords[i] = map->map (coords[i]);
Packit Service 5bcba8
      map = &StructAfter<SegmentMaps> (*map);
Packit Service 5bcba8
    }
Packit Service 5bcba8
  }
Packit Service 5bcba8
Packit Service 5bcba8
  protected:
Packit Service 5bcba8
  FixedVersion<>version;	/* Version of the avar table
Packit Service 5bcba8
				 * initially set to 0x00010000u */
Packit Service 5bcba8
  USHORT	reserved;	/* This field is permanently reserved. Set to 0. */
Packit Service 5bcba8
  USHORT	axisCount;	/* The number of variation axes in the font. This
Packit Service 5bcba8
				 * must be the same number as axisCount in the
Packit Service 5bcba8
				 * 'fvar' table. */
Packit Service 5bcba8
  SegmentMaps	axisSegmentMapsZ;
Packit Service 5bcba8
Packit Service 5bcba8
  public:
Packit Service 5bcba8
  DEFINE_SIZE_MIN (8);
Packit Service 5bcba8
};
Packit Service 5bcba8
Packit Service 5bcba8
} /* namespace OT */
Packit Service 5bcba8
Packit Service 5bcba8
Packit Service 5bcba8
#endif /* HB_OT_VAR_AVAR_TABLE_HH */