
    +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j)        de*fdZ+dej)        de*dej)        fdZ,dej)        de*dej)        fdZ-dej)        de!de'dej)        fd Z.dEdej)        d"e d#e de'd$e'dej)        fd%Z/dej)        d&e de'dej)        fd'Z0dej)        d(e de'dej)        fd)Z1dej)        d*e!de'dej)        fd+Z2dej)        d,ej)        de'd$e'dej)        f
d-Z3dej)        d.e de'dej)        fd/Z4 G d0 d1ej                  Z5d2e6ej)                 dej)        dz  fd3Z7d4e6ej)                 dej)        dz  fd5Z8d6e6e9e'ej)        f                  de9e'ej)        f         dz  fd7Z: G d8 d9ej                  Z; G d: d;ej                  Z< G d< d=ej                  Z= G d> d?ej                  Z> G d@ dAej                  Z? G dB dCe          Z@de@fdDZAdS )F    )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d
S )Blendc                 v   t          j        ddgdddt           j                            d          t           j                            d          t           j                            dd	d
dd          t           j                            dg d          gt           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    B/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_post_processing.pydefine_schemazBlend.define_schema   s    y (>'$ -x((x((~sSWXX|5|5|5|}}	 !!
 
 
 	
    r   r   r   r   returnc                    t          j        ||          \  }}|                    |j                  }|j        |j        k    rj|                    dddd          }t          j                            ||j        d         |j        d         dd          }|                    dddd          }| 	                    |||          }|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    %5ffEE6=))<6<''^^Aq!Q//F[//QVWir  zB/  C  CF^^Aq!Q//FvvzBB!l"23ml6RRM1a8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    rNt          j        |dk    |dd|z  z
  |z  d|z
  z  z
  |d|z  dz
  |                     |          |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{p{  C  qC  _D  XD  E  E  E\!!$;:D::;;;r7   c                 x    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   s9    {19Qq'81'<&A5:a==QQQr7   N)__name__
__module____qualname__classmethodr6   rJ   Tensorfloatstrr
   rL   rN   r   rQ    r7   r5   r   r      s        
 
 [
$ ,U\ ,5< ,u ,be ,jljw , , , [, < < [< R R [R R Rr7   r   kernel_sizesigmac           	      ^   t          j        t          j        dd| |          t          j        dd| |          d          \  }}t          j        ||z  ||z  z             }t          j        ||z   d|z  |z  z            }||                                z                      |          S )Nr;   )rD   ij)indexingg       @)rJ   meshgridlinspacerZ   expsumrC   )rd   re   rD   dtyper[   ydrQ   s           r5   gaussian_kernelrq   H   s    >%.QFKKKU^\^`acnw}M~M~M~  JN  O  O  ODAq
1q51q5=!!A	AE(cEkE1233AKE"""r7   c            	       `    e Zd Zed             Zedej        dedede	j
        fd            ZdS )Blurc                 6   t          j        dddt           j                            d          t           j                            ddddd          t           j                            d	d
ddd          gt           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   s    y%$w'']A1"1MMw$SQQ !!
 
 
 	
r7   rv   rw   re   r8   c                    |dk    rt          j        |          S |                    t          j                                                  }|j        \  }}}}|dz  dz   }t          |||j        |j	                  
                    |dd                              d          }	|                    dddd          }t          j        |||||fd          }
