commit 96aabc6
sewn
·
2026-05-07 17:17:38 +0000 UTC
parent 93d5023
reduce memory usage
1 files changed,
+17,
-17
M
wawa.c
M
wawa.c
+17,
-17
1@@ -48,8 +48,7 @@ static struct wl_list outputs;
2 struct image {
3 struct wl_buffer *buffer;
4 const char *filename;
5- int32_t width, height, size;
6- uint32_t *data;
7+ int32_t width, height;
8 } image;
9
10 static void
11@@ -83,7 +82,6 @@ image_cleanup_callback(void *data, struct wl_callback *callback, uint32_t id)
12 wl_list_for_each(output, &outputs, link)
13 if (!output->configured) return;
14
15- munmap(image.data, image.size);
16 wl_buffer_destroy(image.buffer);
17 image = (struct image){0};
18 }
19@@ -97,10 +95,11 @@ load_image(void)
20 {
21 int fd;
22 struct wl_shm_pool *shm_pool;
23- unsigned char *data;
24+ uint32_t *data;
25+ unsigned char *image_data;
26 int32_t size;
27
28- if (!(data = stbi_load(image.filename,
29+ if (!(image_data = stbi_load(image.filename,
30 &image.width, &image.height, NULL, 4)))
31 die("failed to load image: %s", stbi_failure_reason());
32
33@@ -136,12 +135,23 @@ load_image(void)
34 die("ftruncate:");
35 }
36
37- image.data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
38- if (image.data == MAP_FAILED) {
39+ data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
40+ if (data == MAP_FAILED) {
41 close(fd);
42 die("mmap:");
43 }
44
45+ /* [R, G, B, A] -> ARGB8888 */
46+ for (int i = 0; i < image.width * image.height; i++)
47+ data[i] =
48+ image_data[4 * i + 3] << 24 |
49+ image_data[4 * i + 0] << 16 |
50+ image_data[4 * i + 1] << 8 |
51+ image_data[4 * i + 2];
52+
53+ stbi_image_free(image_data);
54+ munmap(data, size);
55+
56 #if defined(__linux__) || \
57 ((defined(__FreeBSD__) && (__FreeBSD_version >= 1300048)))
58 fcntl(fd, F_ADD_SEALS, F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL);
59@@ -152,16 +162,6 @@ load_image(void)
60 image.width, image.height, image.width * 4, WL_SHM_FORMAT_ARGB8888);
61 wl_shm_pool_destroy(shm_pool);
62 close(fd);
63-
64- /* [R, G, B, A] -> ARGB8888 */
65- for (int i = 0; i < image.width * image.height; i++)
66- image.data[i] =
67- data[4 * i + 3] << 24 |
68- data[4 * i + 0] << 16 |
69- data[4 * i + 1] << 8 |
70- data[4 * i + 2];
71-
72- stbi_image_free(data);
73 }
74
75 static void