tinyimg 1.0.0
Lightweight image manipulation library for Cloudflare Workers
Loading...
Searching...
No Matches
util.h
Go to the documentation of this file.
1
11#pragma once
12
13#include <stddef.h>
14#include <stdint.h>
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
20#pragma region math
21
28float tiny_fabsf(float x);
29
36float tiny_sqrtf(float x);
37
44float tiny_floorf(float x);
45
52float tiny_ceilf(float x);
53
60float tiny_truncf(float x);
61
68float tiny_roundf(float x);
69
80float tiny_fmodf(float x, float y);
81
92float tiny_expf(float x);
93
105float tiny_logf(float x);
106
120float tiny_powf(float x, float y);
121
131float tiny_sinf(float x);
132
142float tiny_cosf(float x);
143
151float tiny_atan2f(float y, float x);
152
159static inline uint8_t tiny_clamp_u8(int32_t v) {
160 return (uint8_t) (v < 0 ? 0 : (v > 255 ? 255 : v));
161}
162
169static inline uint8_t tiny_clamp_u8f(float v) {
170 return (uint8_t) (v <= 0.0f ? 0
171 : (v >= 255.0f ? 255 : (int32_t) (v + 0.5f)));
172}
173
182static inline float tiny_clampf(float v, float lo, float hi) {
183 return v < lo ? lo : (v > hi ? hi : v);
184}
185
194static inline int32_t tiny_clampi(int32_t v, int32_t lo, int32_t hi) {
195 return v < lo ? lo : (v > hi ? hi : v);
196}
197
205static inline uint32_t tiny_min_u32(uint32_t a, uint32_t b) {
206 return a < b ? a : b;
207}
208
216static inline uint32_t tiny_max_u32(uint32_t a, uint32_t b) {
217 return a > b ? a : b;
218}
219
220#pragma endregion
221
222#pragma region lookup tables
223
229void tiny_lut_identity(uint8_t* lut);
230
241void tiny_lut_gamma(uint8_t* lut, float gamma);
242
254void tiny_lut_srgb(uint8_t* lut, int encode);
255
269 uint8_t* out, const uint8_t* first, const uint8_t* second
270);
271
272#pragma endregion
273
274#pragma region checksums
275
290uint32_t tiny_crc32(uint32_t crc, const uint8_t* data, size_t size);
291
305uint32_t tiny_adler32(uint32_t adler, const uint8_t* data, size_t size);
306
307#pragma endregion
308
309#pragma region strings
310
317size_t tiny_strlen(const char* s);
318
327int tiny_strcmp(const char* a, const char* b);
328
340int tiny_strcopy(char* dest, const char* src, size_t capacity);
341
342#pragma endregion
343
344#pragma region huffman
345
374 const uint32_t* frequencies, uint32_t count, uint32_t limit,
375 uint8_t* lengths
376);
377
378#pragma endregion
379
380#pragma region byte writer
381
389typedef struct {
391 uint8_t* data;
393 size_t size;
395 size_t capacity;
397 int error;
398} TinyWriter;
399
408int tiny_writer_init(TinyWriter* writer, size_t initial);
409
416
426uint8_t* tiny_writer_detach(TinyWriter* writer, size_t* size);
427
435int tiny_writer_reserve(TinyWriter* writer, size_t extra);
436
445int tiny_writer_write(TinyWriter* writer, const void* bytes, size_t size);
446
455int tiny_writer_fill(TinyWriter* writer, uint8_t value, size_t count);
456
464int tiny_writer_u8(TinyWriter* writer, uint8_t value);
465
473int tiny_writer_le16(TinyWriter* writer, uint16_t value);
474
482int tiny_writer_le32(TinyWriter* writer, uint32_t value);
483
491int tiny_writer_be16(TinyWriter* writer, uint16_t value);
492
500int tiny_writer_be32(TinyWriter* writer, uint32_t value);
501
507uint32_t tiny_writer_sizeof(void);
508
515uint8_t* tiny_writer_data(const TinyWriter* writer);
516
523uint32_t tiny_writer_size(const TinyWriter* writer);
524
525#pragma endregion
526
527#pragma region bit io
528
547typedef struct {
549 const uint8_t* data;
551 size_t size;
553 size_t pos;
555 uint32_t accumulator;
557 uint32_t count;
564 uint32_t phantom;
568
576void tiny_bits_init(TinyBitReader* reader, const uint8_t* data, size_t size);
577
585uint32_t tiny_bits_msb(TinyBitReader* reader, uint32_t count);
586
597uint32_t tiny_bits_peek_msb(TinyBitReader* reader, uint32_t count);
598
606uint32_t tiny_bits_lsb(TinyBitReader* reader, uint32_t count);
607
615uint32_t tiny_bits_peek_lsb(TinyBitReader* reader, uint32_t count);
616
623void tiny_bits_skip_msb(TinyBitReader* reader, uint32_t count);
624
631void tiny_bits_skip_lsb(TinyBitReader* reader, uint32_t count);
632
643
653
660size_t tiny_bits_remaining(const TinyBitReader* reader);
661
669typedef struct {
673 uint32_t accumulator;
675 uint32_t count;
677
685
693void tiny_bitwriter_msb(TinyBitWriter* writer, uint32_t value, uint32_t count);
694
702void tiny_bitwriter_lsb(TinyBitWriter* writer, uint32_t value, uint32_t count);
703
712
719
720#pragma endregion
721
722#ifdef __cplusplus
723}
724#endif
Reads a bitstream out of a byte buffer.
Definition util.h:547
uint32_t count
Definition util.h:557
const uint8_t * data
Definition util.h:549
uint32_t phantom
How many of those bits came from past the end of the buffer.
Definition util.h:564
int overrun
Definition util.h:566
size_t pos
Definition util.h:553
size_t size
Definition util.h:551
uint32_t accumulator
Definition util.h:555
Writes a bitstream into a TinyWriter.
Definition util.h:669
uint32_t count
Definition util.h:675
TinyWriter * out
Definition util.h:671
uint32_t accumulator
Definition util.h:673
A grow on demand byte sink.
Definition util.h:389
size_t capacity
Definition util.h:395
uint8_t * data
Definition util.h:391
size_t size
Definition util.h:393
int error
Definition util.h:397
void tiny_bitwriter_lsb(TinyBitWriter *writer, uint32_t value, uint32_t count)
Writes bits, least significant first.
uint32_t tiny_writer_sizeof(void)
Size of a TinyWriter, for a host allocating one across the ABI.
uint8_t * tiny_writer_data(const TinyWriter *writer)
Pointer to a writer's bytes.
float tiny_expf(float x)
Exponential of x.
float tiny_floorf(float x)
Largest integral value not greater than x.
float tiny_fabsf(float x)
Absolute value of a float.
int tiny_writer_write(TinyWriter *writer, const void *bytes, size_t size)
Appends raw bytes.
void tiny_lut_srgb(uint8_t *lut, int encode)
Fills a 256 entry table with the sRGB transfer function.
float tiny_truncf(float x)
Integral part of x, discarding the fraction.
int tiny_writer_le16(TinyWriter *writer, uint16_t value)
Appends a 16 bit value, little endian.
int tiny_writer_le32(TinyWriter *writer, uint32_t value)
Appends a 32 bit value, little endian.
size_t tiny_bits_remaining(const TinyBitReader *reader)
Bytes not yet consumed, counting only whole bytes past the head.
void tiny_lut_identity(uint8_t *lut)
Fills a 256 entry table with the identity mapping.
void tiny_bits_skip_lsb(TinyBitReader *reader, uint32_t count)
Discards bits already examined with a least significant first peek.
uint32_t tiny_bits_msb(TinyBitReader *reader, uint32_t count)
Reads bits, most significant first.
float tiny_ceilf(float x)
Smallest integral value not less than x.
int tiny_huffman_lengths(const uint32_t *frequencies, uint32_t count, uint32_t limit, uint8_t *lengths)
Builds length limited Huffman code lengths from symbol frequencies.
void tiny_bitwriter_init(TinyBitWriter *writer, TinyWriter *out)
Points a bit writer at a byte sink.
int tiny_writer_be16(TinyWriter *writer, uint16_t value)
Appends a 16 bit value, big endian.
uint32_t tiny_bits_lsb(TinyBitReader *reader, uint32_t count)
Reads bits, least significant first.
int tiny_writer_be32(TinyWriter *writer, uint32_t value)
Appends a 32 bit value, big endian.
size_t tiny_strlen(const char *s)
Length of a NUL terminated string.
uint8_t * tiny_writer_detach(TinyWriter *writer, size_t *size)
Detaches a writer's buffer, handing ownership to the caller.
void tiny_writer_free(TinyWriter *writer)
Releases a writer's buffer.
void tiny_bits_align_lsb(TinyBitReader *reader)
Drops the partial byte at the read head of a least significant first stream.
void tiny_bits_skip_msb(TinyBitReader *reader, uint32_t count)
Discards bits already examined with a most significant first peek.
int tiny_writer_init(TinyWriter *writer, size_t initial)
Prepares a writer, optionally reserving space up front.
int tiny_strcmp(const char *a, const char *b)
Compares two NUL terminated strings.
void tiny_lut_compose(uint8_t *out, const uint8_t *first, const uint8_t *second)
Composes two 256 entry tables into one.
int tiny_writer_fill(TinyWriter *writer, uint8_t value, size_t count)
Appends the same byte repeatedly.
uint32_t tiny_crc32(uint32_t crc, const uint8_t *data, size_t size)
Computes a running CRC-32 over a buffer.
void tiny_bits_align_msb(TinyBitReader *reader)
Drops the partial byte at the read head of a most significant first stream.
float tiny_roundf(float x)
Nearest integral value, halfway cases rounded away from zero.
float tiny_sinf(float x)
Sine of x.
void tiny_bits_init(TinyBitReader *reader, const uint8_t *data, size_t size)
Points a bit reader at a buffer.
void tiny_bitwriter_flush_msb(TinyBitWriter *writer)
Flushes a most significant bit first stream, padding with one bits.
int tiny_writer_u8(TinyWriter *writer, uint8_t value)
Appends one byte.
void tiny_lut_gamma(uint8_t *lut, float gamma)
Fills a 256 entry table with a gamma curve.
float tiny_fmodf(float x, float y)
Floating point remainder of x/y, with the sign of x.
uint32_t tiny_adler32(uint32_t adler, const uint8_t *data, size_t size)
Computes a running Adler-32 over a buffer.
float tiny_cosf(float x)
Cosine of x.
uint32_t tiny_bits_peek_msb(TinyBitReader *reader, uint32_t count)
Reads bits without consuming them, most significant first.
float tiny_atan2f(float y, float x)
Angle of the vector (x, y) from the positive x axis.
uint32_t tiny_writer_size(const TinyWriter *writer)
Number of bytes a writer holds.
void tiny_bitwriter_msb(TinyBitWriter *writer, uint32_t value, uint32_t count)
Writes bits, most significant first.
float tiny_sqrtf(float x)
Square root of a float.
float tiny_powf(float x, float y)
x raised to the power y.
int tiny_strcopy(char *dest, const char *src, size_t capacity)
Copies a string into a fixed buffer, always terminating it.
float tiny_logf(float x)
Natural logarithm of x.
void tiny_bitwriter_flush_lsb(TinyBitWriter *writer)
Flushes a least significant bit first stream, padding with zero bits.
uint32_t tiny_bits_peek_lsb(TinyBitReader *reader, uint32_t count)
Reads bits without consuming them, least significant first.
int tiny_writer_reserve(TinyWriter *writer, size_t extra)
Reserves capacity for at least extra more bytes.