]> git.eshelyaron.com Git - emacs.git/commitdiff
Include xterm.h.
authorKenichi Handa <handa@m17n.org>
Sun, 17 Feb 2008 02:05:08 +0000 (02:05 +0000)
committerKenichi Handa <handa@m17n.org>
Sun, 17 Feb 2008 02:05:08 +0000 (02:05 +0000)
[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.

src/ChangeLog
src/font.c

index f753ef11714de4ce726b718cae025f2e512b5dd0..333dd802676c106716ffec2e906789ff8504ee7d 100644 (file)
@@ -1,3 +1,64 @@
+2008-02-17  Kenichi Handa  <handa@m17n.org>
+
+       * 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  <rgm@gnu.org>
 
        * fontset.c (Finternal_char_font): Fix compilation warning.
index 3dedaf56f58694841e43694fa6e34e1235a90b9d..70b239694c058a52254006c9fb7d846b94dfc9a0 100644 (file)
@@ -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)
              {