/** * pango_ot_ruleset_substitute: * @ruleset: a #PangoOTRuleset. * @buffer: a #PangoOTBuffer. * * Performs the OpenType GSUB substitution on @buffer using the features * in @ruleset * * Since: 1.4 **/ void pango_ot_ruleset_substitute (const PangoOTRuleset *ruleset, PangoOTBuffer *buffer) { unsigned int i; HB_GSUB gsub = 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_GSUB) continue; if (!gsub) { gsub = pango_ot_info_get_gsub (ruleset->info); if (gsub) HB_GSUB_Clear_Features (gsub); else return; } HB_GSUB_Add_Feature (gsub, rule->feature_index, rule->property_bit); } HB_GSUB_Apply_String (gsub, buffer->buffer); }
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()); } }