summaryrefslogtreecommitdiff
path: root/pango/pangowin32.c
diff options
context:
space:
mode:
authorTor Lillqvist <tml@novell.com>2008-02-24 22:04:56 +0000
committerTor Lillqvist <tml@src.gnome.org>2008-02-24 22:04:56 +0000
commit086da399d3c16f0c9b75ae2c60e4afcb286bb052 (patch)
treee3323630c7f4756578fb15e4982a7f9dfc170799 /pango/pangowin32.c
parentf7c14feedebe9dbea552a49d998dfeb56f1f797f (diff)
downloadpango-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.c93
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)
{