
    3j                     \   S SK Jr  S SKrS SKrS SKJs  Jr  S SK	J
r
  S SKrS SKJr  S SKJrJr  S SKrS SKrS SKrS SKJr  S SKrS SKJrJr  S SKJr   " S	 S
\R:                  5      rS\R>                  4S\ S\!4S jjr" " S S\R:                  5      r# " S S\R:                  5      r$ " S S\R:                  5      r% " S S\R:                  5      r& " S S\'\5      r(S\RR                  S\*4S jr+S\RR                  S\*S\RR                  4S jr,S\RR                  S\*S\RR                  4S jr-S\RR                  S\!S\'S\RR                  4S  jr.SDS\RR                  S!\ S"\ S\'S#\'S\RR                  4S$ jjr/S\RR                  S%\ S\'S\RR                  4S& jr0S\RR                  S'\ S\'S\RR                  4S( jr1S\RR                  S)\!S\'S\RR                  4S* jr2S\RR                  S+\RR                  S\'S#\'S\RR                  4
S, jr3S\RR                  S-\ S\'S\RR                  4S. jr4 " S/ S0\R:                  5      r5S1\6\RR                     S\RR                  S-  4S2 jr7S3\6\RR                     S\RR                  S-  4S4 jr8S5\6\9\'\RR                  4      S\9\'\RR                  4   S-  4S6 jr: " S7 S8\R:                  5      r; " S9 S:\R:                  5      r< " S; S<\R:                  5      r= " S= S>\R:                  5      r> " S? S@\R:                  5      r? " SA SB\5      r@S\@4SC jrAg)E    )overrideN)Image)Enum)	TypedDictLiteral)reshape_latent_to)ComfyExtensionio)MAX_RESOLUTIONc                       \ rS rSr\S 5       r\S\R                  S\R                  S\S\	S\
R                  4
S j5       r\S	 5       r\S
 5       rSrg)Blend   c                 h   [         R                  " SS/SSS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  SS	S
SSS9[         R
                  R                  S/ SQS9/[         R                  R                  5       /S9$ )N
ImageBlendz
mix imageszBlend Imagesimage/filtersImage Toolsimage1image2blend_factor      ?              ?{Gz?defaultminmaxstep
blend_mode)normalmultiplyscreenoverlay
soft_light
differenceoptions)node_idsearch_aliasesdisplay_namecategoryessentials_categoryinputsoutputs)r
   Schemar   InputFloatComboOutputclss    B/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_post_processing.pydefine_schemaBlend.define_schema   s    yy (>'$ -x(x(~sSWX|5|}	 !
 	
    r   r   r   r   returnc                    [         R                  " X5      u  pUR                  UR                  5      nUR                  UR                  :w  ab  UR                  SSSS5      n[        R                  R                  X!R                  S   UR                  S   SSS9nUR                  SSSS5      nU R                  XU5      nUSU-
  -  XS-  -   n[        R                  " USS5      n[        R                  " U5      $ )Nr            bicubiccenter)upscale_methodcrop)node_helpersimage_alpha_fixtodeviceshapepermutecomfyutilscommon_upscaler   torchclampr
   
