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