==> src/bmp.c <==1/* assemble.rs's bmp. */
2#include "mesh/assemble_bmp.h"
3#include "mesh/strbuf.h"
4
5#include <string.h>
6
7static void le32(uint8_t *p, uint32_t v) {
8 for (int i = 0; i < 4; i++) p[i] = (uint8_t)(v >> 8 * i);
9}
10
11uint8_t *masm_bmp(uint32_t w, uint32_t h, const uint8_t *raster, size_t *len) {
12 uint32_t row = (3 * w + 3) / 4 * 4, size = 54 + row * h;
13 uint8_t *b = mxalloc(size);
14 b[0] = 'B';
15 b[1] = 'M';
16 le32(b + 2, size);
17 le32(b + 6, 0);
18 le32(b + 10, 54);
19 le32(b + 14, 40);
20 le32(b + 18, w);
21 le32(b + 22, h);
22 b[26] = 1;
23 b[28] = 24;
24 uint32_t rest[] = {0, row * h, 2835, 2835, 0, 0};
25 for (int i = 0; i < 6; i++) le32(b + 30 + 4 * i, rest[i]);
26 uint8_t *p = b + 54;
27 for (uint32_t y = h; y-- > 0;) {
28 const uint8_t *r = raster + (size_t)3 * w * y;
29 for (uint32_t x = 0; x < w; x++) {
30 p[3 * x] = r[3 * x + 2];
31 p[3 * x + 1] = r[3 * x + 1];
32 p[3 * x + 2] = r[3 * x];
33 }
34 p += row; /* padding stays zero */
35 }
36 *len = size;
37 return b;
38}