]> git.eshelyaron.com Git - emacs.git/commitdiff
Correctly cache images when frames vary in their font metrics
authorPo Lu <luangruo@yahoo.com>
Thu, 20 Jun 2024 09:03:36 +0000 (17:03 +0800)
committerEshel Yaron <me@eshelyaron.com>
Fri, 21 Jun 2024 19:00:49 +0000 (21:00 +0200)
* src/alloc.c (mark_frame): Mark this frame's image cache, if it
exist.
(mark_terminals): Cease marking T->image_cache.

* src/androidfns.c (unwind_create_frame, Fx_create_frame)
(android_create_tip_frame):

* src/haikufns.c (unwind_create_frame, haiku_create_frame)
(haiku_create_tip_frame):

* src/nsfns.m (unwind_create_frame):

* src/pgtkfns.c (unwind_create_frame, Fx_create_frame)
(x_create_tip_frame):

* src/xfns.c (unwind_create_frame, Fx_create_frame)
(x_create_tip_frame):

* src/w32fns.c (unwind_create_frame, Fx_create_frame)
(w32_create_tip_frame): Remove adjustments of the frame image
cache's reference count rendered redundant by the assignment of
image caches to individual frames rather than terminals.

* src/dispextern.h (struct image_cache) <scaling_col_width>: New
field.

* src/frame.c (gui_set_font): In lieu of clearing F's image
cache unconditionally, establish whether the column width as
considered by compute_image_size has changed, and if so, adjust
or reassign the frame's image cache.
(make_frame): Clear F->image_cache.

* src/frame.h (struct frame) <image_cache>: New field.
(FRAME_IMAGE_CACHE): Return F->image_cache.

* src/image.c (make_image_cache): Clear C->scaling_col_width.
(cache_image): Adjust to new means of assigning image caches to
frames.

* src/termhooks.h (struct terminal) <image_cache>: Delete field.

* src/xfaces.c (init_frame_faces): Do image cache assignment
with all new frames.

(cherry picked from commit cebca072c33937b84995a62c35c16441d23bb86d)

13 files changed:
src/alloc.c
src/androidfns.c
src/dispextern.h
src/frame.c
src/frame.h
src/haikufns.c
src/image.c
src/nsfns.m
src/pgtkfns.c
src/termhooks.h
src/w32fns.c
src/xfaces.c
src/xfns.c

index 9304e4e42bb1705133fe6730852b254b2a539776..666f77bfce1b0458ad27f304f215dd93fb9504c3 100644 (file)
@@ -7055,6 +7055,13 @@ mark_frame (struct Lisp_Vector *ptr)
   for (tem = f->conversion.actions; tem; tem = tem->next)
     mark_object (tem->data);
 #endif
+
+#ifdef HAVE_WINDOW_SYSTEM
+  /* Mark this frame's image cache, though it might be common to several
+     frames with the same font size.  */
+  if (FRAME_IMAGE_CACHE (f))
+    mark_image_cache (FRAME_IMAGE_CACHE (f));
+#endif /* HAVE_WINDOW_SYSTEM */
 }
 
 static void
@@ -7515,12 +7522,6 @@ mark_terminals (void)
   for (t = terminal_list; t; t = t->next_terminal)
     {
       eassert (t->name != NULL);
-#ifdef HAVE_WINDOW_SYSTEM
-      /* If a terminal object is reachable from a stacpro'ed object,
-        it might have been marked already.  Make sure the image cache
-        gets marked.  */
-      mark_image_cache (t->image_cache);
-#endif /* HAVE_WINDOW_SYSTEM */
       if (!vectorlike_marked_p (&t->header))
        mark_vectorlike (&t->header);
     }
index 84558350dc0bfd27b65398b418eb89147f004f40..7595e1766184a8a4c626110c2961d185145feac0 100644 (file)
@@ -32,9 +32,6 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #ifndef ANDROID_STUBIFY
 
-/* Some kind of reference count for the image cache.  */
-static ptrdiff_t image_cache_refcount;
-
 /* The frame of the currently visible tooltip, or nil if none.  */
 static Lisp_Object tip_frame;
 