t          j        |
|	|dz  |          d d d d || || f         }|                    dddd          }t          j        |                    t          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_   s|   !='''/@@BBCC.3k+
FE8!Ao) eELPUP[\\\ccdlnoqrss}}~  A  AaAq))uU[[$UW`aa(<9IRZ[[[\]\]\]^_^_^_`kmxlx`x  {F  HS  GS  {S  ]S  T//!Q1--}WZZ(>(R(R(T(TUUVVVr7   Nr\   r]   r^   r_   r6   rJ   r`   intra   r
   rL   rN   rc   r7   r5   rs   rs   N   sw        
 
 [
 WEL Ws W5 WR] W W W [W 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dS )	Quantizec                 4   t          j        dddt           j                            d          t           j                            ddddd          t           j                            d	g d
          gt           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   s    y#)$w''XssKKx1y1y1yzz !!
 
 
 	
r7   c                 
   fdt          |                                          dz  }d|z  }t          t          j        |                    }t          j        | |          z  dz             }t          j        t          j        |           	                    t          j
                            }t          j        |j        d         |j        d         z            }t          j        |j        d         |j        d         z            }	|                    ||	                              d          }
|                    |
d |j        d         d |j        d         f                                       dd           |                    t
          j        	          }t'          j        |                                                                          } |                     |t&          j        j        
          } | 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   ss    Avvxy111F//A666w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 	E 	E 	E 	E **,,--2
:%di&&'''1H1H1Q1Q(QTW(WXX!"(2,,"5"5bj"A"ABBYv|A);A)>>??Yv|A);A)>>??#((R00::2>>L!1&,q/!12B6<?2B!BCDDKKAsSSS--_VZZ\\//1122[[0A[BB	r7   rv   r   r   r8   c                 f   |j         \  }}}}t          j        |          }t          |          D ]m}	t	          j        ||	         dz                      t          j                                                  d          }
|
	                    |          }|dk    r'|
	                    |t          j
        j                  }n|dk    r'|
	                    |t          j
        j                  }nY|                    d          rDt          |                    d	          d
                   }t                               |
||          }t          j        t'          j        |                    d                                                              dz  }|||	<   ot/          j        |          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   sr   ',{$
FE1!%((z"" 	( 	(A%(S.!4!4U[!A!A!G!G!I!IPUVVVB[[[//F"$++fU\EV+"W"W,,,"$++fU\E`+"a"a""7++ DFLL--b122"*..VU"C"C#l28O4K4KE4R4R+S+STTZZ\\_bbO'F1II}V$$$r7   N)r\   r]   r^   r_   r6   staticmethodr   rJ   r`   r   rb   r
   rL   rN   rc   r7   r5   r   r   r   s        
 
 [
   \2 %EL %# %s %r} % % % [% % %r7   r   c                   d    e Zd Zed             Zedej        dededede	j
        f
d            ZdS )	Sharpenc                    t          j        dddt           j                            d          t           j                            dddddd	          t           j                            d
ddddd	          t           j                            dddddd	          gt           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    y"($w''-qaRaZ^__w$T\`aaw#D[_``	 !!
 
 
 	
r7   rv   r   re   r   r8   c                    |dk    rt          j        |          S |j        \  }}}}|                    t          j                                                  }|dz  dz   }	t          |	||j        |j	                  |dz   z  }
|
                    |j	                  }
|	dz  }|
||f         |

                                z
  dz   |
||f<   |
                    |dd                              d          }
|                    dddd          }t          j        |||||fd	          }t          j        ||
||
          d d d d || || f         }|                    dddd          }t#          j        |dd          }t          j        |                    t          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='''.3k+
