o
    iA                     @   sf  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dZG dd	 d	ejZG d
d dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG d d! d!ejZG d"d# d#eZd$efd%d&ZdS )(    N)override)ComfyExtensionIOUI   Fc                 C   s  | | j}|rtjjj|| jd | jd fdd}tj	|| jd }t
|jd  | t|| jd | }t
|jd  | t|| jd | }|| || }}||jd  ||jd  }	}
|d u rlt|}n1|j | jdd}tjjj|dd|jd |jd f|jd |jd fdd}tj	||jd }| jd | td| | jd | td| }}|d d d d d |d |f }|j|jk r|d}t|| }||d	d |d |f  }|| d	||
||	f  }|| | 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_portion r.   5/mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_mask.py	composite   s,   $&&>2 
r0   c                   @   2   e Zd Zedd ZeddejfddZeZdS )LatentCompositeMaskedc                 C   |   t jdg ddt jdt jdt jjdddtjdd	t jjd
ddtjdd	t jjdddt jjdddgt j	 gdS )Nr2   )zoverlay latentzlayer latentzpaste latentzinpaint latentlatentr   r   r    r   r   defaultr   r   stepr!   r$   Fr6   r"   Toptionalnode_idsearch_aliasescategoryinputsoutputs)
r   SchemaLatentInputIntnodesMAX_RESOLUTIONBooleanMaskOutputclsr.   r.   r/   define_schema1      


z#LatentCompositeMasked.define_schemaNreturnc                 C   s>   |  }|d  }|d }t|||||d||d< t|S )Nsamplesr   )r   cloner0   r   
NodeOutputrK   r   r   r    r!   r$   r"   outputr.   r.   r/   executeB   s
   
zLatentCompositeMasked.executeN	__name__
__module____qualname__classmethodrL   r   rQ   rT   r0   r.   r.   r.   r/   r2   0   s    
r2   c                   @   r1   )ImageCompositeMaskedc                 C   r3   )Nr[   )zpaste imageoverlaylayerimager   r   r    r   r   r5   r!   r$   Fr8   r"   Tr9   r;   )
r   rA   ImagerC   rD   rE   rF   rG   rH   rI   rJ   r.   r.   r/   rL   N   rM   z"ImageCompositeMasked.define_schemaNrN   c                 C   sN   t ||\}}| dd}t||dd|||d|dd}t|S )Nr   r   )node_helpersimage_alpha_fixrP   movedimr0   r   rQ   rR   r.   r.   r/   rT   _   s   $
zImageCompositeMasked.executerU   rV   r.   r.   r.   r/   r[   M   s    
r[   c                   @   0   e Zd Zedd ZedejfddZeZdS )MaskToImagec                 C   s*   t jddgddt jdgt j gdS )Nrd   zconvert maskzConvert Mask to Imager"   r<   r=   display_namer>   r?   r@   )r   rA   rH   rC   r_   rI   rJ   r.   r.   r/   rL   j   s   

zMaskToImage.define_schemarN   c                 C   s<   | dd|jd |jd fdddddd}t|S )Nr   r   r      )r   r   rb   expandr   rQ   )rK   r"   resultr.   r.   r/   rT   w   s   2
zMaskToImage.executeN)	rW   rX   rY   rZ   rL   r   rQ   rT   mask_to_imager.   r.   r.   r/   rd   i       
rd   c                   @   rc   )ImageToMaskc              
   C   s>   t jdddgddt jdt jjdg dd	gt j gd
S )Nrl   zextract channelzchannel to maskzConvert Image to Maskr"   r^   channelredgreenbluealphaoptionsre   )r   rA   r_   rC   ComborH   rI   rJ   r.   r.   r/   rL      s   

zImageToMask.define_schemarN   c                 C   s4   g d}|d d d d d d | |f }t|S )Nrn   )indexr   rQ   )rK   r^   rm   channelsr"   r.   r.   r/   rT      s   "
zImageToMask.executeN	rW   rX   rY   rZ   rL   r   rQ   rT   image_to_maskr.   r.   r.   r/   rl      s    
rl   c                   @   rc   )ImageColorToMaskc                 C   sD   t jdddgdt jdt jjddddd	t jjd
gt j gdS )Nrz   zcolor keyingz
chroma keyr"   r^   colorr   i r   )r6   r   r   r7   display_moder;   )	r   rA   r_   rC   rD   NumberDisplaynumberrH   rI   rJ   r.   r.   r/   rL      s   

