@@ -83,7 +83,11 @@ static inline bool checkAllocationResult(void* data, size_t length)
8383static 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
361372static 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