skip to content
==> 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}