From bd02e5c6328866dd1b345de3f49079edbb018172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 15 Sep 2023 10:53:09 +0800 Subject: [PATCH] Logo: code refactor --- src/common/printing.c | 4 +- src/logo/image/image.c | 96 +++++++++++++++++++++--------------------- src/logo/logo.c | 10 ++--- 3 files changed, 52 insertions(+), 58 deletions(-) diff --git a/src/common/printing.c b/src/common/printing.c index 063127081..16b6de8ef 100644 --- a/src/common/printing.c +++ b/src/common/printing.c @@ -112,9 +112,7 @@ void ffPrintColor(const FFstrbuf* colorValue) if(colorValue->length == 0) return; - fputs("\033[", stdout); - ffStrbufWriteTo(colorValue, stdout); - fputc('m', stdout); + printf("\e[%sm", colorValue->chars); } void ffPrintCharTimes(char c, uint32_t times) diff --git a/src/logo/image/image.c b/src/logo/image/image.c index 6da5f4cfc..953d12f8d 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -11,7 +11,7 @@ #include #endif -static FFstrbuf base64Encode(FFstrbuf* in) +static FFstrbuf base64Encode(const FFstrbuf* in) { const char* base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @@ -37,8 +37,9 @@ static FFstrbuf base64Encode(FFstrbuf* in) static bool printImageIterm(void) { + const FFLogoOptions* options = &instance.config.logo; FF_STRBUF_AUTO_DESTROY buf = ffStrbufCreate(); - if(!ffAppendFileBuffer(instance.config.logo.source.chars, &buf)) + if(!ffAppendFileBuffer(options->source.chars, &buf)) { fputs("Logo: Failed to load image file\n", stderr); return false; @@ -49,28 +50,26 @@ static bool printImageIterm(void) FF_STRBUF_AUTO_DESTROY base64 = base64Encode(&buf); ffStrbufClear(&buf); - if (!instance.config.logo.width || !instance.config.logo.height) + if (!options->width || !options->height) { - if (!instance.config.logo.separate) + if (!options->separate) { ffStrbufAppendF(&buf, "\e[2J\e[3J\e[%u;%uH", - (unsigned) instance.config.logo.paddingTop, - (unsigned) instance.config.logo.paddingLeft + (unsigned) options->paddingTop, + (unsigned) options->paddingLeft ); } else { - for (uint32_t i = 0; i < instance.config.logo.paddingTop; ++i) - ffStrbufAppendC(&buf, '\n'); - for (uint32_t i = 0; i < instance.config.logo.paddingLeft; ++i) - ffStrbufAppendC(&buf, ' '); + ffStrbufAppendNC(&buf, options->paddingTop, '\n'); + ffStrbufAppendNC(&buf, options->paddingLeft, ' '); } ffStrbufAppendF(&buf, "\e]1337;File=inline=1:%s\a", base64.chars ); ffWriteFDBuffer(FFUnixFD2NativeFD(STDOUT_FILENO), &buf); - if (!instance.config.logo.separate) + if (!options->separate) { uint16_t X = 0, Y = 0; const char* error = ffGetTerminalResponse("\e[6n", "\e[%hu;%huR", &Y, &X); @@ -79,40 +78,37 @@ static bool printImageIterm(void) fprintf(stderr, "\nLogo (iterm): fail to query cursor position: %s\n", error); return true; // We already printed image logo, don't print ascii logo then } - instance.state.logoWidth = X + instance.config.logo.paddingRight; + instance.state.logoWidth = X + options->paddingRight; instance.state.logoHeight = Y; fputs("\e[H", stdout); } else { instance.state.logoWidth = instance.state.logoHeight = 0; - ffPrintCharTimes('\n', instance.config.logo.paddingRight); + ffPrintCharTimes('\n', options->paddingRight); } } else { - for (uint32_t i = 0; i < instance.config.logo.paddingTop; ++i) - ffStrbufAppendC(&buf, '\n'); - for (uint32_t i = 0; i < instance.config.logo.paddingLeft; ++i) - ffStrbufAppendC(&buf, ' '); + ffStrbufAppendNC(&buf, options->paddingTop, '\n'); + ffStrbufAppendNC(&buf, options->paddingLeft, ' '); ffStrbufAppendF(&buf, "\e]1337;File=inline=1;width=%u;height=%u;preserveAspectRatio=%u:%s\a\n", - (unsigned) instance.config.logo.width, - (unsigned) instance.config.logo.height, - (unsigned) instance.config.logo.preserveAspectRadio, + (unsigned) options->width, + (unsigned) options->height, + (unsigned) options->preserveAspectRadio, base64.chars ); - if (!instance.config.logo.separate) + if (!options->separate) { - instance.state.logoWidth = instance.config.logo.width + instance.config.logo.paddingLeft + instance.config.logo.paddingRight; - instance.state.logoHeight = instance.config.logo.paddingTop + instance.config.logo.height; + instance.state.logoWidth = options->width + options->paddingLeft + options->paddingRight; + instance.state.logoHeight = options->paddingTop + options->height; ffStrbufAppendF(&buf, "\e[%uA", (unsigned) instance.state.logoHeight); } else { instance.state.logoWidth = instance.state.logoHeight = 0; - for (uint32_t i = 0; i < instance.config.logo.paddingRight; ++i) - ffStrbufAppendC(&buf, '\n'); + ffStrbufAppendNC(&buf, options->paddingRight, '\n'); } ffWriteFDBuffer(FFUnixFD2NativeFD(STDOUT_FILENO), &buf); } @@ -122,26 +118,27 @@ static bool printImageIterm(void) static bool printImageKittyDirect(void) { - FF_STRBUF_AUTO_DESTROY base64 = base64Encode(&instance.config.logo.source); + const FFLogoOptions* options = &instance.config.logo; + FF_STRBUF_AUTO_DESTROY base64 = base64Encode(&options->source); - if (!instance.config.logo.width || !instance.config.logo.height) + if (!options->width || !options->height) { - if (!instance.config.logo.separate) + if (!options->separate) { // We must clear the entre screen to make sure that terminal buffer won't scroll up printf("\e[2J\e[3J\e[%u;%uH", - (unsigned) instance.config.logo.paddingTop, - (unsigned) instance.config.logo.paddingLeft + (unsigned) options->paddingTop, + (unsigned) options->paddingLeft ); } else { - ffPrintCharTimes('\n', instance.config.logo.paddingTop); - ffPrintCharTimes(' ', instance.config.logo.paddingLeft); + ffPrintCharTimes('\n', options->paddingTop); + ffPrintCharTimes(' ', options->paddingLeft); } printf("\e_Ga=T,f=100,t=f;%s\e\\", base64.chars); fflush(stdout); - if (!instance.config.logo.separate) + if (!options->separate) { uint16_t X = 0, Y = 0; const char* error = ffGetTerminalResponse("\e[6n", "\e[%hu;%huR", &Y, &X); @@ -150,36 +147,36 @@ static bool printImageKittyDirect(void) fprintf(stderr, "\nLogo (kitty-direct): fail to query cursor position: %s\n", error); return true; // We already printed image logo, don't print ascii logo then } - instance.state.logoWidth = X + instance.config.logo.paddingRight; + instance.state.logoWidth = X + options->paddingRight; instance.state.logoHeight = Y; fputs("\e[H", stdout); } else { instance.state.logoWidth = instance.state.logoHeight = 0; - ffPrintCharTimes('\n', instance.config.logo.paddingRight); + ffPrintCharTimes('\n', options->paddingRight); } } else { - ffPrintCharTimes('\n', instance.config.logo.paddingTop); - ffPrintCharTimes(' ', instance.config.logo.paddingLeft); + ffPrintCharTimes('\n', options->paddingTop); + ffPrintCharTimes(' ', options->paddingLeft); printf("\e_Ga=T,f=100,t=f,c=%u,r=%u;%s\e\\\n", - (unsigned) instance.config.logo.width, - (unsigned) instance.config.logo.height, + (unsigned) options->width, + (unsigned) options->height, base64.chars ); - if (!instance.config.logo.separate) + if (!options->separate) { - instance.state.logoWidth = instance.config.logo.width + instance.config.logo.paddingLeft + instance.config.logo.paddingRight; - instance.state.logoHeight = instance.config.logo.paddingTop + instance.config.logo.height; + instance.state.logoWidth = options->width + options->paddingLeft + options->paddingRight; + instance.state.logoHeight = options->paddingTop + options->height; printf("\e[%uA", (unsigned) instance.state.logoHeight); } else { instance.state.logoWidth = instance.state.logoHeight = 0; - ffPrintCharTimes('\n', instance.config.logo.paddingRight); + ffPrintCharTimes('\n', options->paddingRight); } } @@ -299,22 +296,23 @@ static void writeCacheUint32(FFLogoRequestData* requestData, uint32_t value, con static void printImagePixels(FFLogoRequestData* requestData, const FFstrbuf* result, const char* cacheFileName) { + const FFLogoOptions* options = &instance.config.logo; //Calculate character dimensions - instance.state.logoWidth = requestData->logoCharacterWidth + instance.config.logo.paddingLeft + instance.config.logo.paddingRight; - instance.state.logoHeight = requestData->logoCharacterHeight + instance.config.logo.paddingTop - 1; + instance.state.logoWidth = requestData->logoCharacterWidth + options->paddingLeft + options->paddingRight; + instance.state.logoHeight = requestData->logoCharacterHeight + options->paddingTop - 1; //Write cache files writeCacheStrbuf(requestData, result, cacheFileName); - if(instance.config.logo.width == 0) + if(options->width == 0) writeCacheUint32(requestData, requestData->logoCharacterWidth, FF_CACHE_FILE_WIDTH); - if(instance.config.logo.height == 0) + if(options->height == 0) writeCacheUint32(requestData, requestData->logoCharacterHeight, FF_CACHE_FILE_HEIGHT); //Write result to stdout - ffPrintCharTimes('\n', instance.config.logo.paddingTop); - ffPrintCharTimes(' ', instance.config.logo.paddingLeft); + ffPrintCharTimes('\n', options->paddingTop); + ffPrintCharTimes(' ', options->paddingLeft); fflush(stdout); ffWriteFDBuffer(FFUnixFD2NativeFD(STDOUT_FILENO), result); diff --git a/src/logo/logo.c b/src/logo/logo.c index 75a395ae9..8e52f318c 100644 --- a/src/logo/logo.c +++ b/src/logo/logo.c @@ -43,10 +43,8 @@ static void ffLogoPrintCharsRaw(const char* data, size_t length) } else { - for (uint32_t i = 0; i < options->paddingTop; ++i) - ffStrbufAppendC(&buf, '\n'); - for (uint32_t i = 0; i < options->paddingLeft; ++i) - ffStrbufAppendC(&buf, ' '); + ffStrbufAppendNC(&buf, options->paddingTop, '\n'); + ffStrbufAppendNC(&buf, options->paddingLeft, ' '); ffStrbufAppendNS(&buf, (uint32_t) length, data); instance.state.logoHeight = options->paddingTop + options->height; instance.state.logoWidth = options->paddingLeft + options->width + options->paddingRight; @@ -106,11 +104,11 @@ void ffLogoPrintChars(const char* data, bool doColorReplacement) } //We have an escape sequence direclty as bytes. We print it, but don't increase the line length - if(*data == '\033' && *(data + 1) == '[') + if(*data == '\e' && *(data + 1) == '[') { const char* start = data; - fputs("\033[", stdout); + fputs("\e[", stdout); data += 2; while(isdigit(*data) || *data == ';')