86 lines
1.7 KiB
C++
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);
|
|
}; |