]> git.eshelyaron.com Git - emacs.git/commitdiff
* font.h (struct font_entity) [HAVE_NS]: New field to record
authorDmitry Antipov <dmantipov@yandex.ru>
Thu, 12 Dec 2013 14:26:06 +0000 (18:26 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Thu, 12 Dec 2013 14:26:06 +0000 (18:26 +0400)
font driver which was used to create this entity.
(struct font) [HAVE_WINDOW_SYSTEM]: New field to record
frame where the font was opened.
(font_close_object): Add prototype.
* font.c (font_make_entity) [HAVE_NS]: Zero out driver field.
(font_close_object): Not static any more.  Lost frame arg.
Adjust comment and users.
* alloc.c (cleanup_vector): Call font_close_object to adjust
per-frame font counters correctly.  If HAVE_NS, also call
driver-specific cleanup for font-entity objects.
* ftfont.c (ftfont_open):
* nsfont.m (nsfont_open):
* w32font.c (w32font_open_internal):
* xfont.c (xfont_open):
* xftfont.c (xftfont_open): Save frame pointer in font object.
* macfont.m (macfont_open): Likewise.
(macfont_descriptor_entity): Save driver pointer to be able
to call its free_entity routine when font-entity is swept.
* ftxfont.c (ftxfont_open): Add eassert because frame
pointer should be saved by ftfont_driver.open.

src/ChangeLog
src/alloc.c
src/font.c
src/font.h
src/ftfont.c
src/ftxfont.c
src/macfont.m
src/nsfont.m
src/w32font.c
src/xfont.c
src/xftfont.c

index 336755993903e084facfcf28ac57d28209828395..e0f9b9e868957d0ca7faf04d967bb23a8727ee5c 100644 (file)
@@ -1,3 +1,27 @@
+2013-12-12  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       * font.h (struct font_entity) [HAVE_NS]: New field to record
+       font driver which was used to create this entity.
+       (struct font) [HAVE_WINDOW_SYSTEM]: New field to record
+       frame where the font was opened.
+       (font_close_object): Add prototype.
+       * font.c (font_make_entity) [HAVE_NS]: Zero out driver field.
+       (font_close_object): Not static any more.  Lost frame arg.
+       Adjust comment and users.
+       * alloc.c (cleanup_vector): Call font_close_object to adjust
+       per-frame font counters correctly.  If HAVE_NS, also call
+       driver-specific cleanup for font-entity objects.
+       * ftfont.c (ftfont_open):
+       * nsfont.m (nsfont_open):
+       * w32font.c (w32font_open_internal):
+       * xfont.c (xfont_open):
+       * xftfont.c (xftfont_open): Save frame pointer in font object.
+       * macfont.m (macfont_open): Likewise.
+       (macfont_descriptor_entity): Save driver pointer to be able
+       to call its free_entity routine when font-entity is swept.
+       * ftxfont.c (ftxfont_open): Add eassert because frame
+       pointer should be saved by ftfont_driver.open.
+
 2013-12-12  Dmitry Antipov  <dmantipov@yandex.ru>
 
        * xterm.c (x_make_frame_visible): Restore hack which is needed when
index aeda42637cde8ee5688d55fbe7c0da89191d21d6..022d1e5dcbb8dd8467b8d7f1609982e0ab1ea30d 100644 (file)
@@ -2874,10 +2874,22 @@ vector_nbytes (struct Lisp_Vector *v)
 static void
 cleanup_vector (struct Lisp_Vector *vector)
 {
-  if (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_FONT)
-      && ((vector->header.size & PSEUDOVECTOR_SIZE_MASK)
-         == FONT_OBJECT_MAX))
-    ((struct font *) vector)->driver->close ((struct font *) vector);
+  if (PSEUDOVECTOR_TYPEP (&vector->header, PVEC_FONT))
+    {
+      ptrdiff_t size = vector->header.size & PSEUDOVECTOR_SIZE_MASK;
+      Lisp_Object obj = make_lisp_ptr (vector, Lisp_Vectorlike);
+
+      if (size == FONT_OBJECT_MAX)
+       font_close_object (obj);
+#ifdef HAVE_NS
+      else if (size == FONT_ENTITY_MAX)
+       {
+         struct font_entity *entity = (struct font_entity *) vector;
+         if (entity->driver && entity->driver->free_entity)
+           entity->driver->free_entity (obj);
+       }
+#endif /* HAVE_NS */
+    }
 }
 
 /* Reclaim space used by unmarked vectors.  */
