
    +jEB                     |   d dl Zd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZmZmZ d dlZd%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j                  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j                  Z G d dej                  Z G d dej                  Z G d d ej                  Z G d! d"e          Zd#efd$Z dS )&    N)override)ComfyExtensionIOUI   Fc           	      p   |                     | j                  }|r?t          j        j                            || j        d         | j        d         fd          }t          j        	                    || j        d                   }t          |j        d          |z  t          || j        d         |z                      }t          |j        d          |z  t          || j        d         |z                      }||z  ||z  }}||j        d         z   ||j        d         z   }
}	|t          j        |          }n|                     | j        d          }t          j        j                            |                    dd|j        d         |j        d         f          |j        d         |j        d         fd          }t          j        	                    ||j        d                   }| j        d         |z
  t          d|          z   | j        d         |z
  t          d|          z   }}|d d d d d |d |f         }|j        |j        k     r|                    d          }t          j        |          |z
  }||d	d |d |f         z  }|| d	||
||	f         z  }||z   | d	||
||	f<   | S )
Nbilinear)sizemoder   T)copy   .)todevicetorchnn
functionalinterpolateshapecomfyutilsrepeat_to_batch_sizemaxmin	ones_likereshapendim	unsqueeze)destinationsourcexymask
multiplierresize_sourcelefttoprightbottomvisible_widthvisible_heightinverse_masksource_portiondestination_portions                   7/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_mask.py	compositer1      s   YY{)**F $00{?PQS?TVaVghjVk>ls}0~~[--fk6G6JKKFV\"
*C;3DR3H:3U,V,VWWAV\"
*C;3DR3H:3U,V,VWWAj!z/#DFL,,cFL4D.D6E|v&&ww{)w55x"..t||RDJrNTXT^_aTb<c/d/dlrlxy{l|  E  K  LN  O  lP  Wa.  b  b{//fl1oFF
 &1%6r%:T%AC1II%M{O`acOdgjOjmpqrtumvmvOv>M111o~o~~56Dy6;~~a  ?4((4/LF3-#GHHN&+c3v:tEz6Q*RR/=@S/SKSZe+,    c                   P    e Zd Zed             Zeddej        fd            ZeZdS )LatentCompositeMaskedc                    t          j        dg ddt           j                            d          t           j                            d          t           j                            dddt
          j        d	          t           j                            d
ddt
          j        d	          t           j                            dd          t           j                            dd          gt           j        	                                g          S )Nr4   )zoverlay latentzlayer latentzpaste latentzinpaint latentzmodel/latentr    r!   r"   r   r   defaultr   r   stepr#   r&   Fr7   r$   Toptional)node_idsearch_aliasescategoryinputsoutputs)
r   SchemaLatentInputIntnodesMAX_RESOLUTIONBooleanMaskOutputclss    r0   define_schemaz#LatentCompositeMasked.define_schema3   s    y+___#	..	))S!8LSTUUS!8LSTUU
  % @@ft44 Y%%''(
 
 
 	
r2   Nreturnc           	          |                                 }|d                                         }|d         }t          |||||d|          |d<   t          j        |          S )Nsamplesr   )r   cloner1   r   
NodeOutputrK   r    r!   r"   r#   r&   r$   outputs           r0   executezLatentCompositeMasked.executeD   sa    !!##!),2244	"%k61aq-XXy}V$$$r2   N	__name__
__module____qualname__classmethodrL   r   rQ   rT   r1    r2   r0   r4   r4   2   s\        
 
 [
  % %r} % % % [% IIIr2   r4   c                   P    e Zd Zed             Zeddej        fd            ZeZdS )ImageCompositeMaskedc                     t          j        dg dddt           j                            d          t           j                            d          t           j                            dddt
          j        d	
          t           j                            dddt
          j        d	
          t           j                            dd          t           j                            dd          gt           j        	                                g          S )Nr]   )overlaylayerzpaste imagezimages compositionzImage Composite Maskedzimage/compositingr    r!   r"   r   r   r6   r#   r&   Fr9   r$   Tr:   r<   r=   display_namer>   r?   r@   )
r   rA   ImagerC   rD   rE   rF   rG   rH   rI   rJ   s    r0   rL   z"ImageCompositeMasked.define_schemaP   s    y*TTT1(}--x((S!8LSTUUS!8LSTUU
  % @@ft44 X__&&'
 
 
 	
r2   NrM   c           	      $   t          j        ||          \  }}|                                                    dd          }t	          ||                    dd          |||d|                              dd          }t          j        |          S )Nr
   r   )node_helpersimage_alpha_fixrP   movedimr1   r   rQ   rR   s           r0   rT   zImageCompositeMasked.executeb   s    *:;OOV!''))11"a88;r1(=(=q!T1m\\ddefhjkk}V$$$r2   rU   rV   r[   r2   r0   r]   r]   O   s\        
 
 [
" % %r} % % % [% IIIr2   r]   c                   N    e Zd Zed             Zedej        fd            ZeZdS )MaskToImagec           	          t          j        ddgddt           j                            d          gt           j                                        g          S )Nri   zconvert maskzConvert Mask to Image
image/maskr$   ra   )r   rA   rH   rC   rc   rI   rJ   s    r0   rL   zMaskToImage.define_schemam   sT    y!*+0!f%% X__&&'	
 	
 	
 		
r2   rM   c                     |                     dd|j        d         |j        d         f                              dd                              dddd          }t	          j        |          S )Nr
   r   r	      )r   r   rg   expandr   rQ   )rK   r$   results      r0   rT   zMaskToImage.executez   sa    r1djndjnEFFNNqRTUU\\]_acegijkk}V$$$r2   N)	rW   rX   rY   rZ   rL   r   rQ   rT   mask_to_imager[   r2   r0   ri   ri   l   sW        

 

 [

 %bm % % % [% MMMr2   ri   c                   N    e Zd Zed             Zedej        fd            ZeZdS )ImageToMaskc                     t          j        dddgddt           j                            d          t           j                            dg d	          gt           j                                        g
          S )Nrr   zextract channelzchannel to maskzConvert Image to Maskrk   imagechannelredgreenbluealphaoptionsra   )r   rA   rc   rC   ComborH   rI   rJ   s    r0   rL   zImageToMask.define_schema   ss    y!-/@A0!w''y2S2S2STT W^^%%&

 

 

 
	
r2   rM   c                 |    g d}|d d d d d d |                     |          f         }t          j        |          S )Nrv   )indexr   rQ   )rK   rt   ru   channelsr$   s        r0   rT   zImageToMask.execute   sH    444QQQ111hnnW5556}T"""r2   N	rW   rX   rY   rZ   rL   r   rQ   rT   image_to_maskr[   r2   r0   rr   rr      sW        
 
 [
 # # # # [#
 MMMr2   rr   c                   N    e Zd Zed             Zedej        fd            ZeZdS )ImageColorToMaskc                    t          j        dddgddt           j                            d          t           j                            dddd	d
t           j        j                  gt           j                                        g          S )Nr   zcolor keyingz
chroma keyzConvert Image Color to Maskrk   rt   colorr   i r   )r7   r   r   r8   display_modera   )	r   rA   rc   rC   rD   NumberDisplaynumberrH   rI   rJ   s    r0   rL   zImageColorToMask.define_schema   sz    y&*L96!w''WaQH1[][k[rss W^^%%&

 

 

 
	
r2   rM   c                    t          j        |dd          dz                                                      t           j                  }t          j        |d d d d d d df         d          t          j        |d d d d d d df         d          z   |d d d d d d df         z   }t          j        ||k    dd                                          }t          j	        |          S )Nr         ?g     o@   r   r      )
r   clamproundr   intbitwise_left_shiftwherefloatr   rQ   )rK   rt   r   tempr$   s        r0   rT   zImageColorToMask.execute   s    E1c**U299;;>>uyII'QQQqqq1Wr::U=UVZ[\[\[\]^]^]^_`_`_`ab[bVcef=g=ggjnopopopqrqrqrstststuvovjww{45=#q117799}T"""r2   Nr   r[   r2   r0   r   r      sW        
 
 [
 #bm # # # [# MMMr2   r   c                   N    e Zd Zed             Zedej        fd            ZeZdS )	SolidMaskc                 h   t          j        dddt           j                            ddddd          t           j                            d	d
dt
          j        d          t           j                            dd
dt
          j        d          gt           j                                        g          S )Nr   zCreate Solid Maskrk   valuer           {Gz?r6   width   r   height)r<   rb   r>   r?   r@   )	r   rA   FloatrC   rD   rE   rF   rH   rI   rJ   s    r0   rL   zSolidMask.define_schema   s    y,!w#DQQWcqe>RYZ[[Xsu?SZ[\\
 W^^%%&

 

 

 
	
r2   rM   c                     t          j        d||f|t           j        t          j                                                  }t          j        |          S )Nr   )dtyper   )r   fullfloat32r   model_managementintermediate_devicer   rQ   )rK   r   r   r   outs        r0   rT   zSolidMask.execute   sC    j!VU+U%-PUPfPzPzP|P|}}}}S!!!r2   N)	rW   rX   rY   rZ   rL   r   rQ   rT   solidr[   r2   r0   r   r      sW        
 
 [
 "bm " " " [" EEEr2   r   c                   N    e Zd Zed             Zedej        fd            ZeZdS )
InvertMaskc           	          t          j        dddgddt           j                            d          gt           j                                        g          S )Nr   zreverse maskz	flip maskzInvert Maskrk   r$   ra   )r   rA   rH   rC   rI   rJ   s    r0   rL   zInvertMask.define_schema   sV    y *K8&!f%% W^^%%&	
 	
 	
 		
r2   rM   c                 4    d|z
  }t          j        |          S )Nr   )r   rQ   )rK   r$   r   s      r0   rT   zInvertMask.execute   s    Dj}S!!!r2   N)	rW   rX   rY   rZ   rL   r   rQ   rT   invertr[   r2   r0   r   r      sW        

 

 [

 "bm " " " [" FFFr2   r   c                   N    e Zd Zed             Zedej        fd            ZeZdS )CropMaskc                    t          j        dg dddt           j                            d          t           j                            dddt
          j        d	          t           j                            d
ddt
          j        d	          t           j                            dddt
          j        d	          t           j                            dddt
          j        d	          gt           j                                        g          S )Nr   )zcut maskzextract mask regionz
mask slicez	Crop Maskrk   r$   r"   r   r   r6   r#   r   r   r   ra   r   rA   rH   rC   rD   rE   rF   rI   rJ   s    r0   rL   zCropMask.define_schema   s    yLLL$!f%%S!8LSTUUS!8LSTUUWcqe>RYZ[[Xsu?SZ[\\ W^^%%&
 
 
 	
r2   rM   c                     |                     d|j        d         |j        d         f          }|d d |||z   |||z   f         }t          j        |          S )Nr
   r	   )r   r   r   rQ   )rK   r$   r"   r#   r   r   r   s          r0   rT   zCropMask.execute   s[    ||RBB@AA111aF