FE8/@@BBCC$q(1, eELPUP[\\\afgiai_jj--!!'!7&**,,!F!Lvv~xA..88;;}}Q1a00u\N>.Yg+hjsttH\66(SSSTUTUTUVWVWVWXfhvgvXv  yG  IW  HW  yW  UW  X	%%aAq11	Y1--}VYYu'='Q'Q'S'STTUUUr7   Nr   rc   r7   r5   r   r      s        
 
 [
  VEL V# VU VSX V]_]j V V V [V V Vr7   r   c                   Z    e Zd Zg dZddgZed             Zedej        fd            Z	dS )ImageScaleToTotalPixelsznearest-exactbilineararear=   lanczosdisabledr>   c                    t          j        dddt           j                            d          t           j                            d| j                  t           j                            ddd	d
d	          t           j                            ddddd          gt           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    y-6&w''/9LMM|SdSWXX/sUYZZ	 !!
 
 
 	
r7   r8   c                    |                     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                            |t          |          t          |	          |d          }
|
                     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(9UgmA&6q9I&IJKKgmA&14DDEEHXXw}Q'(25EEFFIYYK&&wE

CKKYcddIIaOO}Qr7   N)
r\   r]   r^   r   crop_methodsr_   r6   r
   rL   rN   rc   r7   r5   r   r      sk        QQQO)L
 
 [
  
 R] 
  
  
  [
  
  
 r7   r   c                   2    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )
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      sB        $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                 b    |r|                      dd          } n|                     d          } | S )Nrg   r;   )r   r   r  r  s     r5   init_image_mask_inputr    s5     #b!$$""Lr7   c                 b    |r|                      dd          } n|                     d          } | S Nr;   rg   )r   squeezer
  s     r5   finalize_image_mask_inputr    s5     !a$$a  Lr7   
multiplierscale_methodc                    t          |           }t          | |          } t          | j        d         |z            }t          | j        d         |z            }t          j                            | |||d          } t          | |          } | S Nrg   r   )r  r  r   rE   rG   rH   rI   r  )r  r  r  r  r   r   s         r5   r   r     s}    UOOM!%77E%+b/J.//E5;r?Z/00FK&&ueV\:VVE%e];;ELr7   r   r   r   r@   c                    |dk    r|dk    r| S t          |           }t          | |          } |dk    r:t          dt          | j        d         |z  | j        d         z                      }n?|dk    r9t          dt          | j        d         |z  | j        d         z                      }t
          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    zzfkkUOOM!%77EzzAuU[_v5BGHHII	1Qek"o5BGHHIIK&&ueV\4PPE%e];;ELr7   longer_sizec                 ^   t          |           }t          | |          } | j        d         }| j        d         }||k    rt          ||z  |z            }|}n"||k    rt          ||z  |z            }|}n|}|}t          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    UOOM!%77EKOE[_F~~uv~455	+566K&&ueV\:V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                            | |||d          } t          | |          } | S r  r  )r  r  r  r  r   r   s         r5   scale_shorter_dimensionr  K  s    UOOM!%77EKOE[_F~~uv~566	,677K&&ueV\:V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        	                    | |||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    UOOM!%77E
T!D())Ey%+b/EKO"CDEEH%+b/H,--E5;r?X-..FK&&ueV\:VVE%e];;ELr7   matchc                    t          |           }t          | |          } t          |t          |                    }|j        d         }|j        d         }t          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  sx    UOOM!%77E!%%99EKOE[_FK&&ueV\4PPE%e];;ELr7   multiplec                    |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                            | |||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}}UOOM '#k65!! ;65!X-H("h.H1}}A5X//
U
C
V
C
czzty#..//hHty--..hH!%77EK&&uh,PZ[[E%e];;E
X
!	#B
X
!	#B	hB	hB )QQQ2r"uaaa'((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dS )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<   dS )#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    s         WXXXX*++++


r7   r6  c                 *   t           j                            dt           j        t           j        g          }t           j                            d| j        dd          }t          j        dddd	g d
t           j                            d|          t           j	                            ddt           j	        
                    t          j        t           j                            dddt          dd          t           j                            dddt          dd          |g          t           j	        
                    t          j        t           j                            dddddd          g          t           j	        
                    t          j        t           j                            dddt          dd          g          t           j	        
                    t          j        t           j                            dddt          dd          g          t           j	        
                    t          j        t           j                            dddt          dd           g          t           j	        
                    t          j        t           j                            dddt          dd!          g          t           j	        
                    t          j        t           j                            d"ddd#dd$          g          t           j	        
                    t          j        t           j                            d%t           j        t           j        gd&'          |g          t           j	        
                    t          j        t           j                            d(d)dt          dd*          g          g	+          t           j                            d,| j        d-d.          gt           j                            |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KX^^$ A	 $ 
 

 y),P& m  m  m""7X">>%%!s..z/JFLL#1._`  kJL  K  KFLL3A>`a  lKL  L  L&M  
 ..z/BHNN<4UX_c  ngN  h  hE   ..z/PFLLP^ef  q|L  }  }S   ..z/QFLL!Q_fg  r~L    T   ..z/EFLL#1._`  krL  s  sH   ..z/FFLL3A>`a  lsL  t  tI   ..z/LHNN<$TX_c  n~N    O   ..z/DL..w278K  V].  ^  ^&G   ..z/KFLLQA>`a  lSL  T  TN  9 & # #H "-" O	   M,Z \((((SSTg4
 4
 4
 4	
