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 #define HB_SHAPER fallback
28 #include "hb-shaper-impl-private.hh"
29
30
31 /*
32 * shaper face data
33 */
34
35 struct hb_fallback_shaper_face_data_t {};
36
37 hb_fallback_shaper_face_data_t *
38 _hb_fallback_shaper_face_data_create (hb_face_t *face HB_UNUSED)
39 {
40 return (hb_fallback_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
41 }
42
43 void
44 _hb_fallback_shaper_face_data_destroy (hb_fallback_shaper_face_data_t *data HB_UNUSED)
45 {
46 }
47
48
49 /*
50 * shaper font data
108 */
109
110 hb_codepoint_t space;
111 bool has_space = (bool) font->get_nominal_glyph (' ', &space);
112
113 buffer->clear_positions ();
114
115 hb_direction_t direction = buffer->props.direction;
116 hb_unicode_funcs_t *unicode = buffer->unicode;
117 unsigned int count = buffer->len;
118 hb_glyph_info_t *info = buffer->info;
119 hb_glyph_position_t *pos = buffer->pos;
120 for (unsigned int i = 0; i < count; i++)
121 {
122 if (has_space && unicode->is_default_ignorable (info[i].codepoint)) {
123 info[i].codepoint = space;
124 pos[i].x_advance = 0;
125 pos[i].y_advance = 0;
126 continue;
127 }
128 font->get_nominal_glyph (info[i].codepoint, &info[i].codepoint);
129 font->get_glyph_advance_for_direction (info[i].codepoint,
130 direction,
131 &pos[i].x_advance,
132 &pos[i].y_advance);
133 font->subtract_glyph_origin_for_direction (info[i].codepoint,
134 direction,
135 &pos[i].x_offset,
136 &pos[i].y_offset);
137 }
138
139 if (HB_DIRECTION_IS_BACKWARD (direction))
140 hb_buffer_reverse (buffer);
141
142 return true;
143 }
|
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 #define HB_SHAPER fallback
28 #include "hb-shaper-impl-private.hh"
29
30
31 HB_SHAPER_DATA_ENSURE_DEFINE(fallback, face)
32 HB_SHAPER_DATA_ENSURE_DEFINE(fallback, font)
33
34
35 /*
36 * shaper face data
37 */
38
39 struct hb_fallback_shaper_face_data_t {};
40
41 hb_fallback_shaper_face_data_t *
42 _hb_fallback_shaper_face_data_create (hb_face_t *face HB_UNUSED)
43 {
44 return (hb_fallback_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
45 }
46
47 void
48 _hb_fallback_shaper_face_data_destroy (hb_fallback_shaper_face_data_t *data HB_UNUSED)
49 {
50 }
51
52
53 /*
54 * shaper font data
112 */
113
114 hb_codepoint_t space;
115 bool has_space = (bool) font->get_nominal_glyph (' ', &space);
116
117 buffer->clear_positions ();
118
119 hb_direction_t direction = buffer->props.direction;
120 hb_unicode_funcs_t *unicode = buffer->unicode;
121 unsigned int count = buffer->len;
122 hb_glyph_info_t *info = buffer->info;
123 hb_glyph_position_t *pos = buffer->pos;
124 for (unsigned int i = 0; i < count; i++)
125 {
126 if (has_space && unicode->is_default_ignorable (info[i].codepoint)) {
127 info[i].codepoint = space;
128 pos[i].x_advance = 0;
129 pos[i].y_advance = 0;
130 continue;
131 }
132 (void) font->get_nominal_glyph (info[i].codepoint, &info[i].codepoint);
133 font->get_glyph_advance_for_direction (info[i].codepoint,
134 direction,
135 &pos[i].x_advance,
136 &pos[i].y_advance);
137 font->subtract_glyph_origin_for_direction (info[i].codepoint,
138 direction,
139 &pos[i].x_offset,
140 &pos[i].y_offset);
141 }
142
143 if (HB_DIRECTION_IS_BACKWARD (direction))
144 hb_buffer_reverse (buffer);
145
146 buffer->safe_to_break_all ();
147
148 return true;
149 }
|