-static void format_row(unsigned char *row, unsigned long c,
- unsigned s, unsigned y, unsigned w, unsigned h)
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
+#define primary(c) (((c) >> 8*COLOUR_PRIMARY) & 0xff)
+#define dark(c) (((c) >> 8*COLOUR_DARK) & 0xff)
+#define light(c) (((c) >> 8*COLOUR_LIGHT) & 0xff)
+
+static void format_row(unsigned char *row, unsigned long c, unsigned s,
+ unsigned y, unsigned w, unsigned h)
+{
+ memset(row, dark(c), w);
+ memset(row, primary(c), y+s < h ? w-s : 0);
+ memset(row, light(c), y >= s ? MIN(s, h-y) : w-y);
+}
+
+static void format_row2(unsigned char *row, unsigned long c, unsigned s,
+ unsigned y, unsigned w, unsigned h, unsigned stride)