PangoGlyphString + PangoLayout?
- From: Mindaugas Jaunius <mindaugas jaunius gmail com>
- To: gtk-i18n-list gnome org
- Subject: PangoGlyphString + PangoLayout?
- Date: Thu, 1 Mar 2012 14:28:45 +0100
Hi,
To be able to fully control open type font features (liga, smcp, ssup)
I ended up using PangoOTBuffer not just PangoLayout. No the problem I
run into is that the output of PangoOTBuffer is PangoGlyphString. The
only function I found to show it is pango_cairo_show_glyph_string(cr,
font, glyphString), but this function shows the full PangoGlyphString
in one line and does not create a wraping paragraph on PangoLayout. No
is there a way to give my PangoGlyphString from PangoOTBuffer to
PangoLayout?
Below is some code of how I am using PangoOTBuffer now. Mainly I used
code from pango modules class basic-fc.c as an example. Any comments
and critiques on the code are welcomed.
const char foo[] = "ffi ff fl Wa VA";
static const PangoOTFeatureMap gsub_features[] =
{
{"ccmp", PANGO_OT_ALL_GLYPHS},
{"locl", PANGO_OT_ALL_GLYPHS},
{"liga", PANGO_OT_ALL_GLYPHS},
{"clig", PANGO_OT_ALL_GLYPHS}
};
static const PangoOTFeatureMap gpos_features[] =
{
{"kern", PANGO_OT_ALL_GLYPHS},
{"mark", PANGO_OT_ALL_GLYPHS},
{"mkmk", PANGO_OT_ALL_GLYPHS}
};
cairo_t *cr = cairo_create(surface);
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); // sets the background color to white
cairo_paint(cr);
PangoLayout *layout; // layout for a paragraph of text
layout = pango_cairo_create_layout(cr);
PangoFontDescription *descFont;
pango_layout_set_text(layout, foo, -1);
pango_layout_set_width(layout, width * PANGO_SCALE);
descFont = pango_font_description_from_string("Fedra Serif Pro A Book 20");
pango_layout_set_font_description(layout, descFont);
pango_font_description_free(descFont);
cairo_move_to(cr, 20, 40);
cairo_set_line_width(cr, 1.0); // sets the line width, default is 2.0
cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); // set the colour to black
pango_cairo_update_layout(cr, layout); // update layout
PangoLayoutIter *iter = NULL;
iter = pango_layout_get_iter(layout);
PangoLayoutRun *run = NULL;
run = pango_layout_iter_get_run_readonly(iter);
PangoFont *font = run->item->analysis.font; // get PangoFont of Fedra Serif
PangoFcFont *fc_font = PANGO_FC_FONT(font);
PangoOTBuffer *otBuffer;
otBuffer = pango_ot_buffer_new(fc_font);
glong n_chars = g_utf8_strlen(foo, strlen(foo));
PangoGlyphString *glyphs = pango_glyph_string_new();
const char *p = foo;
int cluster = 0;
int i;
FT_Face face;
PangoOTRulesetDescription desc;
const PangoOTRuleset *ruleset;
face = pango_fc_font_lock_face(fc_font);
if (!face) {
LOGE("Can not lock fc font face");
}
// add all glyphs to otBuffer
for (i = 0; i < n_chars; i++) {
gunichar wc;
PangoGlyph glyph;
wc = g_utf8_get_char(p);
if (g_unichar_type(wc) != G_UNICODE_NON_SPACING_MARK)
cluster = p - foo1;
if (pango_is_zero_width(wc))
glyph = PANGO_GLYPH_EMPTY;
else {
gunichar c = wc;
if (run->item->analysis.level % 2)
g_unichar_get_mirror_char(c, &c);
glyph = pango_fc_font_get_glyph(fc_font, c);
}
if (!glyph)
glyph = PANGO_GET_UNKNOWN_GLYPH(wc);
pango_ot_buffer_add_glyph(otBuffer, glyph, 0, cluster);
p = g_utf8_next_char(p);
}
// apply open type features
desc.script = run->item->analysis.script;
desc.language = run->item->analysis.language;
desc.n_static_gsub_features = G_N_ELEMENTS(gsub_features);
desc.static_gsub_features = gsub_features;
desc.n_static_gpos_features = G_N_ELEMENTS(gpos_features);
desc.static_gpos_features = gpos_features;
desc.n_other_features = 0;
desc.other_features = NULL;
ruleset = pango_ot_ruleset_get_for_description(pango_ot_info_get(face), &desc);
pango_ot_ruleset_substitute(ruleset, otBuffer);
pango_ot_ruleset_position(ruleset, otBuffer);
// output from otBuffer to PangoGlyphString
pango_ot_buffer_output(otBuffer, glyphs);
pango_cairo_show_glyph_string(cr, font, glyphs);
-mindaugas
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]