
    
3j5                         S SK r S SKrS SKrS SKJrJrJr  SSKJr  SSKJ	r	J
r
Jr   " S S5      rS r " S	 S
5      r\\/rg)    N)Image	ImageDraw	ImageFont   )log)	comfy_dir	font_path
pil2tensorc                   >    \ rS rSrSr\S 5       rSrSrSr	S
S jr
S	rg)MTB_UnsplashImage:   z)Unsplash Image given a keyword and a sizec                 J    SSSSSS.4SSSSSS.4SSSSSS.4S.S	S
SS040S.$ )NINT     r      )defaultmaxminstepg     j@)widthheightrandom_seedkeywordSTRINGr   naturerequiredoptional clss    E/home/wildlama/comfy/ComfyUI/custom_nodes/comfy_mtb/nodes/generate.pyINPUT_TYPESMTB_UnsplashImage.INPUT_TYPES=   si    
  #DAF
  #DAF
  !#aC  Hy(&;<
 	
    IMAGEdo_unsplash_imagemtb/generateNc                     SnU(       a  U(       a  USU SU 3-  nU(       a  UR                  SS5      nUSU SU 3-  nOUSU 3-  n [        R                  " S	U 35        [        R                  " U5      nUR                  5         [        R                  " [        R                  " UR                  5      5      n[        U5      4$ ! [        R                  R                   a  n[        S
U5         S nAgS nAff = f)Nz#https://source.unsplash.com/random//x z%20?&z?&zGetting unsplash image from zError retrieving image:N)replacer   debugrequestsgetraise_for_statusr   openioBytesIOcontentr
   
exceptionsRequestExceptionprint)	selfr   r   r   r   base_urlresponseimagees	            r#   r)   #MTB_UnsplashImage.do_unsplash_imageW   s    8V!E7!F8,,Hooc51G!G9Ak]33H"[M**H	II4XJ?@||H-H%%'JJrzz(*:*:;<E  ""33 	+Q/	s   
A>C	 	C='C88C=r    r1   )__name__
__module____qualname____firstlineno____doc__classmethodr$   RETURN_TYPESFUNCTIONCATEGORYr)   __static_attributes__r    r&   r#   r   r   :   s-    3
 
* L"HHr&   r   c                 "    U u  pp4X1-
  nXB-
  nXV4$ r1   r    )bboxleftupperrightlowerr   r   s          r#   bbox_dimrT   s   s"     $DLE]F=r&   c                   z    \ rS rSrSr0 rSrS r\S 5       r	\S 5       r
SrSrS	rS
 r        SS\4S jjrSrg)MTB_TextToImage}   znUtils to convert text to image using a font.

The tool looks for any .ttf file in the Comfy folder hierarchy.
z# Text to Image

This node look for any font files in comfy_dir/fonts.
by default it fallsback to a default font.

![img](https://i.imgur.com/3GT92hy.gif)
c                     g r1   r    )r>   s    r#   __init__MTB_TextToImage.__init__   s     	r&   c                    / SQn[         /nU Hf  n [        R                  " 5       (       a*  UR                  [        R                  " SU 35      5        MH  [
        R                  " S[         S35        Mh     U HG  n[
        R                  " SU 35        UR                  5       [        R                  UR                  '   MI     g ! [         a$  n[
        R                  " SU 35         S nAM  S nAff = f)N)z*.ttfz*.otfz*.woffz*.woff2z*.eotz	fonts/**/z
Directory z does not exist.zError during font caching: zAdding font )r	   r   existsextendglobr   warn	Exceptionerrorr3   as_posixrV   fontsstem)r"   font_extensionsrc   	extensionrB   fonts         r#   CACHE_FONTSMTB_TextToImage.CACHE_FONTS   s    J(I=##%%LL)I;0G!HIHHz)4DEF ) DIITF+,/3}}O!!$)),   =		7s;<<=s   ACC
C4C//C4c                    U R                   (       d  U R                  5         O-[        R                  " S[	        U R                   5       S35        SSS04[        U R                   R                  5       5      4SSS04SSS04SS	S
SS.4SSSSSS.4SSSSSS.4SSSSSS.4SSSS.4SSSS.4SSS04SSS04SS
S
SSS.4SS
S
SSS.4SSSSSS.4S.SSS SS!SS.4SS"S#S$SS.4S%.S&.$ )'NzUsing cached fonts (count: )r   r   zHello world!BOOLEANTFLOAT      ?r   g?)r   r   r   r       r   i	  )r   r   r   r   r   r   COLORblack	MTB_COLOR)r   
widgetTypewhite)rP   centerrR   rP   )topru   bottomrv   d   )textrg   wraptrimline_height	font_sizer   r   color
backgroundh_alignv_alignh_offsetv_offset
h_coverage)WHISPER_CHUNKS   <         ?g        g      @)whisper_chunksfpsfade_durationr   )rc   rh   r   r3   lensortedkeysr!   s    r#   r$   MTB_TextToImage.INPUT_TYPES   s   yyOOII3C		N3C1EF / !!125"Y$56"Y$56 #As; 
  "1T1E
  #AdAF
  #AdAF
  '{C
  '{C 8)V9LM7)U9KL !!D!D
  !!D!D
  #Ac1EU.` #6 "1RC
  #CSI"
