| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright © 2009  Red Hat, Inc. | 2  * Copyright © 2009  Red Hat, Inc. | 
| 3  * Copyright © 2012  Google, Inc. | 3  * Copyright © 2012  Google, Inc. | 
| 4  * | 4  * | 
| 5  *  This is part of HarfBuzz, a text shaping library. | 5  *  This is part of HarfBuzz, a text shaping library. | 
| 6  * | 6  * | 
| 7  * Permission is hereby granted, without written agreement and without | 7  * Permission is hereby granted, without written agreement and without | 
| 8  * license or royalty fees, to use, copy, modify, and distribute this | 8  * license or royalty fees, to use, copy, modify, and distribute this | 
| 9  * software and its documentation for any purpose, provided that the | 9  * software and its documentation for any purpose, provided that the | 
| 10  * above copyright notice and the following two paragraphs appear in | 10  * above copyright notice and the following two paragraphs appear in | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 38 #include "hb-cache-private.hh" | 38 #include "hb-cache-private.hh" | 
| 39 | 39 | 
| 40 #include <string.h> | 40 #include <string.h> | 
| 41 | 41 | 
| 42 | 42 | 
| 43 /* | 43 /* | 
| 44  * hb_font_funcs_t | 44  * hb_font_funcs_t | 
| 45  */ | 45  */ | 
| 46 | 46 | 
| 47 static hb_bool_t | 47 static hb_bool_t | 
| 48 hb_font_get_glyph_nil (hb_font_t *font, | 48 hb_font_get_glyph_nil (hb_font_t *font HB_UNUSED, | 
| 49                        void *font_data HB_UNUSED, | 49                        void *font_data HB_UNUSED, | 
| 50                        hb_codepoint_t unicode, | 50                        hb_codepoint_t unicode, | 
| 51                        hb_codepoint_t variation_selector, | 51                        hb_codepoint_t variation_selector, | 
| 52                        hb_codepoint_t *glyph, | 52                        hb_codepoint_t *glyph, | 
| 53                        void *user_data HB_UNUSED) | 53                        void *user_data HB_UNUSED) | 
| 54 { | 54 { | 
| 55   if (font->parent) |  | 
| 56     return font->parent->get_glyph (unicode, variation_selector, glyph); |  | 
| 57 |  | 
| 58   *glyph = 0; | 55   *glyph = 0; | 
| 59   return false; | 56   return false; | 
| 60 } | 57 } | 
|  | 58 static hb_bool_t | 
|  | 59 hb_font_get_glyph_parent (hb_font_t *font, | 
|  | 60                           void *font_data HB_UNUSED, | 
|  | 61                           hb_codepoint_t unicode, | 
|  | 62                           hb_codepoint_t variation_selector, | 
|  | 63                           hb_codepoint_t *glyph, | 
|  | 64                           void *user_data HB_UNUSED) | 
|  | 65 { | 
|  | 66   return font->parent->get_glyph (unicode, variation_selector, glyph); | 
|  | 67 } | 
| 61 | 68 | 
| 62 static hb_position_t | 69 static hb_position_t | 
| 63 hb_font_get_glyph_h_advance_nil (hb_font_t *font, | 70 hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED, | 
| 64                                  void *font_data HB_UNUSED, | 71                                  void *font_data HB_UNUSED, | 
| 65                                  hb_codepoint_t glyph, | 72                                  hb_codepoint_t glyph, | 
| 66                                  void *user_data HB_UNUSED) | 73                                  void *user_data HB_UNUSED) | 
| 67 { | 74 { | 
| 68   if (font->parent) |  | 
| 69     return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (gly
      ph)); |  | 
| 70 |  | 
| 71   return font->x_scale; | 75   return font->x_scale; | 
| 72 } | 76 } | 
|  | 77 static hb_position_t | 
|  | 78 hb_font_get_glyph_h_advance_parent (hb_font_t *font, | 
|  | 79                                     void *font_data HB_UNUSED, | 
|  | 80                                     hb_codepoint_t glyph, | 
|  | 81                                     void *user_data HB_UNUSED) | 
|  | 82 { | 
|  | 83   return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph
      )); | 
