]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve support for 'memory-report' on MS-Windows
authorEli Zaretskii <eliz@gnu.org>
Sat, 12 Dec 2020 11:12:57 +0000 (13:12 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 12 Dec 2020 11:12:57 +0000 (13:12 +0200)
* src/w32term.c (w32_image_size): New function.
* src/image.c (image_frame_cache_size) [HAVE_NTGUI]: Support
reporting the size of frame image cache.
(image_frame_cache_size, Fimage_cache_size): The total size is
now of the type 'size_t', not 'int'.

src/image.c
src/w32gui.h
src/w32term.c

index 79b275cba94484165d84d65ef7face6c0648c20d..63033572ed4f693db2ddff7f3aee5ec8197f0b87 100644 (file)
@@ -1792,11 +1792,11 @@ which is then usually a filename.  */)
   return Qnil;
 }
 
-static int
+static size_t
 image_frame_cache_size (struct frame *f)
 {
-  int total = 0;
-#ifdef USE_CAIRO
+  size_t total = 0;
+#if defined USE_CAIRO
   struct image_cache *c = FRAME_IMAGE_CACHE (f);
 
   if (!c)
@@ -1810,6 +1810,19 @@ image_frame_cache_size (struct frame *f)
        total += img->pixmap->width * img->pixmap->height  *
          img->pixmap->bits_per_pixel / 8;
     }
+#elif defined HAVE_NTGUI
+  struct image_cache *c = FRAME_IMAGE_CACHE (f);
+
+  if (!c)
+    return 0;
+
+  for (ptrdiff_t i = 0; i < c->used; ++i)
+    {
+      struct image *img = c->images[i];
+
+      if (img && img->pixmap && img->pixmap != NO_PIXMAP)
+       total += w32_image_size (img);
+    }
 #endif
   return total;
 }
@@ -1819,7 +1832,7 @@ DEFUN ("image-cache-size", Fimage_cache_size, Simage_cache_size, 0, 0, 0,
   (void)
 {
   Lisp_Object tail, frame;
-  int total = 0;
+  size_t total = 0;
 
   FOR_EACH_FRAME (tail, frame)
     if (FRAME_WINDOW_P (XFRAME (frame)))
index dfec1f086171afb2c83810b9913152167bef0422..fc8131130fb73621d99be0906cea632584b2b1ac 100644 (file)
@@ -46,6 +46,7 @@ extern int w32_load_image (struct frame *f, struct image *img,
                            Lisp_Object spec_file, Lisp_Object spec_data);
 extern bool w32_can_use_native_image_api (Lisp_Object);
 extern void w32_gdiplus_shutdown (void);
+extern size_t w32_image_size (struct image *);
 
 #define FACE_DEFAULT (~0)
 
index 23cb380040b8461885e06b436e839f01c67aa163..dc5cd1f6997c0c88483cc85f9e4780e48cf58af4 100644 (file)
@@ -1991,6 +1991,17 @@ w32_draw_image_foreground (struct glyph_string *s)
   RestoreDC (s->hdc ,-1);
 }
 
+size_t
+w32_image_size (struct image *img)
+{
+  BITMAP bm_info;
+  size_t rv = 0;
+
+  if (GetObject (img->pixmap, sizeof (BITMAP), &bm_info))
+    rv = bm_info.bmWidth * bm_info.bmHeight * bm_info.bmBitsPixel / 8;
+  return rv;
+}
+
 
 /* Draw a relief around the image glyph string S.  */