index fb56b3d3fb3a37a3ce60f805f47a1160de9c53d0..d0a10332028cf0b92ee96080795dcc48b70b0aed 100644 (file)
@@ -173,6 +173,9 @@ font_make_entity (void)
        allocate_pseudovector (VECSIZE (struct font_entity),
                              FONT_ENTITY_MAX, PVEC_FONT));
   XSETFONT (font_entity, entity);
+#ifdef HAVE_NS
+  entity->driver = NULL;
+#endif
   return font_entity;
 }
 
@@ -2881,10 +2884,10 @@ font_open_entity (struct frame *f, Lisp_Object entity, int pixel_size)
 }
 
 
-/* Close FONT_OBJECT that is opened on frame F.  */
+/* Close FONT_OBJECT.  */
 
-static void
-font_close_object (struct frame *f, Lisp_Object font_object)
+void
+font_close_object (Lisp_Object font_object)
 {
   struct font *font = XFONT_OBJECT (font_object);
 
@@ -2894,8 +2897,9 @@ font_close_object (struct frame *f, Lisp_Object font_object)
   FONT_ADD_LOG ("close", font_object, Qnil);
   font->driver->close (font);
 #ifdef HAVE_WINDOW_SYSTEM
-  eassert (FRAME_DISPLAY_INFO (f)->n_fonts);
-  FRAME_DISPLAY_INFO (f)->n_fonts--;
+  eassert (font->frame);
+  eassert (FRAME_DISPLAY_INFO (font->frame)->n_fonts);
+  FRAME_DISPLAY_INFO (font->frame)->n_fonts--;
 #endif
 }
 
@@ -4548,11 +4552,11 @@ DEFUN ("open-font", Fopen_font, Sopen_font, 1, 3, 0,
 }
 
 DEFUN ("close-font", Fclose_font, Sclose_font, 1, 2, 0,
-       doc: /* Close FONT-OBJECT.  */)
+       doc: /* Close FONT-OBJECT.  Optional FRAME is unused.  */)
   (Lisp_Object font_object, Lisp_Object frame)
 {
   CHECK_FONT_OBJECT (font_object);
-  font_close_object (decode_live_frame (frame), font_object);
+  font_close_object (font_object);
   return Qnil;
 }
 
@@ -4887,7 +4891,7 @@ If the named font is not yet loaded, return nil.  */)
   /* As font_object is still in FONT_OBJLIST of the entity, we can't
      close it now.  Perhaps, we should manage font-objects
      by `reference-count'.  */
-  font_close_object (f, font_object);
+  font_close_object (font_object);
 #endif
   return info;
 }
index 539ebeba52a395167b245aaad884e22909a25365..7781816860a6aa5d83c8be0c81fd8356eda9733e 100644 (file)
@@ -265,6 +265,9 @@ struct font_entity
 {
   struct vectorlike_header header;
   Lisp_Object props[FONT_ENTITY_MAX];
+#ifdef HAVE_NS
+  struct font_driver *driver;
+#endif
 };
 
 /* A value which may appear in the member `encoding' of struct font
@@ -316,6 +319,9 @@ struct font
 
 #if defined (HAVE_WINDOW_SYSTEM)
 
+  /* The frame where the font was opened.  */
+  struct frame *frame;
+
   /* Vertical pixel width of the underline.  If is zero if that
      information is not in the font.  */
   int underline_thickness;
@@ -735,6 +741,7 @@ extern Lisp_Object merge_font_spec (Lisp_Object, Lisp_Object);
 
 extern Lisp_Object font_make_entity (void);
 extern Lisp_Object font_make_object (int, Lisp_Object, int);
