emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 61b6cc4: Improve support for 'memory-report' on MS-Windows


From: Eli Zaretskii
Subject: master 61b6cc4: Improve support for 'memory-report' on MS-Windows
Date: Sat, 12 Dec 2020 06:14:21 -0500 (EST)

branch: master
commit 61b6cc401a9adf7f718c1c9c4350181ecd413f1c
Author: Eli Zaretskii <eliz@gnu.org>
Commit: Eli Zaretskii <eliz@gnu.org>

    Improve support for 'memory-report' on MS-Windows
    
    * 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   | 21 +++++++++++++++++----
 src/w32gui.h  |  1 +
 src/w32term.c | 11 +++++++++++
 3 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/src/image.c b/src/image.c
index 79b275c..6303357 100644
--- a/src/image.c
+++ b/src/image.c
@@ -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)))
diff --git a/src/w32gui.h b/src/w32gui.h
index dfec1f0..fc81311 100644
--- a/src/w32gui.h
+++ b/src/w32gui.h
@@ -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)
 
diff --git a/src/w32term.c b/src/w32term.c
index 23cb380..dc5cd1f 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -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.  */
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]