Mercurial > emacs
changeset 96343:5c8f2b7d28ae
* w32font.h (FONT_HANDLE, FONT_TEXTMETRIC): New macros.
* w32term.c (x_draw_glyph_string_foreground):
(x_draw_composite_glyph_string_foreground): Sync with xterm.c.
Use FONT_HANDLE macro.
(x_draw_glyph_string): Use FONT_TEXTMETRIC macro.
* w32uniscribe.c (uniscribe_otf_capability, uniscribe_shape):
(uniscribe_encode_char): Use FONT_HANDLE macro.
* w32font.c (Fx_select_font): Use FONT_HANDLE macro.
(w32font_text_extents): Use precast w32_font.
(w32font_close): Free cached metrics.
(w32font_open_internal): Allocate space for name on stack.
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Thu, 26 Jun 2008 22:11:25 +0000 |
parents | 307d2d89ee24 |
children | 6c2ff33de03a |
files | src/ChangeLog src/w32font.c src/w32font.h src/w32term.c src/w32uniscribe.c |
diffstat | 5 files changed, 63 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Thu Jun 26 21:37:42 2008 +0000 +++ b/src/ChangeLog Thu Jun 26 22:11:25 2008 +0000 @@ -1,3 +1,20 @@ +2008-06-26 Jason Rumney <jasonr@gnu.org> + + * w32font.h (FONT_HANDLE, FONT_TEXTMETRIC): New macros. + + * w32term.c (x_draw_glyph_string_foreground): + (x_draw_composite_glyph_string_foreground): Sync with xterm.c. + Use FONT_HANDLE macro. + (x_draw_glyph_string): Use FONT_TEXTMETRIC macro. + + * w32uniscribe.c (uniscribe_otf_capability, uniscribe_shape): + (uniscribe_encode_char): Use FONT_HANDLE macro. + + * w32font.c (Fx_select_font): Use FONT_HANDLE macro. + (w32font_text_extents): Use precast w32_font. + (w32font_close): Free cached metrics. + (w32font_open_internal): Allocate space for name on stack. + 2008-06-26 Chong Yidong <cyd@stupidchicken.com> * xdisp.c (extend_face_to_end_of_line): Fix last change.
--- a/src/w32font.c Thu Jun 26 21:37:42 2008 +0000 +++ b/src/w32font.c Thu Jun 26 22:11:25 2008 +0000 @@ -233,8 +233,23 @@ FRAME_PTR f; struct font *font; { + int i; struct w32font_info *w32_font = (struct w32font_info *) font; + + /* Delete the GDI font object. */ DeleteObject (w32_font->hfont); + + /* Free all the cached metrics. */ + if (w32_font->cached_metrics) + { + for (i = 0; i < w32_font->n_cache_blocks; i++) + { + if (w32_font->cached_metrics[i]) + xfree (w32_font->cached_metrics[i]); + } + xfree (w32_font->cached_metrics); + w32_font->cached_metrics = NULL; + } } /* w32 implementation of has_char for font backend. @@ -493,8 +508,7 @@ { metrics->width = total_width; metrics->lbearing = 0; - metrics->rbearing = total_width - + ((struct w32font_info *) font)->metrics.tmOverhang; + metrics->rbearing = total_width + w32_font->metrics.tmOverhang; } /* Restore state and release DC. */ @@ -831,15 +845,12 @@ /* We don't know how much space we need for the full name, so start with 96 bytes and go up in steps of 32. */ len = 96; - name = xmalloc (len); + name = alloca (len); while (name && w32font_full_name (&logfont, font_entity, pixel_size, name, len) < 0) { - char *new = xrealloc (name, len += 32); - - if (! new) - xfree (name); - name = new; + len += 32; + name = alloca (len); } if (name) font->props[FONT_FULLNAME_INDEX] @@ -2048,7 +2059,7 @@ /* Initialize as much of the font details as we can from the current default font. */ hdc = GetDC (FRAME_W32_WINDOW (f)); - oldobj = SelectObject (hdc, ((struct w32font_info *) FRAME_FONT (f))->hfont); + oldobj = SelectObject (hdc, FONT_HANDLE (FRAME_FONT (f))); GetTextFace (hdc, LF_FACESIZE, lf.lfFaceName); if (GetTextMetrics (hdc, &tm)) {
--- a/src/w32font.h Thu Jun 26 21:37:42 2008 +0000 +++ b/src/w32font.h Thu Jun 26 22:11:25 2008 +0000 @@ -56,6 +56,10 @@ HFONT hfont; }; +/* Macros for getting OS specific information from a font struct. */ +#define FONT_HANDLE(f) (((struct w32font_info *)(f))->hfont) +#define FONT_TEXTMETRIC(f) (((struct w32font_info *)(f))->metrics) + #define CACHE_BLOCKSIZE 128 Lisp_Object w32font_get_cache P_ ((FRAME_PTR fe));
--- a/src/w32term.c Thu Jun 26 21:37:42 2008 +0000 +++ b/src/w32term.c Thu Jun 26 22:11:25 2008 +0000 @@ -1237,8 +1237,6 @@ struct glyph_string *s; { int i, x; - struct w32font_info * w32_font; - HFONT old_font; /* If first glyph of S has a left box line, start drawing the text of S to the right of that box line. */ @@ -1248,21 +1246,10 @@ else x = s->x; - if (s->for_overlaps || (s->background_filled_p && s->hl != DRAW_CURSOR) - || cleartype_active) - SetBkMode (s->hdc, TRANSPARENT); - else - SetBkMode (s->hdc, OPAQUE); - SetTextColor (s->hdc, s->gc->foreground); SetBkColor (s->hdc, s->gc->background); SetTextAlign (s->hdc, TA_BASELINE | TA_LEFT); - w32_font = (struct w32font_info *) s->font; - - if (w32_font && w32_font->hfont) - old_font = SelectObject (s->hdc, w32_font->hfont); - /* Draw characters of S as rectangles if S's font could not be loaded. */ if (s->font_not_found_p) @@ -1278,24 +1265,27 @@ } else { - int boff = s->font->baseline_offset; + struct font *font = s->font; + int boff = font->baseline_offset; int y; - - if (s->font->vertical_centering) - boff = VCENTER_BASELINE_OFFSET (s->font, s->f) - boff; + HFONT old_font; + + old_font = SelectObject (s->hdc, FONT_HANDLE (font)); + + if (font->vertical_centering) + boff = VCENTER_BASELINE_OFFSET (font, s->f) - boff; y = s->ybase - boff; if (s->for_overlaps || (s->background_filled_p && s->hl != DRAW_CURSOR)) - s->font->driver->draw (s, 0, s->nchars, x, y, 0); + font->driver->draw (s, 0, s->nchars, x, y, 0); else - s->font->driver->draw (s, 0, s->nchars, x, y, 1); + font->driver->draw (s, 0, s->nchars, x, y, 1); if (s->face->overstrike) - s->font->driver->draw (s, 0, s->nchars, x + 1, y, 0); + font->driver->draw (s, 0, s->nchars, x + 1, y, 0); + + SelectObject (s->hdc, old_font); } - - if (w32_font && w32_font->hfont) - SelectObject (s->hdc, old_font); } /* Draw the foreground of composite glyph string S. */ @@ -1305,8 +1295,6 @@ struct glyph_string *s; { int i, j, x; - HFONT old_font; - struct w32font_info * w32_font; /* If first glyph of S has a left box line, start drawing the text of S to the right of that box line. */ @@ -1323,14 +1311,8 @@ SetTextColor (s->hdc, s->gc->foreground); SetBkColor (s->hdc, s->gc->background); - SetBkMode (s->hdc, TRANSPARENT); SetTextAlign (s->hdc, TA_BASELINE | TA_LEFT); - w32_font = (struct w32font_info *) s->font; - - if (w32_font && w32_font->hfont) - old_font = SelectObject (s->hdc, w32_font->hfont); - /* Draw a rectangle for the composition if the font for the very first character of the composition could not be loaded. */ if (s->font_not_found_p) @@ -1339,11 +1321,14 @@ w32_draw_rectangle (s->hdc, s->gc, x, s->y, s->width - 1, s->height - 1); } - + else { struct font *font = s->font; int y = s->ybase; int width = 0; + HFONT old_font; + + old_font = SelectObject (s->hdc, FONT_HANDLE (font)); if (s->cmp->method == COMPOSITION_WITH_GLYPH_STRING) { @@ -1393,10 +1378,8 @@ font->driver->draw (s, j, j + 1, xx + 1, yy, 0); } } + SelectObject (s->hdc, old_font); } - - if (w32_font && w32_font->hfont) - SelectObject (s->hdc, old_font); } @@ -2345,7 +2328,7 @@ /* Draw strike-through. */ if (s->face->strike_through_p - && !((struct w32font_info *) s->font)->metrics.tmStruckOut) + && !FONT_TEXTMETRIC(s->font).tmStruckOut) { unsigned long h = 1; unsigned long dy = (s->height - h) / 2;
--- a/src/w32uniscribe.c Thu Jun 26 21:37:42 2008 +0000 +++ b/src/w32uniscribe.c Thu Jun 26 22:11:25 2008 +0000 @@ -166,7 +166,7 @@ f = XFRAME (selected_frame); context = get_frame_dc (f); - old_font = SelectObject (context, ((struct w32font_info *) font)->hfont); + old_font = SelectObject (context, FONT_HANDLE(font)); features = otf_features (context, "GSUB"); XSETCAR (capability, features); @@ -259,7 +259,7 @@ f = XFRAME (selected_frame); context = get_frame_dc (f); - old_font = SelectObject (context, uniscribe_font->w32_font.hfont); + old_font = SelectObject (context, FONT_HANDLE(font)); glyphs = alloca (max_glyphs * sizeof (WORD)); clusters = alloca (nchars * sizeof (WORD)); @@ -424,7 +424,7 @@ /* Use selected frame until API is updated to pass the frame. */ f = XFRAME (selected_frame); context = get_frame_dc (f); - old_font = SelectObject (context, ((struct w32font_info *) font)->hfont); + old_font = SelectObject (context, FONT_HANDLE(font)); retval = GetGlyphIndicesW (context, chars, 1, indices, GGI_MARK_NONEXISTING_GLYPHS);