+extern void font_close_object (Lisp_Object);
 
 extern Lisp_Object find_font_encoding (Lisp_Object);
 extern int font_registry_charsets (Lisp_Object, struct charset **,
index 6a2303ab4a7c788be71fc67875487c23b2aecd12..36780454257ba50837fb6907b0bc4d493ea810a7 100644 (file)
@@ -1236,6 +1236,7 @@ ftfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
   ASET (font_object, FONT_FILE_INDEX, filename);
   ASET (font_object, FONT_FORMAT_INDEX, ftfont_font_format (NULL, filename));
   font = XFONT_OBJECT (font_object);
+  font->frame = f;
   ftfont_info = (struct ftfont_info *) font;
   ftfont_info->ft_size = ft_face->size;
   ftfont_info->index = XINT (idx);
index d1aa3e404037c9d5602054a5e22a60d38794913c..b44905d88cdaa99337a01844e176267526e6ddbe 100644 (file)
@@ -255,6 +255,7 @@ ftxfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
   if (NILP (font_object))
     return Qnil;
   font = XFONT_OBJECT (font_object);
+  eassert (font->frame == f);
   font->driver = &ftxfont_driver;
   return font_object;
 }
index 10623eb12fea4772ce766f4e7a7bba9103d418d4..66833cd1b8073cc1ca075e9b80e4ab00354a278c 100644 (file)
@@ -882,6 +882,7 @@ macfont_descriptor_entity (FontDescriptorRef desc, Lisp_Object extra,
   CFStringRef name;
 
   entity = font_make_entity ();
+  XFONT_ENTITY (entity)->driver = &macfont_driver;
 
   ASET (entity, FONT_TYPE_INDEX, macfont_driver.type);
   ASET (entity, FONT_REGISTRY_INDEX, Qiso10646_1);
@@ -2491,6 +2492,7 @@ macfont_open (struct frame * f, Lisp_Object entity, int pixel_size)
     ASET (font_object, FONT_FULLNAME_INDEX,
          AREF (font_object, FONT_NAME_INDEX));
   font = XFONT_OBJECT (font_object);
+  font->frame = f;
   font->pixel_size = size;
   font->driver = &macfont_driver;
   font->encoding_charset = font->repertory_charset = -1;
index 0f546408316d8908b48c66628c247100f647107b..a794c9eed4121e39450a183c3c046af61912c162 100644 (file)
@@ -805,6 +805,7 @@ nsfont_open (struct frame *f, Lisp_Object font_entity, int pixel_size)
       return Qnil; /* FIXME: other terms do, but return Qnil causes segfault */
     }
 
+  font->frame = f;
   font_info->glyphs = xzalloc (0x100 * sizeof *font_info->glyphs);
   font_info->metrics = xzalloc (0x100 * sizeof *font_info->metrics);
 
index 654e0d9cae40c0fdfff40975f7feae7d6a88b3c5..204692749697d6ab9cc99a600262d9dbcd827a83 100644 (file)
@@ -999,6 +999,7 @@ w32font_open_internal (struct frame *f, Lisp_Object font_entity,
        = DECODE_SYSTEM (build_string (logfont.lfFaceName));
   }
 
+  font->frame = f;
   font->max_width = w32_font->metrics.tmMaxCharWidth;
   /* Parts of Emacs display assume that height = ascent + descent...
      so height is defined later, after ascent and descent.
index d4d6ee7c10fe1dd10079a5615dd6432a9d7694f8..83ef604d5cd782a2fd609abd9228ba76cd3441a2 100644 (file)
@@ -806,6 +806,7 @@ xfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
   ASET (font_object, FONT_FILE_INDEX, Qnil);
   ASET (font_object, FONT_FORMAT_INDEX, Qx);
   font = XFONT_OBJECT (font_object);
+  font->frame = f;
   ((struct xfont_info *) font)->xfont = xfont;
   ((struct xfont_info *) font)->display = FRAME_X_DISPLAY (f);
   font->pixel_size = pixel_size;
index 37b33b3ead8cf9d39a7f97b25617a5a9b513f60c..6423f8e19b3081cf3f8063b91e3734bf836df767 100644 (file)
@@ -365,6 +365,7 @@ xftfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
   ASET (font_object, FONT_FORMAT_INDEX,
        ftfont_font_format (xftfont->pattern, filename));
   font = XFONT_OBJECT (font_object);
+  font->frame = f;
   font->pixel_size = size;
   font->driver = &xftfont_driver;
   font->encoding_charset = font->repertory_charset = -1;