+/* -------------------------------------------------------------------------------------------------
+ * RLE STUFF
+ * -------------------------------------------------------------------------------------------------
+ */
+/* Limit streak count per scanline so we can directly jump to specific scanline */
+#define RLE_STREAKS_PER_SCANLINE 4
+/* Every streak is encoded by 2 bytes: offset and count of black pixels in the streak */
+#define RLE_BYTES_PER_SCANLINE RLE_STREAKS_PER_SCANLINE * 2
+
+static RLEBitmap createRLEBitmap(unsigned int w, unsigned int h) {
+ RLEBitmap ret;
+ ret.w = w;
+ ret.h = h;
+
+ /* Add some padding at the end of the buffer, with the worst case for a scanline (w/2 streaks) */
+ ret.scans = (unsigned char*) calloc(h * RLE_BYTES_PER_SCANLINE + w, 1);
+
+ return ret;
+}
+
+static destroyRLEBitmap(RLEBitmap b) {
+ free(b.scans);
+}
+
+static RLEBitmap rleEncode(unsigned char *pixels, unsigned int w, unsigned int h) {