Commit 54efdcd1 authored by Jason Rumney's avatar Jason Rumney
Browse files

(recompute_cached_metrics): Change font arg to w32font_info.

Compute options separately.
(w32font_open_internal): Set glyph_idx before caching metrics.
parent 34fd2d28
2008-03-03 Jason Rumney <jasonr@gnu.org> 2008-03-03 Jason Rumney <jasonr@gnu.org>
* w32font.c (recompute_cached_metrics): Change font arg to w32font_info.
Compute options separately.
(w32font_open_internal): Set glyph_idx before caching metrics.
* w32font.h (NTM_PS_OPENTYPE, NTM_TT_OPENTYPE, NTM_TYPE1): Define * w32font.h (NTM_PS_OPENTYPE, NTM_TT_OPENTYPE, NTM_TYPE1): Define
if system headers don't. if system headers don't.
(struct w32font_info): Enlarge ascii_metrics. Add glyph_idx. (struct w32font_info): Enlarge ascii_metrics. Add glyph_idx.
......
...@@ -80,7 +80,7 @@ static Lisp_Object lispy_antialias_type P_ ((BYTE type)); ...@@ -80,7 +80,7 @@ static Lisp_Object lispy_antialias_type P_ ((BYTE type));
static Lisp_Object font_supported_scripts P_ ((FONTSIGNATURE * sig)); static Lisp_Object font_supported_scripts P_ ((FONTSIGNATURE * sig));
static int w32font_full_name P_ ((LOGFONT * font, Lisp_Object font_obj, static int w32font_full_name P_ ((LOGFONT * font, Lisp_Object font_obj,
int pixel_size, char *name, int nbytes)); int pixel_size, char *name, int nbytes));
static void recompute_cached_metrics P_ ((HDC dc, struct font * font)); static void recompute_cached_metrics P_ ((HDC dc, struct w32font_info * font));
static Lisp_Object w32_registry P_ ((LONG w32_charset)); static Lisp_Object w32_registry P_ ((LONG w32_charset));
...@@ -324,7 +324,7 @@ w32font_encode_char (font, c) ...@@ -324,7 +324,7 @@ w32font_encode_char (font, c)
/* Mark this font as not supporting glyph indices. This can happen /* Mark this font as not supporting glyph indices. This can happen
on Windows9x, and maybe with non-Truetype fonts on NT etc. */ on Windows9x, and maybe with non-Truetype fonts on NT etc. */
w32_font->glyph_idx = 0; w32_font->glyph_idx = 0;
recompute_cached_metrics (dc, font); recompute_cached_metrics (dc, w32_font);
return c; return c;
} }
...@@ -426,7 +426,7 @@ w32font_text_extents (font, code, nglyphs, metrics) ...@@ -426,7 +426,7 @@ w32font_text_extents (font, code, nglyphs, metrics)
any problems should be caught when initialising the any problems should be caught when initialising the
metrics cache. */ metrics cache. */
w32_font->glyph_idx = 0; w32_font->glyph_idx = 0;
recompute_cached_metrics (dc, font); recompute_cached_metrics (dc, w32_font);
SelectObject (dc, old_font); SelectObject (dc, old_font);
release_frame_dc (f, dc); release_frame_dc (f, dc);
return 0; return 0;
...@@ -781,12 +781,12 @@ w32font_open_internal (f, font_entity, pixel_size, w32_font) ...@@ -781,12 +781,12 @@ w32font_open_internal (f, font_entity, pixel_size, w32_font)
GetTextMetrics (dc, &w32_font->metrics); GetTextMetrics (dc, &w32_font->metrics);
/* Cache ASCII metrics. */ /* Cache ASCII metrics. */
recompute_cached_metrics (dc, font); w32_font->glyph_idx = ETO_GLYPH_INDEX;
recompute_cached_metrics (dc, w32_font);
SelectObject (dc, old_font); SelectObject (dc, old_font);
release_frame_dc (f, dc); release_frame_dc (f, dc);
w32_font->glyph_idx = ETO_GLYPH_INDEX;
/* W32FontStruct - we should get rid of this, and use the w32font_info /* W32FontStruct - we should get rid of this, and use the w32font_info
struct for any W32 specific fields. font->font.font can then be hfont. */ struct for any W32 specific fields. font->font.font can then be hfont. */
font->font.font = xmalloc (sizeof (W32FontStruct)); font->font.font = xmalloc (sizeof (W32FontStruct));
...@@ -1702,14 +1702,13 @@ w32font_full_name (font, font_obj, pixel_size, name, nbytes) ...@@ -1702,14 +1702,13 @@ w32font_full_name (font, font_obj, pixel_size, name, nbytes)
static void static void
recompute_cached_metrics (dc, font) recompute_cached_metrics (dc, w32_font)
HDC dc; HDC dc;
struct font *font; struct w32font_info *w32_font;
{ {
GLYPHMETRICS gm; GLYPHMETRICS gm;
MAT2 transform; MAT2 transform;
int i; unsigned int i;
struct w32font_info *w32_font;
bzero (&transform, sizeof (transform)); bzero (&transform, sizeof (transform));
transform.eM11.value = 1; transform.eM11.value = 1;
...@@ -1718,10 +1717,12 @@ recompute_cached_metrics (dc, font) ...@@ -1718,10 +1717,12 @@ recompute_cached_metrics (dc, font)
for (i = 0; i < 128; i++) for (i = 0; i < 128; i++)
{ {
struct font_metrics* char_metric = &w32_font->ascii_metrics[i]; struct font_metrics* char_metric = &w32_font->ascii_metrics[i];
unsigned int options = GGO_METRICS;
if (w32_font->glyph_idx)
options |= GGO_GLYPH_INDEX;
if (GetGlyphOutlineW (dc, i + 32, GGO_METRICS if (GetGlyphOutlineW (dc, i, options, &gm, 0, NULL, &transform)
| w32_font->glyph_idx ? GGO_GLYPH_INDEX : 0, != GDI_ERROR)
&gm, 0, NULL, &transform) != GDI_ERROR)
{ {
char_metric->lbearing = -gm.gmptGlyphOrigin.x; char_metric->lbearing = -gm.gmptGlyphOrigin.x;
char_metric->rbearing = gm.gmBlackBoxX + gm.gmptGlyphOrigin.x; char_metric->rbearing = gm.gmBlackBoxX + gm.gmptGlyphOrigin.x;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment