From: Kenichi Handa Date: Sun, 17 Feb 2008 02:05:08 +0000 (+0000) Subject: Include xterm.h. X-Git-Tag: emacs-pretest-23.0.90~7895 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=43c0454d44aba9617d5a1d82d327b7cbaed5fbdc;p=emacs.git Include xterm.h. [HAVE_NTGUI]: Include w32term.h. [MAC_OS]: Include macterm.ch. (font_otf_ValueRecord): Use make_number. (font_finish_cache): Fix handling of reference count. (font_clear_cache): Update num_fonts. (font_open_entity): Update smallest_char_width and smallest_font_height of the frame. (font_close_object): Update num_fonts. (Fclear_font_cache): Fix finding the target cache data. --- diff --git a/src/ChangeLog b/src/ChangeLog index f753ef11714..333dd802676 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,64 @@ +2008-02-17 Kenichi Handa + + * ftfont.c (ftfont_shape): Return Lispy number. + + * xfaces.c (prepare_face_for_display): Use display_info->font->fid + for GCs. + (Finternal_set_font_selection_order): Call font_update_sort_order + only when enable_font_backend is set. + (realize_x_face): Set face->font_info to that of default face only + when enable_font_backend is set. + + * xdisp.c (handle_composition_prop): Set it->c to the fist + characte of the composed region. + (fill_composite_glyph_string): Set base_face->font_info to + s->font_info. Get a face for ascii from base_face->ascii_face. + (BUILD_COMPOSITE_GLYPH_STRING): Call fill_composite_glyph_string + with a face already decided. + (x_produce_glyphs): Be sure to set it->ascent and it->descent to + non-negative. + (x_produce_glyphs): If the composition method is + ..._WITH_GLYPH_STRING, call font_prepare_composition + unconditionally. + + * xfns.c (x_make_gc): Use the default font id of the frame for + GCs. + + * xterm.h (struct x_display_info): New member font. + + * xterm.c (x_set_cursor_gc): Use display_info->font->fid for GCs. + (x_set_mouse_face_gc, x_new_font): Likewise. + (x_term_init): Setup display_info->font. + (x_delete_terminal): Free display_info->font. + + * xfont.c (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT. + + * ftxfont.c (ftxfont_default_fid): Delete it. + (ftxfont_open): Set xfont->fid to 0. + (ftxfont_end_for_frame): Clear data specifi to the frame and the + font-driver. + + * xftfont.c (xftfont_default_fid): Delete it. + (xftfont_open): Set xfont->fid to 0. + + * fontset.c (FONTSET_OBJLIST): New macro. + (fontset_find_font): Update font-object list of the fontset. + (free_realized_fontset): New function. + (free_face_fontset): Call free_realized_fontset. + (Ffont_info): Call font_close_object only when enable_font_backend + is set. + + * font.c [HAVE_X_WINDOWS]: Include xterm.h. + [HAVE_NTGUI]: Include w32term.h. + [MAC_OS]: Include macterm.ch. + (font_otf_ValueRecord): Use make_number. + (font_finish_cache): Fix handling of reference count. + (font_clear_cache): Update num_fonts. + (font_open_entity): Update smallest_char_width and + smallest_font_height of the frame. + (font_close_object): Update num_fonts. + (Fclear_font_cache): Fix finding the target cache data. + 2008-02-16 Glenn Morris * fontset.c (Finternal_char_font): Fix compilation warning. diff --git a/src/font.c b/src/font.c index 3dedaf56f58..70b239694c0 100644 --- a/src/font.c +++ b/src/font.c @@ -40,6 +40,18 @@ Boston, MA 02110-1301, USA. */ #include "fontset.h" #include "font.h" +#ifdef HAVE_X_WINDOWS +#include "xterm.h" +#endif /* HAVE_X_WINDOWS */ + +#ifdef HAVE_NTGUI +#include "w32term.h" +#endif /* HAVE_NTGUI */ + +#ifdef MAC_OS +#include "macterm.h" +#endif /* MAC_OS */ + #ifndef FONT_DEBUG #define FONT_DEBUG #endif @@ -1815,13 +1827,13 @@ font_otf_ValueRecord (value_format, value_record) Lisp_Object val = Fmake_vector (make_number (8), Qnil); if (value_format & OTF_XPlacement) - ASET (val, 0, value_record->XPlacement); + ASET (val, 0, make_number (value_record->XPlacement)); if (value_format & OTF_YPlacement) - ASET (val, 1, value_record->YPlacement); + ASET (val, 1, make_number (value_record->YPlacement)); if (value_format & OTF_XAdvance) - ASET (val, 2, value_record->XAdvance); + ASET (val, 2, make_number (value_record->XAdvance)); if (value_format & OTF_YAdvance) - ASET (val, 3, value_record->YAdvance); + ASET (val, 3, make_number (value_record->YAdvance)); if (value_format & OTF_XPlaDevice) ASET (val, 4, font_otf_DeviceTable (&value_record->XPlaDevice)); if (value_format & OTF_YPlaDevice) @@ -2197,6 +2209,7 @@ font_prepare_cache (f, driver) } } + static void font_finish_cache (f, driver) FRAME_PTR f; @@ -2211,17 +2224,15 @@ font_finish_cache (f, driver) cache = val, val = XCDR (val); xassert (! NILP (val)); tmp = XCDR (XCAR (val)); + XSETCAR (tmp, make_number (XINT (XCAR (tmp)) - 1)); if (XINT (XCAR (tmp)) == 0) { font_clear_cache (f, XCAR (val), driver); XSETCDR (cache, XCDR (val)); } - else - { - XSETCAR (tmp, make_number (XINT (XCAR (tmp)) - 1)); - } } + static Lisp_Object font_get_cache (f, driver) FRAME_PTR f; @@ -2238,6 +2249,8 @@ font_get_cache (f, driver) return val; } +static int num_fonts; + static void font_clear_cache (f, cache, driver) FRAME_PTR f; @@ -2273,6 +2286,7 @@ font_clear_cache (f, cache, driver) driver->close (f, font); p->pointer = NULL; p->integer = 0; + num_fonts--; } if (driver->free_entity) driver->free_entity (entity); @@ -2406,8 +2420,6 @@ font_matching_entity (frame, spec) return entity; } -static int num_fonts; - /* Open a font of ENTITY and PIXEL_SIZE on frame F, and return the opened font object. */ @@ -2419,7 +2431,7 @@ font_open_entity (f, entity, pixel_size) int pixel_size; { struct font_driver_list *driver_list; - Lisp_Object objlist, size, val; + Lisp_Object objlist, size, val, font_object; struct font *font; size = AREF (entity, FONT_SIZE_INDEX); @@ -2427,35 +2439,49 @@ font_open_entity (f, entity, pixel_size) if (XINT (size) != 0) pixel_size = XINT (size); + font_object = Qnil; for (objlist = AREF (entity, FONT_OBJLIST_INDEX); CONSP (objlist); objlist = XCDR (objlist)) { font = XSAVE_VALUE (XCAR (objlist))->pointer; if (font->pixel_size == pixel_size) { - XSAVE_VALUE (XCAR (objlist))->integer++; - return XCAR (objlist); + font_object = XCAR (objlist); + XSAVE_VALUE (font_object)->integer++; + break; } } - xassert (FONT_ENTITY_P (entity)); - val = AREF (entity, FONT_TYPE_INDEX); - for (driver_list = f->font_driver_list; - driver_list && ! EQ (driver_list->driver->type, val); - driver_list = driver_list->next); - if (! driver_list) - return Qnil; + if (NILP (font_object)) + { + val = AREF (entity, FONT_TYPE_INDEX); + for (driver_list = f->font_driver_list; + driver_list && ! EQ (driver_list->driver->type, val); + driver_list = driver_list->next); + if (! driver_list) + return Qnil; - font = driver_list->driver->open (f, entity, pixel_size); - if (! font) - return Qnil; - font->scalable = XINT (size) == 0; + font = driver_list->driver->open (f, entity, pixel_size); + if (! font) + return Qnil; + font->scalable = XINT (size) == 0; - val = make_save_value (font, 1); - ASET (entity, FONT_OBJLIST_INDEX, - Fcons (val, AREF (entity, FONT_OBJLIST_INDEX))); - num_fonts++; - return val; + font_object = make_save_value (font, 1); + ASET (entity, FONT_OBJLIST_INDEX, + Fcons (font_object, AREF (entity, FONT_OBJLIST_INDEX))); + num_fonts++; + } + + if (FRAME_SMALLEST_CHAR_WIDTH (f) > font->min_width) + FRAME_SMALLEST_CHAR_WIDTH (f) = font->min_width; + if (FRAME_SMALLEST_CHAR_WIDTH (f) <= 0) + FRAME_SMALLEST_CHAR_WIDTH (f) = 1; + if (FRAME_SMALLEST_FONT_HEIGHT (f) > font->font.height) + FRAME_SMALLEST_FONT_HEIGHT (f) = font->font.height; + if (FRAME_SMALLEST_FONT_HEIGHT (f) <= 0) + FRAME_SMALLEST_FONT_HEIGHT (f) = 1; + + return font_object; } @@ -2470,8 +2496,8 @@ font_close_object (f, font_object) Lisp_Object objlist; Lisp_Object tail, prev = Qnil; + xassert (XSAVE_VALUE (font_object)->integer > 0); XSAVE_VALUE (font_object)->integer--; - xassert (XSAVE_VALUE (font_object)->integer >= 0); if (XSAVE_VALUE (font_object)->integer > 0) return; @@ -2487,6 +2513,7 @@ font_close_object (f, font_object) ASET (font->entity, FONT_OBJLIST_INDEX, XCDR (objlist)); else XSETCDR (prev, XCDR (objlist)); + num_fonts--; return; } abort (); @@ -3364,8 +3391,10 @@ DEFUN ("clear-font-cache", Fclear_font_cache, Sclear_font_cache, 0, 0, 0, Lisp_Object val; val = XCDR (cache); - while (! EQ (XCAR (val), driver_list->driver->type)) + while (! NILP (val) + && ! EQ (XCAR (XCAR (val)), driver_list->driver->type)) val = XCDR (val); + xassert (! NILP (val)); val = XCDR (XCAR (val)); if (XINT (XCAR (val)) == 0) {