- Added screenshot app & service (PC-only for now) - Updated docs with screenshots and new device photo - Add fake statusbar icons for PC/sim build - added `lv_screenshot` library based on `lv_100ask_screenshot` from https://github.com/100askTeam/lv_lib_100ask - T-Deck WiFi is now allocated into SPI RAM - Created `tt_service_find()` to find services by their id
94 lines
2.6 KiB
C
94 lines
2.6 KiB
C
#include "save_bmp.h"
|
|
|
|
typedef struct tagBITMAPFILEHEADER {
|
|
uint16_t bfType;
|
|
uint32_t bfSize;
|
|
uint16_t bfReserved1;
|
|
uint16_t bfReserved2;
|
|
uint32_t bfOffBits;
|
|
} __attribute__((packed)) BITMAPFILEHEADER, *PBITMAPFILEHEADER;
|
|
|
|
typedef struct tagBITMAPINFOHEADER {
|
|
uint32_t biSize;
|
|
uint32_t biwidth;
|
|
uint32_t biheight;
|
|
uint16_t biPlanes;
|
|
uint16_t biBitCount;
|
|
uint32_t biCompression;
|
|
uint32_t biSizeImage;
|
|
uint32_t biXPelsPerMeter;
|
|
uint32_t biYPelsPerMeter;
|
|
uint32_t biClrUsed;
|
|
uint32_t biClrImportant;
|
|
} __attribute__((packed)) BITMAPINFOHEADER, *PBITMAPINFOHEADER;
|
|
|
|
typedef struct tagRGBQUAD {
|
|
uint8_t rgbBlue;
|
|
uint8_t rgbGreen;
|
|
uint8_t rgbRed;
|
|
uint8_t rgbReserved;
|
|
} __attribute__((packed)) RGBQUAD;
|
|
|
|
bool lve_screenshot_save_bmp_file(const uint8_t* image, uint32_t w, uint32_t h, uint32_t bpp, const char* filename) {
|
|
BITMAPFILEHEADER tBmpFileHead;
|
|
BITMAPINFOHEADER tBmpInfoHead;
|
|
|
|
uint32_t dwSize;
|
|
|
|
uint32_t bw;
|
|
lv_fs_file_t f;
|
|
|
|
memset(&tBmpFileHead, 0, sizeof(BITMAPFILEHEADER));
|
|
memset(&tBmpInfoHead, 0, sizeof(BITMAPINFOHEADER));
|
|
|
|
lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_WR);
|
|
if (res != LV_FS_RES_OK) {
|
|
LV_LOG_USER("Can't create output file %s", filename);
|
|
return false;
|
|
}
|
|
|
|
tBmpFileHead.bfType = 0x4d42;
|
|
tBmpFileHead.bfSize = 0x36 + w * h * (bpp / 8);
|
|
tBmpFileHead.bfOffBits = 0x00000036;
|
|
|
|
tBmpInfoHead.biSize = 0x00000028;
|
|
tBmpInfoHead.biwidth = w;
|
|
tBmpInfoHead.biheight = h;
|
|
tBmpInfoHead.biPlanes = 0x0001;
|
|
tBmpInfoHead.biBitCount = bpp;
|
|
tBmpInfoHead.biCompression = 0;
|
|
tBmpInfoHead.biSizeImage = w * h * (bpp / 8);
|
|
tBmpInfoHead.biXPelsPerMeter = 0;
|
|
tBmpInfoHead.biYPelsPerMeter = 0;
|
|
tBmpInfoHead.biClrUsed = 0;
|
|
tBmpInfoHead.biClrImportant = 0;
|
|
|
|
res = lv_fs_write(&f, &tBmpFileHead, sizeof(tBmpFileHead), &bw);
|
|
if (bw != sizeof(tBmpFileHead)) {
|
|
LV_LOG_USER("Can't write BMP File Head to %s", filename);
|
|
return false;
|
|
}
|
|
|
|
res = lv_fs_write(&f, &tBmpInfoHead, sizeof(tBmpInfoHead), &bw);
|
|
if (bw != sizeof(tBmpInfoHead)) {
|
|
LV_LOG_USER("Can't write BMP File Info Head to %s", filename);
|
|
return false;
|
|
}
|
|
|
|
dwSize = w * bpp / 8;
|
|
const uint8_t* pPos = image + (h - 1) * dwSize;
|
|
|
|
while (pPos >= image) {
|
|
res = lv_fs_write(&f, pPos, dwSize, &bw);
|
|
if (bw != dwSize) {
|
|
LV_LOG_USER("Can't write date to BMP File %s", filename);
|
|
return false;
|
|
}
|
|
pPos -= dwSize;
|
|
}
|
|
|
|
lv_fs_close(&f);
|
|
|
|
return true;
|
|
}
|