blob: 2f69ae303778c1f79ef9a7eed8aee345ed9efd07 [file] [log] [blame]
#ifndef PUFFS_GIF_H
#define PUFFS_GIF_H
// Code generated by puffs-gen-c. DO NOT EDIT.
#ifndef PUFFS_BASE_HEADER_H
#define PUFFS_BASE_HEADER_H
// Use of this source code is governed by a BSD-style license that can be found
// in the LICENSE file.
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
// Puffs requires a word size of at least 32 bits because it assumes that
// converting a u32 to usize will never overflow. For example, the size of a
// decoded image is often represented, explicitly or implicitly in an image
// file, as a u32, and it is convenient to compare that to a buffer size.
//
// Similarly, the word size is at most 64 bits because it assumes that
// converting a usize to u64 will never overflow.
#if __WORDSIZE < 32
#error "Puffs requires a word size of at least 32 bits"
#elif __WORDSIZE > 64
#error "Puffs requires a word size of at most 64 bits"
#endif
// PUFFS_VERSION is the major.minor version number as a uint32. The major
// number is the high 16 bits. The minor number is the low 16 bits.
//
// The intention is to bump the version number at least on every API / ABI
// backwards incompatible change.
//
// For now, the API and ABI are simply unstable and can change at any time.
//
// TODO: don't hard code this in base-header.h.
#define PUFFS_VERSION (0x00001)
// puffs_base_buf1 is a 1-dimensional buffer (a pointer and length) plus
// additional indexes into that buffer.
//
// A value with all fields NULL or zero is a valid, empty buffer.
typedef struct {
uint8_t* ptr; // Pointer.
size_t len; // Length.
size_t wi; // Write index. Invariant: wi <= len.
size_t ri; // Read index. Invariant: ri <= wi.
bool closed; // No further writes are expected.
} puffs_base_buf1;
// puffs_base_limit1 provides a limited view of a 1-dimensional byte stream:
// its first N bytes. That N can be greater than a buffer's current read or
// write capacity. N decreases naturally over time as bytes are read from or
// written to the stream.
//
// A value with all fields NULL or zero is a valid, unlimited view.
typedef struct puffs_base_limit1 {
uint64_t* ptr_to_len; // Pointer to N.
struct puffs_base_limit1* next; // Linked list of limits.
} puffs_base_limit1;
typedef struct {
puffs_base_buf1* buf;
puffs_base_limit1 limit;
} puffs_base_reader1;
typedef struct {
puffs_base_buf1* buf;
puffs_base_limit1 limit;
} puffs_base_writer1;
#endif // PUFFS_BASE_HEADER_H
#ifdef __cplusplus
extern "C" {
#endif
// ---------------- Status Codes
// Status codes are int32_t values:
// - the sign bit indicates a non-recoverable status code: an error
// - bits 10-30 hold the packageid: a namespace
// - bits 8-9 are reserved
// - bits 0-7 are a package-namespaced numeric code
//
// Do not manipulate these bits directly. Use the API functions such as
// puffs_gif_status_is_error instead.
typedef int32_t puffs_gif_status;
#define puffs_gif_packageid 1017222 // 0x000f8586
#define PUFFS_GIF_STATUS_OK 0 // 0x00000000
#define PUFFS_GIF_ERROR_BAD_PUFFS_VERSION -2147483647 // 0x80000001
#define PUFFS_GIF_ERROR_BAD_RECEIVER -2147483646 // 0x80000002
#define PUFFS_GIF_ERROR_BAD_ARGUMENT -2147483645 // 0x80000003
#define PUFFS_GIF_ERROR_CONSTRUCTOR_NOT_CALLED -2147483644 // 0x80000004
#define PUFFS_GIF_ERROR_UNEXPECTED_EOF -2147483643 // 0x80000005
#define PUFFS_GIF_SUSPENSION_SHORT_READ 6 // 0x00000006
#define PUFFS_GIF_SUSPENSION_SHORT_WRITE 7 // 0x00000007
#define PUFFS_GIF_ERROR_CLOSED_FOR_WRITES -2147483640 // 0x80000008
#define PUFFS_GIF_ERROR_BAD_GIF_BLOCK -1105848320 // 0xbe161800
#define PUFFS_GIF_ERROR_BAD_GIF_EXTENSION_LABEL -1105848319 // 0xbe161801
#define PUFFS_GIF_ERROR_BAD_GIF_HEADER -1105848318 // 0xbe161802
#define PUFFS_GIF_ERROR_BAD_LZW_LITERAL_WIDTH -1105848317 // 0xbe161803
#define PUFFS_GIF_ERROR_TODO_UNSUPPORTED_LOCAL_COLOR_TABLE \
-1105848316 // 0xbe161804
#define PUFFS_GIF_ERROR_LZW_CODE_IS_OUT_OF_RANGE -1105848315 // 0xbe161805
#define PUFFS_GIF_ERROR_LZW_PREFIX_CHAIN_IS_CYCLICAL -1105848314 // 0xbe161806
bool puffs_gif_status_is_error(puffs_gif_status s);
const char* puffs_gif_status_string(puffs_gif_status s);
// ---------------- Public Consts
// ---------------- Structs
typedef struct {
// Do not access the private_impl's fields directly. There is no API/ABI
// compatibility or safety guarantee if you do so. Instead, use the
// puffs_gif_lzw_decoder_etc functions.
//
// In C++, these fields would be "private", but C does not support that.
//
// It is a struct, not a struct*, so that it can be stack allocated.
struct {
puffs_gif_status status;
uint32_t magic;
uint64_t scratch;
uint32_t f_literal_width;
uint8_t f_stack[4096];
uint8_t f_suffixes[4096];
uint16_t f_prefixes[4096];
struct {
uint32_t coro_susp_point;
uint32_t v_clear_code;
uint32_t v_end_code;
uint32_t v_save_code;
uint32_t v_prev_code;
uint32_t v_width;
uint32_t v_bits;
uint32_t v_n_bits;
uint32_t v_code;
uint32_t v_s;
uint32_t v_c;
} c_decode[1];
} private_impl;
} puffs_gif_lzw_decoder;
typedef struct {
// Do not access the private_impl's fields directly. There is no API/ABI
// compatibility or safety guarantee if you do so. Instead, use the
// puffs_gif_decoder_etc functions.
//
// In C++, these fields would be "private", but C does not support that.
//
// It is a struct, not a struct*, so that it can be stack allocated.
struct {
puffs_gif_status status;
uint32_t magic;
uint64_t scratch;
uint32_t f_width;
uint32_t f_height;
uint8_t f_background_color_index;
uint8_t f_gct[768];
puffs_gif_lzw_decoder f_lzw;
struct {
uint32_t coro_susp_point;
uint8_t v_c;
} c_decode[1];
struct {
uint32_t coro_susp_point;
uint8_t v_c[6];
uint32_t v_i;
} c_decode_header[1];
struct {
uint32_t coro_susp_point;
uint8_t v_c[7];
uint32_t v_i;
uint32_t v_gct_size;
} c_decode_lsd[1];
struct {
uint32_t coro_susp_point;
uint8_t v_label;
uint8_t v_block_size;
} c_decode_extension[1];
struct {
uint32_t coro_susp_point;
uint8_t v_c[9];
uint32_t v_i;
bool v_interlace;
uint8_t v_lw;
uint8_t v_block_size;
uint64_t l_lzw_src;
puffs_base_reader1 v_lzw_src;
} c_decode_id[1];
} private_impl;
} puffs_gif_decoder;
// ---------------- Public Constructor and Destructor Prototypes
// puffs_gif_lzw_decoder_constructor is a constructor function.
//
// It should be called before any other puffs_gif_lzw_decoder_* function.
//
// Pass PUFFS_VERSION and 0 for puffs_version and for_internal_use_only.
void puffs_gif_lzw_decoder_constructor(puffs_gif_lzw_decoder* self,
uint32_t puffs_version,
uint32_t for_internal_use_only);
void puffs_gif_lzw_decoder_destructor(puffs_gif_lzw_decoder* self);
// puffs_gif_decoder_constructor is a constructor function.
//
// It should be called before any other puffs_gif_decoder_* function.
//
// Pass PUFFS_VERSION and 0 for puffs_version and for_internal_use_only.
void puffs_gif_decoder_constructor(puffs_gif_decoder* self,
uint32_t puffs_version,
uint32_t for_internal_use_only);
void puffs_gif_decoder_destructor(puffs_gif_decoder* self);
// ---------------- Public Function Prototypes
puffs_gif_status puffs_gif_decoder_decode(puffs_gif_decoder* self,
puffs_base_writer1 a_dst,
puffs_base_reader1 a_src);
void puffs_gif_lzw_decoder_set_literal_width(puffs_gif_lzw_decoder* self,
uint32_t a_lw);
puffs_gif_status puffs_gif_lzw_decoder_decode(puffs_gif_lzw_decoder* self,
puffs_base_writer1 a_dst,
puffs_base_reader1 a_src);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // PUFFS_GIF_H