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 #include "hb-open-type.hh" 28 29 #include "hb-ot-face.hh" 30 #include "hb-ot-var-avar-table.hh" 31 #include "hb-ot-var-fvar-table.hh" 32 #include "hb-ot-var-mvar-table.hh" 33 #include "hb-ot-var.h" 34 35 36 /** 37 * SECTION:hb-ot-var 38 * @title: hb-ot-var 39 * @short_description: OpenType Font Variations 40 * @include: hb-ot.h 41 * 42 * Functions for fetching information about OpenType Variable Fonts. 43 **/ 44 45 46 /* 47 * fvar/avar 48 */ 49 50 51 /** 52 * hb_ot_var_has_data: 53 * @face: #hb_face_t to test 54 * 55 * This function allows to verify the presence of OpenType variation data on the face. 56 * 57 * Return value: true if face has a `fvar' table and false otherwise 58 * 59 * Since: 1.4.2 60 **/ 61 hb_bool_t 62 hb_ot_var_has_data (hb_face_t *face) 63 { 64 return face->table.fvar->has_data (); 65 } 66 67 /** 68 * hb_ot_var_get_axis_count: 69 * 70 * Since: 1.4.2 71 **/ 72 unsigned int 73 hb_ot_var_get_axis_count (hb_face_t *face) 74 { 75 return face->table.fvar->get_axis_count (); 76 } 77 78 /** 79 * hb_ot_var_get_axes: 80 * 81 * Since: 1.4.2 82 * Deprecated: 2.2.0 83 **/ 84 unsigned int 85 hb_ot_var_get_axes (hb_face_t *face, 86 unsigned int start_offset, 87 unsigned int *axes_count /* IN/OUT */, 88 hb_ot_var_axis_t *axes_array /* OUT */) 89 { 90 return face->table.fvar->get_axes_deprecated (start_offset, axes_count, axes_array); 91 } 92 93 /** 94 * hb_ot_var_find_axis: 95 * 96 * Since: 1.4.2 97 * Deprecated: 2.2.0 98 **/ 99 hb_bool_t 100 hb_ot_var_find_axis (hb_face_t *face, 101 hb_tag_t axis_tag, 102 unsigned int *axis_index, 103 hb_ot_var_axis_t *axis_info) 104 { 105 return face->table.fvar->find_axis_deprecated (axis_tag, axis_index, axis_info); 106 } 107 108 /** 109 * hb_ot_var_get_axis_infos: 110 * 111 * Since: 2.2.0 112 **/ 113 HB_EXTERN unsigned int 114 hb_ot_var_get_axis_infos (hb_face_t *face, 115 unsigned int start_offset, 116 unsigned int *axes_count /* IN/OUT */, 117 hb_ot_var_axis_info_t *axes_array /* OUT */) 118 { 119 return face->table.fvar->get_axis_infos (start_offset, axes_count, axes_array); 120 } 121 122 /** 123 * hb_ot_var_find_axis_info: 124 * 125 * Since: 2.2.0 126 **/ 127 HB_EXTERN hb_bool_t 128 hb_ot_var_find_axis_info (hb_face_t *face, 129 hb_tag_t axis_tag, 130 hb_ot_var_axis_info_t *axis_info) 131 { 132 return face->table.fvar->find_axis_info (axis_tag, axis_info); 133 } 134 135 136 /* 137 * Named instances. 138 */ 139 140 unsigned int 141 hb_ot_var_get_named_instance_count (hb_face_t *face) 142 { 143 return face->table.fvar->get_instance_count (); 144 } 145 146 hb_ot_name_id_t 147 hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t *face, 148 unsigned int instance_index) 149 { 150 return face->table.fvar->get_instance_subfamily_name_id (instance_index); 151 } 152 153 hb_ot_name_id_t 154 hb_ot_var_named_instance_get_postscript_name_id (hb_face_t *face, 155 unsigned int instance_index) 156 { 157 return face->table.fvar->get_instance_postscript_name_id (instance_index); 158 } 159 160 unsigned int 161 hb_ot_var_named_instance_get_design_coords (hb_face_t *face, 162 unsigned int instance_index, 163 unsigned int *coords_length, /* IN/OUT */ 164 float *coords /* OUT */) 165 { 166 return face->table.fvar->get_instance_coords (instance_index, coords_length, coords); 167 } 168 169 170 /** 171 * hb_ot_var_normalize_variations: 172 * 173 * Since: 1.4.2 174 **/ 175 void 176 hb_ot_var_normalize_variations (hb_face_t *face, 177 const hb_variation_t *variations, /* IN */ 178 unsigned int variations_length, 179 int *coords, /* OUT */ 180 unsigned int coords_length) 181 { 182 for (unsigned int i = 0; i < coords_length; i++) 183 coords[i] = 0; 184 185 const OT::fvar &fvar = *face->table.fvar; 186 for (unsigned int i = 0; i < variations_length; i++) 187 { 188 hb_ot_var_axis_info_t info; 189 if (hb_ot_var_find_axis_info (face, variations[i].tag, &info) && 190 info.axis_index < coords_length) 191 coords[info.axis_index] = fvar.normalize_axis_value (info.axis_index, variations[i].value); 192 } 193 194 face->table.avar->map_coords (coords, coords_length); 195 } 196 197 /** 198 * hb_ot_var_normalize_coords: 199 * 200 * Since: 1.4.2 201 **/ 202 void 203 hb_ot_var_normalize_coords (hb_face_t *face, 204 unsigned int coords_length, 205 const float *design_coords, /* IN */ 206 int *normalized_coords /* OUT */) 207 { 208 const OT::fvar &fvar = *face->table.fvar; 209 for (unsigned int i = 0; i < coords_length; i++) 210 normalized_coords[i] = fvar.normalize_axis_value (i, design_coords[i]); 211 212 face->table.avar->map_coords (normalized_coords, coords_length); 213 } 214