#pragma once #include // Para uint32_t #include // Para memcpy #include #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); };