a;
 ;	
r&   r'   text_to_imager*   c
           
         U(       a  UR                  S5      (       d  U/$ / n
US   S   S   S   n[        X-  5      n[        X-  5      n[        U5       GH  nX-  nUR                  5       n[        R
                  " U5      n/ nUS    Hj  nUS   u  nnUUs=::  a  U::  d  M  O  M  [        SUU-
  U-  U-  5      n[        SUU-
  U-  U-  5      n[        UU5      nUR                  US   U45        Ml     US-  nU H  u  nn[        R                  " SXg4S	5      n[        R
                  " U5      nUR                  US
-  U4UUUSS9  UR                  [        R                  " [        R                  " Xv45      US-  -  R                  5       R!                  5       5      5        [        R"                  " UU5      nUUS-  -  nM     U
R                  U5        GM     U
$ )z,Create animation frames from Whisper chunks.chunks	timestampr   rn   ry      RGBAr   r   r   r   r   mm)rg   fillanchor   g      ?)r5   intrangecopyr   Drawr   appendr   newry   putalpha	fromarraytorchonesbytenumpyalpha_composite)r>   r   
base_imagerg   r}   r~   r   r   r   r   framestotal_durationframe_countfade_frames	frame_idxtimeframedrawactive_chunkschunkstartendfade_in_alphafade_out_alphaalphayry   text_img	text_draws                                r#   create_animation_frames'MTB_TextToImage.create_animation_frames   s    VZZ11<)"-k:1=../--.{+I?DOO%E>>%(DM)";/
sD'C''$'dUlc1K?%M &)sTzS.@;.N%ON~>E!((%-)?@ * !A,e 99Ve_lK%NN84	aZO   !!OOVO4D --eX>Y_$-  -0 MM% S ,V r&   Nry   c                 r  ^^^^^^^^	^^^^^^+ SSK m+SSKJn  U R                  T   n[        R
                  " UTS9m [        T	[        5      (       a  UR                  T	5      m	[        U
[        5      (       a  UR                  U
5      n
[        T	5      S:X  a  T	S-   m	[        U
5      S:X  a  U
S-   n
SU	UUUUUUUU+UUUUU4S
 jjn[        R                  " STT4U
5      nU(       Gak  UR                  S5      (       GaT  / nUS   S   S   S   n[!        UU-  5      n[!        UU-  5      n[#        U5       H  nUU-  nUR%                  5       n/ nUS    Hj  n U S   u  n!n"U!Us=::  a  U"::  d  M  O  M  ['        SUU!-
  U-  U-  5      n#['        SU"U-
  U-  U-  5      n$['        U#U$5      n%UR)                  U S   U%45        Ml     U HD  u  n&n%U" U&R+                  SS5      R-                  5       U%5      n'[        R.                  " UU'5      nMF     UR)                  U5        M     U Vs/ s H  n[1        U5      PM     n(n[2        R4                  " U(SS94$ U" U5      n)[        R.                  " UU)5      n*[1        U*5      4$ ! [         a(  n[        R                  " SU 35        Sm	S	n
 SnAGNSnAff = fs  snf )z7Convert text to image, with optional animation support.r   N)
ImageColor)size   )r   zColor parsing error: )r   r   r   r   )r   r   r   r   c           	      d  > T(       a  U R                  5       n T(       a  TS-  T-  T-  S-  nTR                  XS9nOU /n[        R                  " STT4S5      n[        R
                  " U5      nTT-  nTS:X  a  TnO2TS:X  a  TU[        U5      -  -
  S-  T-   nOTU[        U5      -  -
  T-
  nU4S jnU Hs  n	U" U	5      n
TS	:X  a  TnOTS:X  a  TU
-
  S-  T-   nOTU
-
  T-
  nTnUb*  [        [        TS S
 5      [        UTS
   -  5      /-   5      nUR                  X4XTS9  Xv-  nMu     U$ )Nrx   r   )r   r   r   rv   ru   c                 p   > [        TS5      (       a  TR                  U 5      S   $ TR                  U 5      $ )Ngetsizer   )hasattrr   	getlength)linerg   s    r#   	get_widthEMTB_TextToImage.text_to_image.<locals>.render_text.<locals>.get_widtho  s3    4++<<-a00>>$//r&   rP   r   )r   rg   )striprz   r   r   r   r   r   tuplelistr   ry   )text_to_renderr   
wrap_widthlinesimgr   line_height_pxy_textr   r   
line_widthx_text
text_colorr~   rg   r}   r   r   r   r   r|   textwrapr{   r   r   r   rz   s                r#   render_text2MTB_TextToImage.text_to_image.<locals>.render_textX  st   !/!5!5!7 %z9YF!K
 nG'())FUFO\BC>>#&D(94N%!H$~E
:;A !NSZ$?@HL0 &t_
f$%F($z1a78CF#j0H<F"
$!&U2AY3uuQx/?+@*AA"J 		6*D	M(! $ Jr&   r   r   r   r   r   rn   ry   asciiignore)dimr1   )r   PILr   rc   r   truetype
isinstancestrgetrgbr   
ValueErrorr   ra   r   r   r5   r   r   r   r   r   encodedecoder   r
   r   cat),r>   ry   rg   rz   r{   r|   r}   r   r   r~   r   r   r   r   r   r   r   r   r   r   r	   rB   r   base_imgr   r   r   r   r   r   r   r   r   r   r   r   r   r   
chunk_text	chunk_imgframe_tensorsr   resultr   s,     ```````` `````                           @r#   r   MTB_TextToImage.text_to_image,  s   , 	"JJt$	!!))<	(%%%"))%0*c**'..z:
5zQ:!#'&0
/	 /	 /	b 99VeV_jAn00::F+H5b9+FqINns23Kmc12K";/	 3  "+H5E!&{!3JE3+++(+$,#!5!C) *-#*!3k!A* !$M> B%,,eFmU-CD 6 *7%J +"))'8<CCEu!I "11%CE	 *7 e$/ 02 =CCF5Z.FMCIIm355"4(H**8X>Fv&((y  	(II-aS12(E'J	(n Ds   A4I? 'J4?
J1	J,,J1r    )rP   rv   r   r   rx   Nr   r   )rD   rE   rF   rG   rH   rc   DESCRIPTIONrY   rI   rh   r$   rJ   rK   rL   r   r   r   rM   r    r&   r#   rV   rV   }   s    
 EK
 ? ?" @
 @
D LHH@\ 'C)C) C)r&   rV   )r8   r4   r   r   r   r   r   r   utilsr   r	   r
   r   rT   rV   	__nodes__r    r&   r#   <module>r      sJ    	   + +  4 4d6 6rr) r)l	 	r&   