]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new function 'image-cache-size'
authorLars Ingebrigtsen <larsi@gnus.org>
Fri, 11 Dec 2020 13:30:44 +0000 (14:30 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 11 Dec 2020 13:30:44 +0000 (14:30 +0100)
* src/image.c (Fimage_cache_size): New defun.
(image_frame_cache_size): New function.

doc/lispref/display.texi
etc/NEWS
src/image.c

index 590b54668f7545931021e604321a256b102d31f1..b9b05a2a422006d784fa15f81ab607b6c1d5305b 100644 (file)
@@ -6577,6 +6577,12 @@ except when you explicitly clear it.  This mode can be useful for
 debugging.
 @end defvar
 
+@defun image-cache-size
+This function returns the total size of the current image cache, in
+bytes.  An image of size 200x100 with 24 bits per color will have a
+cache size of 60000 bytes, for instance.
+@end defun
+
 @node Xwidgets
 @section Embedded Native Widgets
 @cindex xwidget
index f2772843e7682ee62b21482e66039119dc9e6108..befcf08cec3585aa7141f0963194886f658b9140 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1089,6 +1089,10 @@ If 'shr-width' is non-nil, it overrides this variable.
 
 ** Images
 
++++
+*** New function 'image-cache-size'.
+This function returns the size of the current image cache, in bytes.
+
 ---
 *** Animated images stop automatically under high CPU pressure sooner.
 Previously, an animated image would stop animating if any single image
index 522a4cf7c0f7b6b505d673a0d0d9e7e1c5a84c52..38887ced25b2fbddad3957847bf9c5678dd85d10 100644 (file)
@@ -1792,6 +1792,40 @@ which is then usually a filename.  */)
   return Qnil;
 }
 
+static int
+image_frame_cache_size (struct frame *f)
+{
+  struct image_cache *c = FRAME_IMAGE_CACHE (f);
+  int total = 0;
+
+  if (!c)
+    return 0;
+
+  for (ptrdiff_t i = 0; i < c->used; ++i)
+    {
+      struct image *img = c->images[i];
+
+      if (img)
+       total += img->pixmap->width * img->pixmap->height  *
+         img->pixmap->bits_per_pixel / 8;
+    }
+  return total;
+}
+
+DEFUN ("image-cache-size", Fimage_cache_size, Simage_cache_size, 0, 0, 0,
+       doc: /* Return the size of the image cache.  */)
+  (void)
+{
+  Lisp_Object tail, frame;
+  int total = 0;
+
+  FOR_EACH_FRAME (tail, frame)
+    if (FRAME_WINDOW_P (XFRAME (frame)))
+      total += image_frame_cache_size (XFRAME (frame));
+
+  return make_int (total);
+}
+
 
 DEFUN ("image-flush", Fimage_flush, Simage_flush,
        1, 2, 0,
@@ -10703,6 +10737,7 @@ non-numeric, there is no explicit limit on the size of images.  */);
   defsubr (&Simage_size);
   defsubr (&Simage_mask_p);
   defsubr (&Simage_metadata);
+  defsubr (&Simage_cache_size);
 
 #ifdef GLYPH_DEBUG
   defsubr (&Simagep);