}
static size_t
-image_frame_cache_size (struct frame *f)
+image_size_in_bytes (struct image *img)
{
- size_t total = 0;
+ size_t size = 0;
+
#if defined USE_CAIRO
- struct image_cache *c = FRAME_IMAGE_CACHE (f);
+ Emacs_Pixmap pm = img->pixmap;
+ if (pm)
+ size += pm->height * pm->bytes_per_line;
+ Emacs_Pixmap msk = img->mask;
+ if (msk)
+ size += msk->height * msk->bytes_per_line;
- if (!c)
- return 0;
+#elif defined HAVE_X_WINDOWS
+ /* Use a nominal depth of 24 bpp for pixmap and 1 bpp for mask,
+ to avoid having to query the server. */
+ if (img->pixmap != NO_PIXMAP)
+ size += img->width * img->height * 3;
+ if (img->mask != NO_PIXMAP)
+ size += img->width * img->height / 8;
+
+ if (img->ximg && img->ximg->data)
+ size += img->ximg->bytes_per_line * img->ximg->height;
+ if (img->mask_img && img->mask_img->data)
+ size += img->mask_img->bytes_per_line * img->mask_img->height;
- for (ptrdiff_t i = 0; i < c->used; ++i)
- {
- struct image *img = c->images[i];
+#elif defined HAVE_NS
+ if (img->pixmap)
+ size += ns_image_size_in_bytes (img->pixmap);
+ if (img->mask)
+ size += ns_image_size_in_bytes (img->mask);
- if (img && img->pixmap && img->pixmap != NO_PIXMAP)
- 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 (img->pixmap)
+ size += w32_image_size (img->pixmap);
+ if (img->mask)
+ size += w32_image_size (img->mask);
+
+#endif
+
+ return size;
+}
+static size_t
+image_frame_cache_size (struct frame *f)
+{
+ struct image_cache *c = FRAME_IMAGE_CACHE (f);
if (!c)
return 0;
+ size_t total = 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);
+ total += img ? image_size_in_bytes (img) : 0;
}
-#endif
return total;
}
[(EmacsImage *)img setAlphaAtX: x Y: y to: a];
}
+size_t
+ns_image_size_in_bytes (void *img)
+{
+ return [(EmacsImage *)img sizeInBytes];
+}
/* ==========================================================================
smoothing = s;
}
+/* Approximate allocated size of image in bytes. */
+- (size_t) sizeInBytes
+{
+ size_t bytes = 0;
+ NSImageRep *rep;
+ NSEnumerator *reps = [[self representations] objectEnumerator];
+ while ((rep = (NSImageRep *) [reps nextObject]))
+ {
+ if ([rep respondsToSelector: @selector (bytesPerRow)])
+ {
+ NSBitmapImageRep *bmr = (NSBitmapImageRep *) rep;
+ bytes += [bmr bytesPerRow] * [bmr numberOfPlanes] * [bmr pixelsHigh];
+ }
+ }
+ return bytes;
+}
+
@end
- (BOOL)setFrame: (unsigned int) index;
- (void)setTransform: (double[3][3]) m;
- (void)setSmoothing: (BOOL)s;
+- (size_t)sizeInBytes;
@end
extern int ns_display_pixel_height (struct ns_display_info *);
extern int ns_display_pixel_width (struct ns_display_info *);
+extern size_t ns_image_size_in_bytes (void *img);
/* This in nsterm.m */
extern float ns_antialias_threshold;
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 *);
+extern size_t w32_image_size (Emacs_Pixmap);
#define FACE_DEFAULT (~0)
}
size_t
-w32_image_size (struct image *img)
+w32_image_size (Emacs_Pixmap pixmap)
{
BITMAP bm_info;
size_t rv = 0;
- if (GetObject (img->pixmap, sizeof (BITMAP), &bm_info))
+ if (GetObject (pixmap, sizeof (BITMAP), &bm_info))
rv = bm_info.bmWidth * bm_info.bmHeight * bm_info.bmBitsPixel / 8;
return rv;
}