LCOV - code coverage report
Current view: top level - gfx/harfbuzz/src - hb-open-file-private.hh (source / functions) Hit Total Coverage
Test: output.info Lines: 0 44 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 10 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright © 2007,2008,2009  Red Hat, Inc.
       3             :  * Copyright © 2012  Google, Inc.
       4             :  *
       5             :  *  This is part of HarfBuzz, a text shaping library.
       6             :  *
       7             :  * Permission is hereby granted, without written agreement and without
       8             :  * license or royalty fees, to use, copy, modify, and distribute this
       9             :  * software and its documentation for any purpose, provided that the
      10             :  * above copyright notice and the following two paragraphs appear in
      11             :  * all copies of this software.
      12             :  *
      13             :  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
      14             :  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
      15             :  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
      16             :  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
      17             :  * DAMAGE.
      18             :  *
      19             :  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
      20             :  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
      21             :  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
      22             :  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
      23             :  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
      24             :  *
      25             :  * Red Hat Author(s): Behdad Esfahbod
      26             :  * Google Author(s): Behdad Esfahbod
      27             :  */
      28             : 
      29             : #ifndef HB_OPEN_FILE_PRIVATE_HH
      30             : #define HB_OPEN_FILE_PRIVATE_HH
      31             : 
      32             : #include "hb-open-type-private.hh"
      33             : 
      34             : 
      35             : namespace OT {
      36             : 
      37             : 
      38             : /*
      39             :  *
      40             :  * The OpenType Font File
      41             :  *
      42             :  */
      43             : 
      44             : 
      45             : /*
      46             :  * Organization of an OpenType Font
      47             :  */
      48             : 
      49             : struct OpenTypeFontFile;
      50             : struct OffsetTable;
      51             : struct TTCHeader;
      52             : 
      53             : 
      54             : typedef struct TableRecord
      55             : {
      56             :   inline bool sanitize (hb_sanitize_context_t *c) const
      57             :   {
      58             :     TRACE_SANITIZE (this);
      59             :     return_trace (c->check_struct (this));
      60             :   }
      61             : 
      62             :   Tag           tag;            /* 4-byte identifier. */
      63             :   CheckSum      checkSum;       /* CheckSum for this table. */
      64             :   ULONG         offset;         /* Offset from beginning of TrueType font
      65             :                                  * file. */
      66             :   ULONG         length;         /* Length of this table. */
      67             :   public:
      68             :   DEFINE_SIZE_STATIC (16);
      69             : } OpenTypeTable;
      70             : 
      71             : typedef struct OffsetTable
      72             : {
      73             :   friend struct OpenTypeFontFile;
      74             : 
      75             :   inline unsigned int get_table_count (void) const
      76             :   { return numTables; }
      77           0 :   inline const TableRecord& get_table (unsigned int i) const
      78             :   {
      79           0 :     if (unlikely (i >= numTables)) return Null(TableRecord);
      80           0 :     return tables[i];
      81             :   }
      82           0 :   inline bool find_table_index (hb_tag_t tag, unsigned int *table_index) const
      83             :   {
      84             :     Tag t;
      85           0 :     t.set (tag);
      86           0 :     unsigned int count = numTables;
      87           0 :     for (unsigned int i = 0; i < count; i++)
      88             :     {
      89           0 :       if (t == tables[i].tag)
      90             :       {
      91           0 :         if (table_index) *table_index = i;
      92           0 :         return true;
      93             :       }
      94             :     }
      95           0 :     if (table_index) *table_index = Index::NOT_FOUND_INDEX;
      96           0 :     return false;
      97             :   }
      98           0 :   inline const TableRecord& get_table_by_tag (hb_tag_t tag) const
      99             :   {
     100             :     unsigned int table_index;
     101           0 :     find_table_index (tag, &table_index);
     102           0 :     return get_table (table_index);
     103             :   }
     104             : 
     105             :   public:
     106           0 :   inline bool sanitize (hb_sanitize_context_t *c) const
     107             :   {
     108           0 :     TRACE_SANITIZE (this);
     109           0 :     return_trace (c->check_struct (this) && c->check_array (tables, TableRecord::static_size, numTables));
     110             :   }
     111             : 
     112             :   protected:
     113             :   Tag           sfnt_version;   /* '\0\001\0\00' if TrueType / 'OTTO' if CFF */
     114             :   USHORT        numTables;      /* Number of tables. */
     115             :   USHORT        searchRangeZ;   /* (Maximum power of 2 <= numTables) x 16 */
     116             :   USHORT        entrySelectorZ; /* Log2(maximum power of 2 <= numTables). */
     117             :   USHORT        rangeShiftZ;    /* NumTables x 16-searchRange. */
     118             :   TableRecord   tables[VAR];    /* TableRecord entries. numTables items */
     119             :   public:
     120             :   DEFINE_SIZE_ARRAY (12, tables);
     121             : } OpenTypeFontFace;
     122             : 
     123             : 
     124             : /*
     125             :  * TrueType Collections
     126             :  */
     127             : 
     128             : struct TTCHeaderVersion1
     129             : {
     130             :   friend struct TTCHeader;
     131             : 
     132             :   inline unsigned int get_face_count (void) const { return table.len; }
     133           0 :   inline const OpenTypeFontFace& get_face (unsigned int i) const { return this+table[i]; }
     134             : 
     135           0 :   inline bool sanitize (hb_sanitize_context_t *c) const
     136             :   {
     137           0 :     TRACE_SANITIZE (this);
     138           0 :     return_trace (table.sanitize (c, this));
     139             :   }
     140             : 
     141             :   protected:
     142             :   Tag           ttcTag;         /* TrueType Collection ID string: 'ttcf' */
     143             :   FixedVersion<>version;  /* Version of the TTC Header (1.0),
     144             :                                  * 0x00010000u */
     145             :   ArrayOf<LOffsetTo<OffsetTable>, ULONG>
     146             :                 table;          /* Array of offsets to the OffsetTable for each font
     147             :                                  * from the beginning of the file */
     148             :   public:
     149             :   DEFINE_SIZE_ARRAY (12, table);
     150             : };
     151             : 
     152             : struct TTCHeader
     153             : {
     154             :   friend struct OpenTypeFontFile;
     155             : 
     156             :   private:
     157             : 
     158             :   inline unsigned int get_face_count (void) const
     159             :   {
     160             :     switch (u.header.version.major) {
     161             :     case 2: /* version 2 is compatible with version 1 */
     162             :     case 1: return u.version1.get_face_count ();
     163             :     default:return 0;
     164             :     }
     165             :   }
     166           0 :   inline const OpenTypeFontFace& get_face (unsigned int i) const
     167             :   {
     168           0 :     switch (u.header.version.major) {
     169             :     case 2: /* version 2 is compatible with version 1 */
     170           0 :     case 1: return u.version1.get_face (i);
     171           0 :     default:return Null(OpenTypeFontFace);
     172             :     }
     173             :   }
     174             : 
     175           0 :   inline bool sanitize (hb_sanitize_context_t *c) const
     176             :   {
     177           0 :     TRACE_SANITIZE (this);
     178           0 :     if (unlikely (!u.header.version.sanitize (c))) return_trace (false);
     179           0 :     switch (u.header.version.major) {
     180             :     case 2: /* version 2 is compatible with version 1 */
     181           0 :     case 1: return_trace (u.version1.sanitize (c));
     182           0 :     default:return_trace (true);
     183             :     }
     184             :   }
     185             : 
     186             :   protected:
     187             :   union {
     188             :   struct {
     189             :   Tag           ttcTag;         /* TrueType Collection ID string: 'ttcf' */
     190             :   FixedVersion<>version;  /* Version of the TTC Header (1.0 or 2.0),
     191             :                                  * 0x00010000u or 0x00020000u */
     192             :   }                     header;
     193             :   TTCHeaderVersion1     version1;
     194             :   } u;
     195             : };
     196             : 
     197             : 
     198             : /*
     199             :  * OpenType Font File
     200             :  */
     201             : 
     202             : struct OpenTypeFontFile
     203             : {
     204             :   static const hb_tag_t tableTag        = HB_TAG ('_','_','_','_'); /* Sanitizer needs this. */
     205             : 
     206             :   static const hb_tag_t CFFTag          = HB_TAG ('O','T','T','O'); /* OpenType with Postscript outlines */
     207             :   static const hb_tag_t TrueTypeTag     = HB_TAG ( 0 , 1 , 0 , 0 ); /* OpenType with TrueType outlines */
     208             :   static const hb_tag_t TTCTag          = HB_TAG ('t','t','c','f'); /* TrueType Collection */
     209             :   static const hb_tag_t TrueTag         = HB_TAG ('t','r','u','e'); /* Obsolete Apple TrueType */
     210             :   static const hb_tag_t Typ1Tag         = HB_TAG ('t','y','p','1'); /* Obsolete Apple Type1 font in SFNT container */
     211             : 
     212             :   inline hb_tag_t get_tag (void) const { return u.tag; }
     213             : 
     214             :   inline unsigned int get_face_count (void) const
     215             :   {
     216             :     switch (u.tag) {
     217             :     case CFFTag:        /* All the non-collection tags */
     218             :     case TrueTag:
     219             :     case Typ1Tag:
     220             :     case TrueTypeTag:   return 1;
     221             :     case TTCTag:        return u.ttcHeader.get_face_count ();
     222             :     default:            return 0;
     223             :     }
     224             :   }
     225           0 :   inline const OpenTypeFontFace& get_face (unsigned int i) const
     226             :   {
     227           0 :     switch (u.tag) {
     228             :     /* Note: for non-collection SFNT data we ignore index.  This is because
     229             :      * Apple dfont container is a container of SFNT's.  So each SFNT is a
     230             :      * non-TTC, but the index is more than zero. */
     231             :     case CFFTag:        /* All the non-collection tags */
     232             :     case TrueTag:
     233             :     case Typ1Tag:
     234           0 :     case TrueTypeTag:   return u.fontFace;
     235           0 :     case TTCTag:        return u.ttcHeader.get_face (i);
     236           0 :     default:            return Null(OpenTypeFontFace);
     237             :     }
     238             :   }
     239             : 
     240           0 :   inline bool sanitize (hb_sanitize_context_t *c) const
     241             :   {
     242           0 :     TRACE_SANITIZE (this);
     243           0 :     if (unlikely (!u.tag.sanitize (c))) return_trace (false);
     244           0 :     switch (u.tag) {
     245             :     case CFFTag:        /* All the non-collection tags */
     246             :     case TrueTag:
     247             :     case Typ1Tag:
     248           0 :     case TrueTypeTag:   return_trace (u.fontFace.sanitize (c));
     249           0 :     case TTCTag:        return_trace (u.ttcHeader.sanitize (c));
     250           0 :     default:            return_trace (true);
     251             :     }
     252             :   }
     253             : 
     254             :   protected:
     255             :   union {
     256             :   Tag                   tag;            /* 4-byte identifier. */
     257             :   OpenTypeFontFace      fontFace;
     258             :   TTCHeader             ttcHeader;
     259             :   } u;
     260             :   public:
     261             :   DEFINE_SIZE_UNION (4, tag);
     262             : };
     263             : 
     264             : 
     265             : } /* namespace OT */
     266             : 
     267             : 
     268             : #endif /* HB_OPEN_FILE_PRIVATE_HH */

Generated by: LCOV version 1.13