r7   r  r  r4  r8   c           
      f   |d         }|t           j        k    r)t          j        t	          ||d         |                    S |t           j        k    r7t          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    r0t          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!YZZZj999=!1%W9M{[cOdfrt  AG  uH  "I  "I  J  J  Jj???=!7{=?Y[g!h!hiiij@@@=!8N@[]i!j!jkkkj444=!1%W9MqR^!_!_```j555=!1%K<QS_!`!`aaaj;;;=!3E;|;TVb!c!cdddj333=!1%W9M|]hio]p!q!qrrrj:::=!8J@WYe!f!fgggD]DDEEEr7   N)r\   r]   r^   rL  r   r   r6  r_   r6   r
   r   TyperH  r1   rL   rN   rc   r7   r5   r1  r1    s        OOOM)L
 
 
 
 
) 
 
 
 <
 <
 [<
| FBHMBGL8 F Fds Fxz  yF F F F [F F Fr7   r1  imagesc           
         t          |           dk    rd S t          d | D                       }g }| D ]d}|j        d         |k     r<|                    t          j        j                            |ddd                     O|                    |           eg }|d         j        }|D ]}|j        dd          |dd          k    rk|                    t          j	        
                    |                    dd          |d	         |d         d
d                              dd                     |                    |           t	          j        |d          S )Nr   c              3   0   K   | ]}|j         d          V  dS )rg   N)rE   ).0rv   s     r5   	<genexpr>zbatch_images.<locals>.<genexpr>  s(      ;;5u{2;;;;;;r7   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    s   
6{{at;;F;;;;;L(*M ( (;r?\))  !4!8!8J^a!8!b!bcccc  '''')+N%a(. ) );qrr?/333!!%+"<"<U]]2a=P=PRcdeRfhyz{h|  I  KS  #T  #T  #\  #\  ]^  _a  #b  #b  c  c  c  c!!%((((9^++++r7   masksc                    t          |           dk    rd S g }| d         j        }| D ]}|j        dd          |dd          k    ret          |d          }t          j                            ||d         |d         dd          }|                    t          |d                     |                    |           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    
5zzQt(*MQx~ ' ':abb>-abb111(UCCCD;--d4DQ4GIYZ[I\^hjrssD  !:4u!U!U!UVVVV  &&&&9]****r7   latentsc                    t          |           dk    rd S | d                                         }g |d<   | d         d         }g }| D ]}|                    t          |j        |d         d                     |d                             |                    dd t          d|d         j        d                   D                                  t          j	        |d          |d<   |S )Nr   batch_indexr   F)repeat_batchc                     g | ]}|S rc   rc   )rT  r[   s     r5   
<listcomp>z!batch_latents.<locals>.<listcomp>4  s    DuDuDu1QDuDuDur7   rX  )
r   copyrZ  r   rE   extendgetr   rJ   r]  )ri  samples_outfirst_samplestensorslatents        r5   batch_latentsrv  )  s    
7||qt!*//##K!#KAJy)M"$G x x()<fY>O^cdddeeeM"))&**]DuDuPUVWY_`iYjYpqrYsPtPtDuDuDu*v*vwwww"YwA666K	r7   c                   b    e Zd Zed             Zedej        j        dej        fd            Z	dS )BatchImagesNodec                 6   t           j                            t           j                            d          ddd          }t          j        ddddg d	t           j                            d
|          gt           j                                        g          S )Nrv   r;   2   prefixr   r   rx  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    K66rx~~g7N7NW^dekm6nny%'" -uuu!!(5F!GG !!
 
 
 	
r7   rQ  r8   c                     t          j        t          t          |                                                              S N)r
   rL   rb  listvalues)r4   rQ  s     r5   rN   zBatchImagesNode.executeJ  s*    }\$v}}*?*?@@AAAr7   N
