diff options
| author | Clement Sibille <clements+git@lisible.xyz> | 2024-03-05 16:02:17 +0900 |
|---|---|---|
| committer | Clement Sibille <clements+git@lisible.xyz> | 2024-03-05 16:45:45 +0900 |
| commit | bb6f08f3c79efc7bb7877aca97cebd3dab8b7838 (patch) | |
| tree | 9b3405e607c1f746a7061730adcf831c50a9f70b /lisiblepng/src/bitstream.c | |
| parent | e1e5b4e92bcd460b43ce1b852560751b6525593e (diff) | |
Implement PNG decompression
This patch adds PNG decompression for images without interlacing and
without alpha channel.
Only basic image data is supported. Background, transparency, gamma,
paletted images are not supported.
Diffstat (limited to 'lisiblepng/src/bitstream.c')
| -rw-r--r-- | lisiblepng/src/bitstream.c | 53 |
1 files changed, 0 insertions, 53 deletions
diff --git a/lisiblepng/src/bitstream.c b/lisiblepng/src/bitstream.c deleted file mode 100644 index e7ddb79..0000000 --- a/lisiblepng/src/bitstream.c +++ /dev/null @@ -1,53 +0,0 @@ -#include "bitstream.h" -#include "assert.h" - -#define MAX(x, y) (((x) > (y)) ? (x) : (y)) -#define MIN(x, y) (((x) < (y)) ? (x) : (y)) - -void Bitstream_init(Bitstream *bitstream, const uint8_t *data, - size_t data_size) { - ASSERT(bitstream != NULL); - ASSERT(data != NULL); - bitstream->data = data; - bitstream->data_size = data_size; - bitstream->current_byte_index = 0; - bitstream->current_bit_offset = 0; -} - -void bitstream_advance(Bitstream *bitstream, size_t bit_count) { - ASSERT(bitstream != NULL); - uint8_t current_bit = bitstream->current_bit_offset; - bitstream->current_byte_index = - bitstream->current_byte_index + (current_bit + bit_count) / 8; - bitstream->current_bit_offset = (current_bit + bit_count) % 8; -} - -void Bitstream_skip(Bitstream *bitstream, size_t bit_count) { - ASSERT(bitstream != NULL); - bitstream_advance(bitstream, bit_count); -} - -uint16_t Bitstream_next_bits(Bitstream *bitstream, int bit_count) { - ASSERT(bitstream != NULL); - ASSERT(bit_count <= 16); - ASSERT((bitstream->current_bit_offset + (size_t)bit_count) / 8 <= - bitstream->data_size); - - int bit_to_read = bit_count; - uint16_t val = bitstream->data[bitstream->current_byte_index] >> - bitstream->current_bit_offset; - - size_t bit_read = MIN(bit_count, 8 - bitstream->current_bit_offset); - bitstream_advance(bitstream, bit_read); - bit_to_read -= bit_read; - while (bit_to_read > 0) { - val |= (bitstream->data[bitstream->current_byte_index] >> - bitstream->current_bit_offset) - << bit_read; - bit_read = MIN(bit_to_read, 8 - bitstream->current_bit_offset); - bitstream_advance(bitstream, bit_read); - bit_to_read -= bit_read; - } - - return (val & ((1 << bit_count) - 1)); -} |
