PangoGlyphString + PangoLayout?



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]