Update qoi.h

This commit is contained in:
raysan5 2022-01-26 16:33:38 +01:00
parent e5ee69a0f5
commit 524bf57b74

26
src/external/qoi.h vendored
View file

@ -91,9 +91,9 @@ struct qoi_header_t {
uint8_t colorspace; // 0 = sRGB with linear alpha, 1 = all channels linear uint8_t colorspace; // 0 = sRGB with linear alpha, 1 = all channels linear
}; };
Images are encoded from top to bottom, left to right. The decoder and encoder Images are encoded row by row, left to right, top to bottom. The decoder and
start with {r: 0, g: 0, b: 0, a: 255} as the previous pixel value. An image is encoder start with {r: 0, g: 0, b: 0, a: 255} as the previous pixel value. An
complete when all pixels specified by width * height have been covered. image is complete when all pixels specified by width * height have been covered.
Pixels are encoded as Pixels are encoded as
- a run of the previous pixel - a run of the previous pixel
@ -135,8 +135,8 @@ The possible chunks are:
2-bit tag b00 2-bit tag b00
6-bit index into the color index array: 0..63 6-bit index into the color index array: 0..63
A valid encoder must not issue 7 or more consecutive QOI_OP_INDEX chunks to the A valid encoder must not issue 2 or more consecutive QOI_OP_INDEX chunks to the
index 0, to avoid confusion with the 8 byte end marker. same index. QOI_OP_RUN should be used instead.
.- QOI_OP_DIFF -----------. .- QOI_OP_DIFF -----------.
@ -156,6 +156,8 @@ so "1 - 2" will result in 255, while "255 + 1" will result in 0.
Values are stored as unsigned integers with a bias of 2. E.g. -2 is stored as Values are stored as unsigned integers with a bias of 2. E.g. -2 is stored as
0 (b00). 1 is stored as 3 (b11). 0 (b00). 1 is stored as 3 (b11).
The alpha value remains unchanged from the previous pixel.
.- QOI_OP_LUMA -------------------------------------. .- QOI_OP_LUMA -------------------------------------.
| Byte[0] | Byte[1] | | Byte[0] | Byte[1] |
@ -171,8 +173,8 @@ Values are stored as unsigned integers with a bias of 2. E.g. -2 is stored as
The green channel is used to indicate the general direction of change and is The green channel is used to indicate the general direction of change and is
encoded in 6 bits. The red and blue channels (dr and db) base their diffs off encoded in 6 bits. The red and blue channels (dr and db) base their diffs off
of the green channel difference and are encoded in 4 bits. I.e.: of the green channel difference and are encoded in 4 bits. I.e.:
dr_dg = (last_px.r - cur_px.r) - (last_px.g - cur_px.g) dr_dg = (cur_px.r - prev_px.r) - (cur_px.g - prev_px.g)
db_dg = (last_px.b - cur_px.b) - (last_px.g - cur_px.g) db_dg = (cur_px.b - prev_px.b) - (cur_px.g - prev_px.g)
The difference to the current channel values are using a wraparound operation, The difference to the current channel values are using a wraparound operation,
so "10 - 13" will result in 253, while "250 + 7" will result in 1. so "10 - 13" will result in 253, while "250 + 7" will result in 1.
@ -180,6 +182,8 @@ so "10 - 13" will result in 253, while "250 + 7" will result in 1.
Values are stored as unsigned integers with a bias of 32 for the green channel Values are stored as unsigned integers with a bias of 32 for the green channel
and a bias of 8 for the red and blue channel. and a bias of 8 for the red and blue channel.
The alpha value remains unchanged from the previous pixel.
.- QOI_OP_RUN ------------. .- QOI_OP_RUN ------------.
| Byte[0] | | Byte[0] |
@ -206,6 +210,8 @@ QOI_OP_RGBA tags.
8-bit green channel value 8-bit green channel value
8-bit blue channel value 8-bit blue channel value
The alpha value remains unchanged from the previous pixel.
.- QOI_OP_RGBA ---------------------------------------------------. .- QOI_OP_RGBA ---------------------------------------------------.
| Byte[0] | Byte[1] | Byte[2] | Byte[3] | Byte[4] | | Byte[0] | Byte[1] | Byte[2] | Byte[3] | Byte[4] |
@ -242,7 +248,7 @@ The colorspace in this qoi_desc is an enum where
1 = all channels are linear 1 = all channels are linear
You may use the constants QOI_SRGB or QOI_LINEAR. The colorspace is purely You may use the constants QOI_SRGB or QOI_LINEAR. The colorspace is purely
informative. It will be saved to the file header, but does not affect informative. It will be saved to the file header, but does not affect
en-/decoding in any way. */ how chunks are en-/decoded. */
#define QOI_SRGB 0 #define QOI_SRGB 0
#define QOI_LINEAR 1 #define QOI_LINEAR 1
@ -352,14 +358,14 @@ typedef union {
static const unsigned char qoi_padding[8] = {0,0,0,0,0,0,0,1}; static const unsigned char qoi_padding[8] = {0,0,0,0,0,0,0,1};
void qoi_write_32(unsigned char *bytes, int *p, unsigned int v) { static void qoi_write_32(unsigned char *bytes, int *p, unsigned int v) {
bytes[(*p)++] = (0xff000000 & v) >> 24; bytes[(*p)++] = (0xff000000 & v) >> 24;
bytes[(*p)++] = (0x00ff0000 & v) >> 16; bytes[(*p)++] = (0x00ff0000 & v) >> 16;
bytes[(*p)++] = (0x0000ff00 & v) >> 8; bytes[(*p)++] = (0x0000ff00 & v) >> 8;
bytes[(*p)++] = (0x000000ff & v); bytes[(*p)++] = (0x000000ff & v);
} }
unsigned int qoi_read_32(const unsigned char *bytes, int *p) { static unsigned int qoi_read_32(const unsigned char *bytes, int *p) {
unsigned int a = bytes[(*p)++]; unsigned int a = bytes[(*p)++];
unsigned int b = bytes[(*p)++]; unsigned int b = bytes[(*p)++];
unsigned int c = bytes[(*p)++]; unsigned int c = bytes[(*p)++];