
    3jyB                        S SK rS SKrS SKrS SKrS SKrS SKrS SK	J
r
  S SKJrJrJr  S SKrS#S jr " S S\R"                  5      r " S S\R"                  5      r " S	 S
\R"                  5      r " S S\R"                  5      r " S S\R"                  5      r " S S\R"                  5      r " S S\R"                  5      r " S S\R"                  5      r " S S\R"                  5      r " S S\R"                  5      r " S S\R"                  5      r " S S\R"                  5      r " S S\R"                  5      r " S S \5      rS!\4S" jr g)$    N)override)ComfyExtensionIOUIc           	      f   UR                  U R                  5      nU(       aD  [        R                  R                  R                  XR                  S   U R                  S   4SS9n[        R                  R                  XR                  S   5      n[        UR                  S   * U-  [        X R                  S   U-  5      5      n[        UR                  S   * U-  [        X0R                  S   U-  5      5      nX%-  X5-  pXqR                  S   -   XR                  S   -   pUc  [        R                  " U5      nOUR                  U R                  SS9n[        R                  R                  R                  UR                  SSUR                  S   UR                  S   45      UR                  S   UR                  S   4SS9n[        R                  R                  XAR                  S   5      nU R                  S   U-
  [        SU5      -   U R                  S   U-
  [        SU5      -   pUS S 2S S 2S U2S U24   nUR                  UR                  :  a  UR                  S5      n[        R                  " U5      U-
  nXAS	S U2S U24   -  nXS	X2Xy24   -  nX-   U S	X2Xy24'   U $ )
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	compositer0      s   YY{))*F$$00?P?PQS?TVaVgVghjVk>ls}0~[[--f6G6G6JKFV\\"
*C3D3DR3H:3U,VWAV\\"
*C3D3DR3H:3U,VWA!/#LL,,cLL4D.D6|v&ww{))w5xx""..t||RDJJrNTXT^T^_aTb<c/dlrlxlxy{l|  E  K  K  LN  O  lP  Wa.  b{{//ll1oF
 &1%6%6r%:T%AC1I%M{O`O`acOdgjOjmpqrtumvOv>1o~o~~56Dyy6;;~~a ??4(4/L3-#GHHN&c3:tz6Q*RR/=/SKSZ+,    c                   X    \ rS rSr\S 5       r\SS\R                  4S jj5       r\r	Sr
g)LatentCompositeMasked2   c                    [         R                  " S/ SQSS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  SSS[
        R                  S	S
9[         R                  R                  SSS[
        R                  S	S
9[         R                  R                  SSS9[         R                  R                  SSS9/[         R                  R                  5       /S9$ )Nr3   )zoverlay latentzlayer latentzpaste latentzinpaint latentzLatent Composite Maskedzmodel/latentr   r    r!   r      defaultr   r   stepr"   r%   Fr8   r#   Toptionalnode_idsearch_aliasesdisplay_namecategoryinputsoutputs)
r   SchemaLatentInputIntnodesMAX_RESOLUTIONBooleanMaskOutputclss    r/   define_schema#LatentCompositeMasked.define_schema3   s    yy+_2#		.		)S!8L8LSTUS!8L8LSTU

  % @ft4 YY%%'(
 	
r1   Nreturnc           	          UR                  5       nUS   R                  5       nUS   n[        XX4USU5      US'   [        R                  " U5      $ )Nsamplesr6   )r   cloner0   r   
NodeOutputrN   r   r    r!   r"   r%   r#   outputs           r/   executeLatentCompositeMasked.executeE   sS    !!#!),224	"%k1q-Xy}}V$$r1    N__name__
__module____qualname____firstlineno__classmethodrO   r   rU   rX   r0   __static_attributes__rZ   r1   r/   r3   r3   2   s:    
 
" %r}} % % Ir1   r3   c                   X    \ rS rSr\S 5       r\SS\R                  4S jj5       r\r	Sr
g)ImageCompositeMaskedP   c                    [         R                  " S/ SQSS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  SSS[
        R                  S	S
9[         R                  R                  SSS[
        R                  S	S
9[         R                  R                  SSS9[         R                  R                  SSS9/[         R                  R                  5       /S9$ )Nrd   )overlaylayerzpaste imagezimages compositionzImage Composite Maskedzimage/compositingr   r    r!   r   r   r7   r"   r%   Fr:   r#   Tr;   r=   )
r   rD   ImagerF   rG   rH   rI   rJ   rK   rL   rM   s    r/   rO   "ImageCompositeMasked.define_schemaQ   s    yy*T1(}-x(S!8L8LSTUS!8L8LSTU

  % @ft4 XX__&'
 	
r1   NrQ   c           	          [         R                  " X5      u  pUR                  5       R                  SS5      n[	        XR                  SS5      X4USU5      R                  SS5      n[
        R                  " U5      $ )Nr	   r   )node_helpersimage_alpha_fixrT   movedimr0   r   rU   rV   s           r/   rX   ImageCompositeMasked.executec   sk    *::;O!'')11"a8;r1(=qT1m\ddefhjk}}V$$r1   rZ   r[   r\   rZ   r1   r/   rd   rd   P   s:    
 
" %r}} % % Ir1   rd   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)MaskToImagem   c           	          [         R                  " SS/SS[         R                  R                  S5      /[         R                  R                  5       /S9$ )Nrq   zconvert maskzConvert Mask to Image
image/maskr#   r=   )r   rD   rK   rF   ri   rL   rM   s    r/   rO   MaskToImage.define_scheman   sJ    yy!*+0!f% XX__&'	
 		
r1   rQ   c                     UR                  SSUR                  S   UR                  S   45      R                  SS5      R                  SSSS5      n[        R
                  " U5      $ )Nr	   r   r      )r   r   rn   expandr   rU   )rN   r#   results      r/   rX   MaskToImage.execute{   s[    r1djjndjjnEFNNqRTU\\]_acegijk}}V$$r1   rZ   N)r]   r^   r_   r`   ra   rO   r   rU   rX   mask_to_imagerb   rZ   r1   r/   rq   rq   m   s:    

 

 %bmm % % Mr1   rq   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)ImageToMask   c                     [         R                  " SSS/SS[         R                  R                  S5      [         R                  R                  S/ SQS	9/[         R
                  R                  5       /S
9$ )Nr}   zextract channelzchannel to maskzConvert Image to Maskrt   imagechannelredgreenbluealphaoptionsr=   )r   rD   ri   rF   ComborK   rL   rM   s    r/   rO   ImageToMask.define_schema   sb    yy!-/@A0!w'y2ST WW^^%&

 
	
r1   rQ   c                 r    / SQnUS S 2S S 2S S 2UR                  U5      4   n[        R                  " U5      $ )Nr   )indexr   rU   )rN   r   r   channelsr#   s        r/   rX   ImageToMask.execute   s2    4Q1hnnW556}}T""r1   rZ   Nr]   r^   r_   r`   ra   rO   r   rU   rX   image_to_maskrb   rZ   r1   r/   r}   r}      s:    
 
 # # #
 Mr1   r}   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)ImageColorToMask   c                     [         R                  " SSS/SS[         R                  R                  S5      [         R                  R                  SSSS	S
[         R
                  R                  S9/[         R                  R                  5       /S9$ )Nr   zcolor keyingz
chroma keyzConvert Image Color to Maskrt   r   colorr   i r   )r8   r   r   r9   display_moder=   )	r   rD   ri   rF   rG   NumberDisplaynumberrK   rL   rM   s    r/   rO   ImageColorToMask.define_schema   su    yy&*L96!w'WaQH1[][k[k[r[rs WW^^%&

 
	
r1   rQ   c                    [         R                  " USS5      S-  R                  5       R                  [         R                  5      n[         R
                  " US S 2S S 2S S 2S4   S5      [         R
                  " US S 2S S 2S S 2S4   S5      -   US S 2S S 2S S 2S4   -   n[         R                  " X2:H  SS5      R                  5       n[        R                  " U5      $ )Nr         ?g     o@   r   r6      )
r   clamproundr   intbitwise_left_shiftwherefloatr   rU   )rN   r   r   tempr#   s        r/   rX   ImageColorToMask.execute   s    E1c*U299;>>uyyI''Qq1Wr:U=U=UVZ[\]^_`ab[bVcef=ggjnopqrstuvovjww{{4=#q1779}}T""r1   rZ   Nr   rZ   r1   r/   r   r      s:    
 
 #bmm # # Mr1   r   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)	SolidMask   c                 d   [         R                  " SSS[         R                  R                  SSSSSS9[         R                  R                  S	S
S[
        R                  SS9[         R                  R                  SS
S[
        R                  SS9/[         R                  R                  5       /S9$ )Nr   zCreate Solid Maskrt   valuer           {Gz?r7   width   r   height)r>   r@   rA   rB   rC   )	r   rD   FloatrF   rG   rH   rI   rK   rL   rM   s    r/   rO   SolidMask.define_schema   s    yy,!w#DQWcqe>R>RYZ[Xsu?S?SZ[\
 WW^^%&

 
	
r1   rQ   c                     [         R                  " SX24U[         R                  [        R                  R                  5       S9n[        R                  " U5      $ )Nr   )dtyper   )r   fullfloat32r   model_managementintermediate_devicer   rU   )rN   r   r   r   outs        r/   rX   SolidMask.execute   s>    jj!V+U%--PUPfPfPzPzP|}}}S!!r1   rZ   N)r]   r^   r_   r`   ra   rO   r   rU   rX   solidrb   rZ   r1   r/   r   r      s:    
 
 "bmm " " Er1   r   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)
InvertMask   c           	          [         R                  " SSS/SS[         R                  R                  S5      /[         R                  R	                  5       /S9$ )Nr   zreverse maskz	flip maskzInvert Maskrt   r#   r=   )r   rD   rK   rF   rL   rM   s    r/   rO   InvertMask.define_schema   sL    yy *K8&!f% WW^^%&	
 		
r1   rQ   c                 8    SU-
  n[         R                  " U5      $ )Nr   )r   rU   )rN   r#   r   s      r/   rX   InvertMask.execute   s    Dj}}S!!r1   rZ   N)r]   r^   r_   r`   ra   rO   r   rU   rX   invertrb   rZ   r1   r/   r   r      s:    

 

 "bmm " " Fr1   r   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)CropMask   c                    [         R                  " S/ SQSS[         R                  R                  S5      [         R                  R                  SSS[
        R                  SS	9[         R                  R                  S
SS[
        R                  SS	9[         R                  R                  SSS[
        R                  SS	9[         R                  R                  SSS[
        R                  SS	9/[         R                  R                  5       /S9$ )Nr   )zcut maskzextract mask regionz
mask slicez	Crop Maskrt   r#   r!   r   r   r7   r"   r   r   r   r=   r   rD   rK   rF   rG   rH   rI   rL   rM   s    r/   rO   CropMask.define_schema   s    yyL$!f%S!8L8LSTUS!8L8LSTUWcqe>R>RYZ[Xsu?S?SZ[\ WW^^%&
 	
r1   rQ   c                     UR                  SUR                  S   UR                  S   45      nUS S 2X3U-   2X"U-   24   n[        R                  " U5      $ )Nr	   r   )r   r   r   rU   )rN   r#   r!   r"   r   r   r   s          r/   rX   CropMask.execute   sS    ||RBB@A1aF
lA%iK/0}}S!!r1   rZ   N)r]   r^   r_   r`   ra   rO   r   rU   rX   croprb   rZ   r1   r/   r   r      s:    
 
  "2== " "
 Dr1   r   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)MaskComposite   c                    [         R                  " S/ SQSS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  SSS[
        R                  S	S
9[         R                  R                  SSS[
        R                  S	S
9[         R                  R                  S/ SQS9/[         R                  R                  5       /S9$ )Nr   )zcombine maskszblend maskszlayer maskszmasks compositionzCombine Masksrt   r   r    r!   r   r   r7   r"   	operation)multiplyaddsubtractandorxorr   r=   )	r   rD   rK   rF   rG   rH   rI   r   rL   rM   s    r/   rO   MaskComposite.define_schema   s    yy#_(!m,h'S!8L8LSTUS!8L8LSTU{4gh WW^^%&
 	
r1   rQ   c                 b   UR                  SUR                  S   UR                  S   45      R                  5       nUR                  SUR                  S   UR                  S   45      nUR                  UR                  5      nX4p[        XrR                  S   -   UR                  S   5      [        XR                  S   -   UR                  S   5      pX-
  X-
  pUS S 2S U2S U24   nUS S 2X2Xy24   nUS:X  a  X-  US S 2X2Xy24'   GOuUS:X  a  X-   US S 2X2Xy24'   GO_US:X  a  X-
  US S 2X2Xy24'   GOIUS:X  ah  [        R                  " UR                  5       R                  5       UR                  5       R                  5       5      R                  5       US S 2X2Xy24'   OUS:X  ah  [        R                  " UR                  5       R                  5       UR                  5       R                  5       5      R                  5       US S 2X2Xy24'   OmUS:X  ag  [        R                  " UR                  5       R                  5       UR                  5       R                  5       5      R                  5       US S 2X2Xy24'   [        R                  " US	S
5      n[        R                  " U5      $ )Nr	   r   r   r   r   r   r   r   r   r   )r   r   rT   r   r   r   r   bitwise_andr   boolr   
bitwise_orbitwise_xorr   r   rU   )rN   r   r    r!   r"   r   rW   r&   r'   r(   r)   r*   r+   r-   r.   s                  r/   rX   MaskComposite.execute  s   $$b+*;*;B*?ARARSUAV%WX^^`V\\"%5v||B7G HI6==)cTLL$44k6G6G6KLcRUXdXdegXhRhjuj{j{|~j  OAv).v|~?N?N]N BC$Q
DJ%>?
"0C0TF1cj$*,-%0C0TF1cj$*,-*$0C0TF1cj$*,-%050A0ABUB[B[B]BbBbBdftfzfzf|  gB  gB  gD  1E  1K  1K  1MF1cj$*,-$050@0@ATAZAZA\AaAaAceseyeye{  fA  fA  fC  1D  1J  1J  1LF1cj$*,-%050A0ABUB[B[B]BbBbBdftfzfzf|  gB  gB  gD  1E  1K  1K  1MF1cj$*,-VS#.}}V$$r1   rZ   N)r]   r^   r_   r`   ra   rO   r   rU   rX   combinerb   rZ   r1   r/   r   r      s:    
 
  %bmm % %: Gr1   r   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)FeatherMaski/  c                    [         R                  " S/ SQSS[         R                  R                  S5      [         R                  R                  SSS[
        R                  SS	9[         R                  R                  S
SS[
        R                  SS	9[         R                  R                  SSS[
        R                  SS	9[         R                  R                  SSS[
        R                  SS	9/[         R                  R                  5       /S9$ )Nr   )zsoft edge maskzblur mask edgeszgradient mask edgezFeather Maskrt   r#   r&   r   r   r7   r'   r(   r)   r=   r   rM   s    r/   rO   FeatherMask.define_schema0  s    yy!V'!f%VQA5;O;OVWXUA1%:N:NUVWWaQE<P<PWXYXqaU=Q=QXYZ WW^^%&
 	
r1   rQ   c                    UR                  SUR                  S   UR                  S   45      R                  5       n[        X&R                  S   5      n[        XFR                  S   5      n[        X6R                  S   5      n[        XVR                  S   5      n[	        U5       H  nUS-   U-  nUS S 2S S 2U4==   U-  ss'   M!     [	        U5       H#  nUS-   U-  nUS S 2S S 2US-   * 4==   U-  ss'   M%     [	        U5       H  n	U	S-   U-  nUS S 2U	S S 24==   U-  ss'   M!     [	        U5       H#  n	U	S-   U-  nUS S 2U	S-   * S S 24==   U-  ss'   M%     [
        R                  " U5      $ )Nr	   r   r   r   )r   r   rT   r   ranger   rU   )
rN   r#   r&   r'   r(   r)   rW   r!   feather_rater"   s
             r/   rX   FeatherMask.executeA  sa   r4::b>4::b>BCIIK4b)*E<<+,#||B'(V\\"-.tAGt+L1a7O|+O  uAEU?L1a1q5>"l2"  sAES=L1a7O|+O  vAEV+L1Ah>"l2"  }}V$$r1   rZ   N)r]   r^   r_   r`   ra   rO   r   rU   rX   featherrb   rZ   r1   r/   r   r   /  s:    
 
  % % %4 Gr1   r   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)GrowMaski_  c                 d   [         R                  " SSS/SS[         R                  R                  S5      [         R                  R                  SS[
        R                  * [
        R                  S	S
9[         R                  R                  SSSS9/[         R                  R                  5       /S9$ )Nr   zexpand maskzshrink maskz	Grow Maskrt   r#   rx   r   r   r7   tapered_cornersT)r8   advancedr=   )	r   rD   rK   rF   rG   rH   rI   rJ   rL   rM   s    r/   rO   GrowMask.define_schema`  s    yy)=9$!f%Xqu7K7K6KQVQeQelmn

  !2D4 P
 WW^^%&
 	
r1   rQ   c                 F   U(       a  SOSn[         R                  " USU// SQUSU//5      nUR                  SUR                  S   UR                  S   45      n/ nU H  nUR	                  5       n[        [        U5      5       HE  n	US:  a  [        R                  R                  XS9nM(  [        R                  R                  XS9nMG     [        R                  " U5      nUR                  U5        M     [        R                  " [        R                   " USS95      $ )Nr   r   )r   r   r   r	   r   )	footprint)dim)nparrayr   r   numpyr   absscipyndimagegrey_erosiongrey_dilationr   
from_numpyappendr   rU   stack)
rN   r#   rx   r   ckernelr   mrW   _s
             r/   rX   GrowMask.executeo  s     AaAq!9$q!9& ' ||RBB@AAWWYF3v;'A:"]]777QF"]]888RF	 (
 %%f-FJJv  }}U[[!455r1   rZ   N)r]   r^   r_   r`   ra   rO   r   rU   rX   expand_maskrb   rZ   r1   r/   r   r   _  s:    
 
 6r}} 6 6$ Kr1   r   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)ThresholdMaski  c                     [         R                  " SS/SS[         R                  R                  S5      [         R                  R                  SSSS	S
S9/[         R                  R                  5       /S9$ )Nr  zbinary maskzThreshold Maskrt   r#   r   g      ?r   r   r   r7   r=   )r   rD   rK   rF   r   rL   rM   s    r/   rO   ThresholdMask.define_schema  sc    yy#)?)!f%w#DQ WW^^%&

 
	
r1   rQ   c                 R    X:  R                  5       n[        R                  " U5      $ r[   )r   r   rU   )rN   r#   r   s      r/   rX   ThresholdMask.execute  s!    ##%}}T""r1   rZ   Nr   rZ   r1   r/   r  r    s:    
 
 #R]] # # Mr1   r  c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)MaskPreviewi  c                     [         R                  " S/ SQSSS[         R                  R                  S5      /[         R                  R
                  [         R                  R                  /SS9$ )	Nr	  )z	show maskz	view maskzinspect maskz
debug maskzPreview Maskrt   z8Saves the input images to your ComfyUI output directory.r#   T)r>   r?   r@   rA   descriptionrB   hiddenis_output_node)r   rD   rK   rF   Hiddenpromptextra_pnginforM   s    r/   rO   MaskPreview.define_schema  sX    yy!S'!Rf% II$$bii&=&=>
 	
r1   rQ   c                 R    [         R                  " [        R                  " U5      S9$ )N)ui)r   rU   r   PreviewMask)rN   r#   filename_prefixs      r/   rX   MaskPreview.execute  s    }}t 455r1   rZ   N)ComfyUI)
r]   r^   r_   r`   ra   rO   r   rU   rX   rb   rZ   r1   r/   r	  r	    s3    
 
 6 6 6r1   r	  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)MaskExtensioni  rQ   c                    #    [         [        [        [        [        [
        [        [        [        [        [        [        [        /$ 7fr[   )r3   rd   rq   r}   r   r   r   r   r   r   r   r  r	  )selfs    r/   get_node_listMaskExtension.get_node_list  s8      " 
 	
s   AArZ   N)r]   r^   r_   r`   r   listtyper   	ComfyNoder  rb   rZ   r1   r/   r  r    s)    
T$r||*<%= 
 
r1   r  rQ   c                     #    [        5       $ 7fr[   )r  rZ   r1   r/   comfy_entrypointr"    s     ?s   )Nr6   F)!r   r   scipy.ndimager   r   comfy.utilsr   comfy.model_managementrl   typing_extensionsr   comfy_api.latestr   r   r   rH   r0   r   r3   rd   rq   r}   r   r   r   r   r   r   r   r  r	  r  r"  rZ   r1   r/   <module>r(     s         & 3 3 #LBLL <2<< :",, ,",, 0r|| 2 . ,r|| 60BLL 0f-",, -`#r|| #JBLL 46",, 6*
N 
( r1   