2015-07-23 12:56:36 (UTC-03:00)
Marcel Rodrigues <marcelgmr@gmail.com>
Write 16-bit values to GIF portably.
diff --git a/gif.c b/gif.c index 9372aaf..667023c 100644 --- a/gif.c +++ b/gif.c @@ -1,8 +1,3 @@ -/* NOTES - - The encoder dumps uint16_t numbers as is into GIF files, which means it - only works on little-endian machines, since this is what GIF requires. -*/ - #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -13,6 +8,9 @@ #include "gif.h" +/* helper to write a little-endian 16-bit number portably */ +#define write_num(fd, n) write((fd), (uint8_t []) {(n) & 0xFF, (n) >> 8}, 2) + struct Node { uint16_t key; struct Node *children[0x10]; @@ -53,8 +51,8 @@ new_gif(const char *fname, uint16_t w, uint16_t h, uint8_t *gct) if (gif->fd == -1) return NULL; write(gif->fd, "GIF89a", 6); - write(gif->fd, &w, 2); - write(gif->fd, &h, 2); + write_num(gif->fd, w); + write_num(gif->fd, h); write(gif->fd, (uint8_t []) {0xF3, 0x00, 0x00}, 3); write(gif->fd, gct, 0x30); return gif; @@ -104,10 +102,10 @@ put_image(GIF *gif, uint16_t w, uint16_t h, uint16_t x, uint16_t y) root = malloc(sizeof(*root)); write(gif->fd, ",", 1); - write(gif->fd, &x, 2); - write(gif->fd, &y, 2); - write(gif->fd, &w, 2); - write(gif->fd, &h, 2); + write_num(gif->fd, x); + write_num(gif->fd, y); + write_num(gif->fd, w); + write_num(gif->fd, h); write(gif->fd, (uint8_t []) {0x00, 0x04}, 2); /* Create nodes for single pixels. */ for (nkeys = 0; nkeys < 0x10; nkeys++) @@ -174,7 +172,7 @@ set_delay(GIF *gif, uint16_t d) #else write(gif->fd, (uint8_t []) {'!', 0xF9, 0x04, 0x04}, 4); #endif - write(gif->fd, &d, 2); + write_num(gif->fd, d); write(gif->fd, "\0\0", 2); }