
    ^(j                     :   d dl mZ d dlZd dlZd dlmc mZ d dl	m
Z
 d dlZd dlmZ d dlmZmZ d dlZd dlZd dlZd dlmZ d dlZd dlmZmZ d dlmZ  G d	 d
ej:                        Zdej>                  fde de!fdZ" G d dej:                        Z# G d dej:                        Z$ G d dej:                        Z% G d dej:                        Z& G d de'e      Z(dejR                  de*fdZ+dejR                  de*dejR                  fdZ,dejR                  de*dejR                  fdZ-dejR                  de!de'dejR                  fd Z.dDdejR                  d!e d"e de'd#e'dejR                  fd$Z/dejR                  d%e de'dejR                  fd&Z0dejR                  d'e de'dejR                  fd(Z1dejR                  d)e!de'dejR                  fd*Z2dejR                  d+ejR                  de'd#e'dejR                  f
d,Z3dejR                  d-e de'dejR                  fd.Z4 G d/ d0ej:                        Z5d1e6ejR                     dejR                  dz  fd2Z7d3e6ejR                     dejR                  dz  fd4Z8d5e6e9e'ejR                  f      de9e'ejR                  f   dz  fd6Z: G d7 d8ej:                        Z; G d9 d:ej:                        Z< G d; d<ej:                        Z= G d= d>ej:                        Z> G d? d@ej:                        Z? G dA dBe      Z@de@fdCZAy)E    )overrideN)Image)Enum)	TypedDictLiteral)reshape_latent_to)ComfyExtensionio)MAX_RESOLUTIONc                       e Zd Zed        Zedej                  dej                  dedede	j                  f
d       Zed        Zed	        Zy
)Blendc                 x   t        j                  ddgdddt         j                  j                  d      t         j                  j                  d      t         j                  j                  dd	d
dd      t         j
                  j                  dg d      gt         j                  j                         g      S )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    L/Users/danicosta/Desktop/Flux2/ComfyUI/comfy_extras/nodes_post_processing.pydefine_schemazBlend.define_schema   s    yy (>'$ -x(x(~sSWX|5|}	 !
 	
    r   r   r   r   returnc                    t        j                  ||      \  }}|j                  |j                        }|j                  |j                  k7  rf|j                  dddd      }t        j                  j                  ||j                  d   |j                  d   dd      }|j                  dddd      }| j                  |||      }|d|z
  z  ||z  z   }t        j                  |dd      }t        j                  |      S )Nr            bicubiccenter)upscale_methodcrop)node_helpersimage_alpha_fixtodeviceshapepermutecomfyutilscommon_upscaler   torchclampr
   
NodeOutput)r4   r   r   r   r   blended_images         r5   executezBlend.execute&   s    %55ffE6==)<<6<<'^^Aq!Q/F[[//QVWir  zB/  CF^^Aq!Q/FvvzB!l"23ml6RRM1a8}}]++r7   c           	         |dk(  r|S |dk(  r||z  S |dk(  rdd|z
  d|z
  z  z
  S |dk(  r/t        j                  |dk  d|z  |z  ddd|z
  z  d|z
  z  z
        S |dk(  rJt        j                  |dk  |dd|z  z
  |z  d|z
  z  z
  |d|z  dz
  | j                  |      |z
  z  z         S |d	k(  r||z
  S t        d
|       )Nr   r    r!   r;   r"   r   r<   r#   r$   zUnsupported blend mode: )rJ   whereg
ValueError)r4   img1img2modes       r5   r   z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:;;r7   c                 z    t        j                  |dk  d|z  dz
  |z  dz   |z  t        j                  |            S )Ng      ?         )rJ   rP   sqrt)r4   xs     r5   rQ   zBlend.gD   s8    {{19Qq'81'<&A5::a=QQr7   N)__name__
__module____qualname__classmethodr6   rJ   Tensorfloatstrr
   rL   rN   r   rQ    r7   r5   r   r      s    
 
$ ,U\\ ,5<< ,u ,be ,jljwjw , , < < R Rr7   r   kernel_sizesigmac           	      X   t        j                  t        j                  dd| |      t        j                  dd| |      d      \  }}t        j                  ||z  ||z  z         }t        j                  ||z   d|z  |z  z        }||j                         z  j                  |      S )Nr;   )rD   ij)indexingg       @)rJ   meshgridlinspacerZ   expsumrC   )rd   re   rD   dtyper[   ydrQ   s           r5   gaussian_kernelrq   H   s    >>%..QFKU^^\^`acnw}M~  JN  ODAq

1q51q5=!A		AE(cEkE123AKE""r7   c            	       f    e Zd Zed        Zedej                  dedede	j                  fd       Zy)Blurc                 8   t        j                  dddt         j                  j                  d      t         j                  j                  ddddd      t         j
                  j                  d	d
ddd      gt         j                  j                         g      S )N	ImageBlurz
Blur Imager   imageblur_radiusr;      r   re   r   皙?      $@r'   r)   r*   r,   r-   r
   r.   r   r/   Intr0   r2   r3   s    r5   r6   zBlur.define_schemaO   sz    yy%$w']A1"1Mw$SQ !
 	
r7   rv   rw   re   r8   c                    |dk(  rt        j                  |      S |j                  t        j                  j                               }|j                  \  }}}}|dz  dz   }t        |||j                  |j                        j                  |dd      j                  d      }	|j                  dddd      }t        j                  |||||fd      }
t        j                  |
|	|dz  |      d d d d || || f   }|j                  dddd      }t        j                  |j                  t        j                  j!                                     S )Nr   r<   r;   rD   rn   r:   reflectpaddinggroups)r
   rL   rC   rG   model_managementget_torch_devicerE   rq   rD   rn   repeat	unsqueezerF   Fpadconv2dintermediate_device)r4   rv   rw   re   
batch_sizeheightwidthchannelsrd   kernelpadded_imageblurreds               r5   rN   zBlur.execute_   sR   !==''//@@BC.3kk+
FE8!Ao) eELLPUP[P[\ccdlnoqrs}}~  AaAq)uuU[[$UW`a((<9IRZ[\]^_`kmxlx`x  {F  HS  GS  {S  ]S  T//!Q1-}}WZZ(>(>(R(R(TUVVr7   Nr\   r]   r^   r_   r6   rJ   r`   intra   r
   rL   rN   rc   r7   r5   rs   rs   N   sR    
 
 WELL Ws W5 WR]] W Wr7   rs   c            	       v    e Zd Zed        Zed        Zedej                  de	de
dej                  fd       Zy)	Quantizec                 6   t        j                  dddt         j                  j                  d      t         j                  j                  ddddd      t         j
                  j                  d	g d
      gt         j                  j                         g      S )NImageQuantizezQuantize Imager   rv   colors   r;   r   dither)nonefloyd-steinbergzbayer-2zbayer-4zbayer-8zbayer-16r%   r{   )r
   r.   r   r/   r}   r1   r2   r3   s    r5   r6   zQuantize.define_schemas   su    yy#)$w'XssKx1yz !
 	