lAa%iK/0}S!!!r2   N)	rW   rX   rY   rZ   rL   r   rQ   rT   cropr[   r2   r0   r   r      sW        
 
 [
  "2= " " " ["
 DDDr2   r   c                   N    e Zd Zed             Zedej        fd            ZeZdS )MaskCompositec                    t          j        dg dddt           j                            d          t           j                            d          t           j                            dddt
          j        d	
          t           j                            dddt
          j        d	
          t           j                            dg d          gt           j                                        g          S )Nr   )zcombine maskszblend maskszlayer maskszmasks compositionzCombine Masksrk   r    r!   r"   r   r   r6   r#   	operation)multiplyaddsubtractandorxorr{   ra   )	r   rA   rH   rC   rD   rE   rF   r}   rI   rJ   s    r0   rL   zMaskComposite.define_schema   s    y#___(!m,,h''S!8LSTUUS!8LSTUU{4g4g4ghh W^^%%&
 
 
 	
r2   rM   c                    |                     d|j        d         |j        d         f                                          }|                     d|j        d         |j        d         f          }|                    |j                  }||}}t          ||j        d         z   |j        d                   t          ||j        d         z   |j        d                   }
}	|	|z
  |
|z
  }}|d d d |d |f         }|d d ||
||	f         }|dk    r||z  |d d ||
||	f<   n|dk    r||z   |d d ||
||	f<   n|dk    r||z
  |d d ||
