improvement of font selection with PangoCoverage
Submitted by Behdad Esfahbod
Link to original bug (#334392)
Description
Copying from gtk-i18n-list:
Date: Mon, 13 Mar 2006 02:38:41 -0500 From: Kenichi Handa handa@m17n.org To: gtk-i18n-list@gnome.org Subject: improvement of font selection
Hi,
I'd like to suggest the attached patch to pango/pango-context.c.
Pango's shaper engine (struct _PangoEngineShapeClass) can have a callback function "covers", but it seems that it is not utilized that much. In the function get_shaper_and_font_foreach(), the return value of (PangoCoverageLevel) _pango_engine_shape_covers() is simply checked against PANGO_COVERAGE_NONE, and if any other value is returned, that font is accepted.
I think it is better to try another font if PANGO_COVERAGE_FALLBACK or PANGO_COVERAGE_APPROXIMATE is returned here until PANGO_COVERAGE_EXACT is returned.
That way, pango can use a font most preferred by a shaper engine while falling back to APPROXIMATE or FALLBACK font.
What do you think?
If the patch is accepted, the next step will be to modify each shape engine to supply proper "covers" function if the default "covers" function is not enough. For instance, indic shaper should accept only proper OTFs.
Kenichi Handa handa@m17n.org
*** pango-context.c 04 Apr 2005 14:07:57 +0900 1.74 --- pango-context.c 22 Jul 2005 16:59:41 +0900
*** 867,872 **** --- 867,873 ---- GSList *engines; PangoEngineShape *shape_engine; PangoFont *font;
- PangoCoverageLevel level; } GetShaperFontInfo;
static gboolean
*** 884,894 ****
level = _pango_engine_shape_covers (engine, font,
info->lang, info->wc);
! if (level != PANGO_COVERAGE_NONE) { info->shape_engine = engine; info->font = g_object_ref (font); ! return TRUE; } }
--- 885,899 ----
level = _pango_engine_shape_covers (engine, font,
info->lang, info->wc);
! if (level > info->level) { info->shape_engine = engine;
-
if (info->font)
-
g_object_unref (info->font); info->font = g_object_ref (font);
! info->level = level; ! if (level == PANGO_COVERAGE_EXACT) ! return TRUE; } }
*** 926,931 **** --- 931,937 ---- info.wc = wc; info.shape_engine = NULL; info.font = NULL;
-
info.level = PANGO_COVERAGE_NONE;
info.engines = state->exact_engines; if (state->enable_fallback)