Exemple #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);
}
Exemple #2
0
/**
 * pango_ot_ruleset_maybe_add_features:
 * @ruleset: a #PangoOTRuleset.
 * @table_type: the table type to add features to.
 * @features: array of feature name and property bits to add.
 * @n_features: number of feature records in @features array.
 *
 * This is a convenience function that
 * for each feature in the feature map array @features
 * converts the feature name to a #PangoOTTag feature tag using PANGO_OT_TAG_MAKE()
 * and calls pango_ot_ruleset_maybe_add_feature() on it.
 *
 * Return value: The number of features in @features that were found
 *               and added to @ruleset.
 *
 * Since: 1.18
 **/
guint
pango_ot_ruleset_maybe_add_features (PangoOTRuleset          *ruleset,
                                     PangoOTTableType         table_type,
                                     const PangoOTFeatureMap *features,
                                     guint                    n_features)
{
    guint i, n_found_features = 0;

    g_return_val_if_fail (PANGO_IS_OT_RULESET (ruleset), 0);
    g_return_val_if_fail (ruleset->info != NULL, 0);

    for (i = 0; i < n_features; i++)
    {
        PangoOTTag feature_tag = PANGO_OT_TAG_MAKE (features[i].feature_name[0],
                                 features[i].feature_name[1],
                                 features[i].feature_name[2],
                                 features[i].feature_name[3]);

        n_found_features += pango_ot_ruleset_maybe_add_feature (ruleset,
                            table_type,
                            feature_tag,
                            features[i].property_bit);
    }

    return n_found_features;
}
Exemple #3
0
/**
 * pango_ot_ruleset_maybe_add_feature:
 * @ruleset: a #PangoOTRuleset.
 * @table_type: the table type to add a feature to.
 * @feature_tag: the tag of the feature to add.
 * @property_bit: the property bit to use for this feature. Used to identify
 *                the glyphs that this feature should be applied to, or
 *                %PANGO_OT_ALL_GLYPHS if it should be applied to all glyphs.
 *
 * This is a convenience function that first tries to find the feature
 * using pango_ot_info_find_feature() and the ruleset script and language
 * passed to pango_ot_ruleset_new_for(),
 * and if the feature is found, adds it to the ruleset.
 *
 * If @ruleset was not created using pango_ot_ruleset_new_for(), this function
 * does nothing.
 *
 * Return value: %TRUE if the feature was found and added to ruleset,
 *               %FALSE otherwise.
 *
 * Since: 1.18
 **/
gboolean
pango_ot_ruleset_maybe_add_feature (PangoOTRuleset          *ruleset,
                                    PangoOTTableType         table_type,
                                    PangoOTTag               feature_tag,
                                    gulong                   property_bit)
{
    guint feature_index;

    g_return_val_if_fail (PANGO_IS_OT_RULESET (ruleset), FALSE);
    g_return_val_if_fail (ruleset->info != NULL, FALSE);

    pango_ot_info_find_feature (ruleset->info, table_type,
                                feature_tag,
                                ruleset->script_index[table_type],
                                ruleset->language_index[table_type],
                                &feature_index);

    if (feature_index != PANGO_OT_NO_FEATURE)
    {
        pango_ot_ruleset_add_feature (ruleset, table_type,
                                      feature_index, property_bit);
        return TRUE;
    }

    return FALSE;
}
Exemple #4
0
/**
 * pango_ot_ruleset_get_feature_count:
 * @ruleset: a #PangoOTRuleset.
 * @n_gsub_features: location to store number of GSUB features, or %NULL.
 * @n_gpos_features: location to store number of GPOS features, or %NULL.
 *
 * Gets the number of GSUB and GPOS features in the ruleset.
 *
 * Return value: Total number of features in the @ruleset.
 *
 * Since: 1.18
 **/
guint
pango_ot_ruleset_get_feature_count (const PangoOTRuleset   *ruleset,
                                    guint                  *n_gsub_features,
                                    guint                  *n_gpos_features)
{
    g_return_val_if_fail (PANGO_IS_OT_RULESET (ruleset), 0);

    if (n_gsub_features)
        *n_gsub_features = ruleset->n_features[PANGO_OT_TABLE_GSUB];

    if (n_gpos_features)
        *n_gpos_features = ruleset->n_features[PANGO_OT_TABLE_GPOS];

    return ruleset->n_features[PANGO_OT_TABLE_GSUB] + ruleset->n_features[PANGO_OT_TABLE_GPOS];
}
Exemple #5
0
/**
 * pango_ot_ruleset_add_feature:
 * @ruleset: a #PangoOTRuleset.
 * @table_type: the table type to add a feature to.
 * @feature_index: the index of the feature to add.
 * @property_bit: the property bit to use for this feature. Used to identify
 *                the glyphs that this feature should be applied to, or
 *                %PANGO_OT_ALL_GLYPHS if it should be applied to all glyphs.
 *
 * Adds a feature to the ruleset.
 **/
void
pango_ot_ruleset_add_feature (PangoOTRuleset   *ruleset,
			      PangoOTTableType  table_type,
			      guint             feature_index,
			      gulong            property_bit)
{
  PangoOTRule tmp_rule;

  g_return_if_fail (PANGO_IS_OT_RULESET (ruleset));
  g_return_if_fail (PANGO_IS_OT_INFO (ruleset->info));

  tmp_rule.table_type = table_type;
  tmp_rule.feature_index = feature_index;
  tmp_rule.property_bit = property_bit;

  g_array_append_val (ruleset->rules, tmp_rule);
}
Exemple #6
0
/**
 * pango_ot_ruleset_add_feature:
 * @ruleset: a #PangoOTRuleset.
 * @table_type: the table type to add a feature to.
 * @feature_index: the index of the feature to add.
 * @property_bit: the property bit to use for this feature. Used to identify
 *                the glyphs that this feature should be applied to, or
 *                %PANGO_OT_ALL_GLYPHS if it should be applied to all glyphs.
 *
 * Adds a feature to the ruleset.
 **/
void
pango_ot_ruleset_add_feature (PangoOTRuleset   *ruleset,
                              PangoOTTableType  table_type,
                              guint             feature_index,
                              gulong            property_bit)
{
    PangoOTRule tmp_rule;

    g_return_if_fail (PANGO_IS_OT_RULESET (ruleset));
    g_return_if_fail (ruleset->info != NULL);

    if (feature_index == PANGO_OT_NO_FEATURE)
        return;

    tmp_rule.table_type = table_type;
    tmp_rule.feature_index = feature_index;
    tmp_rule.property_bit = property_bit;

    g_array_append_val (ruleset->rules, tmp_rule);

    ruleset->n_features[table_type]++;
}
Exemple #7
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;
}