||	f<   n|dk    r}t          j        |                                	                                |                                	                                          
                                |d d ||
||	f<   n|dk    r|t          j        |                                	                                |                                	                                          
                                |d d ||
||	f<   n|dk    r{t          j        |                                	                                |                                	                                          
                                |d d ||
||	f<   t          j        |d	d
          }t          j        |          S )Nr
   r	   r   r   r   r   r   r   r   r   )r   r   rP   r   r   r   r   bitwise_andr   boolr   
bitwise_orbitwise_xorr   r   rQ   )rK   r    r!   r"   r#   r   rS   r'   r(   r)   r*   r+   r,   r.   r/   s                  r0   rT   zMaskComposite.execute  s   $$b+*;B*?ARSUAV%WXX^^``V\"%5v|B7G HII6=))cTFL$44k6G6KLLcRUX^XdegXhRhjuj{|~j  OA  OAv).v|~?N?N]N BC$QQQF
DJ%>?
""0Cn0TF111c&j$u*,--%0Cn0TF111c&j$u*,--*$$0Cn0TF111c&j$u*,--%050ABUB[B[B]B]BbBbBdBdftfzfzf|f|  gB  gB  gD  gD  1E  1E  1K  1K  1M  1MF111c&j$u*,--$050@ATAZAZA\A\AaAaAcAceseyeye{e{  fA  fA  fC  fC  1D  1D  1J  1J  1L  1LF111c&j$u*,--%050ABUB[B[B]B]BbBbBdBdftfzfzf|f|  gB  gB  gD  gD  1E  1E  1K  1K  1M  1MF111c&j$u*,-VS#..}V$$$r2   N)	rW   rX   rY   rZ   rL   r   rQ   rT   combiner[   r2   r0   r   r      sW        
 
 [
  %bm % % % [%: GGGr2   r   c                   N    e Zd Zed             Zedej        fd            ZeZdS )FeatherMaskc                    t          j        dg dddt           j                            d          t           j                            dddt
          j        d	          t           j                            d
ddt
          j        d	          t           j                            dddt
          j        d	          t           j                            dddt
          j        d	          gt           j                                        g          S )Nr   )zsoft edge maskzblur mask edgeszgradient mask edgezFeather Maskrk   r$   r'   r   r   r6   r(   r)   r*   ra   r   rJ   s    r0   rL   zFeatherMask.define_schema/  s    y!VVV'!f%%VQA5;OVWXXUA1%:NUVWWWaQE<PWXYYXqaU=QXYZZ W^^%%&
 
 
 	
r2   rM   c                    |                     d|j        d         |j        d         f                                          }t          ||j        d                   }t          ||j        d                   }t          ||j        d                   }t          ||j        d                   }t	          |          D ]!}|dz   |z  }|d d d d |fxx         |z  cc<   "t	          |          D ]%}|dz   |z  }|d d d d |dz    fxx         |z  cc<   &t	          |          D ]!}	|	dz   |z  }|d d |	d d fxx         |z  cc<   "t	          |          D ]%}	|	dz   |z  }|d d |	dz    d d fxx         |z  cc<   &t          j        |          S )Nr
   r	   r   r   )r   r   rP   r   ranger   rQ   )
