Image (Windows): support sixel protocol

This commit is contained in:
李通洲
2024-09-03 21:31:43 +08:00
parent d79bf0a460
commit aec27c3e50
+16 -28
View File
@@ -3,6 +3,7 @@
#include "common/printing.h"
#include "util/stringUtils.h"
#include "util/base64.h"
#include "detection/terminalsize/terminalsize.h"
#include <limits.h>
#include <math.h>
@@ -835,38 +836,25 @@ static bool printCached(FFLogoRequestData* requestData)
static bool getCharacterPixelDimensions(FFLogoRequestData* requestData)
{
#ifndef _WIN32
struct winsize winsize;
//Initialize every member to 0, because it isn't guaranteed that every terminal sets them all
memset(&winsize, 0, sizeof(struct winsize));
ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize);
if(winsize.ws_row == 0 || winsize.ws_col == 0)
ffGetTerminalResponse("\033[18t", "\033[8;%hu;%hut", &winsize.ws_row, &winsize.ws_col);
if(winsize.ws_row == 0 || winsize.ws_col == 0)
return false;
if(winsize.ws_ypixel == 0 || winsize.ws_xpixel == 0)
ffGetTerminalResponse("\033[14t", "\033[4;%hu;%hut", &winsize.ws_ypixel, &winsize.ws_xpixel);
requestData->characterPixelWidth = winsize.ws_xpixel / (double) winsize.ws_col;
requestData->characterPixelHeight = winsize.ws_ypixel / (double) winsize.ws_row;
#else
#ifdef _WIN32
CONSOLE_FONT_INFO cfi;
if(GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi) == FALSE) // Only works for ConHost
return false;
requestData->characterPixelWidth = cfi.dwFontSize.X;
requestData->characterPixelHeight = cfi.dwFontSize.Y;
if(GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi)) // Only works for ConHost
{
requestData->characterPixelWidth = cfi.dwFontSize.X;
requestData->characterPixelHeight = cfi.dwFontSize.Y;
}
if (requestData->characterPixelWidth > 1.0 && requestData->characterPixelHeight > 1.0)
return true;
#endif
FFTerminalSizeResult termSize = {};
if (ffDetectTerminalSize(&termSize))
{
requestData->characterPixelWidth = termSize.width / (double) termSize.columns;
requestData->characterPixelHeight = termSize.height / (double) termSize.rows;
}
return requestData->characterPixelWidth > 1.0 && requestData->characterPixelHeight > 1.0;
}