#include <AnimatedGIF.h> // Подключение библиотеки для работы с GIF-изображениями
AnimatedGIF gif; // Создание объекта для работы с GIF-изображениями
#include "badgers.h" // Подключение заголовочного файла с данными GIF-изображения
#include <TFT_eSPI.h>
#include <SPI.h> // this is needed for display
// The display also uses hardware SPI, plus #9 & #10
#define TFT_CS 15
#define TFT_DC 2
#define TFT_MOSI 23
#define TFT_SCLK 18
TFT_eSPI tft = TFT_eSPI(); // Создаем объект tft для управления экраном с использованием библиотеки TFT_eSPI
void setup(void) {
Serial.begin(115200); // Инициализация последовательного порта для вывода отладочной информации
tft.begin(); // Инициализация экрана
tft.setRotation(1); // Устанавливаем ориентацию экрана
tft.fillScreen(TFT_BLACK); // Заполняем экран черным цветом
tft.setSwapBytes(true); // Если не правильно отображаются цвета, нужно включить эту настройку библиотки
tft.setTextSize(2); // Устанавливаем размер текста
tft.setTextColor(TFT_GREEN); // Устанавливаем цвет текста
//gif.begin(GIF_PALETTE_RGB565_BE); // Устанавливаем тип выходных данных в формате RGB565 big-endian (совместимый с SPI LCDs)
//gif.begin(BIG_ENDIAN_PIXELS);
}
void loop() {
long lTime;
int iFrames;
if (gif.open((uint8_t *)badgers, sizeof(badgers), GIFDraw)) {
Serial.printf("Successfully opened GIF; Canvas size = %d x %d\n", gif.getCanvasWidth(), gif.getCanvasHeight());
// Allocate an internal buffer to hold the full canvas size
// In this case, 128x128 = 16k of RAM
if (gif.allocFrameBuf(GIFAlloc) == GIF_SUCCESS) {
gif.setDrawType(GIF_DRAW_COOKED); // мы хотим, чтобы библиотека генерировала готовые пиксели
lTime = micros();
iFrames = 0;
tft.startWrite();
while (gif.playFrame(true, NULL)) {
iFrames++;
}
lTime = micros() - lTime;
Serial.printf("total decode time for %d frames = %d us\n", iFrames, (int)lTime);
gif.freeFrameBuf(GIFFree);
} else {
Serial.println("Insufficient memory!");
}
gif.close();
tft.endWrite();
}
}
void GIFDraw(GIFDRAW *pDraw) {
if (pDraw->y == 0) { // set the memory window when the first line is rendered
tft.setAddrWindow(pDraw->iX, pDraw->iY, pDraw->iWidth, pDraw->iHeight);
}
tft.pushPixels(pDraw->pPixels, pDraw->iWidth);
}
// memory allocation callback function
void * GIFAlloc(uint32_t u32Size) {
return malloc(u32Size);
}
// memory free callback function
void GIFFree(void *p) {
free(p);
}