rK   r$   r'   r(   r)   r*   rS   r"   feather_rater#   s
             r0   rT   zFeatherMask.execute@  s   r4:b>4:b>BCCIIKK4b)**E6<+,,#v|B'((VV\"-..t 	, 	,AGt+L111aaa7OOO|+OOOOu 	3 	3AEU?L111aaa1q5>"""l2""""s 	, 	,AES=L111a7OOO|+OOOOv 	3 	3AEV+L111Ah>"""l2""""}V$$$r2   N)	rW   rX   rY   rZ   rL   r   rQ   rT   featherr[   r2   r0   r   r   .  sW        
 
 [
  % % % % [%4 GGGr2   r   c                   N    e Zd Zed             Zedej        fd            ZeZdS )GrowMaskc                 b   t          j        dddgddt           j                            d          t           j                            ddt
          j         t
          j        d	
          t           j                            ddd          gt           j                                        g          S )Nr   zexpand maskzshrink maskz	Grow Maskrk   r$   rn   r   r   r6   tapered_cornersT)r7   advancedra   )	r   rA   rH   rC   rD   rE   rF   rG   rI   rJ   s    r0   rL   zGrowMask.define_schema_  s    y)=9$!f%%Xqu7K6KQVQelmnn
  !2D4 PP
 W^^%%&
 
 
 	