NodeOutput)r5   r   r   r   r   blended_images         r6   executeBlend.execute&   s    %55fE6==)<<6<<'^^Aq!Q/F[[//QVWir  zB/  CF^^Aq!Q/FvzB!l"23m6RRM1a8}}]++r9   c           	         US:X  a  U$ US:X  a  X-  $ US:X  a  SSU-
  SU-
  -  -
  $ US:X  a0  [         R                  " US:*  SU-  U-  SSSU-
  -  SU-
  -  -
  5      $ US:X  aK  [         R                  " US:*  USSU-  -
  U-  SU-
  -  -
  USU-  S-
  U R                  U5      U-
  -  -   5      $ US	:X  a  X-
  $ [        S
U 35      e)Nr    r!   r"   r=   r#   r   r>   r$   r%   zUnsupported blend mode: )rL   whereg
ValueError)r5   img1img2modes       r6   r   Blend.blend_mode4   s   8KZ;XDQX...Y;;ts{AHtOQa$hSTW[S[A\=\]]\!;;ts{DADLD3HAPTH3U,UW[_`cg_gjk_kpspupuvzp{  C  qC  _D  XD  E  E\!;3D6:;;r9   c                 ~    [         R                  " US:*  SU-  S-
  U-  S-   U-  [         R                  " U5      5      $ )Ng      ?         )rL   rS   sqrt)r5   xs     r6   rT   Blend.gD   s8    {{19Qq'81'<&A5::a=QQr9    N)__name__
__module____qualname____firstlineno__classmethodr7   rL   Tensorfloatstrr
   rN   rP   r   rT   __static_attributes__ra   r9   r6   r   r      s    
 
$ ,U\\ ,5<< ,u ,be ,jljwjw , , < < R Rr9   r   kernel_sizesigmac           
      B   [         R                  " [         R                  " SSXS9[         R                  " SSXS9SS9u  pE[         R                  " XD-  XU-  -   5      n[         R                  " Xf-  * SU-  U-  -  5      nXwR                  5       -  R                  U5      $ )Nr=   )rF   ij)indexingg       @)rL   meshgridlinspacer^   expsumrE   )rk   rl   rF   dtyper_   ydrT   s           r6   gaussian_kernelrx   H   s    >>%..QKU^^\^`acnM~  JN  ODA

1515=!A		AE(cEkE123AKE""r9   c            	       p    \ rS rSr\S 5       r\S\R                  S\S\	S\
R                  4S j5       rSrg	)
BlurN   c                 (   [         R                  " SSS[         R                  R                  S5      [         R                  R                  SSSSSS9[         R
                  R                  S	S
SSSS9/[         R                  R                  5       /S9$ )N	ImageBlurz
Blur Imager   imageblur_radiusr=      r   rl   r   皙?      $@r(   r*   r+   r-   r.   r
   r/   r   r0   Intr1   r3   r4   s    r6   r7   Blur.define_schemaO   sz    yy%$w']A1"1Mw$SQ !
 	
r9   r~   r   rl   r:   c                    US:X  a  [         R                  " U5      $ UR                  [        R                  R                  5       5      nUR                  u  pEpgUS-  S-   n[        XUR                  UR                  S9R                  USS5      R                  S5      n	UR                  SSSS5      n[        R                  " XX"U4S5      n
[        R                  " XUS-  US9S S 2S S 2X"* 2X"* 24   nUR                  SSSS5      n[         R                  " UR                  [        R                  R!                  5       5      5      $ )Nr   r>   r=   rF   ru   r<   reflectpaddinggroups)r
   rN   rE   rI   model_managementget_torch_devicerG   rx   rF   ru   repeat	unsqueezerH   Fpadconv2dintermediate_device)r5   r~   r   rl   
batch_sizeheightwidthchannelsrk   kernelpadded_imageblurreds               r6   rP   Blur.execute_   s<   !==''//@@BC.3kk+
E!Ao) ELLPUP[P[\ccdlnoqrs}}~  AaAq)uuU$UW`a((<9IRZ[\]^_`klx`x  {F  GS  {S  ]S  T//!Q1-}}WZZ(>(>(R(R(TUVVr9   ra   Nrb   rc   rd   re   rf   r7   rL   rg   intrh   r
   rN   rP   rj   ra   r9   r6   rz   rz   N   sR    
 
 WELL Ws W5 WR]] W Wr9   rz   c            	           \ rS rSr\S 5       r\S 5       r\S\R                  S\
S\S\R                  4S j5       rS	rg
)Quantizer   c                 &   [         R                  " SSS[         R                  R                  S5      [         R                  R                  SSSSSS9[         R
                  R                  S	/ S
QS9/[         R                  R                  5       /S9$ )NImageQuantizezQuantize Imager   r~   colors   r=   r   dither)nonefloyd-steinbergzbayer-2zbayer-4zbayer-8zbayer-16r&   r   )r
   r/   r   r0   r   r2   r3   r4   s    r6   r7   Quantize.define_schemas   su    yy#)$w'XssKx1yz !
 	
r9   c                   ^ U4S jm[        UR                  5       5      S-  nSU-  n[        [        R                  " U5      5      n[
        R                  " UT" U5      -  S-   5      n[
        R                  " [        R                  " U 5      R                  [        R                  5      5      n[        R                  " UR                  S   UR                  S   -  5      n[        R                  " UR                  S   UR                  S   -  5      n	UR                  X5      R                  S5      n
UR                  U
S UR                  S   2S UR                  S   24   5      R!                  SS5        UR#                  [
        R$                  S	9n[&        R(                  " UR+                  5       R-                  5       5      n U R/                  U[&        R0                  R2                  S
9n U $ )Nc                    > U S:X  a  [         R                  " SS5      $ SU -  nUT" U S-
  5      -  n[         R                  " US-
  US-   4US-   US-
  445      U-  $ )Nr   )r=   r=   float32r]   r=   g      ?r   )npzerosbmat)nqmnormalized_bayer_matrixs      r6   r   /Quantize.bayer.<locals>.normalized_bayer_matrix   si    Avxxy11F/A66ww3#3#?@1DDr9   r<      r   r   r=   rn      ru   paletter   )len
getpaletter   mathlog2rL   
from_numpyr   arrayastyper   ceilrG   tiler   add_clamp_rE   uint8r   	fromarraycpunumpyquantizeDitherNONE)impal_imorder
num_colorsspreadbayer_nbayer_matrixresulttwthtiled_matrixr   s              @r6   bayerQuantize.bayer   s   	E **,-2
:%dii&'''1H1Q(QTW(WX!!"((2,"5"5bjj"ABYYv||A););A)>>?YYv||A););A)>>?#((0::2>L!1&,,q/!12B6<<?2B!BCDKKAsS-__VZZ\//12[[0A0A[B	r9   r~   r   r   r:   c                 2   UR                   u  pEpg[        R                  " U5      n[        U5       GHM  n	[        R
                  " X   S-  R                  [        R                  5      R                  5       SS9n
U
R                  US9nUS:X  a)  U
R                  U[        R                  R                  S9nOxUS:X  a)  U
R                  U[        R                  R                  S9nOIUR                  S5      (       a3  [        UR                  S	5      S
   5      n[         R#                  XU5      n[        R$                  " [&        R(                  " WR+                  S5      5      5      R-                  5       S-  nXU	'   GMP     [.        R0                  " U5      $ )Nr   RGB)rX   )r   r   r   r   r   -rn   )rG   rL   
zeros_likeranger   r   rE   r   r   r   r   r   FLOYDSTEINBERG
startswithr   splitr   r   tensorr   r   convertrh   r
   rN   )r5   r~   r   r   r   r   r   _r   br   r   quantized_imager   quantized_arrays                  r6   rP   Quantize.execute   s9   ',{{$
E!!%(z"A%(S.!4!4U[[!A!G!G!IPUVB[[[/F"$++fU\\EVEV+"W,,"$++fU\\E`E`+"a""7++FLL-b12"*..U"C#ll288O4K4KE4R+STZZ\_bbO'1I #  }}V$$r9   ra   N)rb   rc   rd   re   rf   r7   staticmethodr   rL   rg   r   ri   r
   rN   rP   rj   ra   r9   r6   r   r   r   s`    
 
  2 %ELL %# %s %r}} % %r9   r   c                   t    \ rS rSr\S 5       r\S\R                  S\S\	S\	S\
R                  4
S j5       rS	rg
)Sharpen   c                 n   [         R                  " SSS[         R                  R                  S5      [         R                  R                  SSSSSSS	9[         R
                  R                  S
SSSSSS	9[         R
                  R                  SSSSSSS	9/[         R                  R                  5       /S9$ )NImageSharpenzSharpen Imager   r~   sharpen_radiusr=   r   T)r   r   r   r   advancedrl   r   r   r   r   alphar   g      @r   r   r4   s    r6   r7   Sharpen.define_schema   s    yy"($w'-qaRaZ^_w$T\`aw#D[_`	 !
 	
r9   r~   r   rl   r   r:   c                 H   US:X  a  [         R                  " U5      $ UR                  u  pVpxUR                  [        R
                  R                  5       5      nUS-  S-   n	[        XUR                  UR                  S9US-  * -  n
U
R                  UR                  S9n
U	S-  nXU4   U
R                  5       -
  S-   XU4'   U
R                  USS5      R                  S5      n
UR                  SSSS5      n[        R                  " XX"U4S	5      n[        R                   " XXS
9S S 2S S 2X"* 2X"* 24   nUR                  SSSS5      n["        R$                  " USS5      n[         R                  " UR                  [        R
                  R'                  5       5      5      $ )Nr   r>   r=   r   
   r   r   r<   r   r   )r
   rN   rG   rE   rI   r   r   rx   rF   ru   rt   r   r   rH   r   r   r   rL   rM   r   )r5   r~   r   rl   r   r   r   r   r   rk   r   r@   tensor_image	sharpenedr   s                  r6   rP   Sharpen.execute   s   Q==''.3kk+
E//@@BC$q(1, ELLPUP[P[\afgiai_jj-!!'!7&**,!F!Lv~xA.88;}}Q1a0uu\>Yg+hjstHH\6STUVWXfgvXv  yG  HW  yW  UW  X	%%aAq1	Y1-}}VYYu'='='Q'Q'STUUr9   ra   Nr   ra   r9   r6   r   r      s^    
 
  VELL V# VU VSX V]_]j]j V Vr9   r   c                   `    \ rS rSr/ SQrSS/r\S 5       r\S\R                  4S j5       r
Srg	)
ImageScaleToTotalPixels   znearest-exactbilineararear?   lanczosdisabledr@   c                 v   [         R                  " SSS[         R                  R                  S5      [         R                  R                  SU R
                  S9[         R                  R                  SSS	S
S	S9[         R                  R                  SSSSSS9/[         R                  R                  5       /S9$ )Nr   zScale Image to Total Pixelszimage/upscalingr~   rA   r&   
megapixelsr   r         0@r   resolution_stepsr=   r   T)r   r   r   r   r   )	r
   r/   r   r0   r2   upscale_methodsr1   r   r3   r4   s    r6   r7   %ImageScaleToTotalPixels.define_schema   s    yy-6&w'/9L9LM|SdSWX/sUYZ	 !
 	
r9   r:   c                    UR                  SS5      nUS-  S-  n[        R                  " XeR                  S   UR                  S   -  -  5      n[	        UR                  S   U-  U-  5      U-  n[	        UR                  S   U-  U-  5      U-  n	[
        R                  R                  U[        U5      [        U	5      US5      n
U
R                  SS5      n
[        R                  " U
5      $ )Nrn   r=      r<   r>   r   )movedimr   r^   rG   roundrI   rJ   rK   r   r
   rN   )r5   r~   rA   r   r  samplestotalscale_byr   r   ss              r6   rP   ImageScaleToTotalPixels.execute   s    --1%T!D(99UmmA&6q9I&IJKgmmA&14DDEHXXw}}Q'(25EEFIYYKK&&wE
CKYcdIIaO}}Qr9   ra   N)rb   rc   rd   re   r  crop_methodsrf   r7   r
   rN   rP   rj   ra   r9   r6   r   r      sB    QO)L
 
  
 R]] 
  
 r9   r   c                   8    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrg)
ResizeTyper   zscale by multiplierzscale dimensionszscale longer dimensionzscale shorter dimensionzscale widthzscale heightzscale total pixelsz
match sizezscale to multiplera   N)rb   rc   rd   re   SCALE_BYSCALE_DIMENSIONSSCALE_LONGER_DIMENSIONSCALE_SHORTER_DIMENSIONSCALE_WIDTHSCALE_HEIGHTSCALE_TOTAL_PIXELS
MATCH_SIZESCALE_TO_MULTIPLErj   ra   r9   r6   r  r     s4    $H)57K!L-J+r9   r  inputr:   c                 2    [        U R                  5      S:H  $ )Nr]   )r   rG   )r  s    r6   is_imager    s     u{{q  r9   is_type_imagec                 ^    U(       a  U R                  SS5      n U $ U R                  S5      n U $ )Nrn   r=   )r  r   r  r  s     r6   init_image_mask_inputr     s1    b!$ L "Lr9   c                 ^    U(       a  U R                  SS5      n U $ U R                  S5      n U $ Nr=   rn   )r  squeezer  s     r6   finalize_image_mask_inputr$    s1    a$ L a Lr9   
multiplierscale_methodc                     [        U 5      n[        X5      n [        U R                  S   U-  5      n[        U R                  S   U-  5      n[        R
                  R                  XXRS5      n [        X5      n U $ Nrn   r   )r  r   r  rG   rI   rJ   rK   r$  )r  r%  r&  r  r   r   s         r6   r  r    sj    UOM!%7E%++b/J./E5;;r?Z/0FKK&&uV:VE%e;ELr9   r   r   rB   c                    US:X  a  US:X  a  U $ [        U 5      n[        X5      n US:X  a6  [        S[        U R                  S   U-  U R                  S   -  5      5      nO;US:X  a5  [        S[        U R                  S   U-  U R                  S   -  5      5      n[
        R                  R                  XX#U5      n [        X5      n U $ )Nr   r=   rn   r)  )	r  r   r   r  rG   rI   rJ   rK   r$  )r  r   r   r&  rB   r  s         r6   scale_dimensionsr+  (  s    zfkUOM!%7EzAuU[[_v5BGHI	1Qekk"o5BGHIKK&&uV4PE%e;ELr9   longer_sizec                 .   [        U 5      n[        X5      n U R                  S   nU R                  S   nXT:  a  [        XE-  U-  5      nUnOXE:  a  [        XT-  U-  5      nUnOUnUn[        R
                  R                  XXRS5      n [        X5      n U $ r(  r  r   rG   r  rI   rJ   rK   r$  )r  r,  r&  r  r   r   s         r6   scale_longer_dimensionr/  7  s    UOM!%7EKKOE[[_F~u~45	+56KK&&uV:VE%e;ELr9   shorter_sizec                 .   [        U 5      n[        X5      n U R                  S   nU R                  S   nXT:  a  [        XE-  U-  5      nUnOXE:  a  [        XT-  U-  5      nUnOUnUn[        R
                  R                  XXRS5      n [        X5      n U $ r(  r.  )r  r0  r&  r  r   r   s         r6   scale_shorter_dimensionr2  K  s    UOM!%7EKKOE[[_F~u~56	,67KK&&uV:VE%e;ELr9   r   c                    [        U 5      n[        X5      n [        US-  S-  5      n[        R                  " X@R
                  S   U R
                  S   -  -  5      n[        U R
                  S   U-  5      n[        U R
                  S   U-  5      n[        R                  R                  XXrS5      n [        X5      n U $ )Nr  rn   r)  r   )r  r   r   r   r^   rG   r  rI   rJ   rK   r$  )r  r   r&  r  r
  r  r   r   s           r6   scale_total_pixelsr4  _  s    UOM!%7E
T!D()Eyy++b/EKKO"CDEH%++b/H,-E5;;r?X-.FKK&&uV:VE%e;ELr9   matchc                     [        U 5      n[        X5      n [        U[        U5      5      nUR                  S   nUR                  S   n[        R                  R                  XXbU5      n [        X5      n U $ )Nrn   r)  )r  r   rG   rI   rJ   rK   r$  )r  r5  r&  rB   r  r   r   s          r6   scale_match_sizer7  l  sf    UOM!%7E!%%9EKKOE[[_FKK&&uV4PE%e;ELr9   multiplec                 j   US::  a  U $ [        U 5      nU(       a  U R                  u  pEpdOU R                  u  pEnXa-  U-  nXQ-  U-  nUS:X  d  US:X  a  U $ Xv:X  a  X:X  a  U $ Xv-  n	X-  n
X:  a+  Un[        [        R                  " XY-  5      5      nX:  a  UnO*Un[        [        R                  " Xj-  5      5      nX:  a  Un[        X5      n [        R                  R                  XXS5      n [        X5      n X-
  S-  nX-
  S-  nX-   nX-   nU(       a  U S S 2UU2X2S S 24   $ U S S 2UU2X24   $ )Nr=   r   r   r>   )
r  rG   r   r   r   r   rI   rJ   rK   r$  )r  r8  r&  r  r   r   r   target_wtarget_hs_ws_hscaled_wscaled_hx0y0x1y1s                    r6   scale_to_multiple_coverrD  w  s]   1}UOM#kk5! ;;5!X-H"h.H1}AX/

C

C
ztyy./Htyy-.H!%7EKK&&uPZ[E%e;E

!	#B

!	#B	B	BQ2rua'((BrE25!!r9   c            	           \ rS rSr/ SQrSS/r " S S\5      r\S 5       r	\S\
R                  R                  \
R                  R                  -  S	\
R                  R                  S
\S\
R                  4S j5       rSrg)ResizeImageMaskNodei  r   r   r@   c                       \ rS rSr% \\S'   \S   \S'   \S   \S'   \\S'   \\S'   \\S	'   \\S
'   \\S'   \\S'   \\S'   Sr	g)#ResizeImageMaskNode.ResizeTypedDicti  resize_typer   r&  )r   r@   rB   r%  r   r   r,  r0  r   r8  ra   N)
rb   rc   rd   re   r  __annotations__r   rh   r   rj   ra   r9   r6   ResizeTypedDictrH    sG    WXX*++
r9   rK  c                  <   [         R                  R                  S[         R                  [         R                  /5      n[         R
                  R                  SU R                  SSS9n[         R                  " SSSS	/ S
Q[         R                  R                  SUS9[         R                  R                  SS[         R                  R                  [        R                  [         R                  R                  SSS[        SSS9[         R                  R                  SSS[        SSS9U/5      [         R                  R                  [        R                  [         R                   R                  SSSSSSS9/5      [         R                  R                  [        R"                  [         R                  R                  SSS[        SSS9/5      [         R                  R                  [        R$                  [         R                  R                  SSS[        SSS9/5      [         R                  R                  [        R&                  [         R                  R                  SSS[        SS S9/5      [         R                  R                  [        R(                  [         R                  R                  SSS[        SS!S9/5      [         R                  R                  [        R*                  [         R                   R                  S"SSS#SS$S9/5      [         R                  R                  [        R,                  [         R.                  R                  S%[         R                  [         R                  /S&S'9U/5      [         R                  R                  [        R0                  [         R                  R                  S(S)S[        SS*S9/5      /	S+9[         R
                  R                  S,U R2                  S-S.S9/[         R                  R5                  US/S09/S19$ )2N
input_typerB   r@   zjHow to handle aspect ratio mismatch: 'disabled' stretches to fit, 'center' crops to maintain aspect ratio.)r'   r   tooltiprF  zResize Image/Maskz6Resize an image or mask using various scaling methods.zimage/transform)resizezresize imagezresize maskscalezscale imagez
scale maskzimage resizezchange size
dimensionsshrinkenlarger  templaterI  zUSelect how to resize: by exact dimensions, scale factor, matching another image, etc.r   r   r   r=   z]Target width in pixels. Set to 0 to auto-calculate from height while preserving aspect ratio.)r   r   r   r   rN  r   z]Target height in pixels. Set to 0 to auto-calculate from width while preserving aspect ratio.r%  r   r   g       @z7Scale factor (e.g., 2.0 doubles size, 0.5 halves size).r,  zIThe longer edge will be resized to this value. Aspect ratio is preserved.r0  zJThe shorter edge will be resized to this value. Aspect ratio is preserved.zETarget width in pixels. Height auto-adjusts to preserve aspect ratio.zETarget height in pixels. Width auto-adjusts to preserve aspect ratio.r   r  uN   Target total megapixels (e.g., 1.0 ≈ 1024×1024). Aspect ratio is preserved.r5  zEResize input to match the dimensions of this reference image or mask.rN  r8     zeResize so width and height are divisible by this number. Useful for latent alignment (e.g., 8 or 64).rN  r'   r&  r   zpInterpolation algorithm. 'area' is best for downscaling, 'lanczos' for upscaling, 'nearest-exact' for pixel art.resized)rU  r*   )r(   r*   descriptionr+   r)   r-   r.   )r
   	MatchTypeTemplater   Maskr2   r0   r  r/   DynamicComboOptionr  r  r   r   r  r1   r  r  r  r  r  r  	MultiTyper  scale_methodsr3   )r5   rU  
crop_combos      r6   r7   !ResizeImageMaskNode.define_schema  s   <<(("''7JKXX^^$$ A	 $ 

 yy),P& m""7X">%%!s..z/J/JFFLL#1._`  kJL  KFFLL3A>`a  lKL  L&M 
 ..z/B/BHHNN<4UX_c  ngN  hE  ..z/P/PFFLLP^ef  q|L  }S  ..z/Q/QFFLL!Q_fg  r~L  T  ..z/E/EFFLL#1._`  krL  sH  ..z/F/FFFLL3A>`a  lsL  tI  ..z/L/LHHNN<$TX_c  n~N  O  ..z/D/DLL..w2778K  V].  ^&G  ..z/K/KFFLLQA>`a  lSL  TN 9 & #H "--" O	  M,Z \\((((STg4
 4	
r9   r  r&  rI  r:   c           
          US   nU[         R                  :X  a#  [        R                  " [	        XS   U5      5      $ U[         R
                  :X  a*  [        R                  " [        XS   US   X#S   5      5      $ U[         R                  :X  a#  [        R                  " [        XS   U5      5      $ U[         R                  :X  a#  [        R                  " [        XS   U5      5      $ U[         R                  :X  a$  [        R                  " [        XS   SU5      5      $ U[         R                  :X  a%  [        R                  " [        USUS   U5      5      $ U[         R                  :X  a#  [        R                  " [        XS	   U5      5      $ U[         R                  :X  a&  [        R                  " [!        XS
   X#S   5      5      $ U[         R"                  :X  a#  [        R                  " [%        XS   U5      5      $ ['        SU 35      e)NrI  r%  r   r   rB   r,  r0  r   r   r5  r8  zUnsupported resize type: )r  r  r
   rN   r  r  r+  r  r/  r  r2  r  r  r  r4  r  r7  r  rD  rU   )r5   r  r&  rI  selected_types        r6   rP   ResizeImageMaskNode.execute  s   #M2J///==%\1JL!YZZj999==!1%W9M{[cOdfr  AG  uH  "I  J  Jj???==!7=?Y[g!hiij@@@==!8N@[]i!jkkj444==!1%W9MqR^!_``j555==!1%K<QS_!`aaj;;;==!3E|;TVb!cddj333==!1%W9M|io]p!qrrj:::==!8J@WYe!fgg4]ODEEr9   ra   N)rb   rc   rd   re   ra  r  r   rK  rf   r7   r
   r   Typer]  r2   rN   rP   rj   ra   r9   r6   rF  rF    s    OM)L
) 
 <
 <
| FBHHMMBGGLL8 F Fds Fxz  yF  yF F Fr9   rF  imagesc           
      z   [        U 5      S:X  a  g [        S U  5       5      n/ nU  Hb  nUR                  S   U:  a;  UR                  [        R
                  R                  R                  USSSS95        MQ  UR                  U5        Md     / nUS   R                  nU H  nUR                  SS  USS  :w  aZ  UR                  [        R                  R                  UR                  SS5      US	   US   S
S5      R                  SS5      5        Ms  UR                  U5        M     [        R                  " USS9$ )Nr   c              3   >   #    U  H  oR                   S    v   M     g7f)rn   N)rG   ).0r~   s     r6   	<genexpr>batch_images.<locals>.<genexpr>  s     ;F5{{2Fs   rn   )r   r=   constantr   )rX   valuer=   r>   r   r@   dim)r   r   rG   appendrL   nn
functionalr   rI   rJ   rK   r  cat)rh  max_channelspadded_imagesr~   resized_imagesfirst_image_shapes         r6   batch_imagesrz    sF   
6{a;F;;L(*M;;r?\)  !4!4!8!8J^a!8!bc  '	  *,N%a(..;;qr?/33!!%++"<"<U]]2a=PRcdeRfhyz{h|  I  KS  #T  #\  #\  ]^  _a  #b  c!!%(	  99^++r9   masksc                 h   [        U 5      S:X  a  g / nU S   R                  nU  Hw  nUR                  SS  USS  :w  aM  [        USS9n[        R                  R                  X2S   US   SS5      nUR                  [        USS95        Mf  UR                  U5        My     [        R                  " USS9$ )	Nr   r=   F)r  r>   r   r@   rp  )
r   rG   r   rI   rJ   rK   rr  r$  rL   ru  )r{  resized_masksfirst_mask_shapemasks       r6   batch_masksr    s    
5zQ(*MQx~~::ab>-ab11(UCD;;--dQ4GIYZ[I\^hjrsD  !:4u!UV  &  99]**r9   latentsc                    [        U 5      S:X  a  g U S   R                  5       n/ US'   U S   S   n/ nU  Hx  nUR                  [        UR                  US   SS95        US   R                  UR                  S[        SUS   R                  S   5       Vs/ s H  oUPM     sn5      5        Mz     [        R                  " USS9US'   U$ s  snf )Nr   batch_indexr	  F)repeat_batchrp  )
r   copyrr  r   rG   extendgetr   rL   ru  )r  samples_outfirst_samplestensorslatentr_   s         r6   batch_latentsr  )  s    
7|q!*//#K!#KAJy)M"$G()<)<fY>O^cdeM"))&**]PUVWY_`iYjYpYpqrYsPtDuPt1QPtDu*vw	 
 #YYwA6K	 Evs   Cc                   |    \ rS rSr\S 5       r\S\R                  R                  S\R                  4S j5       r
Srg)BatchImagesNodei8  c                 (   [         R                  R                  [         R                  R	                  S5      SSSS9n[         R
                  " SSSS/ S	Q[         R                  R	                  S
US9/[         R                  R                  5       /S9$ )Nr~   r=   2   prefixr   r   r  zBatch Imageszimage/batchr   )batchzimage batchzbatch imageszcombine imageszmerge imageszstack imagesrh  rT  )r(   r*   r+   r,   r)   r-   r.   )r
   AutogrowTemplatePrefixr   r0   r/   r3   r5   autogrow_templates     r6   r7   BatchImagesNode.define_schema9  s    KK66rxx~~g7NW^dekm6nyy%'" -u!!(5F!G !
 	
r9   rh  r:   c                 n    [         R                  " [        [        UR	                  5       5      5      5      $ N)r
   rN   rz  listvalues)r5   rh  s     r6   rP   BatchImagesNode.executeJ  s!    }}\$v}}*?@AAr9   ra   Nrb   rc   rd   re   rf   r7   r
   r  rg  rN   rP   rj   ra   r9   r6   r  r  8  sH    
 
  BR[[-- B"-- B Br9   r  c                   |    \ rS rSr\S 5       r\S\R                  R                  S\R                  4S j5       r
Srg)BatchMasksNodeiN  c                 &   [         R                  R                  [         R                  R	                  S5      SSSS9n[         R
                  " S/ SQSS[         R                  R	                  S	US
9/[         R                  R                  5       /S9$ )Nr  r=   r  r  r  )zcombine maskszstack maskszmerge maskszBatch Masksz
image/maskr{  rT  r(   r)   r*   r+   r-   r.   )r
   r  r  r]  r0   r/   r3   r  s     r6   r7   BatchMasksNode.define_schemaO  s    KK66rww}}V7LU[abhj6kyy$J&!!!'4E!F  
 	
r9   r{  r:   c                 n    [         R                  " [        [        UR	                  5       5      5      5      $ r  )r
   rN   r  r  r  )r5   r{  s     r6   rP   BatchMasksNode.execute_  s!    }}[elln)=>??r9   ra   Nr  ra   r9   r6   r  r  N  sH    
 
 @BKK,, @ @ @r9   r  c                   |    \ rS rSr\S 5       r\S\R                  R                  S\R                  4S j5       r
Srg)BatchLatentsNodeic  c                 &   [         R                  R                  [         R                  R	                  S5      SSSS9n[         R
                  " S/ SQSS[         R                  R	                  S	US
9/[         R                  R                  5       /S9$ )Nr  r=   r  r  r  )zcombine latentszstack latentszmerge latentszBatch Latentszmodel/latent/batchr  rT  r  )r
   r  r  Latentr0   r/   r3   r  s     r6   r7   BatchLatentsNode.define_schemad  s    KK66ryyx7PYaghnp6qyy&P()!!)6G!H 		  "
 	
r9   r  r:   c                 n    [         R                  " [        [        UR	                  5       5      5      5      $ r  )r
   rN   r  r  r  )r5   r  s     r6   rP   BatchLatentsNode.executet  s"    }}]40@+ABCCr9   ra   Nr  ra   r9   r6   r  r  c  sH    
 
 Dbkk.. D2== D Dr9   r  c                   |    \ rS rSr\S 5       r\S\R                  R                  S\R                  4S j5       r
Srg)BatchImagesMasksLatentsNodeix  c                    [         R                  R                  S[         R                  [         R                  [         R
                  /S9n[         R                  R                  [         R                  R                  SU5      SSSS9n[         R                  " S/ SQSS	[         R                  R                  S
US9/[         R                  R                  S US9/S9$ )Nr  )allowed_typesr=   r  r  r  )zcombine batchzmerge batchzstack inputszBatch Images/Masks/Latentsutilr-   rT  )idrU  r  )r
   r[  r\  r   r]  r  r  r  r0   r/   r3   )r5   matchtype_templater  s      r6   r7   )BatchImagesMasksLatentsNode.define_schemay  s    \\227288UWU\U\^`^g^gJh2iKK66""7,>?A2 7 / yy1K5!!(5F!G ##t6H#I
 	
r9   r-   r:   c                     S n[        UR                  5       5      n[        US   [        5      (       a  [	        U5      nO*[        US   5      (       a  [        U5      nO[        U5      n[        R                  " U5      $ )Nr   )
r  r  
isinstancedictr  r  rz  r  r
   rN   )r5   r-   batchedr  s       r6   rP   #BatchImagesMasksLatentsNode.execute  sf    fmmo&fQi&&#F+GfQi  "6*G "&)G}}W%%r9   ra   Nr  ra   r9   r6   r  r  x  sD    
 
$ &R[[-- &"-- & &r9   r  c                       \ rS rSr\S 5       r\S 5       r\S 5       r\S 5       r	\S 5       r
\SS j5       r\SS j5       r\S	 5       r\S
 5       r\SS\R                   4S jj5       rSrg)ColorTransferi  c                    [         R                  " SSSS/ SQ[         R                  R                  SSS9[         R                  R                  S	S
S9[         R                  R                  S/ SQS9[         R
                  R                  SS[         R
                  R                  S/ 5      [         R
                  R                  S/ 5      [         R
                  R                  S[         R                  R                  SSSSSS9/5      /S9[         R                  R                  SSSSSS9/[         R                  R                  SS 9/S!9$ )"Nr  zTransfer Colorr   zBMatch the colors of one image to another using various algorithms.)zcolor matchzcolor gradingzcolor correctionzmatch colorszcolor transformmklreinhard	histogramimage_targetz)Image(s) to apply the color transform to.rV  	image_refz&Reference image(s) to match colors to.method)reinhard_labmkl_labr  r&   source_statsa  per_frame: each frame matched to image_ref individually. uniform: pool stats across all source frames as baseline, match to image_ref. target_frame: use one chosen frame as the baseline for the transform to image_ref, applied uniformly to all frames (preserves relative differences)	per_frameuniformtarget_frametarget_indexr   i'  zPFrame index used as the source baseline for computing the transform to image_ref)r   r   r   rN  rX  strengthr   r   r   r   r   r~   )r*   )r(   r*   r+   rZ  r)   r-   r.   )
r
   r/   r   r0   r2   r^  r_  r   r1   r3   r4   s    r6   r7   ColorTransfer.define_schema  s&   yy#)$\ S~7bc{4\]x1Y[%%n y..{B?..y"=..~FFLLu(z ) |@  & 	 z3CTPTU" W5-
 	
r9   c                     [         R                  R                  XUS-    R                  U[        R
                  S9R                  SSSS5      5      $ )Nr=   r   r   r<   r>   )korniacolor
rgb_to_labrE   rL   r   rH   )rh  irF   s      r6   _to_labColorTransfer._to_lab  sK    ||&&QqSMV5==9AA!Q1MO 	Or9   c                    U R                   S   U R                   S   pTU R                   S   U R                   S   -  n[        R                  " USU[        R                  S9n[	        U5       H:  nU[
        R                  XU5      R                  US5      R                  SSS9-  nM<     Xt-  n[        R                  " XR(       a  SOUU[        R                  S9n	[	        U5       H^  n[
        R                  XU5      R                  US5      U-
  n
U(       a  XU
-  R                  SSS9-  n	MJ  XU
R                  -  U-  -  n	M`     U(       a)  U[        R                  " X-  5      R                  U5      4$ XyU-  4$ )	z1Two-pass pooled mean + std/cov across all frames.r   r<   r=   r>   r   rn   Trq  keepdim)rG   rL   r   r   r   r  r  viewmeanTr^   
clamp_min_)rh  rF   is_reinhardepsNCHWr  r  acccentereds              r6   _pool_statsColorTransfer._pool_stats  sN    ||AQ1\\!_v||A.{{1aemmDqAM))&V<AA!RHMMRT^bMccD 	kk!+Q1V5==YqA$,,V?DDQKdRH8+11b$1GG(**,r11  CG,77<<<1W}r9   c                     U R                  SSS9nU(       a!  X@R                  SSSS9R                  U5      4$ X-
  nXEUR                  -  U-  4$ )zPer-frame mean + std/cov.rn   Tr  F)rq  r  unbiased)r  stdr  r  )lab_flathwr  r  r  r  s         r6   _frame_statsColorTransfer._frame_stats  s[     }}T}2"dUKVVWZ[[[?

*R///r9   c                    [         R                  R                  U 5      u  p4[         R                  " UR	                  S5      5      R                  U5      nXER                  S5      -  nUR                  U-  U-  n[         R                  R                  U5      u  p[         R                  " UR	                  S5      5      n
SU-  nXKR                  S5      -  nXR                  S5      -  U	R                  -  nX-  UR                  -  $ )zACompute MKL 3x3 transform matrix from source and ref covariances.r   r   )rL   linalgeighr^   	clamp_minr  r   r  )cov_scov_rr  	eig_val_s	eig_vec_s
sqrt_val_sscaled_Vmid	eig_val_m	eig_vec_msqrt_m
inv_sqrt_sinv_scaled_VM_halfs                 r6   _mkl_matrixColorTransfer._mkl_matrix  s      %||007	ZZ	 3 3A 67BB3G
33A66jj5 8+$||005	I//23:%
 #7#7#::..q11Y[[@$|~~55r9   c                    XS-
  -  R                  5       R                  SUS-
  5      nXS-
  -  R                  5       R                  SUS-
  5      n[        R                  " U R                  S   X R
                  U R                  S9n[        R                  " U R                  S   X R
                  U R                  S9n[        R                  " U 5      n[        R                  " U5      nUR                  SX75        UR                  SXH5        UR                  S5      n	XSS2SS24   -  n	UR                  S5      n
XSS2SS24   -  n
[        R                  " X5      R                  US-
  5      R                  5       US-
  -  $ )zPBuild per-channel LUT from source and ref histograms. src/ref: (C, HW) in [0,1].r=   r   r   Nrn   )longrM   rL   r   rG   rF   ru   	ones_likescatter_add_cumsumsearchsorted
clamp_max_rh   )srcrefbinss_binsr_binss_histr_histones_sones_rs_cdfr_cdfs              r6   _histogram_lutColorTransfer._histogram_lut  sE    "((*00D1H="((*00D1H=SYYq\4

#))TSYYq\4

#))T%%Av.Av.a af%a af%!!%/::4!8DJJLPTWXPXYYr9   c                    UR                   S   n[        R                  " XCU[        R                  S9n[	        UR                   S   5       H  nX   R                  U[        R                  S9R                  SSS5      R                  US5      nXsS-
  -  R                  5       R                  SUS-
  5      nUR                  SU[        R                  " U5      5        M     UR                  S5      n	XSS2SS24   -  $ )	z8Build pooled CDF across all frames, one frame at a time.r<   r   r   r   r>   r=   rn   N)rG   rL   r   r   r   rE   rH   reshaper  rM   r   r  r  )
r5   rh  rF   num_binsr  histr  framer  cdfs
             r6   _pooled_cdfColorTransfer._pooled_cdf  s     LLO{{1vU]]Kv||A'AILLu}}L=EEaANVVWXZ\]E\*00288HqLIDauu'=> ( kk!nBC[  r9   c                    US:X  a  gU R                  X#5      nUS:X  a&  [        XVS-
  5      nU R                  XUS-    U5      n	OU R                  X5      n	[        R                  " Xy5      R	                  S5      R                  5       S-  $ )z<Build per-frame or uniform LUT transform for histogram mode.r  Nr  r=   r   g     o@)r  r   rL   r  r  rh   )
r5   r  r  rF   
stats_moder  Br  tir  s
             r6   _build_histogram_transform(ColorTransfer._build_histogram_transform	  s     $	2'\q5)BOOLBqD$96BEOOL9E!!%/::3?EEG%OOr9   c                 l  ^ ^^^^^^^^^^^^^^ SmUR                   u  pxn	mTR                   S   mTS:H  mX-  mTR                   S   TR                   S   -  mT(       d  US;   a  T R                  TTTT5      u  mmUS;   a  US:X  aG  [        XWS-
  5      n
T R                  XT5      R	                  TS5      nT R                  UTTT5      u  pOT R                  UTTT5      u  pT(       a  TU-  mTTU-  -
  mUU4S j$ T R                  UTT5      mTTU-  -
  mUU4S	 j$ UUUUU UUUUUUU4S
 jnU$ )zOBuild transform parameters for Lab-based methods. Returns a transform function.gư>r   r=   r>   )r  r  r  rn   c                    > U T-  T-   $ r  ra   )src_flatr   offsetrP  s     r6   <lambda>4ColorTransfer._build_lab_transform.<locals>.<lambda>1  s    X-=-Fr9   c                    > TU -  T-   $ r  ra   )r!  r   r  r"  s     r6   r#  r$  4  s    X)>r9   c                 N  > TR                  U TTT5      u  p#T(       a  TTpTOF[        UT	S-
  5      nTR                  TR                  TUT5      R                  T
S5      TTT5      u  pEX-
  nT(       a
  XuU-  -  U-   $ TR	                  XwR
                  -  T-  UT5      nX-  U-   $ r"  )r  r   r  r  r  r  )r!  	frame_idxs_means_scr_meanr_scrir  r  B_refr  r  HW_refr5   rF   r  r  r  ref_meanref_sc
single_refs            r6   per_frame_transform?ColorTransfer._build_lab_transform.<locals>.per_frame_transform7  s    ++Hb+sKLF'EAI."//Ir60R0W0WXY[]0^`fhsuxy(H$;/&88:: 5 :D#FA<&((r9   )rG   r  r   r  r  r  r  )r5   r  r  rF   r  r  r  r  HWr  s_labr(  r)  r2  r-  r  r  r.  r  r  r"  r/  r0  rP  r1  s   ` ``  `        @@@@@@@@@@@r6   _build_lab_transform"ColorTransfer._build_lab_transform  sH    !''
a"aZ
U#iooa&88 'BB"y&+sSHf 44^+1u-Lf=BB1bI"//r;L"|V[RUV!EFN2FFfc2AF
*F>>	) 	) 	) #"r9   r:   c                 B   US   nUR                  SS5      nUS:X  d  Uc  [        R                  " U5      $ [        R                  R                  5       n[        R                  R                  5       n	[        R                  R                  5       n
UR                  u  ppUR                  S   n[        R                  R                  U5      n[        R                  " XXXS9nUS:X  Ga  U R                  XXX{5      n[        U5       GHZ  nUU   R                  U[        R                   S9R#                  SSS5      nUR%                  US	5      nUb  UnOc['        UUS-
  5      nUU   R                  U[        R                   S9R#                  SSS5      R%                  US	5      nU R)                  UU5      nUS
-  R+                  5       R-                  SS
5      nUR/                  SU5      R1                  XU5      nUS:X  a  UO[        R2                  " UUU5      nUR#                  SSS5      R5                  SS5      R                  XS9UU'   UR7                  S5        GM]     GO!U R9                  XXXsS:H  S9n[        U5       H  nU R;                  UUU5      nU" UR1                  US	5      US9nUS:X  a1  [<        R>                  RA                  UR1                  SXU5      5      nOF[<        R>                  RA                  [        R2                  " UUR1                  SXU5      U5      5      nURC                  S5      R#                  SSS5      R5                  SS5      R                  XS9UU'   UR7                  S5        GM      [        R                  " U5      $ )Nr  r  r   r   r  r   r>   r=   rn   r   r   r  )r  )r'  )"r  r
   rN   rI   r   r   r   intermediate_dtyperG   rJ   ProgressBarrL   emptyr  r   rE   r   rH   r  r   r  r  rM   gatherr  lerpr   updater7  r  r  r  
lab_to_rgbr#  )r5   r  r  r  r  r  r  r  rF   r   r:  r  r4  r5  r  r-  pbaroutuniform_lutr  r  r!  lutr,  r  bin_idxmatchedr   	transform	src_frame	correcteds                                  r6   rP   ColorTransfer.executeH  s@   !.1
#'':q=I-==..''88:#44HHJ"33FFH!''
a"{{&&q)kk!-@[[ 88\NK 1X"1o((u}}(EMMaQRTUV;;q"-*%CQ	*B#B-**6*GOOPQSTVWX``abdfgC,,Xs;C#c>//1773?**Q055aA>$,OCRZ9[1a0771=@@H[@vAA  00&^j  CQ  yQ0  RI1XKKa@	%innQ&;qI	s?#\\44Y^^AqQ5OPF#\\44UZZ	9>>Z[]^cdKego5pqF*221a;BB1aHKKSfK  BAA  }}S!!r9   ra   N)r   )r   )rb   rc   rd   re   rf   r7   r   r  r  r  r  r  r  r  r7  r
   rN   rP   rj   ra   r9   r6   r  r    s    
 
8 O O  & 0 0 6 6 Z Z  	! 	! P P .# .#` /"UWUbUb /" /"r9   r  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)PostProcessingExtensioni{  r:   c           
      r   #    [         [        [        [        [        [
        [        [        [        [        /
$ 7fr  )
r   rz   r   r   r   rF  r  r  r  r  )selfs    r6   get_node_list%PostProcessingExtension.get_node_list|  s/      #
 	
s   57ra   N)rb   rc   rd   re   r   r  typer
   	ComfyNoderO  rj   ra   r9   r6   rL  rL  {  s)    
T$r||*<%= 
 
r9   rL  c                     #    [        5       $ 7fr  )rL  ra   r9   r6   comfy_entrypointrT    s     "$$s   )r   )Btyping_extensionsr   r   r   rL   torch.nn.functionalrs  rt  r   PILr   r   enumr   typingr   r   r  comfy.utilsrI   comfy.model_managementcomfy_extras.nodes_latentr   rC   comfy_api.latestr	   r
   nodesr   rR  r   r   r   rh   rx   rz   r   r   r   ri   r  rg   boolr  r   r$  r  r+  r/  r2  r4  r7  rD  rF  r  rz  r  r  r  r  r  r  r  r  rL  rT  ra   r9   r6   <module>r`     sv   &        %    7  /  4RBLL 4Rl <@u}} # #U #!W2<< !WH@%r|| @%D(Vbll (VT  bll   D	,d 	,!ELL !T !
 d u|| U\\ $ 5<< ELL e 3 5<< ELL  c QT \_ oto{o{ %,, S PS X]XdXd (5<< s RU Z_ZfZf (ell  S UZUaUa 	ELL 	 	S 	X[ 	`e`l`l 	#"5<< #"3 #"c #"V[VbVb #"JdF",, dFL,ell+ ,t0C ,.+tELL) +ellT.A + 4S%,,%6 78 T#u||BS=TW[=[ Bbll B,@R\\ @*Dr|| D*!&",, !&H\"BLL \"~
n 
"% 7 %r9   