|  | 84 } | 
| 73 | 85 | 
| 74 static hb_position_t | 86 static hb_position_t | 
| 75 hb_font_get_glyph_v_advance_nil (hb_font_t *font, | 87 hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED, | 
| 76                                  void *font_data HB_UNUSED, | 88                                  void *font_data HB_UNUSED, | 
| 77                                  hb_codepoint_t glyph, | 89                                  hb_codepoint_t glyph, | 
| 78                                  void *user_data HB_UNUSED) | 90                                  void *user_data HB_UNUSED) | 
| 79 { | 91 { | 
| 80   if (font->parent) |  | 
| 81     return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (gly
      ph)); |  | 
| 82 |  | 
| 83   return font->y_scale; | 92   return font->y_scale; | 
| 84 } | 93 } | 
|  | 94 static hb_position_t | 
|  | 95 hb_font_get_glyph_v_advance_parent (hb_font_t *font, | 
|  | 96                                     void *font_data HB_UNUSED, | 
|  | 97                                     hb_codepoint_t glyph, | 
|  | 98                                     void *user_data HB_UNUSED) | 
|  | 99 { | 
|  | 100   return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph
      )); | 
|  | 101 } | 
| 85 | 102 | 
| 86 static hb_bool_t | 103 static hb_bool_t | 
| 87 hb_font_get_glyph_h_origin_nil (hb_font_t *font, | 104 hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED, | 
| 88                                 void *font_data HB_UNUSED, | 105                                 void *font_data HB_UNUSED, | 
| 89                                 hb_codepoint_t glyph, | 106                                 hb_codepoint_t glyph, | 
| 90                                 hb_position_t *x, | 107                                 hb_position_t *x, | 
| 91                                 hb_position_t *y, | 108                                 hb_position_t *y, | 
| 92                                 void *user_data HB_UNUSED) | 109                                 void *user_data HB_UNUSED) | 
| 93 { | 110 { | 
| 94   if (font->parent) { |  | 
| 95     hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y); |  | 
| 96     if (ret) |  | 
| 97       font->parent_scale_position (x, y); |  | 
| 98     return ret; |  | 
| 99   } |  | 
| 100 |  | 
| 101   *x = *y = 0; | 111   *x = *y = 0; | 
| 102   return false; | 112   return false; | 
| 103 } | 113 } | 
|  | 114 static hb_bool_t | 
|  | 115 hb_font_get_glyph_h_origin_parent (hb_font_t *font, | 
|  | 116                                    void *font_data HB_UNUSED, | 
|  | 117                                    hb_codepoint_t glyph, | 
|  | 118                                    hb_position_t *x, | 
|  | 119                                    hb_position_t *y, | 
|  | 120                                    void *user_data HB_UNUSED) | 
|  | 121 { | 
|  | 122   hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y); | 
|  | 123   if (ret) | 
|  | 124     font->parent_scale_position (x, y); | 
|  | 125   return ret; | 
|  | 126 } | 
| 104 | 127 | 
| 105 static hb_bool_t | 128 static hb_bool_t | 
| 106 hb_font_get_glyph_v_origin_nil (hb_font_t *font, | 129 hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED, | 
| 107                                 void *font_data HB_UNUSED, | 130                                 void *font_data HB_UNUSED, | 
| 108                                 hb_codepoint_t glyph, | 131                                 hb_codepoint_t glyph, | 
| 109                                 hb_position_t *x, | 132                                 hb_position_t *x, | 
| 110                                 hb_position_t *y, | 133                                 hb_position_t *y, | 
| 111                                 void *user_data HB_UNUSED) | 134                                 void *user_data HB_UNUSED) | 
| 112 { | 135 { | 
| 113   if (font->parent) { |  | 
| 114     hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y); |  | 
| 115     if (ret) |  | 
| 116       font->parent_scale_position (x, y); |  | 
| 117     return ret; |  | 
| 118   } |  | 
| 119 |  | 
| 120   *x = *y = 0; | 136   *x = *y = 0; | 
| 121   return false; | 137   return false; | 
| 122 } | 138 } | 
|  | 139 static hb_bool_t | 
|  | 140 hb_font_get_glyph_v_origin_parent (hb_font_t *font, | 
|  | 141                                    void *font_data HB_UNUSED, | 
|  | 142                                    hb_codepoint_t glyph, | 
|  | 143                                    hb_position_t *x, | 
|  | 144                                    hb_position_t *y, | 
|  | 145                                    void *user_data HB_UNUSED) | 
|  | 146 { | 
|  | 147   hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y); | 
|  | 148   if (ret) | 
|  | 149     font->parent_scale_position (x, y); | 
|  | 150   return ret; | 
|  | 151 } | 
| 123 | 152 | 
| 124 static hb_position_t | 153 static hb_position_t | 
| 125 hb_font_get_glyph_h_kerning_nil (hb_font_t *font, | 154 hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED, | 
| 126                                  void *font_data HB_UNUSED, | 155                                  void *font_data HB_UNUSED, | 
| 127                                  hb_codepoint_t left_glyph, | 156                                  hb_codepoint_t left_glyph, | 
| 128                                  hb_codepoint_t right_glyph, | 157                                  hb_codepoint_t right_glyph, | 
| 129                                  void *user_data HB_UNUSED) | 158                                  void *user_data HB_UNUSED) | 
| 130 { | 159 { | 
| 131   if (font->parent) |  | 
| 132     return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (lef
      t_glyph, right_glyph)); |  | 
| 133 |  | 
| 134   return 0; | 160   return 0; | 
| 135 } | 161 } | 
|  | 162 static hb_position_t | 
|  | 163 hb_font_get_glyph_h_kerning_parent (hb_font_t *font, | 
|  | 164                                     void *font_data HB_UNUSED, | 
|  | 165                                     hb_codepoint_t left_glyph, | 
|  | 166                                     hb_codepoint_t right_glyph, | 
|  | 167                                     void *user_data HB_UNUSED) | 
|  | 168 { | 
|  | 169   return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_
      glyph, right_glyph)); | 
