1 /*
   2  * Copyright © 2018  Ebrahim Byagowi
   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 
  25 #ifndef HB_AAT_LTAG_TABLE_HH
  26 #define HB_AAT_LTAG_TABLE_HH
  27 
  28 #include "hb-open-type.hh"
  29 
  30 /*
  31  * ltag -- Language Tag
  32  * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6ltag.html
  33  */
  34 #define HB_AAT_TAG_ltag HB_TAG('l','t','a','g')
  35 
  36 
  37 namespace AAT {
  38 
  39 using namespace OT;
  40 
  41 
  42 struct FTStringRange
  43 {
  44   friend struct ltag;
  45 
  46   bool sanitize (hb_sanitize_context_t *c, const void *base) const
  47   {
  48     TRACE_SANITIZE (this);
  49     return_trace (c->check_struct (this) && (base+tag).sanitize (c, length));
  50   }
  51 
  52   protected:
  53   NNOffsetTo<UnsizedArrayOf<HBUINT8> >
  54                 tag;            /* Offset from the start of the table to
  55                                  * the beginning of the string */
  56   HBUINT16      length;         /* String length (in bytes) */
  57   public:
  58   DEFINE_SIZE_STATIC (4);
  59 };
  60 
  61 struct ltag
  62 {
  63   static constexpr hb_tag_t tableTag = HB_AAT_TAG_ltag;
  64 
  65   hb_language_t get_language (unsigned int i) const
  66   {
  67     const FTStringRange &range = tagRanges[i];
  68     return hb_language_from_string ((const char *) (this+range.tag).arrayZ,
  69                                     range.length);
  70   }
  71 
  72   bool sanitize (hb_sanitize_context_t *c) const
  73   {
  74     TRACE_SANITIZE (this);
  75     return_trace (likely (c->check_struct (this) &&
  76                           version >= 1 &&
  77                           tagRanges.sanitize (c, this)));
  78   }
  79 
  80   protected:
  81   HBUINT32      version;        /* Table version; currently 1 */
  82   HBUINT32      flags;          /* Table flags; currently none defined */
  83   LArrayOf<FTStringRange>
  84                 tagRanges;      /* Range for each tag's string */
  85   public:
  86   DEFINE_SIZE_ARRAY (12, tagRanges);
  87 };
  88 
  89 } /* namespace AAT */
  90 
  91 
  92 #endif /* HB_AAT_LTAG_TABLE_HH */