zImageColorToMask.define_schemarN   c                 C   s   t |ddd  t j}t |d d d d d d df dt |d d d d d d df d |d d d d d d df  }t ||kdd }t	|S )Nr         ?g     o@   r   r      )
r   clamproundr   intbitwise_left_shiftwherefloatr   rQ   )rK   r^   r{   tempr"   r.   r.   r/   rT      s   d
zImageColorToMask.executeNrx   r.   r.   r.   r/   rz      s    
rz   c                   @   rc   )	SolidMaskc                 C   sZ   t jddt jjddddddt jjdd	d
tjd
dt jjdd	d
tjd
dgt j gdS )Nr   r"   valuer           {Gz?r5   width   r   height)r<   r>   r?   r@   )	r   rA   FloatrC   rD   rE   rF   rH   rI   rJ   r.   r.   r/   rL      s   
zSolidMask.define_schemarN   c                 C   s$   t jd||f|t jdd}t|S )Nr   cpu)dtyper   )r   fullfloat32r   rQ   )rK   r   r   r   outr.   r.   r/   rT      s   
zSolidMask.executeN)	rW   rX   rY   rZ   rL   r   rQ   rT   solidr.   r.   r.   r/   r      rk   r   c                   @   rc   )
InvertMaskc                 C   s*   t jdddgdt jdgt j gdS )Nr   zreverse maskz	flip maskr"   r;   )r   rA   rH   rC   rI   rJ   r.   r.   r/   rL      s   

zInvertMask.define_schemarN   c                 C   s   d| }t |S )Nr   )r   rQ   )rK   r"   r   r.   r.   r/   rT      s   
zInvertMask.executeN)	rW   rX   rY   rZ   rL   r   rQ   rT   invertr.   r.   r.   r/   r      s    
r   c                   @   rc   )CropMaskc                 C   s   t jdg ddt jdt jjdddtjddt jjdddtjddt jjd	d
dtjddt jjdd
dtjddgt j gdS )Nr   )zcut maskzextract mask regionz
mask slicer"   r    r   r   r5   r!   r   r   r   r;   r   rA   rH   rC   rD   rE   rF   rI   rJ   r.   r.   r/   rL         

zCropMask.define_schemarN   c                 C   sH   | d|jd |jd f}|d d ||| ||| f }t|S )Nr   r   )r   r   r   rQ   )rK   r"   r    r!   r   r   r   r.   r.   r/   rT      s   "
zCropMask.executeN)	rW   rX   rY   rZ   rL   r   rQ   rT   cropr.   r.   r.   r/   r      s    
r   c                   @   rc   )MaskCompositec                 C   sr   t jdg ddt jdt jdt jjdddtjdd	t jjd
ddtjdd	t jjdg ddgt j gdS )Nr   )zcombine maskszblend maskszlayer masksr"   r   r   r    r   r   r5   r!   	operation)multiplyaddsubtractandorxorrs   r;   )	r   rA   rH   rC   rD   rE   rF   ru   rI   rJ   r.   r.   r/   rL      s   


zMaskComposite.define_schemarN   c                 C   s  | d|jd |jd f }| d|jd |jd f}||}}t||jd  |jd t||jd  |jd }	}
|	| |
| }}|d d d |d |f }|d d ||
||	f }|dkru|| |d d ||
||	f< n|dkr|| |d d ||
||	f< ns|dkr|| |d d ||
||	f< n_|dkrt|  |   |d d ||
||	f< n?|dkrt	|  |   |d d ||
||	f< n|dkrt
|  |   |d d ||
||	f< t|d	d
}t|S )Nr   r   r   r   r   r   r   r   r   r   )r   r   rP   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-   r.   r.   r/   rT     s*    
6   886
zMaskComposite.executeN)	rW   rX   rY   rZ   rL   r   rQ   rT   combiner.   r.   r.   r/   r      s    
r   c                   @   rc   )FeatherMaskc                 C   s   t jdg ddt jdt jjdddtjddt jjdddtjddt jjd	ddtjddt jjd
ddtjddgt j gdS )Nr   )zsoft edge maskzblur mask edgeszgradient mask edger"   r%   r   r   r5   r&   r'   r(   r;   r   rJ   r.   r.   r/   rL   &  r   zFeatherMask.define_schemarN   c           
      C   sN  | d|jd |jd f }t||jd }t||jd }t||jd }t||jd }t|D ]}|d | }|d d d d |f  |9  < q4t|D ]}|d | }|d d d d | f  |9  < qPt|D ]}	|	d | }|d d |	d d f  |9  < qmt|D ]}	|	d | }|d d |	 d d f  |9  < qt|S )Nr   r   r   r   )r   r   rP   r   ranger   rQ   )