|  | 170 } | 
| 136 | 171 | 
| 137 static hb_position_t | 172 static hb_position_t | 
| 138 hb_font_get_glyph_v_kerning_nil (hb_font_t *font, | 173 hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED, | 
| 139                                  void *font_data HB_UNUSED, | 174                                  void *font_data HB_UNUSED, | 
| 140                                  hb_codepoint_t top_glyph, | 175                                  hb_codepoint_t top_glyph, | 
| 141                                  hb_codepoint_t bottom_glyph, | 176                                  hb_codepoint_t bottom_glyph, | 
| 142                                  void *user_data HB_UNUSED) | 177                                  void *user_data HB_UNUSED) | 
| 143 { | 178 { | 
| 144   if (font->parent) |  | 
| 145     return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top
      _glyph, bottom_glyph)); |  | 
| 146 |  | 
| 147   return 0; | 179   return 0; | 
| 148 } | 180 } | 
|  | 181 static hb_position_t | 
|  | 182 hb_font_get_glyph_v_kerning_parent (hb_font_t *font, | 
|  | 183                                     void *font_data HB_UNUSED, | 
|  | 184                                     hb_codepoint_t top_glyph, | 
|  | 185                                     hb_codepoint_t bottom_glyph, | 
|  | 186                                     void *user_data HB_UNUSED) | 
|  | 187 { | 
|  | 188   return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_g
      lyph, bottom_glyph)); | 
