- uint32_t argb;
- _DO_OR_DIE(fread(&argb, sizeof(argb), 1, file));
- rgba_t rgba = PACK(rgba, 3, UNPACK(argb, 2));
- rgba = PACK(rgba, 2, UNPACK(argb, 1));
- rgba = PACK(rgba, 1, UNPACK(argb, 0));
- rgba = PACK(rgba, 0, UNPACK(argb, 3));
- p->pixels[i] = color_from_rgba(rgba);
+ union {
+ rgba_t rgba;
+ struct {
+ rgbachan_t r, g, b, a;
+ } chan;
+ } u;
+ _DO_OR_DIE(fread(&u, sizeof(u), 1, file));
+ rgbachan_t t = u.chan.r;
+ u.chan.r = u.chan.a;
+ u.chan.a = t;
+ t = u.chan.g;
+ u.chan.g = u.chan.b;
+ u.chan.b = t;
+ t = u.chan.r;
+ u.chan.r = u.chan.g;
+ u.chan.g = u.chan.b;
+ u.chan.b = u.chan.a;
+ u.chan.a = t;
+ p->pixels[i] = color_from_rgba(u.rgba);