extents->width = extents->height = 0;
}
-static hb_codepoint_t
+static hb_bool_t
hb_font_get_glyph_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t unicode,
hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
void *user_data HB_UNUSED)
{
if (font->parent)
- return hb_font_get_glyph (font->parent, unicode, variation_selector);
+ return hb_font_get_glyph (font->parent, unicode, variation_selector, glyph);
- return 0;
+ *glyph = 0;
+ return FALSE;
}
static void
font->klass->user_data.glyph_extents);
}
-hb_codepoint_t
+hb_bool_t
hb_font_get_glyph (hb_font_t *font,
- hb_codepoint_t unicode, hb_codepoint_t variation_selector)
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph)
{
return font->klass->get.glyph (font, font->user_data,
- unicode, variation_selector,
+ unicode, variation_selector, glyph,
font->klass->user_data.glyph);
}
hb_codepoint_t glyph,
hb_glyph_extents_t *extents,
void *user_data);
-typedef hb_codepoint_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
- hb_codepoint_t unicode, hb_codepoint_t variation_selector,
- void *user_data);
+typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data);
typedef void (*hb_font_get_kerning_func_t) (hb_font_t *font, void *font_data,
hb_codepoint_t left_glyph, hb_codepoint_t right_glyph,
hb_position_t *x_kern, hb_position_t *y_kern,
hb_codepoint_t glyph,
hb_glyph_extents_t *extents);
-hb_codepoint_t
+hb_bool_t
hb_font_get_glyph (hb_font_t *font,
- hb_codepoint_t unicode, hb_codepoint_t variation_selector);
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph);
void
hb_font_get_kerning (hb_font_t *font,
}
}
-static hb_codepoint_t
+static hb_bool_t
hb_ft_get_glyph (hb_font_t *font HB_UNUSED,
void *font_data,
hb_codepoint_t unicode,
hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
void *user_data HB_UNUSED)
{
#ifdef HAVE_FT_FACE_GETCHARVARIANTINDEX
if (unlikely (variation_selector)) {
- hb_codepoint_t glyph = FT_Face_GetCharVariantIndex (ft_face, unicode, variation_selector);
- if (glyph)
- return glyph;
+ *glyph = FT_Face_GetCharVariantIndex (ft_face, unicode, variation_selector);
+ if (*glyph)
+ return TRUE;
}
#endif
- return FT_Get_Char_Index (ft_face, unicode);
+ *glyph = FT_Get_Char_Index (ft_face, unicode);
+ return *glyph != 0;
}
static void
if (unlikely (!buffer->len))
return;
+ hb_codepoint_t glyph;
buffer->clear_output ();
unsigned int count = buffer->len - 1;
for (buffer->i = 0; buffer->i < count;) {
if (unlikely (is_variation_selector (buffer->info[buffer->i + 1].codepoint))) {
- buffer->replace_glyph (hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, buffer->info[buffer->i + 1].codepoint));
+ hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, buffer->info[buffer->i + 1].codepoint, &glyph);
+ buffer->replace_glyph (glyph);
buffer->i++;
} else {
- buffer->replace_glyph (hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, 0));
+ hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, 0, &glyph);
+ buffer->replace_glyph (glyph);
}
}
- if (likely (buffer->i < buffer->len))
- buffer->replace_glyph (hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, 0));
+ if (likely (buffer->i < buffer->len)) {
+ hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, 0, &glyph);
+ buffer->replace_glyph (glyph);
+ }
buffer->swap ();
}
static void
_test_font_nil_funcs (hb_font_t *font)
{
+ hb_codepoint_t glyph;
hb_position_t x, y;
hb_glyph_extents_t extents;
g_assert_cmpint (extents.width, ==, 0);
g_assert_cmpint (extents.height, ==, 0);
- g_assert (0 == hb_font_get_glyph (font, 17, 2));
+ glyph = 3;
+ g_assert (!hb_font_get_glyph (font, 17, 2, &glyph));
+ g_assert_cmpint (glyph, ==, 0);
x = y = 13;
hb_font_get_kerning (font, 17, 19, &x, &y);
}
}
-static hb_codepoint_t
+static hb_bool_t
glyph_func (hb_font_t *font, void *font_data,
hb_codepoint_t unicode, hb_codepoint_t variant_selector,
+ hb_codepoint_t *glyph,
void *user_data)
{
switch (unicode) {
- case 'T': return 1;
- case 'e': return 2;
- case 's': return 3;
- default: return 0;
+ case 'T': *glyph = 1; return TRUE;
+ case 'e': *glyph = 2; return TRUE;
+ case 's': *glyph = 3; return TRUE;
}
+
+ return FALSE;
}
static void