r\   r]   r^   r_   r6   r
   r~  rP  rL   rN   rc   r7   r5   rx  rx  8  sj        
 
 [
  BR[- B"- B B B [B B Br7   rx  c                   b    e Zd Zed             Zedej        j        dej        fd            Z	dS )BatchMasksNodec           
      4   t           j                            t           j                            d          ddd          }t          j        dg dddt           j                            d	|
          gt           j                                        g          S )Nrg  r;   rz  r{  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    K66rw}}V7L7LU[abhj6kky$JJJ&!!!'4E!FF   
 
 
 	
r7   rc  r8   c                     t          j        t          t          |                                                              S r  )r
   rL   rh  r  r  )r4   rc  s     r5   rN   zBatchMasksNode.execute_  s*    }[ellnn)=)=>>???r7   Nr  rc   r7   r5   r  r  N  sj        
 
 [
 @BK, @ @ @ @ [@ @ @r7   r  c                   b    e Zd Zed             Zedej        j        dej        fd            Z	dS )BatchLatentsNodec           
      4   t           j                            t           j                            d          ddd          }t          j        dg dddt           j                            d	|
          gt           j                                        g          S )Nru  r;   rz  r{  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    K66ryx7P7PYaghnp6qqy&PPP(#!!)6G!HH 	  ""
 
 
 	
r7   ri  r8   c                     t          j        t          t          |                                                              S r  )r
   rL   rv  r  r  )r4   ri  s     r5   rN   zBatchLatentsNode.executet  s,    }]40@0@+A+ABBCCCr7   Nr  rc   r7   r5   r  r  c  sj        
 
 [
 Dbk. D2= D D D [D D Dr7   r  c                   b    e Zd Zed             Zedej        j        dej        fd            Z	dS )BatchImagesMasksLatentsNodec                    t           j                            dt           j        t           j        t           j        g          }t           j                            t           j                            d|          ddd          }t          j	        dg ddd	t           j                            d
