diff options
-rw-r--r-- | ChangeLog | 28 | ||||
-rw-r--r-- | pango/pangowin32-fontmap.c | 7 | ||||
-rw-r--r-- | pango/pangowin32-private.h | 1 | ||||
-rw-r--r-- | pango/pangowin32.c | 93 |
4 files changed, 116 insertions, 13 deletions
@@ -1,3 +1,31 @@ +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. + 2008-02-21 Kristian Rietveld <kris@imendio.com> * modules/basic/basic-atsui.c (basic_engine_shape): free the diff --git a/pango/pangowin32-fontmap.c b/pango/pangowin32-fontmap.c index da13443d..2216786e 100644 --- a/pango/pangowin32-fontmap.c +++ b/pango/pangowin32-fontmap.c @@ -57,6 +57,10 @@ struct _PangoWin32SizeInfo # define NTM_PS_OPENTYPE 0x20000 #endif +#if !defined(NTM_TYPE1) +# define NTM_TYPE1 0x100000 +#endif + #define PANGO_WIN32_TYPE_FAMILY (pango_win32_family_get_type ()) #define PANGO_WIN32_FAMILY(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_WIN32_TYPE_FAMILY, PangoWin32Family)) #define PANGO_WIN32_IS_FAMILY(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_WIN32_TYPE_FAMILY)) @@ -196,7 +200,7 @@ pango_win32_enum_proc (LOGFONTW *lfp, if (fontType == TRUETYPE_FONTTYPE || (_pango_win32_os_version_info.dwMajorVersion >= 5 && - (metrics->ntmFlags & NTM_PS_OPENTYPE))) + ((metrics->ntmFlags & NTM_PS_OPENTYPE) || (metrics->ntmFlags & NTM_TYPE1)))) { lf = *lfp; @@ -1098,6 +1102,7 @@ pango_win32_insert_font (PangoWin32FontMap *win32fontmap, win32face->is_synthetic = is_synthetic; + win32face->has_cmap = TRUE; win32face->cmap_format = 0; win32face->cmap = NULL; diff --git a/pango/pangowin32-private.h b/pango/pangowin32-private.h index 0450e5dc..5f603667 100644 --- a/pango/pangowin32-private.h +++ b/pango/pangowin32-private.h @@ -165,6 +165,7 @@ struct _PangoWin32Face char *face_name; gboolean is_synthetic; + gboolean has_cmap; guint16 cmap_format; gpointer cmap; 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) { |