示例#1
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());
    }
}
示例#2
0
/**
 * 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;
}