static int substituteWithVerticalGlyphs(const SimpleFontData* fontData, uint16_t* glyphs, unsigned bufferLength) { HB_FaceRec_* hbFace = fontData->platformData().harfbuzzFace()->face(); if (!hbFace->gsub) { // if there is no GSUB table, treat it as not covered return 0Xffff; } HB_Buffer buffer; hb_buffer_new(&buffer); for (unsigned i = 0; i < bufferLength; ++i) hb_buffer_add_glyph(buffer, glyphs[i], 0, i); HB_UShort scriptIndex; HB_UShort featureIndex; HB_GSUB_Select_Script(hbFace->gsub, HB_MAKE_TAG('D', 'F', 'L', 'T'), &scriptIndex); HB_GSUB_Select_Feature(hbFace->gsub, HB_MAKE_TAG('v', 'e', 'r', 't'), scriptIndex, 0xffff, &featureIndex); HB_GSUB_Add_Feature(hbFace->gsub, featureIndex, 1); HB_GSUB_Select_Feature(hbFace->gsub, HB_MAKE_TAG('v', 'r', 't', '2'), scriptIndex, 0xffff, &featureIndex); HB_GSUB_Add_Feature(hbFace->gsub, featureIndex, 1); int error = HB_GSUB_Apply_String(hbFace->gsub, buffer); if (!error) { for (unsigned i = 0; i < bufferLength; ++i) glyphs[i] = static_cast<Glyph>(buffer->out_string[i].gindex); } return error; }
/** * pango_ot_buffer_new * @font: a #PangoFcFont * * Creates a new #PangoOTBuffer for the given OpenType font. * * Return value: the newly allocated #PangoOTBuffer, which should * be freed with pango_ot_buffer_destroy(). * * Since: 1.4 **/ PangoOTBuffer * pango_ot_buffer_new (PangoFcFont *font) { /* We lock the font here immediately for the silly reason * of getting the FT_Memory; otherwise we'd have to * add a new operation to PangoFcFontmap; callers will * probably already have the font locked, however, * so there is little performance penalty. */ PangoOTBuffer *buffer = g_slice_new (PangoOTBuffer); FT_Face face = pango_fc_font_lock_face (font); if (hb_buffer_new (face->memory, &buffer->buffer) != FT_Err_Ok) g_warning ("Allocation of HB_Buffer failed"); /* this doesn't happen */ buffer->font = g_object_ref (font); buffer->applied_gpos = FALSE; buffer->rtl = FALSE; buffer->zero_width_marks = FALSE; pango_fc_font_unlock_face (font); return buffer; }