Load/store RGBA separately instead of using a typecast; close #197
This should fix problems on big-endian machines and with ILP64
This commit is contained in:
parent
59e0575c49
commit
e42b0b3022
22
qoi.h
22
qoi.h
@ -424,13 +424,12 @@ void *qoi_encode(const void *data, const qoi_desc *desc, int *out_len) {
|
|||||||
channels = desc->channels;
|
channels = desc->channels;
|
||||||
|
|
||||||
for (px_pos = 0; px_pos < px_len; px_pos += channels) {
|
for (px_pos = 0; px_pos < px_len; px_pos += channels) {
|
||||||
|
px.rgba.r = pixels[px_pos + 0];
|
||||||
|
px.rgba.g = pixels[px_pos + 1];
|
||||||
|
px.rgba.b = pixels[px_pos + 2];
|
||||||
|
|
||||||
if (channels == 4) {
|
if (channels == 4) {
|
||||||
px = *(qoi_rgba_t *)(pixels + px_pos);
|
px.rgba.a = pixels[px_pos + 3];
|
||||||
}
|
|
||||||
else {
|
|
||||||
px.rgba.r = pixels[px_pos + 0];
|
|
||||||
px.rgba.g = pixels[px_pos + 1];
|
|
||||||
px.rgba.b = pixels[px_pos + 2];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (px.v == px_prev.v) {
|
if (px.v == px_prev.v) {
|
||||||
@ -598,13 +597,12 @@ void *qoi_decode(const void *data, int size, qoi_desc *desc, int channels) {
|
|||||||
index[QOI_COLOR_HASH(px) % 64] = px;
|
index[QOI_COLOR_HASH(px) % 64] = px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pixels[px_pos + 0] = px.rgba.r;
|
||||||
|
pixels[px_pos + 1] = px.rgba.g;
|
||||||
|
pixels[px_pos + 2] = px.rgba.b;
|
||||||
|
|
||||||
if (channels == 4) {
|
if (channels == 4) {
|
||||||
*(qoi_rgba_t*)(pixels + px_pos) = px;
|
pixels[px_pos + 3] = px.rgba.a;
|
||||||
}
|
|
||||||
else {
|
|
||||||
pixels[px_pos + 0] = px.rgba.r;
|
|
||||||
pixels[px_pos + 1] = px.rgba.g;
|
|
||||||
pixels[px_pos + 2] = px.rgba.b;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user