LCOV - code coverage report
Current view: top level - gfx/harfbuzz/src - hb-ot-var-avar-table.hh (source / functions) Hit Total Coverage
Test: output.info Lines: 0 33 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 3 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright © 2017  Google, Inc.
       3             :  *
       4             :  *  This is part of HarfBuzz, a text shaping library.
       5             :  *
       6             :  * Permission is hereby granted, without written agreement and without
       7             :  * license or royalty fees, to use, copy, modify, and distribute this
       8             :  * software and its documentation for any purpose, provided that the
       9             :  * above copyright notice and the following two paragraphs appear in
      10             :  * all copies of this software.
      11             :  *
      12             :  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
      13             :  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
      14             :  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
      15             :  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
      16             :  * DAMAGE.
      17             :  *
      18             :  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
      19             :  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
      20             :  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
      21             :  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
      22             :  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
      23             :  *
      24             :  * Google Author(s): Behdad Esfahbod
      25             :  */
      26             : 
      27             : #ifndef HB_OT_VAR_AVAR_TABLE_HH
      28             : #define HB_OT_VAR_AVAR_TABLE_HH
      29             : 
      30             : #include "hb-open-type-private.hh"
      31             : 
      32             : namespace OT {
      33             : 
      34             : 
      35             : struct AxisValueMap
      36             : {
      37             :   inline bool sanitize (hb_sanitize_context_t *c) const
      38             :   {
      39             :     TRACE_SANITIZE (this);
      40             :     return_trace (c->check_struct (this));
      41             :   }
      42             : 
      43             :   public:
      44             :   F2DOT14       fromCoord;      /* A normalized coordinate value obtained using
      45             :                                  * default normalization. */
      46             :   F2DOT14       toCoord;        /* The modified, normalized coordinate value. */
      47             : 
      48             :   public:
      49             :   DEFINE_SIZE_STATIC (4);
      50             : };
      51             : 
      52             : struct SegmentMaps : ArrayOf<AxisValueMap>
      53             : {
      54           0 :   inline int map (int value) const
      55             :   {
      56             :     /* The following special-cases are not part of OpenType, which requires
      57             :      * that at least -1, 0, and +1 must be mapped. But we include these as
      58             :      * part of a better error recovery scheme. */
      59             : 
      60           0 :     if (!len)
      61           0 :       return value;
      62             : 
      63           0 :     if (value <= array[0].fromCoord)
      64           0 :       return value - array[0].fromCoord + array[0].toCoord;
      65             : 
      66             :     unsigned int i;
      67           0 :     unsigned int count = len;
      68           0 :     for (i = 1; i < count && value > array[i].fromCoord; i++)
      69             :       ;
      70             : 
      71           0 :     if (value >= array[i].fromCoord)
      72           0 :       return value - array[i].fromCoord + array[i].toCoord;
      73             : 
      74           0 :     if (unlikely (array[i-1].fromCoord == array[i].fromCoord))
      75           0 :       return array[i-1].toCoord;
      76             : 
      77           0 :     int denom = array[i].fromCoord - array[i-1].fromCoord;
      78           0 :     return array[i-1].toCoord +
      79           0 :            (array[i].toCoord - array[i-1].toCoord) *
      80           0 :            (value - array[i-1].fromCoord + denom/2) / denom;
      81             :   }
      82             : 
      83             :   DEFINE_SIZE_ARRAY (2, array);
      84             : };
      85             : 
      86             : /*
      87             :  * avar — Axis Variations Table
      88             :  */
      89             : 
      90             : #define HB_OT_TAG_avar HB_TAG('a','v','a','r')
      91             : 
      92             : struct avar
      93             : {
      94             :   static const hb_tag_t tableTag        = HB_OT_TAG_avar;
      95             : 
      96           0 :   inline bool sanitize (hb_sanitize_context_t *c) const
      97             :   {
      98           0 :     TRACE_SANITIZE (this);
      99           0 :     if (unlikely (!(version.sanitize (c) &&
     100             :                     version.major == 1 &&
     101             :                     c->check_struct (this))))
     102           0 :       return_trace (false);
     103             : 
     104           0 :     const SegmentMaps *map = &axisSegmentMapsZ;
     105           0 :     unsigned int count = axisCount;
     106           0 :     for (unsigned int i = 0; i < count; i++)
     107             :     {
     108           0 :       if (unlikely (!map->sanitize (c)))
     109           0 :         return_trace (false);
     110           0 :       map = &StructAfter<SegmentMaps> (*map);
     111             :     }
     112             : 
     113           0 :     return_trace (true);
     114             :   }
     115             : 
     116           0 :   inline void map_coords (int *coords, unsigned int coords_length) const
     117             :   {
     118           0 :     unsigned int count = MIN<unsigned int> (coords_length, axisCount);
     119             : 
     120           0 :     const SegmentMaps *map = &axisSegmentMapsZ;
     121           0 :     for (unsigned int i = 0; i < count; i++)
     122             :     {
     123           0 :       coords[i] = map->map (coords[i]);
     124           0 :       map = &StructAfter<SegmentMaps> (*map);
     125             :     }
     126           0 :   }
     127             : 
     128             :   protected:
     129             :   FixedVersion<>version;  /* Version of the avar table
     130             :                                  * initially set to 0x00010000u */
     131             :   USHORT        reserved;       /* This field is permanently reserved. Set to 0. */
     132             :   USHORT        axisCount;      /* The number of variation axes in the font. This
     133             :                                  * must be the same number as axisCount in the
     134             :                                  * 'fvar' table. */
     135             :   SegmentMaps   axisSegmentMapsZ;
     136             : 
     137             :   public:
     138             :   DEFINE_SIZE_MIN (8);
     139             : };
     140             : 
     141             : } /* namespace OT */
     142             : 
     143             : 
     144             : #endif /* HB_OT_VAR_AVAR_TABLE_HH */

Generated by: LCOV version 1.13