diff options
author | Tor Lillqvist <tml@novell.com> | 2008-02-24 22:04:56 +0000 |
---|---|---|
committer | Tor Lillqvist <tml@src.gnome.org> | 2008-02-24 22:04:56 +0000 |
commit | 086da399d3c16f0c9b75ae2c60e4afcb286bb052 (patch) | |
tree | e3323630c7f4756578fb15e4982a7f9dfc170799 /pango/pangowin32.c | |
parent | f7c14feedebe9dbea552a49d998dfeb56f1f797f (diff) | |
download | pango-086da399d3c16f0c9b75ae2c60e4afcb286bb052.tar.gz |
Bug 515484: Pango on Windows is missing Type 1 font support Patch from
2008-02-24 Tor Lillqvist <tml@novell.com>
Bug 515484: Pango on Windows is missing Type 1
font support
Patch from Adrian Johnson.
* pango/pangowin32-private.h (PangoWin32Face): Add has_cmap field
that tells whether the font has a cmap or not. A Type 1 font
doesn't.
* pango/pangowin32.c (pango_win32_font_get_type1_glyph_index): New
static function. Uses GetGlyphIndicesW() to get the glyph indices
for Type 1 fonts. Possibly also TrueType fonts that for some
reason lack the cmap formats we understand.
(pango_win32_font_calc_type1_coverage): New static function. Uses
GetFontUnicodeRanges() to get the coverage for Type 1 fonts, and
possibly TrueType fonts that lack the cmap formats we understand.
(pango_win32_font_get_glyph_index): Set has_cmap to false if the
font doesn't have a cmap. Call
pango_win32_font_get_type1_glyph_index() in that case.
(pango_win32_font_calc_coverage): Set has_cmap to false if the
font doesn't have a cmap. Call
pango_win32_font_calc_type1_coverage() in that case.
* pango/pangowin32-fontmap.c (pango_win32_enum_proc): Accept also
Type 1 fonts.
(pango_win32_insert_font): Initialise has_cmap tentativaly to True.
svn path=/trunk/; revision=2573
Diffstat (limited to 'pango/pangowin32.c')
-rw-r--r-- | pango/pangowin32.c | 93 |
1 files changed, 81 insertions, 12 deletions
diff --git a/pango/pangowin32.c b/pango/pangowin32.c index c7c27503..d3759fb7 100644 --- a/pango/pangowin32.c +++ b/pango/pangowin32.c @@ -1463,6 +1463,26 @@ font_get_cmap (PangoFont *font) return cmap; } +static gint +pango_win32_font_get_type1_glyph_index (PangoFont *font, + gunichar wc) +{ + wchar_t unicode[2]; + WORD glyph_index; + gint32 res; + + unicode[0] = wc; + unicode[1] = 0; + pango_win32_font_select_font (font, _pango_win32_hdc); + res = GetGlyphIndicesW (_pango_win32_hdc, unicode, 1, &glyph_index, 0); + pango_win32_font_done_font (font); + + if (res == 1) + return glyph_index; + else + return 0; +} + /** * pango_win32_font_get_glyph_index: * @font: a #PangoFont. @@ -1481,11 +1501,16 @@ pango_win32_font_get_glyph_index (PangoFont *font, gpointer cmap; guint16 glyph; - /* Do GetFontData magic on font->hfont here. */ - cmap = font_get_cmap (font); + if (win32font->win32face->has_cmap) + { + /* Do GetFontData magic on font->hfont here. */ + cmap = font_get_cmap (font); + if (cmap == NULL) + win32font->win32face->has_cmap = FALSE; + } - if (cmap == NULL) - return 0; + if (!win32font->win32face->has_cmap) + return pango_win32_font_get_type1_glyph_index (font, wc); if (win32font->win32face->cmap_format == 4) { @@ -1636,6 +1661,44 @@ font_has_name_in (PangoFont *font, } static void +pango_win32_font_calc_type1_coverage (PangoFont *font, + PangoCoverage *coverage, + PangoLanguage *lang) +{ + GLYPHSET *glyph_set; + gint32 res; + guint32 ch; + guint32 i; + + pango_win32_font_select_font (font, _pango_win32_hdc); + res = GetFontUnicodeRanges(_pango_win32_hdc, NULL); + if (res == 0) + goto fail1; + + glyph_set = g_malloc (res); + res = GetFontUnicodeRanges(_pango_win32_hdc, glyph_set); + if (res == 0) + goto fail2; + + for (i = 0; i < glyph_set->cRanges; i++) + { + guint32 end = glyph_set->ranges[i].wcLow + glyph_set->ranges[i].cGlyphs; + + for (ch = glyph_set->ranges[i].wcLow; ch < end; ch++) + if (CH_IS_UNIHAN_BMP (ch)) + pango_coverage_set (coverage, ch, PANGO_COVERAGE_APPROXIMATE); + else + pango_coverage_set (coverage, ch, PANGO_COVERAGE_EXACT); + } + + fail2: + g_free (glyph_set); + + fail1: + pango_win32_font_done_font (font); +} + +static void pango_win32_font_calc_coverage (PangoFont *font, PangoCoverage *coverage, PangoLanguage *lang) @@ -1651,6 +1714,20 @@ pango_win32_font_calc_coverage (PangoFont *font, pango_font_description_to_string (pango_font_describe (font)), pango_language_to_string (lang))); + if (win32font->win32face->has_cmap) + { + /* Do GetFontData magic on font->hfont here. */ + cmap = font_get_cmap (font); + if (cmap == NULL) + win32font->win32face->has_cmap = FALSE; + } + + if (!win32font->win32face->has_cmap) + { + pango_win32_font_calc_type1_coverage (font, coverage, lang); + return; + } + cjkv = pango_win32_coverage_language_classify (lang); if (cjkv != PANGO_WIN32_COVERAGE_UNSPEC && !font_has_name_in (font, cjkv)) @@ -1659,14 +1736,6 @@ pango_win32_font_calc_coverage (PangoFont *font, hide_unihan = TRUE; } - /* Do GetFontData magic on font->hfont here. */ - cmap = font_get_cmap (font); - if (cmap == NULL) - { - PING(("no table")); - return; - } - PING (("coverage:")); if (win32font->win32face->cmap_format == 4) { |