r7   c                    fdt        |j                               dz  }d|z  }t        t        j                  |            }t        j                  | |      z  dz         }t        j                  t        j                  |       j                  t        j                              }t        j                  |j                  d   |j                  d   z        }t        j                  |j                  d   |j                  d   z        }	|j                  ||	      j                  d      }
|j                  |
d |j                  d   d |j                  d   f         j!                  dd       |j#                  t
        j$                  	      }t'        j(                  |j+                         j-                               } | j/                  |t&        j0                  j2                  
      } | S )Nc                     | dk(  rt        j                  dd      S d| z  }| | dz
        z  }t        j                  |dz
  |dz   f|dz   |dz
  ff      |z  S )Nr   )r;   r;   float32rY   r;   g      ?r   )npzerosbmat)nqmnormalized_bayer_matrixs      r5   r   z/Quantize.bayer.<locals>.normalized_bayer_matrix   si    Avxxy11F/A66ww3#3#?@1DDr7   r:      r   r   r;   rg      rn   paletter   )len
getpaletter   mathlog2rJ   
from_numpyr   arrayastyper   ceilrE   tiler   add_clamp_rC   uint8r   	fromarraycpunumpyquantizeDitherNONE)impal_imorder
num_colorsspreadbayer_nbayer_matrixresulttwthtiled_matrixr   s              @r5   bayerzQuantize.bayer   s   	E **,-2
:%dii&'''1H1Q(QTW(WX!!"((2,"5"5bjj"ABYYv||A););A)>>?YYv||A););A)>>?#((R0::2>L!1&,,q/!12B6<<?2B!BCDKKAsS-__VZZ\//12[[0A0A[B	r7   rv   r   r   r8   c                 8   |j                   \  }}}}t        j                  |      }t        |      D ]Q  }	t	        j
                  ||	   dz  j                  t        j                        j                         d      }
|
j                  |      }|dk(  r,|
j                  |t        j                  j                        }nv|dk(  r,|
j                  |t        j                  j                        }nE|j                  d      r4t        |j                  d	      d
         }t         j#                  |
||      }t        j$                  t'        j(                  j+                  d                  j-                         dz  }|||	<   T t/        j0                  |      S )Nr   RGB)rU   )r   r   r   r   r   -rg   )rE   rJ   
zeros_likeranger   r   rC   r   r   r   r   r   FLOYDSTEINBERG
startswithr   splitr   r   tensorr   r   convertra   r
   rL   )r4   rv   r   r   r   r   r   _r   br   r   quantized_imager   quantized_arrays                  r5   rN   zQuantize.execute   s@   ',{{$
FE1!!%(z"A%(S.!4!4U[[!A!G!G!IPUVB[[[/F"$++fU\\EVEV+"W,,"$++fU\\E`E`+"a""7+FLL-b12"*..VU"C#ll288O4K4KE4R+STZZ\_bbO'F1I #  }}V$$r7   N)r\   r]   r^   r_   r6   staticmethodr   rJ   r`   r   rb   r
   rL   rN   rc   r7   r5   r   r   r   s`    
 
  2 %ELL %# %s %r}} % %r7   r   c                   j    e Zd Zed        Zedej                  dededede	j                  f
d       Zy)	Sharpenc                    t        j                  dddt         j                  j                  d      t         j                  j                  dddddd	      t         j
                  j                  d
ddddd	      t         j
                  j                  dddddd	      gt         j                  j                         g      S )NImageSharpenzSharpen Imager   rv   sharpen_radiusr;   rx   T)r   r   r   r   advancedre   r   ry   rz   r   alphar   g      @r{   r|   r3   s    r5   r6   zSharpen.define_schema   s    yy"($w'-qaRaZ^_w$T\`aw#D[_`	 !
 	
r7   rv   r   re   r   r8   c                 d   |dk(  rt        j                  |      S |j                  \  }}}}|j                  t        j
                  j                               }|dz  dz   }	t        |	||j                  |j                        |dz   z  }
|
j                  |j                        }
|	dz  }|
||f   |
j                         z
  dz   |
||f<   |
j                  |dd      j                  d      }
|j                  dddd      }t        j                  |||||fd	      }t        j                   ||
||
      d d d d || || f   }|j                  dddd      }t#        j$                  |dd      }t        j                  |j                  t        j
                  j'                                     S )Nr   r<   r;   r   
   r   r   r:   r   r   )r
   rL   rE   rC   rG   r   r   rq   rD   rn   rm   r   r   rF   r   r   r   rJ   rK   r   )r4   rv   r   re   r   r   r   r   r   rd   r   r>   tensor_image	sharpenedr   s                  r5   rN   zSharpen.execute   s   Q==''.3kk+
FE8//@@BC$q(1, eELLPUP[P[\afgiai_jj-!!'!7&**,!F!Lvv~xA.88;}}Q1a0uu\N>.Yg+hjstHH\66(STUVWXfhvgvXv  yG  IW  HW  yW  UW  X	%%aAq1	Y1-}}VYYu'='='Q'Q'STUUr7   Nr   rc   r7   r5   r   r      s^    
 
  VELL V# VU VSX V]_]j]j V Vr7   r   c                   V    e Zd Zg dZddgZed        Zedej                  fd       Z	y)ImageScaleToTotalPixelsznearest-exactbilineararear=   lanczosdisabledr>   c                    t        j                  dddt         j                  j                  d      t         j                  j                  d| j
                        t         j                  j                  ddd	d
d	      t         j                  j                  ddddd      gt         j                  j                         g      S )Nr   zScale Image to Total Pixelszimage/upscalingrv   r?   r%   
megapixelsr   r         0@r   resolution_stepsr;   r   T)r   r   r   r   r{   )	r
   r.   r   r/   r1   upscale_methodsr0   r}   r2   r3   s    r5   r6   z%ImageScaleToTotalPixels.define_schema   s    yy-6&w'/9L9LM|SdSWX/sUYZ	 !
 	
r7   r8   c                    |j                  dd      }|dz  dz  }t        j                  ||j                  d   |j                  d   z  z        }t	        |j                  d   |z  |z        |z  }t	        |j                  d   |z  |z        |z  }	t
        j                  j                  |t        |      t        |	      |d      }
|
j                  dd      }
t        j                  |
      S )Nrg   r;      r:   r<   r   )movedimr   rZ   rE   roundrG   rH   rI   r   r
   rL   )r4   rv   r?   r   r   samplestotalscale_byr   r   ss              r5   rN   zImageScaleToTotalPixels.execute   s    --1%T!D(99UgmmA&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r7   N)
r\   r]   r^   r   crop_methodsr_   r6   r
   rL   rN   rc   r7   r5   r   r      sB    QO)L
 
  
 R]] 
  
 r7   r   c                   0    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zy
)
ResizeTypezscale by multiplierzscale dimensionszscale longer dimensionzscale shorter dimensionzscale widthzscale heightzscale total pixelsz
match sizezscale to multipleN)r\   r]   r^   SCALE_BYSCALE_DIMENSIONSSCALE_LONGER_DIMENSIONSCALE_SHORTER_DIMENSIONSCALE_WIDTHSCALE_HEIGHTSCALE_TOTAL_PIXELS
MATCH_SIZESCALE_TO_MULTIPLErc   r7   r5   r   r      s4    $H)57K!L-J+r7   r   inputr8   c                 2    t        | j                        dk(  S )NrY   )r   rE   )r  s    r5   is_imager    s     u{{q  r7   is_type_imagec                 T    |r| j                  dd      } | S | j                  d      } | S )Nrg   r;   )r   r   r  r  s     r5   init_image_mask_inputr    s1    b!$ L "Lr7   c                 T    |r| j                  dd      } | S | j                  d      } | S Nr;   rg   )r   squeezer
  s     r5   finalize_image_mask_inputr    s1    a$ L a Lr7   
multiplierscale_methodc                     t        |       }t        | |      } t        | j                  d   |z        }t        | j                  d   |z        }t        j
                  j                  | |||d      } t        | |      } | S Nrg   r   )r  r  r   rE   rG   rH   rI   r  )r  r  r  r  r   r   s         r5   r   r     sr    UOM!%7E%++b/J./E5;;r?Z/0FKK&&ueV\:VE%e];ELr7   r   r   r@   c                    |dk(  r|dk(  r| S t        |       }t        | |      } |dk(  r6t        dt        | j                  d   |z  | j                  d   z              }n:|dk(  r5t        dt        | j                  d   |z  | j                  d   z              }t
        j                  j                  | ||||      } t        | |      } | S )Nr   r;   rg   r  )	r  r  r   r   rE   rG   rH   rI   r  )r  r   r   r  r@   r  s         r5   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&&ueV\4PE%e];ELr7   longer_sizec                 :   t        |       }t        | |      } | j                  d   }| j                  d   }||kD  rt        ||z  |z        }|}n||kD  rt        ||z  |z        }|}n|}|}t        j
                  j                  | |||d      } t        | |      } | S r  r  r  rE   r   rG   rH   rI   r  )r  r  r  r  r   r   s         r5   scale_longer_dimensionr  7  s    UOM!%7EKKOE[[_F~uv~45	+56KK&&ueV\:VE%e];ELr7   shorter_sizec                 :   t        |       }t        | |      } | j                  d   }| j                  d   }||k  rt        ||z  |z        }|}n||k  rt        ||z  |z        }|}n|}|}t        j
                  j                  | |||d      } t        | |      } | S r  r  )r  r  r  r  r   r   s         r5   scale_shorter_dimensionr  K  s    UOM!%7EKKOE[[_F~uv~56	,67KK&&ueV\:VE%e];ELr7   r   c                    t        |       }t        | |      } t        |dz  dz        }t        j                  || j
                  d   | j
                  d   z  z        }t        | j
                  d   |z        }t        | j
                  d   |z        }t        j                  j                  | |||d      } t        | |      } | S )Nr   rg   r  r   )r  r  r   r   rZ   rE   r   rG   rH   rI   r  )r  r   r  r  r   r   r   r   s           r5   scale_total_pixelsr  _  s    UOM!%7E
T!D()Eyy%++b/EKKO"CDEH%++b/H,-E5;;r?X-.FKK&&ueV\:VE%e];ELr7   matchc                     t        |       }t        | |      } t        |t        |            }|j                  d   }|j                  d   }t        j                  j                  | ||||      } t        | |      } | S )Nrg   r  )r  r  rE   rG   rH   rI   r  )r  r   r  r@   r  r   r   s          r5   scale_match_sizer"  l  sn    UOM!%7E!%%9EKKOE[[_FKK&&ueV\4PE%e];ELr7   multiplec                 r   |dk  r| S t        |       }|r| j                  \  }}}}n| j                  \  }}}||z  |z  }||z  |z  }|dk(  s|dk(  r| S ||k(  r||k(  r| S ||z  }	||z  }
|	|
k\  r+|}t        t        j                  ||	z              }||k  r-|}n*|}t        t        j                  ||
z              }||k  r|}t        | |      } t        j                  j                  | |||d      } t        | |      } ||z
  dz  }||z
  dz  }||z   }||z   }|r| d d ||||d d f   S | d d ||||f   S )Nr;   r   r   r<   )
r  rE   r   r   r   r  rG   rH   rI   r  )r  r#  r  r  r   r   r   target_wtarget_hs_ws_hscaled_wscaled_hx0y0x1y1s                    r5   scale_to_multiple_coverr/  w  s   1}UOM#kk65! ;;65!X-H("h.H1}A5X/
U
C
V
C
cztyy#./hHtyy-.hH!%7EKK&&uh,PZ[E%e];E
X
!	#B
X
!	#B	hB	hBQ2r"ua'((BrE2b5!!r7   c            	           e Zd Zg dZddgZ G d de      Zed        Zede	j                  j                  e	j                  j                  z  de	j                  j                  d	ed
e	j                  fd       Zy)ResizeImageMaskNoder   r   r>   c                   ~    e Zd ZU eed<   ed   ed<   ed   ed<   eed<   eed<   eed<   eed	<   eed
<   eed<   eed<   y)#ResizeImageMaskNode.ResizeTypedDictresize_typer   r  )r   r>   r@   r  r   r   r  r  r   r#  N)r\   r]   r^   r   __annotations__r   ra   r   rc   r7   r5   ResizeTypedDictr3    sG    WXX*++
r7   r6  c                    t         j                  j                  dt         j                  t         j                  g      }t         j
                  j                  d| j                  dd      }t        j                  dddd	g d
t         j                  j                  d|      t         j                  j                  ddt         j                  j                  t        j                  t         j                  j                  dddt        dd      t         j                  j                  dddt        dd      |g      t         j                  j                  t        j                  t         j                   j                  dddddd      g      t         j                  j                  t        j"                  t         j                  j                  dddt        dd      g      t         j                  j                  t        j$                  t         j                  j                  dddt        dd      g      t         j                  j                  t        j&                  t         j                  j                  dddt        dd       g      t         j                  j                  t        j(                  t         j                  j                  dddt        dd!      g      t         j                  j                  t        j*                  t         j                   j                  d"ddd#dd$      g      t         j                  j                  t        j,                  t         j.                  j                  d%t         j                  t         j                  gd&'      |g      t         j                  j                  t        j0                  t         j                  j                  d(d)dt        dd*      g      g	+      t         j
                  j                  d,| j2                  d-d.      gt         j                  j5                  |d/0      g1      S )2N
input_typer@   r>   zjHow to handle aspect ratio mismatch: 'disabled' stretches to fit, 'center' crops to maintain aspect ratio.)r&   r   tooltipr1  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  templater4  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   r9  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.r  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.r   zEResize input to match the dimensions of this reference image or mask.r9  r#     zeResize so width and height are divisible by this number. Useful for latent alignment (e.g., 8 or 64).r9  r&   r  r   zpInterpolation algorithm. 'area' is best for downscaling, 'lanczos' for upscaling, 'nearest-exact' for pixel art.resized)r@  r)   )r'   r)   descriptionr*   r(   r,   r-   )r
   	MatchTypeTemplater   Maskr1   r/   r   r.   DynamicComboOptionr   r   r}   r   r   r0   r   r   r   r  r  r  	MultiTyper  scale_methodsr2   )r4   r@  
crop_combos      r5   r6   z!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	
r7   r  r  r4  r8   c           
         |d   }|t         j                  k(  r#t        j                  t	        ||d   |            S |t         j
                  k(  r+t        j                  t        ||d   |d   ||d               S |t         j                  k(  r#t        j                  t        ||d   |            S |t         j                  k(  r#t        j                  t        ||d   |            S |t         j                  k(  r$t        j                  t        ||d   d|            S |t         j                  k(  r$t        j                  t        |d|d   |            S |t         j                  k(  r#t        j                  t        ||d	   |            S |t         j                  k(  r't        j                  t!        ||d
   ||d               S |t         j"                  k(  r#t        j                  t%        ||d   |            S t'        d|       )Nr4  r  r   r   r@   r  r  r   r   r   r#  zUnsupported resize type: )r   r   r
   rL   r   r   r  r   r  r   r  r   r  r  r  r  r"  r  r/  rR   )r4   r  r  r4  selected_types        r5   rN   zResizeImageMaskNode.execute  s   #M2J///==%\1JL!YZZj999==!1%W9M{[cOdfrt  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|]hio]p!qrrj:::==!8J@WYe!fgg4]ODEEr7   N)r\   r]   r^   rL  r   r   r6  r_   r6   r
   r   TyperH  r1   rL   rN   rc   r7   r5   r1  r1    s    OM)L
) 
 <
 <
| FBHHMMBGGLL8 F Fds Fxz  yF  yF F Fr7   r1  imagesc           
      r   t        |       dk(  ry t        d | D              }g }| D ]b  }|j                  d   |k  r=|j                  t        j
                  j                  j                  |ddd             R|j                  |       d g }|d   j                  }|D ]  }|j                  dd  |dd  k7  rY|j                  t        j                  j                  |j                  dd      |d	   |d   d
d      j                  dd             q|j                  |        t	        j                  |d      S )Nr   c              3   :   K   | ]  }|j                   d      yw)rg   N)rE   ).0rv   s     r5   	<genexpr>zbatch_images.<locals>.<genexpr>  s     ;F5u{{2Fs   rg   )r   r;   constantr   )rU   valuer;   r<   r   r>   dim)r   r   rE   appendrJ   nn
functionalr   rG   rH   rI   r   cat)rQ  max_channelspadded_imagesrv   resized_imagesfirst_image_shapes         r5   batch_imagesrb    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^++r7   masksc                 p   t        |       dk(  ry g }| d   j                  }| D ]{  }|j                  dd  |dd  k7  rSt        |d      }t        j                  j                  ||d   |d   dd      }|j                  t        |d             k|j                  |       } t        j                  |d      S )	Nr   r;   F)r  r<   r   r>   rX  )
r   rE   r  rG   rH   rI   rZ  r  rJ   r]  )rc  resized_masksfirst_mask_shapemasks       r5   batch_masksrh    s    
5zQ(*MQx~~::ab>-ab11(UCD;;--d4DQ4GIYZ[I\^hjrsD  !:4u!UV  &  99]**r7   latentsc                    t        |       dk(  ry | d   j                         }g |d<   | d   d   }g }| D ]x  }|j                  t        |j                  |d   d             |d   j                  |j                  dt        d|d   j                  d         D cg c]  }| c}             z t        j                  |d      |d<   |S c c}w )Nr   batch_indexr   F)repeat_batchrX  )
r   copyrZ  r   rE   extendgetr   rJ   r]  )ri  samples_outfirst_samplestensorslatentr[   s         r5   batch_latentsrt  )  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    e Zd Zed        Zedej                  j                  dej                  fd       Z	y)BatchImagesNodec                 8   t         j                  j                  t         j                  j	                  d      ddd      }t        j
                  ddddg d	t         j                  j	                  d
|      gt         j                  j                         g      S )Nrv   r;   2   prefixr   r   rv  zBatch Imageszimage/batchr   )batchzimage batchzbatch imageszcombine imageszmerge imageszstack imagesrQ  r?  )r'   r)   r*   r+   r(   r,   r-   )r
   AutogrowTemplatePrefixr   r/   r.   r2   r4   autogrow_templates     r5   r6   zBatchImagesNode.define_schema9  s    KK66rxx~~g7NW^dekm6nyy%'" -u!!(5F!G !
 	
r7   rQ  r8   c                 l    t        j                  t        t        |j	                                           S N)r
   rL   rb  listvalues)r4   rQ  s     r5   rN   zBatchImagesNode.executeJ  s!    }}\$v}}*?@AAr7   N
r\   r]   r^   r_   r6   r
   r|  rP  rL   rN   rc   r7   r5   rv  rv  8  sH    
 
  BR[[-- B"-- B Br7   rv  c                   r    e Zd Zed        Zedej                  j                  dej                  fd       Z	y)BatchMasksNodec           
      6   t         j                  j                  t         j                  j	                  d      ddd      }t        j
                  dg dddt         j                  j	                  d	|
      gt         j                  j                         g      S )Nrg  r;   rx  ry  r  )zcombine maskszstack maskszmerge maskszBatch Masksz
image/maskrc  r?  r'   r(   r)   r*   r,   r-   )r
   r|  r}  rH  r/   r.   r2   r~  s     r5   r6   zBatchMasksNode.define_schemaO  s    KK66rww}}V7LU[abhj6kyy$J&!!!'4E!F  
 	
r7   rc  r8   c                 l    t        j                  t        t        |j	                                           S r  )r
   rL   rh  r  r  )r4   rc  s     r5   rN   zBatchMasksNode.execute_  s!    }}[elln)=>??r7   Nr  rc   r7   r5   r  r  N  sH    
 
 @BKK,, @ @ @r7   r  c                   r    e Zd Zed        Zedej                  j                  dej                  fd       Z	y)BatchLatentsNodec           
      6   t         j                  j                  t         j                  j	                  d      ddd      }t        j
                  dg dddt         j                  j	                  d	|
      gt         j                  j                         g      S )Nrs  r;   rx  ry  r  )zcombine latentszstack latentszmerge latentszBatch Latentszmodel/latentri  r?  r  )r
   r|  r}  Latentr/   r.   r2   r~  s     r5   r6   zBatchLatentsNode.define_schemad  s    KK66ryyx7PYaghnp6qyy&P(#!!)6G!H 		  "
 	
r7   ri  r8   c                 l    t        j                  t        t        |j	                                           S r  )r
   rL   rt  r  r  )r4   ri  s     r5   rN   zBatchLatentsNode.executet  s"    }}]40@+ABCCr7   Nr  rc   r7   r5   r  r  c  sH    
 
 Dbkk.. D2== D Dr7   r  c                   r    e Zd Zed        Zedej                  j                  dej                  fd       Z	y)BatchImagesMasksLatentsNodec                    t         j                  j                  dt         j                  t         j                  t         j
                  g      }t         j                  j                  t         j                  j                  d|      ddd      }t        j                  dg ddd	t         j                  j                  d
|      gt         j                  j                  d |      g      S )Nr  )allowed_typesr;   rx  ry  r  )zcombine batchzmerge batchzstack inputszBatch Images/Masks/Latentsutilr,   r?  )idr@  r  )r
   rF  rG  r   rH  r  r|  r}  r/   r.   r2   )r4   matchtype_templater  s      r5   r6   z)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
 	
r7   r,   r8   c                     d }t        |j                               }t        |d   t              rt	        |      }n%t        |d         rt        |      }nt        |      }t        j                  |      S )Nr   )
r  r  
isinstancedictrt  r  rb  rh  r
   rL   )r4   r,   batchedr  s       r5   rN   z#BatchImagesMasksLatentsNode.execute  s`    fmmo&fQi&#F+GfQi "6*G "&)G}}W%%r7   Nr  rc   r7   r5   r  r  x  sD    
 
$ &R[[-- &"-- & &r7   r  c                       e Zd Zed        Zed        Zed        Zed        Zed        Z	edd       Z
edd       Zed        Zed	        Zedd
ej                  fd       Zy)ColorTransferc                    t        j                  ddddg dt         j                  j                  dd      t         j                  j                  d	d
      t         j                  j                  dg d      t         j
                  j                  ddt         j
                  j                  dg       t         j
                  j                  dg       t         j
                  j                  dt         j                  j                  ddddd      g      g      t         j                  j                  ddddd      gt         j                  j                  d       g!      S )"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.rA  	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   r9  rC  strengthr   r   rz   r   r   rv   )r)   )r'   r)   r*   rE  r(   r,   r-   )
r
   r.   r   r/   r1   rI  rJ  r}   r0   r2   r3   s    r5   r6   zColorTransfer.define_schema  s&   yy#)$\ S~7bc{4\]x1Y[%%n y..{B?..y"=..~FFLLu(z ) |@  & 	 z3CTPTU" W5-
 	
r7   c                     t         j                  j                  | ||dz    j                  |t        j
                        j                  dddd            S )Nr;   r   r   r:   r<   )korniacolor
rgb_to_labrC   rJ   r   rF   )rQ  irD   s      r5   _to_labzColorTransfer._to_lab  sM    ||&&1QqSMV5==9AA!Q1MO 	Or7   c                    | j                   d   | j                   d   }}| j                   d   | j                   d   z  }t        j                  |d|t        j                        }t	        |      D ]=  }|t
        j                  | ||      j                  |d      j                  dd      z  }? ||z  }t        j                  ||rdn||t        j                        }	t	        |      D ]]  }t
        j                  | ||      j                  |d      |z
  }
|r|	|
|
z  j                  dd      z  }	I|	|
|
j                  z  |z  z  }	_ |r)|t        j                  |	|z        j                  |      fS ||	|z  fS )	z1Two-pass pooled mean + std/cov across all frames.r   r:   r;   r<   r   rg   TrY  keepdim)rE   rJ   r   r   r   r  r  viewmeanTrZ   
clamp_min_)rQ  rD   is_reinhardepsNCHWr  r  acccentereds              r5   _pool_statszColorTransfer._pool_stats  s^    ||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$,,VQ?DDQKdRH8+11b$1GGx(**,r11  C!G,77<<<S1W}r7   c                     | j                  dd      }|r%|| j                  ddd      j                  |      fS | |z
  }|||j                  z  |z  fS )zPer-frame mean + std/cov.rg   Tr  F)rY  r  unbiased)r  stdr  r  )lab_flathwr  r  r  r  s         r5   _frame_statszColorTransfer._frame_stats  sa     }}T}2"dUKVVWZ[[[d?X

*R///r7   c                    t         j                  j                  |       \  }}t        j                  |j	                  d            j                  |      }||j                  d      z  }|j                  |z  |z  }t         j                  j                  |      \  }}	t        j                  |j	                  d            }
d|z  }||j                  d      z  }|	|
j                  d      z  |	j                  z  }||z  |j                  z  S )zACompute MKL 3x3 transform matrix from source and ref covariances.r   r   )rJ   linalgeighrZ   	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                 r5   _mkl_matrixzColorTransfer._mkl_matrix  s      %||007	9ZZ	 3 3A 67BB3G
z33A66jj5 8+$||005	9I//23:%
 :#7#7#::f..q11Y[[@f$|~~55r7   c                 "   | |dz
  z  j                         j                  d|dz
        }||dz
  z  j                         j                  d|dz
        }t        j                  | j                  d   || j
                  | j                        }t        j                  | j                  d   || j
                  | j                        }t        j                  |       }t        j                  |      }|j                  d||       |j                  d||       |j                  d      }	|	|	ddddf   z  }	|j                  d      }
|
|
ddddf   z  }
t        j                  |
|	      j                  |dz
        j                         |dz
  z  S )zPBuild per-channel LUT from source and ref histograms. src/ref: (C, HW) in [0,1].r;   r   r   Nrg   )longrK   rJ   r   rE   rD   rn   	ones_likescatter_add_cumsumsearchsorted
clamp_max_ra   )srcrefbinss_binsr_binss_histr_histones_sones_rs_cdfr_cdfs              r5   _histogram_lutzColorTransfer._histogram_lut  sW    "((*00D1H="((*00D1H=SYYq\4

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

#))T%%Avv.Avv.a af%a af%!!%/::4!8DJJLPTWXPXYYr7   c                    |j                   d   }t        j                  |||t        j                        }t	        |j                   d         D ]  }||   j                  |t        j                        j                  ddd      j                  |d      }||dz
  z  j                         j                  d|dz
        }|j                  d|t        j                  |              |j                  d      }	|	|	ddddf   z  S )	z8Build pooled CDF across all frames, one frame at a time.r:   r   r   r   r<   r;   rg   N)rE   rJ   r   r   r   rC   rF   reshaper  rK   r  r  r  )
r4   rQ  rD   num_binsr  histr  framer  cdfs
             r5   _pooled_cdfzColorTransfer._pooled_cdf  s     LLO{{1hvU]]Kv||A'A1ILLu}}L=EEaANVVWXZ\]EX\*00288HqLIDauu'=> ( kk!nSBC[  r7   c                    |dk(  ry| j                  ||      }|dk(  r(t        ||dz
        }| j                  |||dz    |      }	n| j                  ||      }	t        j                  ||	      j	                  d      j                         dz  S )z<Build per-frame or uniform LUT transform for histogram mode.r  Nr  r;   r   g     o@)r  r   rJ   r  r  ra   )
r4   r  r  rD   
stats_moder  Br  tir  s
             r5   _build_histogram_transformz(ColorTransfer._build_histogram_transform	  s     $	62'\1q5)BOOLBqD$96BEOOL&9E!!%/::3?EEG%OOr7   c                 T    d|j                   \  }}}	j                   d   dk(  ||	z  j                   d   j                   d   z  s|dv r j                        \  |dv r|dk(  rJt        ||dz
        }
 j                  ||
      j	                  d      } j                  |      \  }}n j                  |      \  }}r|z  |z  z
  fdS  j                  |      |z  z
  fd	S  fd
}|S )zOBuild transform parameters for Lab-based methods. Returns a transform function.gư>r   r;   r<   )r  r  r  rg   c                     | z  z   S r  rc   )src_flatr   offsetr;  s     r5   <lambda>z4ColorTransfer._build_lab_transform.<locals>.<lambda>1  s    X-=-Fr7   c                     | z  z   S r  rc   )r  r   r  r  s     r5   r  z4ColorTransfer._build_lab_transform.<locals>.<lambda>4  s    X)>r7   c                 H   j                  |       \  }}r}}nGt        |	dz
        }j                  j                  |      j                  
d            \  }}| |z
  }r|||z  z  |z   S j	                  ||j
                  z  z  |      }||z  |z   S r  )r  r   r  r  r  r  )r  	frame_idxs_means_scr_meanr_scrir  r  B_refr  r  HW_refr4   rD   r  r  r  ref_meanref_sc
single_refs            r5   per_frame_transformz?ColorTransfer._build_lab_transform.<locals>.per_frame_transform7  s    ++Hb+sKLFD'EAI."//Ir60R0W0WXY[]0^`fhsuxy&(H4$;/&888:: 5 :D#FAx<&((r7   )rE   r  r   r  r  r  r  )r4   r  r  rD   r  r  r  r  HWr  s_labr  r   r	  r  r  r  r  r  r  r  r  r  r;  r  s   ` ``  `        @@@@@@@@@@@r5   _build_lab_transformz"ColorTransfer._build_lab_transform  sM    !''
1a"aZ
U#iooa&88 'BB"y&+sSHf 44^+q1u-L"f=BB1bI"//r;L"|V[RUV!EFN2FFfc2AF
*F>>	) 	) #"r7   r8   c                 p   |d   }|j                  dd      }|dk(  s|t        j                  |      S t        j                  j                         }t        j                  j                         }	t        j                  j                         }
|j                  \  }}}}|j                  d   }t        j                  j                  |      }t        j                  |||||	|
      }|dk(  r| j                  ||||||      }t        |      D ]a  }||   j                  |t        j                         j#                  ddd      }|j%                  |d	      }||}nft'        ||dz
        }||   j                  |t        j                         j#                  ddd      j%                  |d	      }| j)                  ||      }|d
z  j+                         j-                  dd
      }|j/                  d|      j1                  |||      }|dk(  r|nt        j2                  |||      }|j#                  ddd      j5                  dd      j                  |	|
      ||<   |j7                  d       d n-| j9                  ||||||dk(        }t        |      D ]  }| j;                  |||      } ||j1                  |d	      |      }|dk(  r2t<        j>                  jA                  |j1                  d|||            }nFt<        j>                  jA                  t        j2                  ||j1                  d|||      |            }|jC                  d      j#                  ddd      j5                  dd      j                  |	|
      ||<   |j7                  d        t        j                  |      S )Nr  r  r   r   r  r   r<   r;   rg   r   r   r  )r  )r  )"ro  r
   rL   rG   r   r   r   intermediate_dtyperE   rH   ProgressBarrJ   emptyr  r   rC   r   rF   r  r   r  r  rK   gatherr  lerpr   updater  r  r  r  
lab_to_rgbr  )r4   r  r  r  r  r  r  r  rD   r   r  r  r
  r  r  r  pbaroutuniform_lutr  r  r  lutr  r  bin_idxmatchedr   	transform	src_frame	correcteds                                  r5   rN   zColorTransfer.executeH  sj   !.1
#'':q=I-==..''88:#44HHJ"33FFH!''
1a"{{&&q)kk!Q1-@HZ[[ 88i\1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5aA>$,OCRZ9[1a0771=@@H[cu@vAA  00y&R\^jx~  CQ  yQ0  RI1XKKa@	%innQ&;qI	s?#\\44Y^^Aq!Q5OPF#\\44UZZ	9>>Z[]^`acdKego5pqF*221a;BB1aHKKSf  oAK  BAA  }}S!!r7   N)r   )r   )r\   r]   r^   r_   r6   r   r  r  r  r  r  r  r  r  r
   rL   rN   rc   r7   r5   r  r    s    
 
8 O O  & 0 0 6 6 Z Z  	! 	! P P .# .#` /"UWUbUb /" /"r7   r  c                   B    e Zd Zedeeej                        fd       Zy)PostProcessingExtensionr8   c           
      r   K   t         t        t        t        t        t
        t        t        t        t        g
S wr  )
r   rs   r   r   r   r1  rv  r  r  r  )selfs    r5   get_node_listz%PostProcessingExtension.get_node_list|  s0      #
 	
s   57N)	r\   r]   r^   r   r  typer
   	ComfyNoder#  rc   r7   r5   r   r   {  s)    
T$r||*<%= 
 
r7   r   c                     K   t               S wr  )r   rc   r7   r5   comfy_entrypointr'    s     "$$s   )r   )Btyping_extensionsr   r   r   rJ   torch.nn.functionalr[  r\  r   PILr   r   enumr   typingr   r   r  comfy.utilsrG   comfy.model_managementcomfy_extras.nodes_latentr   rA   comfy_api.latestr	   r
   nodesr   r%  r   r   r   ra   rq   rs   r   r   r   rb   r   r`   boolr  r  r  r   r  r  r  r  r"  r/  r1  r  rb  rh  r  rt  rv  r  r  r  r  r   r'  rc   r7   r5   <module>r3     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 %r7   