@@ -654,17 +651,6 @@ unwind_create_frame (Lisp_Object frame)
   /* If frame is ``official'', nothing to do.  */
   if (NILP (Fmemq (frame, Vframe_list)))
     {
-      /* If the frame's image cache refcount is still the same as our
-        private shadow variable, it means we are unwinding a frame
-        for which we didn't yet call init_frame_faces, where the
-        refcount is incremented.  Therefore, we increment it here, so
-        that free_frame_faces, called in x_free_frame_resources
-        below, will not mistakenly decrement the counter that was not
-        incremented yet to account for this new frame.  */
-      if (FRAME_IMAGE_CACHE (f) != NULL
-         && FRAME_IMAGE_CACHE (f)->refcount == image_cache_refcount)
-       FRAME_IMAGE_CACHE (f)->refcount++;
-
       android_free_frame_resources (f);
       free_glyphs (f);
       return Qt;
@@ -944,10 +930,6 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
   register_font_driver (&androidfont_driver, f);
   register_font_driver (&android_sfntfont_driver, f);
 
-  image_cache_refcount = (FRAME_IMAGE_CACHE (f)
-                         ? FRAME_IMAGE_CACHE (f)->refcount
-                         : 0);
-
   gui_default_parameter (f, parms, Qfont_backend, Qnil,
                          "fontBackend", "FontBackend", RES_TYPE_STRING);
 
@@ -2023,9 +2005,6 @@ android_create_tip_frame (struct android_display_info *dpyinfo,
   register_font_driver (&androidfont_driver, f);
   register_font_driver (&android_sfntfont_driver, f);
 
-  image_cache_refcount
-    = FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0;
-
   gui_default_parameter (f, parms, Qfont_backend, Qnil,
                          "fontBackend", "FontBackend", RES_TYPE_STRING);
 
index 35e1893c83cbe20ffbc2e04175f617f6625471b0..85012130689d0ec89a183575e3d4b2a80ace8ab0 100644 (file)
@@ -3292,6 +3292,11 @@ struct image_cache
 
   /* Reference count (number of frames sharing this cache).  */
   ptrdiff_t refcount;
+
+  /* Column width by which images whose QCscale property is Qdefault
+     will be scaled, which is 10 or FRAME_COLUMN_WIDTH of each frame
+     assigned this image cache, whichever is greater.  */
+  int scaling_col_width;
 };
 
 /* Size of bucket vector of image caches.  Should be prime.  */
@@ -3708,6 +3713,9 @@ int smaller_face (struct frame *, int, int);
 int face_with_height (struct frame *, int, int);
 int lookup_derived_face (struct window *, struct frame *,
                          Lisp_Object, int, bool);
+#ifdef HAVE_WINDOW_SYSTEM
+extern struct image_cache *share_image_cache (struct frame *f);
+#endif /* HAVE_WINDOW_SYSTEM */
 void init_frame_faces (struct frame *);
 void free_frame_faces (struct frame *);
 void recompute_basic_faces (struct frame *);
index 256202176802a449b49531906acd913787abd00e..1bb92e1f9b0a169ca6be0f30410d0eb8b17b7902 100644 (file)
@@ -983,6 +983,8 @@ make_frame (bool mini_p)
   f->tooltip = false;
   f->was_invisible = false;
   f->child_frame_border_width = -1;
+  f->face_caches = NULL;
+  f->image_cache = NULL;
   f->last_tab_bar_item = -1;
 #ifndef HAVE_EXT_TOOL_BAR
   f->last_tool_bar_item = -1;
@@ -4732,7 +4734,7 @@ void
 gui_set_font (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
 {
   Lisp_Object font_object;
-  int fontset = -1;
+  int fontset = -1, iwidth;
 
   /* Set the frame parameter back to the old value because we may
      fail to use ARG as the new parameter value.  */
@@ -4811,9 +4813,33 @@ gui_set_font (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
   /* Recalculate toolbar height.  */
   f->n_tool_bar_rows = 0;
 
-  /* Clean F's image cache of images whose values derive from the font
-     width.  */
-  clear_image_cache (f, Qauto);
+  /* Re-initialize F's image cache.  Since `set_new_font_hook' might
+     have changed the frame's column width, by which images are scaled,
+     it might likewise need to be assigned a different image cache, or
+     have its existing cache adjusted, if by coincidence it is its sole
+     user.  */
+
+  iwidth = max (10, FRAME_COLUMN_WIDTH (f));
+  if (FRAME_IMAGE_CACHE (f)
+      && (iwidth != FRAME_IMAGE_CACHE (f)->scaling_col_width))
+    {
+      eassert (FRAME_IMAGE_CACHE (f)->refcount >= 1);
+      if (FRAME_IMAGE_CACHE (f)->refcount == 1)
+       {
+         /* This frame is the only user of this image cache.  */
+         FRAME_IMAGE_CACHE (f)->scaling_col_width = iwidth;
+         /* Clean F's image cache of images whose values are derived
+            from the font width.  */
+         clear_image_cache (f, Qauto);
+       }
+      else
+       {
+         /* Release the current image cache, and reuse or allocate a
+            new image cache with IWIDTH.  */
+         FRAME_IMAGE_CACHE (f)->refcount--;
+         FRAME_IMAGE_CACHE (f) = share_image_cache (f);
+       }
+    }
 
   /* Ensure we redraw it.  */
   clear_current_matrices (f);
index 63bcce259af950d563ab5569c1274eeaf2481794..1d920d1a6bcbea0dc022fa2722f27943149dbe63 100644 (file)
@@ -288,6 +288,12 @@ struct frame
   /* Cache of realized faces.  */
   struct face_cache *face_cache;
 
+#ifdef HAVE_WINDOW_SYSTEM
+  /* Cache of realized images, which may be shared with other
+     frames.  */
+  struct image_cache *image_cache;
+#endif /* HAVE_WINDOW_SYSTEM */
+
   /* Tab-bar item index of the item on which a mouse button was pressed.  */
   int last_tab_bar_item;
 
@@ -909,7 +915,7 @@ default_pixels_per_inch_y (void)
 #define FRAME_KBOARD(f) ((f)->terminal->kboard)
 
 /* Return a pointer to the image cache of frame F.  */
-#define FRAME_IMAGE_CACHE(F) ((F)->terminal->image_cache)
+#define FRAME_IMAGE_CACHE(F) ((F)->image_cache)
 
 #define XFRAME(p) \
   (eassert (FRAMEP (p)), XUNTAG (p, Lisp_Vectorlike, struct frame))
index 870b6f58f02a7004034492d2067f7cc01b29566d..4a31def4defb64b51e868b2c691ca7190e98b1f2 100644 (file)
@@ -73,9 +73,6 @@ static Lisp_Object tip_last_parms;
 static void haiku_explicitly_set_name (struct frame *, Lisp_Object, Lisp_Object);
 static void haiku_set_title (struct frame *, Lisp_Object, Lisp_Object);
 
-/* The number of references to an image cache.  */
-static ptrdiff_t image_cache_refcount;
-
 static Lisp_Object
 get_geometry_from_preferences (struct haiku_display_info *dpyinfo,
                                Lisp_Object parms)
@@ -627,29 +624,8 @@ unwind_create_frame (Lisp_Object frame)
   /* If frame is ``official'', nothing to do.  */
   if (NILP (Fmemq (frame, Vframe_list)))
     {
-#if defined GLYPH_DEBUG && defined ENABLE_CHECKING
-      struct haiku_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
-#endif
-
-      /* If the frame's image cache refcount is still the same as our
-        private shadow variable, it means we are unwinding a frame
-        for which we didn't yet call init_frame_faces, where the
-        refcount is incremented.  Therefore, we increment it here, so
-        that free_frame_faces, called in free_frame_resources later,
-        will not mistakenly decrement the counter that was not
-        incremented yet to account for this new frame.  */
-      if (FRAME_IMAGE_CACHE (f) != NULL
-         && FRAME_IMAGE_CACHE (f)->refcount == image_cache_refcount)
-       FRAME_IMAGE_CACHE (f)->refcount++;
-
       haiku_free_frame_resources (f);
       free_glyphs (f);
-
-#if defined GLYPH_DEBUG && defined ENABLE_CHECKING
-      /* Check that reference counts are indeed correct.  */
-      if (dpyinfo->terminal->image_cache)
-       eassert (dpyinfo->terminal->image_cache->refcount == image_cache_refcount);
-#endif
     }
 }
 
@@ -807,9 +783,6 @@ haiku_create_frame (Lisp_Object parms)
 #endif
   register_font_driver (&haikufont_driver, f);
 
-  image_cache_refcount =
-    FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0;
-
   gui_default_parameter (f, parms, Qfont_backend, Qnil,
                          "fontBackend", "FontBackend", RES_TYPE_STRING);
 
@@ -1098,9 +1071,6 @@ haiku_create_tip_frame (Lisp_Object parms)
 #endif
   register_font_driver (&haikufont_driver, f);
 
-  image_cache_refcount =
-    FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0;
-
   gui_default_parameter (f, parms, Qfont_backend, Qnil,
                          "fontBackend", "FontBackend", RES_TYPE_STRING);
 
index 879531d5264b89e76fba131156bf831d942eebd2..2945447b962e469046e8ed268f679e38de5de9ac 100644 (file)
@@ -2195,6 +2195,8 @@ make_image_cache (void)
   c->used = c->refcount = 0;
   c->images = xmalloc (c->size * sizeof *c->images);
   c->buckets = xzalloc (IMAGE_CACHE_BUCKETS_SIZE * sizeof *c->buckets);
+  /* This value should never be encountered.  */
+  c->scaling_col_width = -1;
   return c;
 }
 
@@ -3620,7 +3622,10 @@ cache_image (struct frame *f, struct image *img)
   ptrdiff_t i;
 
   if (!c)
-    c = FRAME_IMAGE_CACHE (f) = make_image_cache ();
+    {
+      c = FRAME_IMAGE_CACHE (f) = share_image_cache (f);
+      c->refcount++;
+    }
 
   /* Find a free slot in c->images.  */
   for (i = 0; i < c->used; ++i)
index 24fabbe2eaade4c0bb7f4bf2c611c0469ff7db45..d9c1296056c312e6bb19678f4333a5f522815243 100644 (file)
@@ -87,8 +87,6 @@ static Lisp_Object tip_last_parms;
 static Lisp_Object as_script, *as_result;
 static int as_status;
 
-static ptrdiff_t image_cache_refcount;
-
 static struct ns_display_info *ns_display_info_for_name (Lisp_Object);
 
 /* ==========================================================================
@@ -1137,29 +1135,8 @@ unwind_create_frame (Lisp_Object frame)
   /* If frame is ``official'', nothing to do.  */
   if (NILP (Fmemq (frame, Vframe_list)))
     {
-#if defined GLYPH_DEBUG && defined ENABLE_CHECKING
-      struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
-#endif
-
-      /* If the frame's image cache refcount is still the same as our
-        private shadow variable, it means we are unwinding a frame
-        for which we didn't yet call init_frame_faces, where the
-        refcount is incremented.  Therefore, we increment it here, so
-        that free_frame_faces, called in ns_free_frame_resources
-        below, will not mistakenly decrement the counter that was not
-        incremented yet to account for this new frame.  */
-      if (FRAME_IMAGE_CACHE (f) != NULL
-         && FRAME_IMAGE_CACHE (f)->refcount == image_cache_refcount)
-       FRAME_IMAGE_CACHE (f)->refcount++;
-
       ns_free_frame_resources (f);
       free_glyphs (f);
-
-#if defined GLYPH_DEBUG && defined ENABLE_CHECKING
-      /* Check that reference counts are indeed correct.  */
-      eassert (dpyinfo->terminal->image_cache->refcount == image_cache_refcount);
-#endif
-
       return Qt;
     }
 
index bdc6c5836fa0a605dc376dc0a7a6b5463a4ef498..49467988cae26111e950810067c7d99de2fe3686 100644 (file)
@@ -38,8 +38,6 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include "xsettings.h"
 #include "atimer.h"
 
-static ptrdiff_t image_cache_refcount;
-
 static int x_decode_color (struct frame *f, Lisp_Object color_name,
                           int mono_color);
 static struct pgtk_display_info *pgtk_display_info_for_name (Lisp_Object);
@@ -1019,17 +1017,6 @@ unwind_create_frame (Lisp_Object frame)
   /* If frame is ``official'', nothing to do.  */
   if (NILP (Fmemq (frame, Vframe_list)))
     {
-      /* If the frame's image cache refcount is still the same as our
-         private shadow variable, it means we are unwinding a frame
-         for which we didn't yet call init_frame_faces, where the
-         refcount is incremented.  Therefore, we increment it here, so
-         that free_frame_faces, called in x_free_frame_resources
-         below, will not mistakenly decrement the counter that was not
-         incremented yet to account for this new frame.  */
-      if (FRAME_IMAGE_CACHE (f) != NULL
-         && FRAME_IMAGE_CACHE (f)->refcount == image_cache_refcount)
-       FRAME_IMAGE_CACHE (f)->refcount++;
-
       pgtk_free_frame_resources (f);
       free_glyphs (f);
       return Qt;
@@ -1389,9 +1376,6 @@ This function is an internal primitive--use `make-frame' instead.  */ )
   register_font_driver (&ftcrhbfont_driver, f);
 #endif /* HAVE_HARFBUZZ */
 
-  image_cache_refcount =
-    FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0;
-
   gui_default_parameter (f, parms, Qfont_backend, Qnil,
                         "fontBackend", "FontBackend", RES_TYPE_STRING);
 
@@ -2746,9 +2730,6 @@ x_create_tip_frame (struct pgtk_display_info *dpyinfo, Lisp_Object parms, struct
   register_font_driver (&ftcrhbfont_driver, f);
 #endif /* HAVE_HARFBUZZ */
 
-  image_cache_refcount =
-    FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0;
-
   gui_default_parameter (f, parms, Qfont_backend, Qnil,
                          "fontBackend", "FontBackend", RES_TYPE_STRING);
 
index d828c62ce331fab7cfb5a14a7d7fc09264377fdb..d6a9300bac9b14b19075785b0c260bef00d45f6d 100644 (file)
@@ -523,11 +523,6 @@ struct terminal
   /* The terminal's keyboard object. */
   struct kboard *kboard;
 
-#ifdef HAVE_WINDOW_SYSTEM
-  /* Cache of images.  */
-  struct image_cache *image_cache;
-#endif /* HAVE_WINDOW_SYSTEM */
-
   /* Device-type dependent data shared amongst all frames on this terminal.  */
   union display_info
   {
index 5b0e4a895d0fc469184e234576521309f9952104..b784a9a563d719f39d26f44395bad00409438423 100644 (file)
@@ -270,7 +270,6 @@ unsigned int msh_mousewheel = 0;
 static unsigned menu_free_timer = 0;
 
 #ifdef GLYPH_DEBUG
-static ptrdiff_t image_cache_refcount;
 static int dpyinfo_refcount;
 #endif
 
@@ -5918,17 +5917,6 @@ unwind_create_frame (Lisp_Object frame)
     {
 #ifdef GLYPH_DEBUG
       struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
-
-      /* If the frame's image cache refcount is still the same as our
-        private shadow variable, it means we are unwinding a frame
-        for which we didn't yet call init_frame_faces, where the
-        refcount is incremented.  Therefore, we increment it here, so
-        that free_frame_faces, called in w32_free_frame_resources
-        below, will not mistakenly decrement the counter that was not
-        incremented yet to account for this new frame.  */
-      if (FRAME_IMAGE_CACHE (f) != NULL
-         && FRAME_IMAGE_CACHE (f)->refcount == image_cache_refcount)
-       FRAME_IMAGE_CACHE (f)->refcount++;
 #endif
 
       w32_free_frame_resources (f);
@@ -5937,10 +5925,6 @@ unwind_create_frame (Lisp_Object frame)
 #ifdef GLYPH_DEBUG
       /* Check that reference counts are indeed correct.  */
       eassert (dpyinfo->reference_count == dpyinfo_refcount);
-      eassert ((dpyinfo->terminal->image_cache == NULL
-               && image_cache_refcount == 0)
-              || (dpyinfo->terminal->image_cache != NULL
-                  && dpyinfo->terminal->image_cache->refcount == image_cache_refcount));
 #endif
       return Qt;
     }
@@ -6128,8 +6112,6 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
   record_unwind_protect (do_unwind_create_frame, frame);
 
 #ifdef GLYPH_DEBUG
-  image_cache_refcount =
-    FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0;
   dpyinfo_refcount = dpyinfo->reference_count;
 #endif /* GLYPH_DEBUG */
 
@@ -7222,8 +7204,6 @@ w32_create_tip_frame (struct w32_display_info *dpyinfo, Lisp_Object parms)
   f->tooltip = true;
 
 #ifdef GLYPH_DEBUG
-  image_cache_refcount =
-    FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0;
   dpyinfo_refcount = dpyinfo->reference_count;
 #endif /* GLYPH_DEBUG */
   FRAME_KBOARD (f) = kb;
index e305cc7456f291396f48885ceec47778cc975526..1e0196a1171fb15eeea963f09ac874f24adc9f17 100644 (file)
@@ -634,6 +634,37 @@ x_free_gc (struct frame *f, struct android_gc *gc)
                           Frames and faces
  ***********************************************************************/
 
+#ifdef HAVE_WINDOW_SYSTEM
+
+/* Find an existing image cache registered for a frame on F's display
+   and with a `scaling_col_width' of F's FRAME_COLUMN_WIDTH, or, in the
+   absence of an eligible image cache, allocate an image cache with the
+   same width value.  */
+
+struct image_cache *
+share_image_cache (struct frame *f)
+{
+  int width = max (10, FRAME_COLUMN_WIDTH (f));
+  Lisp_Object tail, frame;
+  struct image_cache *cache;
+
+  FOR_EACH_FRAME (tail, frame)
+    {
+      struct frame *x = XFRAME (frame);
+
+      if (FRAME_TERMINAL (x) == FRAME_TERMINAL (f)
+         && FRAME_IMAGE_CACHE (x)
+         && FRAME_IMAGE_CACHE (x)->scaling_col_width == width)
+       return FRAME_IMAGE_CACHE (x);
+    }
+
+  cache = make_image_cache ();
+  cache->scaling_col_width = width;
+  return cache;
+}
+
+#endif /* HAVE_WINDOW_SYSTEM */
+
 /* Initialize face cache and basic faces for frame F.  */
 
 void
@@ -644,14 +675,10 @@ init_frame_faces (struct frame *f)
     FRAME_FACE_CACHE (f) = make_face_cache (f);
 
 #ifdef HAVE_WINDOW_SYSTEM
-  /* Make the image cache.  */
+  /* Make or share an image cache.  */
   if (FRAME_WINDOW_P (f))
     {
-      /* We initialize the image cache when creating the first frame
-        on a terminal, and not during terminal creation.  This way,
-        `x-open-connection' on a tty won't create an image cache.  */
-      if (FRAME_IMAGE_CACHE (f) == NULL)
-       FRAME_IMAGE_CACHE (f) = make_image_cache ();
+      FRAME_IMAGE_CACHE (f) = share_image_cache (f);
       ++FRAME_IMAGE_CACHE (f)->refcount;
     }
 #endif /* HAVE_WINDOW_SYSTEM */
index 4fdcf07e8fb183aa59294f5e8205eabb882a2271..5ba4a78ac9df9f1f9fe44027942a1b7bac3110e4 100644 (file)
@@ -127,7 +127,6 @@ extern LWLIB_ID widget_id_tick;
 
 #define MAXREQUEST(dpy) (XMaxRequestSize (dpy))
 
-static ptrdiff_t image_cache_refcount;
 #ifdef GLYPH_DEBUG
 static int dpyinfo_refcount;
 #endif
@@ -4754,29 +4753,12 @@ unwind_create_frame (Lisp_Object frame)
   /* If frame is ``official'', nothing to do.  */
   if (NILP (Fmemq (frame, Vframe_list)))
     {
-#if defined GLYPH_DEBUG && defined ENABLE_CHECKING
-      struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
-#endif
-
-      /* If the frame's image cache refcount is still the same as our
-        private shadow variable, it means we are unwinding a frame
-        for which we didn't yet call init_frame_faces, where the
-        refcount is incremented.  Therefore, we increment it here, so
-        that free_frame_faces, called in x_free_frame_resources
-        below, will not mistakenly decrement the counter that was not
-        incremented yet to account for this new frame.  */
-      if (FRAME_IMAGE_CACHE (f) != NULL
-         && FRAME_IMAGE_CACHE (f)->refcount == image_cache_refcount)
-       FRAME_IMAGE_CACHE (f)->refcount++;
-
       x_free_frame_resources (f);
       free_glyphs (f);
-
 #if defined GLYPH_DEBUG && defined ENABLE_CHECKING
       /* Check that reference counts are indeed correct.  */
       eassert (dpyinfo->reference_count == dpyinfo_refcount);
-      eassert (dpyinfo->terminal->image_cache->refcount == image_cache_refcount);
-#endif
+#endif /* GLYPH_DEBUG && ENABLE_CHECKING */
       return Qt;
     }
 
@@ -5112,9 +5094,6 @@ This function is an internal primitive--use `make-frame' instead.  */)
 #endif /* HAVE_FREETYPE */
 #endif /* not USE_CAIRO */
   register_font_driver (&xfont_driver, f);
-
-  image_cache_refcount =
-    FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0;
 #ifdef GLYPH_DEBUG
   dpyinfo_refcount = dpyinfo->reference_count;
 #endif /* GLYPH_DEBUG */
@@ -8484,8 +8463,6 @@ x_create_tip_frame (struct x_display_info *dpyinfo, Lisp_Object parms)
 #endif /* not USE_CAIRO */
   register_font_driver (&xfont_driver, f);
 
-  image_cache_refcount =
-    FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0;
 #ifdef GLYPH_DEBUG
   dpyinfo_refcount = dpyinfo->reference_count;
 #endif /* GLYPH_DEBUG */