|          gt           j        
                    d |          g          S )Nr  )allowed_typesr;   rz  r{  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2728UWU\^`^gJh2iiK66""7,>??A2 7 / / y1KKK5!!(5F!GG ##t6H#II
 
 
 	
r7   r,   r8   c                 .   d }t          |                                          }t          |d         t                    rt	          |          }n4t          |d                   rt          |          }nt          |          }t          j	        |          S )Nr   )
r  r  
isinstancedictrv  r  rb  rh  r
   rL   )r4   r,   batchedr  s       r5   rN   z#BatchImagesMasksLatentsNode.execute  s    fmmoo&&fQi&& 	*#F++GGfQi   	*"6**GG "&))G}W%%%r7   Nr  rc   r7   r5   r  r  x  sb        
 
 [
$ &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dS )ColorTransferc                    t          j        ddddg dt           j                            dd          t           j                            d	d
          t           j                            dg d          t           j                            ddt           j                            dg           t           j                            dg           t           j                            dt           j                            ddddd          g          g          t           j                            ddddd          gt           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  sQ   y#)$\ S  S  S~7bcc{4\]]x1Y1Y1Y[[%%n y..{B??..y"==..~FLLu(z ) | |@   & 	 	 z3CTPTUU" W55-
 
 
 	
r7   c                     t           j                            | ||dz                                |t          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  sW    |&&1QqS5MV5=99AA!Q1MMO O 	Or7   c                    | j         d         | j         d         }}| j         d         | j         d         z  }t          j        |d|t          j                  }t	          |          D ]J}|t
                              | ||                              |d                              dd          z  }K||z  }t          j        ||rdn||t          j                  }	t	          |          D ]e}t
                              | ||                              |d          |z
  }
|r|	|
|
z                      dd          z  }	U|	|
|
j	        z  |z  z  }	f|r,|t          j
        |	|z                                |          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emDDDq 	d 	dAM))&!V<<AA!RHHMMRT^bMcccDD	k!+4QQ1V5=YYYq 	2 	2A$,,VQ??DDQKKdRH 28+11b$1GGGx(*,r11 	=C!G,,77<<<<S1W}r7   c                     |                      dd          }|r-||                     ddd                              |          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  sn     }}T}22 	\"dUKKVVWZ[[[[d?X
*R///r7   c                 *   t           j                            |           \  }}t          j        |                    d                                        |          }||                    d          z  }|j        |z  |z  }t           j                            |          \  }}	t          j        |                    d                    }
d|z  }||                    d          z  }|	|
                    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7	9Z	 3 3A 6 677BB3GG
z33A666j5 8+$|0055	9I//2233:%
 :#7#7#:#::f..q111Y[@f$|~55r7   r   c                 D   | |dz
  z                                                       d|dz
            }||dz
  z                                                       d|dz
            }t          j        | j        d         || j        | j                  }t          j        | j        d         || j        | j                  }t          j        |           }t          j        |          }|                    d||           |                    d||           |	                    d          }	|	|	ddddf         z  }	|	                    d          }
|
|
ddddf         z  }
t          j
        |
|	                              |dz
                                            |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  s    "((**00D1H=="((**00D1H==SYq\4
#)TTTSYq\4
#)TTT%%%%Avv...Avv...a  aaaf%a  aaaf%!%//::4!8DDJJLLPTWXPXYYr7   c                 :   |j         d         }t          j        |||t          j                  }t	          |j         d                   D ]}||                             |t          j                                      ddd                              |d          }||dz
  z                                  	                    d|dz
            }|
                    d|t          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    LO{1hvU]KKKv|A'' 	? 	?A1ILLu}L==EEaANNVVWXZ\]]EX\*002288HqLIIDauu'='=>>>>kk!nnSBCC[  r7   c                 Z   |dk    rdS |                      ||          }|dk    r5t          ||dz
            }|                      |||dz            |          }	n|                      ||          }	t          j        ||	                              d                                          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     $$4	622''\1q5))BOOLBqD$96BBEEOOL&99E!%//::3??EEGG%OOr7   c                 z    d|j         \  }}}	j         d         dk    ||	z  j         d         j         d         z  s|dv r                               \  |dv r|dk    rZt          ||dz
            }
                     ||
                              d          }                     |          \  }}n                     |          \  }}r|z  |z  z
  fdS                      |          |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-=-F r7   c                     | z  z   S r  rc   )r  r   r  r  s     r5   r  z4ColorTransfer._build_lab_transform.<locals>.<lambda>4  s    X)> r7   c                 n                        |           \  }}r}}nWt          |	dz
            }                                         |                              
d                    \  }}| |z
  }r|||z  z  |z   S                     ||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KKLFD z'EAI.."//Ir60R0R0W0WXY[]0^0^`fhsuxyy&(H 94$;/&888: 5 :D#F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  s    !'
1a"aZ
U#ioa&88  	T'BBB"y&+sSSHf 444^++q1u--L"f==BB1bII"//r;LL"|V[RUVV G!EFN2FFFFFFfc22AF
*F>>>>>>	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) #"r7   r   r8   c                 R   |d         }|                     dd          }|dk    s|t          j        |          S t          j                                        }t          j                                        }	t          j                                        }
|j        \  }}}}|j        d         }t          j	        
                    |          }t          j        |||||	|
          }|dk    r|                     ||||||          }t          |          D ]}||                             |t          j                                      ddd          }|                    |d	          }||}nyt'          ||dz
            }||                             |t          j                                      ddd                              |d	          }|                     ||          }|d
