static void setupFontFeatures(const FontFeatureSettings* settings, HB_FaceRec_* hbFace) { if (!settings) return; if (hbFace->gsub) HB_GSUB_Clear_Features(hbFace->gsub); if (hbFace->gpos) HB_GPOS_Clear_Features(hbFace->gpos); HB_UShort scriptIndex = 0; HB_GSUB_Select_Script(hbFace->gsub, HB_MAKE_TAG('D', 'F', 'L', 'T'), &scriptIndex); size_t numFeatures = settings->size(); for (size_t i = 0; i < numFeatures; ++i) { if (!settings->at(i).value()) continue; HB_UShort featureIndex = 0; const UChar* tag = settings->at(i).tag().characters(); HB_UInt feature = HB_MAKE_TAG(tag[0], tag[1], tag[2], tag[3]); if (hbFace->gsub && HB_GSUB_Select_Feature(hbFace->gsub, feature, scriptIndex, 0xffff, &featureIndex) == HB_Err_Ok) HB_GSUB_Add_Feature(hbFace->gsub, featureIndex, settings->at(i).value()); else if (hbFace->gpos && HB_GPOS_Select_Feature(hbFace->gpos, feature, scriptIndex, 0xffff, &featureIndex) == HB_Err_Ok) HB_GPOS_Add_Feature(hbFace->gpos, featureIndex, settings->at(i).value()); } }
/** * pango_ot_ruleset_position: * @ruleset: a #PangoOTRuleset. * @buffer: a #PangoOTBuffer. * * Performs the OpenType GPOS positioning on @buffer using the features * in @ruleset * * Since: 1.4 **/ void pango_ot_ruleset_position (const PangoOTRuleset *ruleset, PangoOTBuffer *buffer) { unsigned int i; HB_GPOS gpos = NULL; g_return_if_fail (PANGO_IS_OT_RULESET (ruleset)); g_return_if_fail (ruleset->info != NULL); for (i = 0; i < ruleset->rules->len; i++) { PangoOTRule *rule = &g_array_index (ruleset->rules, PangoOTRule, i); if (rule->table_type != PANGO_OT_TABLE_GPOS) continue; if (!gpos) { gpos = pango_ot_info_get_gpos (ruleset->info); if (gpos) HB_GPOS_Clear_Features (gpos); else return; } HB_GPOS_Add_Feature (gpos, rule->feature_index, rule->property_bit); } if (HB_GPOS_Apply_String (ruleset->info->face, gpos, 0, buffer->buffer, FALSE /* enable device-dependant values */, buffer->rtl) == HB_Err_Ok) buffer->applied_gpos = TRUE; }