tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

hb-ot-name.cc (6135B)


      1 /*
      2 * Copyright © 2018  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 #include "hb.hh"
     28 
     29 #ifndef HB_NO_NAME
     30 
     31 #include "hb-ot-name-table.hh"
     32 
     33 #include "hb-utf.hh"
     34 
     35 
     36 /**
     37 * SECTION:hb-ot-name
     38 * @title: hb-ot-name
     39 * @short_description: OpenType font name information
     40 * @include: hb-ot.h
     41 *
     42 * Functions for fetching name strings from OpenType fonts.
     43 **/
     44 
     45 
     46 /**
     47 * hb_ot_name_list_names:
     48 * @face: font face.
     49 * @num_entries: (out) (optional): number of returned entries.
     50 *
     51 * Enumerates all available name IDs and language combinations. Returned
     52 * array is owned by the @face and should not be modified.  It can be
     53 * used as long as @face is alive.
     54 *
     55 * Returns: (transfer none) (array length=num_entries): Array of available name entries.
     56 * Since: 2.1.0
     57 **/
     58 const hb_ot_name_entry_t *
     59 hb_ot_name_list_names (hb_face_t    *face,
     60 	       unsigned int *num_entries /* OUT */)
     61 {
     62  const OT::name_accelerator_t &name = *face->table.name;
     63  if (num_entries) *num_entries = name.names.length;
     64  return (const hb_ot_name_entry_t *) name.names;
     65 }
     66 
     67 template <typename utf_t>
     68 static inline unsigned int
     69 hb_ot_name_get_utf (hb_face_t       *face,
     70 	    hb_ot_name_id_t  name_id,
     71 	    hb_language_t    language,
     72 	    unsigned int    *text_size /* IN/OUT */,
     73 	    typename utf_t::codepoint_t *text /* OUT */)
     74 {
     75  const OT::name_accelerator_t &name = *face->table.name;
     76 
     77  if (!language)
     78    language = hb_language_from_string ("en", 2);
     79 
     80  unsigned int width;
     81  int idx = name.get_index (name_id, language, &width);
     82  if (idx != -1)
     83  {
     84    hb_bytes_t bytes = name.get_name (idx);
     85 
     86    if (width == 2) /* UTF16-BE */
     87      return OT::hb_ot_name_convert_utf<hb_utf16_be_t, utf_t> (bytes, text_size, text);
     88 
     89    if (width == 1) /* ASCII */
     90      return OT::hb_ot_name_convert_utf<hb_ascii_t, utf_t> (bytes, text_size, text);
     91  }
     92 
     93  if (text_size)
     94  {
     95    if (*text_size)
     96      *text = 0;
     97    *text_size = 0;
     98  }
     99  return 0;
    100 }
    101 
    102 /**
    103 * hb_ot_name_get_utf8:
    104 * @face: font face.
    105 * @name_id: OpenType name identifier to fetch.
    106 * @language: language to fetch the name for.
    107 * @text_size: (inout) (optional): input size of @text buffer, and output size of
    108 *                                   text written to buffer.
    109 * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
    110 *
    111 * Fetches a font name from the OpenType 'name' table.
    112 * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
    113 * Returns string in UTF-8 encoding. A NUL terminator is always written
    114 * for convenience, and isn't included in the output @text_size.
    115 *
    116 * Returns: full length of the requested string, or 0 if not found.
    117 * Since: 2.1.0
    118 **/
    119 unsigned int
    120 hb_ot_name_get_utf8 (hb_face_t       *face,
    121 	     hb_ot_name_id_t  name_id,
    122 	     hb_language_t    language,
    123 	     unsigned int    *text_size /* IN/OUT */,
    124 	     char            *text      /* OUT */)
    125 {
    126  return hb_ot_name_get_utf<hb_utf8_t> (face, name_id, language, text_size,
    127 				(hb_utf8_t::codepoint_t *) text);
    128 }
    129 
    130 /**
    131 * hb_ot_name_get_utf16:
    132 * @face: font face.
    133 * @name_id: OpenType name identifier to fetch.
    134 * @language: language to fetch the name for.
    135 * @text_size: (inout) (optional): input size of @text buffer, and output size of
    136 *                                   text written to buffer.
    137 * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
    138 *
    139 * Fetches a font name from the OpenType 'name' table.
    140 * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
    141 * Returns string in UTF-16 encoding. A NUL terminator is always written
    142 * for convenience, and isn't included in the output @text_size.
    143 *
    144 * Returns: full length of the requested string, or 0 if not found.
    145 * Since: 2.1.0
    146 **/
    147 unsigned int
    148 hb_ot_name_get_utf16 (hb_face_t       *face,
    149 	      hb_ot_name_id_t  name_id,
    150 	      hb_language_t    language,
    151 	      unsigned int    *text_size /* IN/OUT */,
    152 	      uint16_t        *text      /* OUT */)
    153 {
    154  return hb_ot_name_get_utf<hb_utf16_t> (face, name_id, language, text_size, text);
    155 }
    156 
    157 /**
    158 * hb_ot_name_get_utf32:
    159 * @face: font face.
    160 * @name_id: OpenType name identifier to fetch.
    161 * @language: language to fetch the name for.
    162 * @text_size: (inout) (optional): input size of @text buffer, and output size of
    163 *                                   text written to buffer.
    164 * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
    165 *
    166 * Fetches a font name from the OpenType 'name' table.
    167 * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
    168 * Returns string in UTF-32 encoding. A NUL terminator is always written
    169 * for convenience, and isn't included in the output @text_size.
    170 *
    171 * Returns: full length of the requested string, or 0 if not found.
    172 * Since: 2.1.0
    173 **/
    174 unsigned int
    175 hb_ot_name_get_utf32 (hb_face_t       *face,
    176 	      hb_ot_name_id_t  name_id,
    177 	      hb_language_t    language,
    178 	      unsigned int    *text_size /* IN/OUT */,
    179 	      uint32_t        *text      /* OUT */)
    180 {
    181  return hb_ot_name_get_utf<hb_utf32_t> (face, name_id, language, text_size, text);
    182 }
    183 
    184 #endif