|  | 189 } | 
| 149 | 190 | 
| 150 static hb_bool_t | 191 static hb_bool_t | 
| 151 hb_font_get_glyph_extents_nil (hb_font_t *font, | 192 hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, | 
| 152                                void *font_data HB_UNUSED, | 193                                void *font_data HB_UNUSED, | 
| 153                                hb_codepoint_t glyph, | 194                                hb_codepoint_t glyph, | 
| 154                                hb_glyph_extents_t *extents, | 195                                hb_glyph_extents_t *extents, | 
| 155                                void *user_data HB_UNUSED) | 196                                void *user_data HB_UNUSED) | 
| 156 { | 197 { | 
| 157   if (font->parent) { |  | 
| 158     hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents); |  | 
| 159     if (ret) { |  | 
| 160       font->parent_scale_position (&extents->x_bearing, &extents->y_bearing); |  | 
| 161       font->parent_scale_distance (&extents->width, &extents->height); |  | 
| 162     } |  | 
| 163     return ret; |  | 
| 164   } |  | 
| 165 |  | 
| 166   memset (extents, 0, sizeof (*extents)); | 198   memset (extents, 0, sizeof (*extents)); | 
| 167   return false; | 199   return false; | 
| 168 } | 200 } | 
|  | 201 static hb_bool_t | 
|  | 202 hb_font_get_glyph_extents_parent (hb_font_t *font, | 
|  | 203                                   void *font_data HB_UNUSED, | 
|  | 204                                   hb_codepoint_t glyph, | 
|  | 205                                   hb_glyph_extents_t *extents, | 
|  | 206                                   void *user_data HB_UNUSED) | 
|  | 207 { | 
|  | 208   hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents); | 
|  | 209   if (ret) { | 
|  | 210     font->parent_scale_position (&extents->x_bearing, &extents->y_bearing); | 
|  | 211     font->parent_scale_distance (&extents->width, &extents->height); | 
|  | 212   } | 
|  | 213   return ret; | 
|  | 214 } | 
| 169 | 215 | 
| 170 static hb_bool_t | 216 static hb_bool_t | 
| 171 hb_font_get_glyph_contour_point_nil (hb_font_t *font, | 217 hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED, | 
| 172                                      void *font_data HB_UNUSED, | 218                                      void *font_data HB_UNUSED, | 
| 173                                      hb_codepoint_t glyph, | 219                                      hb_codepoint_t glyph, | 
| 174                                      unsigned int point_index, | 220                                      unsigned int point_index, | 
| 175                                      hb_position_t *x, | 221                                      hb_position_t *x, | 
| 176                                      hb_position_t *y, | 222                                      hb_position_t *y, | 
| 177                                      void *user_data HB_UNUSED) | 223                                      void *user_data HB_UNUSED) | 
| 178 { | 224 { | 
| 179   if (font->parent) { |  | 
| 180     hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x
      , y); |  | 
| 181     if (ret) |  | 
| 182       font->parent_scale_position (x, y); |  | 
| 183     return ret; |  | 
| 184   } |  | 
| 185 |  | 
| 186   *x = *y = 0; | 225   *x = *y = 0; | 
| 187   return false; | 226   return false; | 
| 188 } | 227 } | 
|  | 228 static hb_bool_t | 
|  | 229 hb_font_get_glyph_contour_point_parent (hb_font_t *font, | 
|  | 230                                         void *font_data HB_UNUSED, | 
|  | 231                                         hb_codepoint_t glyph, | 
|  | 232                                         unsigned int point_index, | 
|  | 233                                         hb_position_t *x, | 
|  | 234                                         hb_position_t *y, | 
|  | 235                                         void *user_data HB_UNUSED) | 
|  | 236 { | 
|  | 237   hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, 
      y); | 
