Files
coffee_crisis_arcade_edition/source/gif.h
2025-03-15 19:20:04 +01:00

86 lines
1.7 KiB
C++

#pragma once
#include <cstdint> // Para uint32_t
#include <cstring> // Para memcpy
#include <vector>
#define EXTENSION_INTRODUCER 0x21
#define IMAGE_DESCRIPTOR 0x2C
#define TRAILER 0x3B
#define GRAPHIC_CONTROL 0xF9
#define APPLICATION_EXTENSION 0xFF
#define COMMENT_EXTENSION 0xFE
#define PLAINTEXT_EXTENSION 0x01
#define READ(dst, size) \
memcpy(dst, buffer, size); \
buffer += size
struct ScreenDescriptor
{
uint16_t width;
uint16_t height;
uint8_t fields;
uint8_t background_color_index;
uint8_t pixel_aspect_ratio;
};
struct RGB
{
uint8_t r, g, b;
};
struct ImageDescriptor
{
uint16_t image_left_position;
uint16_t image_top_position;
uint16_t image_width;
uint16_t image_height;
uint8_t fields;
};
struct DictionaryEntry
{
uint8_t byte;
int prev;
int len;
};
struct Extension
{
uint8_t extension_code;
uint8_t block_size;
};
struct GraphicControlExtension
{
uint8_t fields;
uint16_t delay_time;
uint8_t transparent_color_index;
};
struct ApplicationExtension
{
uint8_t application_id[8];
uint8_t version[3];
};
struct PlaintextExtension
{
uint16_t left, top, width, height;
uint8_t cell_width, cell_height;
uint8_t foreground_color, background_color;
};
class Gif
{
public:
void uncompress(int code_length, const uint8_t *input, int input_length, uint8_t *out);
uint32_t *LoadPalette(uint8_t *buffer);
uint8_t *LoadGif(uint8_t *buffer, uint16_t *w, uint16_t *h);
private:
int read_sub_blocks(uint8_t *buffer, uint8_t **data);
uint8_t *process_image_descriptor(uint8_t *buffer, RGB *gct, int gct_size, int resolution_bits);
uint8_t *process_gif_stream(uint8_t *buffer, uint16_t *w, uint16_t *h);
};