Ejemplo n.º 1
0
/**
 * 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);
}
Ejemplo n.º 2
0
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());
    }
}