|  | 238   if (ret) | 
|  | 239     font->parent_scale_position (x, y); | 
|  | 240   return ret; | 
|  | 241 } | 
| 189 | 242 | 
| 190 static hb_bool_t | 243 static hb_bool_t | 
| 191 hb_font_get_glyph_name_nil (hb_font_t *font, | 244 hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED, | 
| 192                             void *font_data HB_UNUSED, | 245                             void *font_data HB_UNUSED, | 
| 193                             hb_codepoint_t glyph, | 246                             hb_codepoint_t glyph, | 
| 194                             char *name, unsigned int size, | 247                             char *name, unsigned int size, | 
| 195                             void *user_data HB_UNUSED) | 248                             void *user_data HB_UNUSED) | 
| 196 { | 249 { | 
| 197   if (font->parent) |  | 
| 198     return font->parent->get_glyph_name (glyph, name, size); |  | 
| 199 |  | 
| 200   if (size) *name = '\0'; | 250   if (size) *name = '\0'; | 
| 201   return false; | 251   return false; | 
| 202 } | 252 } | 
|  | 253 static hb_bool_t | 
|  | 254 hb_font_get_glyph_name_parent (hb_font_t *font, | 
|  | 255                                void *font_data HB_UNUSED, | 
|  | 256                                hb_codepoint_t glyph, | 
|  | 257                                char *name, unsigned int size, | 
|  | 258                                void *user_data HB_UNUSED) | 
|  | 259 { | 
|  | 260   return font->parent->get_glyph_name (glyph, name, size); | 
|  | 261 } | 
| 203 | 262 | 
| 204 static hb_bool_t | 263 static hb_bool_t | 
| 205 hb_font_get_glyph_from_name_nil (hb_font_t *font, | 264 hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED, | 
| 206                                  void *font_data HB_UNUSED, | 265                                  void *font_data HB_UNUSED, | 
| 207                                  const char *name, int len, /* -1 means nul-term
      inated */ | 266                                  const char *name, int len, /* -1 means nul-term
      inated */ | 
| 208                                  hb_codepoint_t *glyph, | 267                                  hb_codepoint_t *glyph, | 
| 209                                  void *user_data HB_UNUSED) | 268                                  void *user_data HB_UNUSED) | 
| 210 { | 269 { | 
| 211   if (font->parent) |  | 
| 212     return font->parent->get_glyph_from_name (name, len, glyph); |  | 
| 213 |  | 
| 214   *glyph = 0; | 270   *glyph = 0; | 
| 215   return false; | 271   return false; | 
| 216 } | 272 } | 
|  | 273 static hb_bool_t | 
|  | 274 hb_font_get_glyph_from_name_parent (hb_font_t *font, | 
|  | 275                                     void *font_data HB_UNUSED, | 
|  | 276                                     const char *name, int len, /* -1 means nul-t
      erminated */ | 
|  | 277                                     hb_codepoint_t *glyph, | 
|  | 278                                     void *user_data HB_UNUSED) | 
|  | 279 { | 
|  | 280   return font->parent->get_glyph_from_name (name, len, glyph); | 
|  | 281 } | 
| 217 | 282 | 
| 218 | 283 | 
| 219 static const hb_font_funcs_t _hb_font_funcs_nil = { | 284 static const hb_font_funcs_t _hb_font_funcs_nil = { | 
| 220   HB_OBJECT_HEADER_STATIC, | 285   HB_OBJECT_HEADER_STATIC, | 
| 221 | 286 | 
| 222   true, /* immutable */ | 287   true, /* immutable */ | 
| 223 | 288 | 
| 224   { | 289   { | 
| 225 #define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil, | 290 #define HB_FONT_FUNC_IMPLEMENT(name) NULL, | 
| 226     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS | 291     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS | 
| 227 #undef HB_FONT_FUNC_IMPLEMENT | 292 #undef HB_FONT_FUNC_IMPLEMENT | 
|  | 293   }, | 
|  | 294   { | 
|  | 295 #define HB_FONT_FUNC_IMPLEMENT(name) NULL, | 
|  | 296     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS | 
|  | 297 #undef HB_FONT_FUNC_IMPLEMENT | 
|  | 298   }, | 
|  | 299   { | 
|  | 300     { | 
|  | 301 #define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil, | 
|  | 302       HB_FONT_FUNCS_IMPLEMENT_CALLBACKS | 
|  | 303 #undef HB_FONT_FUNC_IMPLEMENT | 
|  | 304     } | 
|  | 305   } | 
|  | 306 }; | 
|  | 307 static const hb_font_funcs_t _hb_font_funcs_parent = { | 
|  | 308   HB_OBJECT_HEADER_STATIC, | 
|  | 309 | 
|  | 310   true, /* immutable */ | 
|  | 311 | 
|  | 312   { | 
|  | 313 #define HB_FONT_FUNC_IMPLEMENT(name) NULL, | 
|  | 314     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS | 
|  | 315 #undef HB_FONT_FUNC_IMPLEMENT | 
|  | 316   }, | 
|  | 317   { | 
|  | 318 #define HB_FONT_FUNC_IMPLEMENT(name) NULL, | 
|  | 319     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS | 
|  | 320 #undef HB_FONT_FUNC_IMPLEMENT | 
|  | 321   }, | 
|  | 322   { | 
|  | 323     { | 
|  | 324 #define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_parent, | 
|  | 325       HB_FONT_FUNCS_IMPLEMENT_CALLBACKS | 
|  | 326 #undef HB_FONT_FUNC_IMPLEMENT | 
|  | 327     } | 
| 228   } | 328   } | 
| 229 }; | 329 }; | 
| 230 | 330 | 
| 231 | 331 | 
| 232 /** | 332 /** | 
| 233  * hb_font_funcs_create: (Xconstructor) | 333  * hb_font_funcs_create: (Xconstructor) | 
| 234  * | 334  * | 
| 235  * | 335  * | 
| 236  * | 336  * | 
| 237  * Return value: (transfer full): | 337  * Return value: (transfer full): | 
| 238  * | 338  * | 
| 239  * Since: 0.9.2 | 339  * Since: 0.9.2 | 
| 240  **/ | 340  **/ | 
| 241 hb_font_funcs_t * | 341 hb_font_funcs_t * | 
| 242 hb_font_funcs_create (void) | 342 hb_font_funcs_create (void) | 
| 243 { | 343 { | 
| 244   hb_font_funcs_t *ffuncs; | 344   hb_font_funcs_t *ffuncs; | 
| 245 | 345 | 
| 246   if (!(ffuncs = hb_object_create<hb_font_funcs_t> ())) | 346   if (!(ffuncs = hb_object_create<hb_font_funcs_t> ())) | 
| 247     return hb_font_funcs_get_empty (); | 347     return hb_font_funcs_get_empty (); | 
| 248 | 348 | 
| 249   ffuncs->get = _hb_font_funcs_nil.get; | 349   ffuncs->get = _hb_font_funcs_parent.get; | 
| 250 | 350 | 
| 251   return ffuncs; | 351   return ffuncs; | 
| 252 } | 352 } | 
| 253 | 353 | 
| 254 /** | 354 /** | 
| 255  * hb_font_funcs_get_empty: | 355  * hb_font_funcs_get_empty: | 
| 256  * | 356  * | 
| 257  * | 357  * | 
| 258  * | 358  * | 
| 259  * Return value: (transfer full): | 359  * Return value: (transfer full): | 
| 260  * | 360  * | 
| 261  * Since: 0.9.2 | 361  * Since: 0.9.2 | 
| 262  **/ | 362  **/ | 
| 263 hb_font_funcs_t * | 363 hb_font_funcs_t * | 
| 264 hb_font_funcs_get_empty (void) | 364 hb_font_funcs_get_empty (void) | 
| 265 { | 365 { | 
| 266   return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil); | 366   return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_parent); | 
| 267 } | 367 } | 
| 268 | 368 | 
| 269 /** | 369 /** | 
| 270  * hb_font_funcs_reference: (skip) | 370  * hb_font_funcs_reference: (skip) | 
| 271  * @ffuncs: font functions. | 371  * @ffuncs: font functions. | 
| 272  * | 372  * | 
| 273  * | 373  * | 
| 274  * | 374  * | 
| 275  * Return value: | 375  * Return value: | 
| 276  * | 376  * | 
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 391   if (ffuncs->immutable) {                                               \ | 491   if (ffuncs->immutable) {                                               \ | 
| 392     if (destroy)                                                         \ | 492     if (destroy)                                                         \ | 
| 393       destroy (user_data);                                               \ | 493       destroy (user_data);                                               \ | 
| 394     return;                                                              \ | 494     return;                                                              \ | 
| 395   }                                                                      \ | 495   }                                                                      \ | 
| 396                                                                          \ | 496                                                                          \ | 
| 397   if (ffuncs->destroy.name)                                              \ | 497   if (ffuncs->destroy.name)                                              \ | 
| 398     ffuncs->destroy.name (ffuncs->user_data.name);                       \ | 498     ffuncs->destroy.name (ffuncs->user_data.name);                       \ | 
| 399                                                                          \ | 499                                                                          \ | 
| 400   if (func) {                                                            \ | 500   if (func) {                                                            \ | 
| 401     ffuncs->get.name = func;                                             \ | 501     ffuncs->get.f.name = func;                                           \ | 
| 402     ffuncs->user_data.name = user_data;                                  \ | 502     ffuncs->user_data.name = user_data;                                  \ | 
| 403     ffuncs->destroy.name = destroy;                                      \ | 503     ffuncs->destroy.name = destroy;                                      \ | 
| 404   } else {                                                               \ | 504   } else {                                                               \ | 
| 405     ffuncs->get.name = hb_font_get_##name##_nil;                         \ | 505     ffuncs->get.f.name = hb_font_get_##name##_parent;                    \ | 
| 406     ffuncs->user_data.name = NULL;                                       \ | 506     ffuncs->user_data.name = NULL;                                       \ | 
| 407     ffuncs->destroy.name = NULL;                                         \ | 507     ffuncs->destroy.name = NULL;                                         \ | 
| 408   }                                                                      \ | 508   }                                                                      \ | 
| 409 } | 509 } | 
| 410 | 510 | 
| 411 HB_FONT_FUNCS_IMPLEMENT_CALLBACKS | 511 HB_FONT_FUNCS_IMPLEMENT_CALLBACKS | 
| 412 #undef HB_FONT_FUNC_IMPLEMENT | 512 #undef HB_FONT_FUNC_IMPLEMENT | 
| 413 | 513 | 
|  | 514 bool | 
|  | 515 hb_font_t::has_func (unsigned int i) | 
|  | 516 { | 
|  | 517   if (parent && parent != hb_font_get_empty () && parent->has_func (i)) | 
|  | 518     return true; | 
|  | 519   return this->klass->get.array[i] != _hb_font_funcs_parent.get.array[i]; | 
|  | 520 } | 
| 414 | 521 | 
| 415 /* Public getters */ | 522 /* Public getters */ | 
| 416 | 523 | 
| 417 /** | 524 /** | 
| 418  * hb_font_get_glyph: | 525  * hb_font_get_glyph: | 
| 419  * @font: a font. | 526  * @font: a font. | 
| 420  * @unicode: | 527  * @unicode: | 
| 421  * @variation_selector: | 528  * @variation_selector: | 
| 422  * @glyph: (out): | 529  * @glyph: (out): | 
| 423  * | 530  * | 
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 851 hb_font_create (hb_face_t *face) | 958 hb_font_create (hb_face_t *face) | 
| 852 { | 959 { | 
| 853   hb_font_t *font; | 960   hb_font_t *font; | 
| 854 | 961 | 
| 855   if (unlikely (!face)) | 962   if (unlikely (!face)) | 
| 856     face = hb_face_get_empty (); | 963     face = hb_face_get_empty (); | 
| 857   if (!(font = hb_object_create<hb_font_t> ())) | 964   if (!(font = hb_object_create<hb_font_t> ())) | 
| 858     return hb_font_get_empty (); | 965     return hb_font_get_empty (); | 
| 859 | 966 | 
| 860   hb_face_make_immutable (face); | 967   hb_face_make_immutable (face); | 
|  | 968   font->parent = hb_font_get_empty (); | 
| 861   font->face = hb_face_reference (face); | 969   font->face = hb_face_reference (face); | 
| 862   font->klass = hb_font_funcs_get_empty (); | 970   font->klass = hb_font_funcs_get_empty (); | 
| 863 | 971 | 
| 864   font->x_scale = font->y_scale = hb_face_get_upem (face); | 972   font->x_scale = font->y_scale = hb_face_get_upem (face); | 
| 865 | 973 | 
| 866   return font; | 974   return font; | 
| 867 } | 975 } | 
| 868 | 976 | 
| 869 /** | 977 /** | 
| 870  * hb_font_create_sub_font: | 978  * hb_font_create_sub_font: | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 910 hb_font_get_empty (void) | 1018 hb_font_get_empty (void) | 
| 911 { | 1019 { | 
| 912   static const hb_font_t _hb_font_nil = { | 1020   static const hb_font_t _hb_font_nil = { | 
| 913     HB_OBJECT_HEADER_STATIC, | 1021     HB_OBJECT_HEADER_STATIC, | 
| 914 | 1022 | 
| 915     true, /* immutable */ | 1023     true, /* immutable */ | 
| 916 | 1024 | 
| 917     NULL, /* parent */ | 1025     NULL, /* parent */ | 
| 918     const_cast<hb_face_t *> (&_hb_face_nil), | 1026     const_cast<hb_face_t *> (&_hb_face_nil), | 
| 919 | 1027 | 
| 920     0, /* x_scale */ | 1028     1000, /* x_scale */ | 
| 921     0, /* y_scale */ | 1029     1000, /* y_scale */ | 
| 922 | 1030 | 
| 923     0, /* x_ppem */ | 1031     0, /* x_ppem */ | 
| 924     0, /* y_ppem */ | 1032     0, /* y_ppem */ | 
| 925 | 1033 | 
| 926     const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil), /* klass */ | 1034     const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil), /* klass */ | 
| 927     NULL, /* user_data */ | 1035     NULL, /* user_data */ | 
| 928     NULL, /* destroy */ | 1036     NULL, /* destroy */ | 
| 929 | 1037 | 
| 930     { | 1038     { | 
| 931 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID, | 1039 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID, | 
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1257  * Since: 0.9.2 | 1365  * Since: 0.9.2 | 
| 1258  **/ | 1366  **/ | 
| 1259 void | 1367 void | 
| 1260 hb_font_get_ppem (hb_font_t *font, | 1368 hb_font_get_ppem (hb_font_t *font, | 
| 1261                   unsigned int *x_ppem, | 1369                   unsigned int *x_ppem, | 
| 1262                   unsigned int *y_ppem) | 1370                   unsigned int *y_ppem) | 
| 1263 { | 1371 { | 
| 1264   if (x_ppem) *x_ppem = font->x_ppem; | 1372   if (x_ppem) *x_ppem = font->x_ppem; | 
| 1265   if (y_ppem) *y_ppem = font->y_ppem; | 1373   if (y_ppem) *y_ppem = font->y_ppem; | 
| 1266 } | 1374 } | 
| OLD | NEW | 
|---|