rK   r"   r%   r&   r'   r(   rS   r    feather_rater!   r.   r.   r/   rT   6  s$     " "
zFeatherMask.executeN)	rW   rX   rY   rZ   rL   r   rQ   rT   featherr.   r.   r.   r/   r   %  s    
r   c                   @   rc   )GrowMaskc                 C   sV   t jdddgddt jdt jjddtj tjdd	t jjd
dddgt j gdS )Nr   zexpand maskzshrink maskz	Grow Maskr"   rh   r   r   r5   tapered_cornersT)r6   advancedre   )	r   rA   rH   rC   rD   rE   rF   rG   rI   rJ   r.   r.   r/   rL   U  s   

zGrowMask.define_schemarN   c           
      C   s   |rdnd}t |d|gg d|d|gg}|d|jd |jd f}g }|D ].}| }tt|D ]}	|dk rCtjj	||d}q4tjj
||d}q4t|}|| q(ttj|d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"   rh   r   ckernelr   mrS   _r.   r.   r/   rT   d  s    
zGrowMask.executeN)	rW   rX   rY   rZ   rL   r   rQ   rT   expand_maskr.   r.   r.   r/   r   T  s    
r   c                   @   rc   )ThresholdMaskc                 C   s<   t jddgdt jdt jjdddddd	gt j gd
S )Nr   zbinary maskr"   r   g      ?r   r   r   r5   r;   )r   rA   rH   rC   r   rI   rJ   r.   r.   r/   rL   {  s   

zThresholdMask.define_schemarN   c                 C   s   ||k  }t|S rU   )r   r   rQ   )rK   r"   r   r.   r.   r/   rT     s   
zThresholdMask.executeNrx   r.   r.   r.   r/   r   z  rk   r   c                   @   s.   e Zd Zedd ZeddejfddZdS )	MaskPreviewc              
   C   s4   t jdg ddddt jdgt jjt jjgddS )Nr   )z	show maskz	view maskzinspect maskz
debug maskzPreview Maskr"   z8Saves the input images to your ComfyUI output directory.T)r<   r=   rf   r>   descriptionr?   hiddenis_output_node)r   rA   rH   rC   Hiddenpromptextra_pnginforJ   r.   r.   r/   rL     s   
zMaskPreview.define_schemaComfyUIrN   c                 C   s   t jt|dS )N)ui)r   rQ   r   PreviewMask)rK   r"   filename_prefixr.   r.   r/   rT     s   zMaskPreview.executeN)r   )rW   rX   rY   rZ   rL   r   rQ   rT   r.   r.   r.   r/   r     s
    
r   c                   @   s(   e Zd Zedeeej  fddZdS )MaskExtensionrN   c                    s    t ttttttttt	t
ttgS rU   )r2   r[   rd   rl   rz   r   r   r   r   r   r   r   r   )selfr.   r.   r/   get_node_list  s   zMaskExtension.get_node_listN)	rW   rX   rY   r   listtyper   	ComfyNoder   r.   r.   r.   r/   r     s    r   rN   c                      s   t  S rU   )r   r.   r.   r.   r/   comfy_entrypoint  s   r   )Nr   F) r   r   scipy.ndimager   r   comfy.utilsr   r`   typing_extensionsr   comfy_api.latestr   r   r   rE   r0   r   r2   r[   rd   rl   rz   r   r   r   r   r   r   r   r   r   r   r.   r.   r.   r/   <module>   s0    
%1/&