Re: PangoGlyphString + PangoLayout?
- From: Behdad Esfahbod <behdad behdad org>
- To: Mindaugas Jaunius <mindaugas jaunius gmail com>
- Cc: gtk-i18n-list gnome org
- Subject: Re: PangoGlyphString + PangoLayout?
- Date: Tue, 06 Mar 2012 02:14:32 -0500
You have a better luck just copying basic-fc.c and modifying it, and either
installing your module on the system or register it using pango_module_register().
behdad
On 03/01/2012 08:28 AM, Mindaugas Jaunius wrote:
> 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
> _______________________________________________
> gtk-i18n-list mailing list
> gtk-i18n-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtk-i18n-list
>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]