Upgrade to latest harfbuzz
[framework/uifw/harfbuzz.git] / src / hb-tt-font.cc
1 /*
2  * Copyright © 2011  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-font-private.hh" /* Shall be first since may include windows.h */
28
29 #include "hb-open-type-private.hh"
30
31 #include "hb-ot-hhea-table.hh"
32 #include "hb-ot-hmtx-table.hh"
33
34 #include "hb-blob.h"
35
36 #include <string.h>
37
38
39
40 #if 0
41 struct hb_tt_font_t
42 {
43   const struct hhea *hhea;
44   hb_blob_t *hhea_blob;
45 };
46
47
48 static hb_tt_font_t *
49 _hb_tt_font_create (hb_font_t *font)
50 {
51   /* TODO Remove this object altogether */
52   hb_tt_font_t *tt = (hb_tt_font_t *) calloc (1, sizeof (hb_tt_font_t));
53
54   tt->hhea_blob = Sanitizer<hhea>::sanitize (hb_face_reference_table (font->face, HB_OT_TAG_hhea));
55   tt->hhea = Sanitizer<hhea>::lock_instance (tt->hhea_blob);
56
57   return tt;
58 }
59
60 static void
61 _hb_tt_font_destroy (hb_tt_font_t *tt)
62 {
63   hb_blob_destroy (tt->hhea_blob);
64
65   free (tt);
66 }
67
68 static inline const hhea&
69 _get_hhea (hb_face_t *face)
70 {
71 //  return likely (face->tt && face->tt->hhea) ? *face->tt->hhea : Null(hhea);
72 }
73
74
75 /*
76  * hb_tt_font_funcs_t
77  */
78
79 static hb_bool_t
80 hb_font_get_glyph_nil (hb_font_t *font HB_UNUSED,
81                        void *font_data HB_UNUSED,
82                        hb_codepoint_t unicode,
83                        hb_codepoint_t variation_selector,
84                        hb_codepoint_t *glyph,
85                        void *user_data HB_UNUSED)
86 {
87   if (font->parent)
88     return hb_font_get_glyph (font->parent, unicode, variation_selector, glyph);
89
90   *glyph = 0;
91   return false;
92 }
93
94 static hb_position_t
95 hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED,
96                                  void *font_data HB_UNUSED,
97                                  hb_codepoint_t glyph,
98                                  void *user_data HB_UNUSED)
99 {
100   if (font->parent)
101     return font->parent_scale_x_distance (hb_font_get_glyph_h_advance (font->parent, glyph));
102
103   return font->x_scale;
104 }
105
106 static hb_position_t
107 hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED,
108                                  void *font_data HB_UNUSED,
109                                  hb_codepoint_t glyph,
110                                  void *user_data HB_UNUSED)
111 {
112   if (font->parent)
113     return font->parent_scale_y_distance (hb_font_get_glyph_v_advance (font->parent, glyph));
114
115   return font->y_scale;
116 }
117
118 static hb_bool_t
119 hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
120                                 void *font_data HB_UNUSED,
121                                 hb_codepoint_t glyph,
122                                 hb_position_t *x,
123                                 hb_position_t *y,
124                                 void *user_data HB_UNUSED)
125 {
126   if (font->parent) {
127     hb_bool_t ret = hb_font_get_glyph_h_origin (font->parent,
128                                                 glyph,
129                                                 x, y);
130     if (ret)
131       font->parent_scale_position (x, y);
132     return ret;
133   }
134
135   *x = *y = 0;
136   return false;
137 }
138
139 static hb_bool_t
140 hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
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   if (font->parent) {
148     hb_bool_t ret = hb_font_get_glyph_v_origin (font->parent,
149                                                 glyph,
150                                                 x, y);
151     if (ret)
152       font->parent_scale_position (x, y);
153     return ret;
154   }
155
156   *x = *y = 0;
157   return false;
158 }
159
160 static hb_position_t
161 hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
162                                  void *font_data HB_UNUSED,
163                                  hb_codepoint_t left_glyph,
164                                  hb_codepoint_t right_glyph,
165                                  void *user_data HB_UNUSED)
166 {
167   if (font->parent)
168     return font->parent_scale_x_distance (hb_font_get_glyph_h_kerning (font->parent, left_glyph, right_glyph));
169
170   return 0;
171 }
172
173 static hb_position_t
174 hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
175                                  void *font_data HB_UNUSED,
176                                  hb_codepoint_t top_glyph,
177                                  hb_codepoint_t bottom_glyph,
178                                  void *user_data HB_UNUSED)
179 {
180   if (font->parent)
181     return font->parent_scale_y_distance (hb_font_get_glyph_v_kerning (font->parent, top_glyph, bottom_glyph));
182
183   return 0;
184 }
185
186 static hb_bool_t
187 hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
188                                void *font_data HB_UNUSED,
189                                hb_codepoint_t glyph,
190                                hb_glyph_extents_t *extents,
191                                void *user_data HB_UNUSED)
192 {
193   if (font->parent) {
194     hb_bool_t ret = hb_font_get_glyph_extents (font->parent,
195                                                glyph,
196                                                extents);
197     if (ret) {
198       font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
199       font->parent_scale_distance (&extents->width, &extents->height);
200     }
201     return ret;
202   }
203
204   memset (extents, 0, sizeof (*extents));
205   return false;
206 }
207
208 static hb_bool_t
209 hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
210                                      void *font_data HB_UNUSED,
211                                      hb_codepoint_t glyph,
212                                      unsigned int point_index,
213                                      hb_position_t *x,
214                                      hb_position_t *y,
215                                      void *user_data HB_UNUSED)
216 {
217   if (font->parent) {
218     hb_bool_t ret = hb_font_get_glyph_contour_point (font->parent,
219                                                      glyph, point_index,
220                                                      x, y);
221     if (ret)
222       font->parent_scale_position (x, y);
223     return ret;
224   }
225
226   *x = *y = 0;
227   return false;
228 }
229
230
231 static hb_font_funcs_t _hb_font_funcs_nil = {
232   HB_OBJECT_HEADER_STATIC,
233
234   true, /* immutable */
235
236   {
237 #define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil,
238     HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
239 #undef HB_FONT_FUNC_IMPLEMENT
240   }
241 };
242 #endif
243