r2   rM   c                 P   |rdnd}t          j        |d|gg d|d|gg          }|                    d|j        d         |j        d         f          }g }|D ]}|                                }t          t          |                    D ]K}	|dk     r"t          j        	                    ||          }*t          j        
                    ||          }Lt          j        |          }|                    |           t          j        t          j        |d                    S )Nr   r   )r   r   r   r
   r	   )	footprint)dim)nparrayr   r   numpyr   absscipyndimagegrey_erosiongrey_dilationr   
from_numpyappendr   rQ   stack)
rK   r$   rn   r   ckernelr   mrS   _s
             r0   rT   zGrowMask.executen  s)    'AAaAq!9$99q!9& ' ' ||RBB@AA 	 	AWWYYF3v;;'' S SA::"]77&7QQFF"]8868RRFF%f--FJJv}U[!444555r2   N)	rW   rX   rY   rZ   rL   r   rQ   rT   expand_maskr[   r2   r0   r   r   ^  sW        
 
 [
 6r} 6 6 6 [6$ KKKr2   r   c                   N    e Zd Zed             Zedej        fd            ZeZdS )ThresholdMaskc                     t          j        ddgddt           j                            d          t           j                            dddd	d
          gt           j                                        g          S )Nr   zbinary maskzThreshold Maskrk   r$   r   g      ?r   r   r   r6   ra   )r   rA   rH   rC   r   rI   rJ   s    r0   rL   zThresholdMask.define_schema  sn    y#)?)!f%%w#DQQ W^^%%&

 

 

 
	
r2   rM   c                 Z    ||k                                     }t          j        |          S rU   )r   r   rQ   )rK   r$   r   s      r0   rT   zThresholdMask.execute  s'    u##%%}T"""r2   Nr   r[   r2   r0   r   r     sW        
 
 [
 #R] # # # [# MMMr2   r   c                   L    e Zd Zed             Zeddej        fd            ZdS )MaskPreviewc           
          t          j        dg ddddt           j                            d          gt           j        j        t           j        j        gd          S )	Nr   )z	show maskz	view maskzinspect maskz
debug maskzPreview Maskrk   z8Saves the input images to your ComfyUI output directory.r$   T)r<   r=   rb   r>   descriptionr?   hiddenis_output_node)r   rA   rH   rC   Hiddenpromptextra_pnginforJ   s    r0   rL   zMaskPreview.define_schema  s]    y!SSS'!Rf%% I$bi&=>
 
 
 	
r2   ComfyUIrM   c                 P    t          j        t          j        |                    S )N)ui)r   rQ   r   PreviewMask)rK   r$   filename_prefixs      r0   rT   zMaskPreview.execute  s    }t 4 45555r2   N)r   )rW   rX   rY   rZ   rL   r   rQ   rT   r[   r2   r0   r   r     s[        
 
 [
 6 6 6 6 6 [6 6 6r2   r   c                   L    e Zd Zedeeej                          fd            ZdS )MaskExtensionrM   c                    K   t           t          t          t          t          t
          t          t          t          t          t          t          t          gS rU   )r4   r]   ri   rr   r   r   r   r   r   r   r   r   r   )selfs    r0   get_node_listzMaskExtension.get_node_list  s9       " 
 	
r2   N)	rW   rX   rY   r   listtyper   	ComfyNoder   r[   r2   r0   r   r     sE        
T$r|*<%= 
 
 
 X
 
 
r2   r   rM   c                  "   K   t                      S rU   )r   r[   r2   r0   comfy_entrypointr     s      ??r2   )Nr   F)!r   r   scipy.ndimager   r   comfy.utilsr   comfy.model_managementre   typing_extensionsr   comfy_api.latestr   r   r   rE   r1   r   r4   r]   ri   rr   r   r   r   r   r   r   r   r   r   r   r   r[   r2   r0   <module>r     s&                        & & & & & & 3 3 3 3 3 3 3 3 3 3 # # # #L    BL   :    2<   :    ",   ,    ",   0    r|   2       .       ,    r|   60 0 0 0 0BL 0 0 0f- - - - -", - - -`# # # # #r| # # #J    BL   46 6 6 6 6", 6 6 6*
 
 
 
 
N 
 
 
(      r2   