about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-01-07 01:11:20 -0500
committerJune McEnroe <june@causal.agency>2019-01-07 01:11:20 -0500
commit42fcb6656dd9b6c735b09ce61f8ce4e875329c43 (patch)
tree2c97aa115e449633218fea5d5be051530fe82f2c
parentmadvise MADV_NOCORE in image (diff)
downloadtorus-42fcb6656dd9b6c735b09ce61f8ce4e875329c43.tar.gz
torus-42fcb6656dd9b6c735b09ce61f8ce4e875329c43.zip
Compress PNG data in image
kcgi never enables compression for FastCGI.
-rw-r--r--Makefile2
-rw-r--r--image.c9
-rw-r--r--kcgi.mk2
-rw-r--r--png.h8
4 files changed, 17 insertions, 4 deletions
diff --git a/Makefile b/Makefile
index 342e292..b1c43b1 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ CHROOT_GROUP = $(CHROOT_USER)
 
 CFLAGS += -std=c11 -Wall -Wextra -Wpedantic
 LDFLAGS = -static
-LDLIBS = -lcursesw -lutil
+LDLIBS = -lcursesw -lutil -lz
 
 -include config.mk
 
diff --git a/image.c b/image.c
index ef77906..38cd7cd 100644
--- a/image.c
+++ b/image.c
@@ -25,6 +25,7 @@
 #include <sys/stat.h>
 #include <sysexits.h>
 #include <unistd.h>
+#include <zlib.h>
 
 #ifdef __FreeBSD__
 #include <sys/capsicum.h>
@@ -158,7 +159,12 @@ static void render(FILE *stream, uint32_t tileX, uint32_t tileY) {
 		}
 	}
 
-	pngData(stream, (uint8_t *)data, sizeof(data));
+	uLong zlen = compressBound(sizeof(data));
+	uint8_t zdata[zlen];
+	int error = compress(zdata, &zlen, (uint8_t *)data, sizeof(data));
+	if (error) errx(EX_SOFTWARE, "compress: %d", error);
+
+	pngDeflated(stream, zdata, (size_t)zlen);
 	pngTail(stream);
 }
 
@@ -229,6 +235,7 @@ static void worker(void) {
 		if (error == KCGI_HUP) goto next;
 		if (error) errkcgi(EX_IOERR, error, "khttp_head");
 
+		// XXX: kcgi never enables compression for FastCGI.
 		error = khttp_body(&req);
 		if (error == KCGI_HUP) goto next;
 		if (error) errkcgi(EX_IOERR, error, "khttp_body");
diff --git a/kcgi.mk b/kcgi.mk
index ddfea53..8492047 100644
--- a/kcgi.mk
+++ b/kcgi.mk
@@ -1,3 +1,3 @@
 CFLAGS += -DHAVE_KCGI -I/usr/local/include
 LDFLAGS += -L/usr/local/lib
-LDLIBS += -lkcgi -lz
+LDLIBS := -lkcgi $(LDLIBS)
diff --git a/png.h b/png.h
index 0df4699..d5fd3f5 100644
--- a/png.h
+++ b/png.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2018  June McEnroe <june@causal.agency>
+/* Copyright (C) 2018, 2019  June McEnroe <june@causal.agency>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as published by
@@ -102,6 +102,12 @@ static inline void pngData(FILE *file, const uint8_t *data, uint32_t len) {
 	pngInt32(file, ~pngCRC);
 }
 
+static inline void pngDeflated(FILE *file, const uint8_t *data, uint32_t len) {
+	pngChunk(file, "IDAT", len);
+	pngWrite(file, data, len);
+	pngInt32(file, ~pngCRC);
+}
+
 static inline void pngTail(FILE *file) {
 	pngChunk(file, "IEND", 0);
 	pngInt32(file, ~pngCRC);