z                                                      dd
          }|                    d|                              |||          }|dk    r|nt          j        |||          }|                    ddd                              dd                              |	|
          ||<   |                    d           n[|                     ||||||dk              }t          |          D ]+}|                     |||          } ||                    |d	          |          }|dk    r6t<          j                             |                    d|||                    }nIt<          j                             t          j        ||                    d|||          |                    }|!                    d                              ddd                              dd                              |	|
          ||<   |                    d           -t          j        |          S )Nr  r  r   r   r  r   r<   r;   rg   r   r   r  )r  )r   )"rq  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  s   !.1
#''::q==I-=...'88::#4HHJJ"3FFHH!'
1a"{&&q))k!Q1-@HZ[[[[  88i\1N NK 1XX  "1o((u}(EEMMaQRTUVV;;q"--*%CCQ	**B#B-**6*GGOOPQSTVWXX``abdfggC,,Xs;;C#c>//11773??**Q0055aA>>$,OOCRZ9[9[1a00771==@@H[cu@vvAA 00y&R\^jx~  CQ  yQ0  R  RI1XX  KKa@@	%IinnQ&;&;qIII	s??#\44Y^^Aq!Q5O5OPPFF#\44UZ	9>>Z[]^`acdKeKego5p5pqqF**221a;;BB1aHHKKSf  oAK  B  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    sJ       
 
 [
8 O O \O   \& 0 0 \0 6 6 \6 Z Z Z \Z  	! 	! 	! [	! P P [P .# .# [.#` /" /"UWUb /" /" /" [/" /" /"r7   r  c                   L    e Zd Zedeeej                          fd            ZdS )PostProcessingExtensionr8   c           
         K   t           t          t          t          t          t
          t          t          t          t          g
S r  )
r   rs   r   r   r   r1  rx  r  r  r  )selfs    r5   get_node_listz%PostProcessingExtension.get_node_list|  s0       #
 	
r7   N)	r\   r]   r^   r   r  typer
   	ComfyNoder%  rc   r7   r5   r"  r"  {  sE        
T$r|*<%= 
 
 
 X
 
 
r7   r"  c                  "   K   t                      S r  )r"  rc   r7   r5   comfy_entrypointr)    s      "$$$r7   )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  rv  rx  r  r  r  r  r"  r)  rc   r7   r5   <module>r5     s   & & & & & &                            % % % % % % % %          7 7 7 7 7 7     / / / / / / / /            4R 4R 4R 4R 4RBL 4R 4R 4Rl <@u} # # #U # # # #!W !W !W !W !W2< !W !W !WH@% @% @% @% @%r| @% @% @%D(V (V (V (V (Vbl (V (V (VT              bl         D	, 	, 	, 	, 	,d 	, 	, 	,!EL !T ! ! ! !
 d u|    U\ $ 5<    EL e 3 5<     EL  c QT \_ oto{    %, S PS X]Xd    (5< s RU Z_Zf    (el  S UZUa    	EL 	 	S 	X[ 	`e`l 	 	 	 	#"5< #"3 #"c #"V[Vb #" #" #" #"JdF dF dF dF dF", dF dF dFL,el+ ,t0C , , , ,.+tEL) +elT.A + + + + 4S%,%6 78 T#u|BS=TW[=[    B B B B Bbl B B B,@ @ @ @ @R\ @ @ @*D D D D Dr| D D D*!& !& !& !& !&", !& !& !&H\" \" \" \" \"BL \" \" \"~
 
 
 
 
n 
 
 
"% 7 % % % % % %r7   