[ot] Hook up cmap table to hb_ot_font_funcs()
This commit is contained in:
parent
c8a4745299
commit
3608a6847e
|
@ -193,14 +193,18 @@ struct cmap
|
||||||
{
|
{
|
||||||
static const hb_tag_t tableTag = HB_OT_TAG_cmap;
|
static const hb_tag_t tableTag = HB_OT_TAG_cmap;
|
||||||
|
|
||||||
inline unsigned int find_subtable (unsigned int platform_id,
|
inline const CmapSubtable *find_subtable (unsigned int platform_id,
|
||||||
unsigned int encoding_id) const
|
unsigned int encoding_id) const
|
||||||
{
|
{
|
||||||
EncodingRecord key;
|
EncodingRecord key;
|
||||||
key.platformID.set (platform_id);
|
key.platformID.set (platform_id);
|
||||||
key.encodingID.set (encoding_id);
|
key.encodingID.set (encoding_id);
|
||||||
|
|
||||||
return encodingRecord.search (key);
|
int result = encodingRecord.search (key);
|
||||||
|
if (result == -1)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return &(this+encodingRecord[result].subtable);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) {
|
inline bool sanitize (hb_sanitize_context_t *c) {
|
||||||
|
|
|
@ -42,6 +42,9 @@ struct hb_ot_font_t
|
||||||
unsigned int num_hmetrics;
|
unsigned int num_hmetrics;
|
||||||
const OT::hmtx *hmtx;
|
const OT::hmtx *hmtx;
|
||||||
hb_blob_t *hmtx_blob;
|
hb_blob_t *hmtx_blob;
|
||||||
|
|
||||||
|
const OT::CmapSubtable *cmap;
|
||||||
|
hb_blob_t *cmap_blob;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,15 +72,25 @@ _hb_ot_font_create (hb_font_t *font)
|
||||||
free (ot_font);
|
free (ot_font);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ot_font->hmtx = OT::Sanitizer<OT::hmtx>::lock_instance (ot_font->hmtx_blob);
|
ot_font->hmtx = OT::Sanitizer<OT::hmtx>::lock_instance (ot_font->hmtx_blob);
|
||||||
|
|
||||||
|
ot_font->cmap_blob = OT::Sanitizer<OT::cmap>::sanitize (font->face->reference_table (HB_OT_TAG_cmap));
|
||||||
|
const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (ot_font->cmap_blob);
|
||||||
|
const OT::CmapSubtable *subtable = NULL;
|
||||||
|
|
||||||
|
if (!subtable) subtable = cmap->find_subtable (0, 3);
|
||||||
|
if (!subtable) subtable = cmap->find_subtable (3, 1);
|
||||||
|
if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
|
||||||
|
|
||||||
|
ot_font->cmap = subtable;
|
||||||
|
|
||||||
return ot_font;
|
return ot_font;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_hb_ot_font_destroy (hb_ot_font_t *ot_font)
|
_hb_ot_font_destroy (hb_ot_font_t *ot_font)
|
||||||
{
|
{
|
||||||
|
hb_blob_destroy (ot_font->cmap_blob);
|
||||||
hb_blob_destroy (ot_font->hmtx_blob);
|
hb_blob_destroy (ot_font->hmtx_blob);
|
||||||
|
|
||||||
free (ot_font);
|
free (ot_font);
|
||||||
|
@ -93,24 +106,16 @@ hb_ot_get_glyph (hb_font_t *font HB_UNUSED,
|
||||||
void *user_data HB_UNUSED)
|
void *user_data HB_UNUSED)
|
||||||
|
|
||||||
{
|
{
|
||||||
#if 0
|
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
|
||||||
FT_Face ft_face = (FT_Face) font_data;
|
|
||||||
|
|
||||||
#ifdef HAVE_FT_FACE_GETCHARVARIANTINDEX
|
if (unlikely (variation_selector))
|
||||||
if (unlikely (variation_selector)) {
|
return false;
|
||||||
*glyph = FT_Face_GetCharVariantIndex (ft_face, unicode, variation_selector);
|
|
||||||
return *glyph != 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
*glyph = FT_Get_Char_Index (ft_face, unicode);
|
return ot_font->cmap->get_glyph (unicode, glyph);
|
||||||
return *glyph != 0;
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static hb_position_t
|
static hb_position_t
|
||||||
hb_ot_get_glyph_h_advance (hb_font_t *font,
|
hb_ot_get_glyph_h_advance (hb_font_t *font HB_UNUSED,
|
||||||
void *font_data,
|
void *font_data,
|
||||||
hb_codepoint_t glyph,
|
hb_codepoint_t glyph,
|
||||||
void *user_data HB_UNUSED)
|
void *user_data HB_UNUSED)
|
||||||
|
|
Loading…
Reference in New Issue