Skip to content

Commit 9986918

Browse files
logo-height option
1 parent 64e5ef0 commit 9986918

File tree

4 files changed

+54
-26
lines changed

4 files changed

+54
-26
lines changed

src/common/init.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ static void defaultConfig(FFinstance* instance)
109109
for(uint8_t i = 0; i < (uint8_t) FASTFETCH_LOGO_MAX_COLORS; ++i)
110110
ffStrbufInit(&instance->config.logoColors[i]);
111111
instance->config.logoWidth = 65;
112+
instance->config.logoHeight = 0; //preserve aspect ratio
112113
instance->config.logoPaddingLeft = 0;
113114
instance->config.logoPaddingRight = 4;
114115
instance->config.logoPrintRemaining = true;

src/fastfetch.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
759759
}
760760
else if(strcasecmp(key, "--logo-width") == 0)
761761
instance->config.logoWidth = optionParseUInt32(key, value);
762+
else if(strcasecmp(key, "--logo-height") == 0)
763+
instance->config.logoHeight = optionParseUInt32(key, value);
762764
else if(strcasecmp(key, "--logo-padding") == 0)
763765
{
764766
uint32_t padding = optionParseUInt32(key, value);

src/fastfetch.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ typedef struct FFconfig
4848
FFLogoType logoType;
4949
FFstrbuf logoColors[FASTFETCH_LOGO_MAX_COLORS];
5050
uint32_t logoWidth;
51+
uint32_t logoHeight;
5152
uint32_t logoPaddingLeft;
5253
uint32_t logoPaddingRight;
5354
bool logoPrintRemaining;

src/logo/image/image.c

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,11 @@ static inline bool checkAllocationResult(void* data, size_t length)
8383
static void finishPrinting(FFinstance* instance, const FFLogoRequestData* requestData)
8484
{
8585
instance->state.logoWidth = (uint32_t) (requestData->imagePixelWidth / requestData->characterPixelWidth) + instance->config.logoPaddingLeft + instance->config.logoPaddingRight;
86-
instance->state.logoHeight = (uint32_t) (requestData->imagePixelHeight / requestData->characterPixelHeight);
86+
87+
if(instance->config.logoHeight == 0)
88+
instance->state.logoHeight = (uint32_t) (requestData->imagePixelHeight / requestData->characterPixelHeight);
89+
else
90+
instance->state.logoHeight = instance->config.logoHeight;
8791

8892
//Seems to be required on all consoles that support sixel. TBH i don't know why.
8993
if(requestData->type == FF_LOGO_TYPE_SIXEL)
@@ -110,13 +114,16 @@ static void writeResult(FFinstance* instance, FFLogoRequestData* requestData, co
110114
ffWriteFileContent(requestData->cacheDir.chars, result);
111115
ffStrbufSubstrBefore(&requestData->cacheDir, cacheDirLength);
112116

113-
//Write height cache file
114-
ffStrbufAppendS(&requestData->cacheDir, FF_CACHE_FILE_HEIGHT);
115-
FFstrbuf content;
116-
content.chars = (char*) &requestData->imagePixelHeight;
117-
content.length = sizeof(requestData->imagePixelHeight);
118-
ffWriteFileContent(requestData->cacheDir.chars, &content);
119-
ffStrbufSubstrBefore(&requestData->cacheDir, cacheDirLength);
117+
//If no custom height is given, we need to save the height in "height" file
118+
if(instance->config.logoHeight == 0)
119+
{
120+
ffStrbufAppendS(&requestData->cacheDir, FF_CACHE_FILE_HEIGHT);
121+
FFstrbuf content;
122+
content.chars = (char*) &requestData->imagePixelHeight;
123+
content.length = sizeof(requestData->imagePixelHeight);
124+
ffWriteFileContent(requestData->cacheDir.chars, &content);
125+
ffStrbufSubstrBefore(&requestData->cacheDir, cacheDirLength);
126+
}
120127

121128
//Write escape codes to stdout
122129
finishPrinting(instance, requestData);
@@ -295,13 +302,17 @@ FFLogoImageResult ffLogoPrintImageImpl(FFinstance* instance, FFLogoRequestData*
295302
return FF_LOGO_IMAGE_RESULT_RUN_ERROR;
296303
}
297304

298-
//imagePixelWidth is set in ffLogoPrintImageIfExists
299-
requestData->imagePixelHeight = (uint32_t) ((requestData->imagePixelWidth / (double) originalImage->columns) * (double) originalImage->rows);
300-
if(requestData->imagePixelHeight < 1)
305+
//imagePixelWidth is always set in ffLogoPrintImageIfExists
306+
//imagePixelHeigght is set, if a custom one is given. Otherwise calculate right aspect ratio here
307+
if(requestData->imagePixelHeight == 0)
301308
{
302-
ffDestroyImage(originalImage);
303-
ffDestroyExceptionInfo(imageData.exceptionInfo);
304-
return FF_LOGO_IMAGE_RESULT_RUN_ERROR;
309+
requestData->imagePixelHeight = (uint32_t) ((requestData->imagePixelWidth / (double) originalImage->columns) * (double) originalImage->rows);
310+
if(requestData->imagePixelHeight == 0)
311+
{
312+
ffDestroyImage(originalImage);
313+
ffDestroyExceptionInfo(imageData.exceptionInfo);
314+
return FF_LOGO_IMAGE_RESULT_RUN_ERROR;
315+
}
305316
}
306317

307318
if(instance->config.logoType != FF_LOGO_TYPE_CHAFA)
@@ -360,21 +371,25 @@ static int getCacheFD(FFLogoRequestData* requestData, const char* fileName)
360371

361372
static bool printCached(FFinstance* instance, FFLogoRequestData* requestData)
362373
{
363-
uint32_t cacheDirLength = requestData->cacheDir.length;
364-
ffStrbufAppendS(&requestData->cacheDir, FF_CACHE_FILE_HEIGHT);
374+
//If no custom height is given, read the height from file
375+
if(requestData->imagePixelHeight == 0)
376+
{
377+
uint32_t cacheDirLength = requestData->cacheDir.length;
378+
ffStrbufAppendS(&requestData->cacheDir, FF_CACHE_FILE_HEIGHT);
365379

366-
FFstrbuf content;
367-
ffStrbufInitA(&content, sizeof(requestData->imagePixelHeight) + 1); // +1 because strbuf is null terminated
368-
memset(content.chars, 0, sizeof(requestData->imagePixelHeight));
380+
FFstrbuf content;
381+
ffStrbufInitA(&content, sizeof(requestData->imagePixelHeight) + 1); // +1 because strbuf is null terminated
382+
memset(content.chars, 0, sizeof(requestData->imagePixelHeight));
369383

370-
ffAppendFileContent(requestData->cacheDir.chars, &content);
371-
memcpy(&requestData->imagePixelHeight, content.chars, sizeof(requestData->imagePixelHeight));
384+
ffAppendFileContent(requestData->cacheDir.chars, &content);
385+
memcpy(&requestData->imagePixelHeight, content.chars, sizeof(requestData->imagePixelHeight));
372386

373-
ffStrbufDestroy(&content);
374-
ffStrbufSubstrBefore(&requestData->cacheDir, cacheDirLength);
387+
ffStrbufDestroy(&content);
388+
ffStrbufSubstrBefore(&requestData->cacheDir, cacheDirLength);
375389

376-
if(requestData->imagePixelHeight < 1)
377-
return false;
390+
if(requestData->imagePixelHeight == 0)
391+
return false;
392+
}
378393

379394
int fd;
380395
if(requestData->type == FF_LOGO_TYPE_KITTY)
@@ -446,6 +461,15 @@ FFLogoImageResult ffLogoPrintImageIfExists(FFinstance* instance, FFLogoType type
446461
if(requestData.imagePixelWidth < 1)
447462
return FF_LOGO_IMAGE_RESULT_RUN_ERROR;
448463

464+
if(instance->config.logoHeight > 0)
465+
{
466+
requestData.imagePixelHeight = (uint32_t) (instance->config.logoHeight * requestData.characterPixelHeight);
467+
if(requestData.imagePixelHeight == 0)
468+
return FF_LOGO_IMAGE_RESULT_RUN_ERROR;
469+
}
470+
else
471+
requestData.imagePixelHeight = 0;
472+
449473
ffStrbufInitA(&requestData.cacheDir, PATH_MAX * 2);
450474
ffStrbufAppend(&requestData.cacheDir, &instance->state.cacheDir);
451475
ffStrbufAppendS(&requestData.cacheDir, "images");
@@ -461,7 +485,7 @@ FFLogoImageResult ffLogoPrintImageIfExists(FFinstance* instance, FFLogoType type
461485
if(!ffStrbufEndsWithC(&requestData.cacheDir, '/'))
462486
ffStrbufAppendC(&requestData.cacheDir, '/');
463487

464-
ffStrbufAppendF(&requestData.cacheDir, "%u", requestData.imagePixelWidth);
488+
ffStrbufAppendF(&requestData.cacheDir, "%u*%u", requestData.imagePixelWidth, requestData.imagePixelHeight);
465489
ffStrbufAppendC(&requestData.cacheDir, '/');
466490

467491
if(!instance->config.recache && printCached(instance, &requestData))

0 commit comments

Comments
 (0)