o
    i$                  
   @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZm	Z	 dd Z
G dd deZd	e jd
e jde jde jdef
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ZdefddZdS )    N)Enum)override)ComfyExtensionioc                 C   s@   t jjj| dd| jd | jd f|d |d fdddS )N   r   bilinear)sizemode)torchnn
functionalinterpolatereshapeshapesqueeze)maskr    r   </mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_compositing.pyresize_mask   s   @r   c                   @   sT   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdS )PorterDuffModer   r                        	   
                        N)__name__
__module____qualname__ADDCLEARDARKENDSTDST_ATOPDST_INDST_OUTDST_OVERLIGHTENMULTIPLYOVERLAYSCREENSRCSRC_ATOPSRC_INSRC_OUTSRC_OVERXORr   r   r   r   r      s&    r   	src_image	src_alpha	dst_image	dst_alphar   c                 C   sh  d| }d| }| | } || }|t jkr)t|| dd}t| | dd}nn|t jkr:t|}t|}n]|t jkr[|| ||  }d| |  d| |  t| | }n<|t jkrf|}|}n1|t j	kry|}|| d| |   }n|t j
kr|| }|| }n|t jkrd| | }d| | }n|t jkr|d| |  }|d| |   }n|t jkr|| ||  }d| |  d| |  t| | }n|t jkr|| }| | }n|t jkr|| ||  }td| |k d|  | || d||   ||   }n|t jkr|| ||  }| | | |  }nx|t jkr*|}| }nm|t jkr=|}||  d| |  }nZ|t jkrL|| }| | }nK|t jkr_d| | }d| |  }n8|t jkrv|d| |  }| d| |  }n!|t jkrd| | d| |  }d| |  d| |  }ndS t|dk|| t|}t|dd}d| }||fS )Nr   r   r   )NNgh㈵>)r   r+   r   clampr,   
zeros_liker-   minr.   r/   r0   r1   r2   r3   maxr4   r5   wherer6   r7   r8   r9   r:   r;   r<   )r=   r>   r?   r@   r   	out_alpha	out_imager   r   r   porter_duff_composite    s   



(





&


rH   c                   @   sD   e Zd Zedd Zedejdejdejdejdejf
dd	Z	d
S )PorterDuffImageCompositec                 C   sp   t jdg dddt jdt jdt jdt jdt jjd	d
d tD tjjdgt j	 t j	 gdS )NrI   )zalpha compositezblend modeszlayer blendztransparency blendzPorter-Duff Image Compositemask/compositingsourcesource_alphadestinationdestination_alphar   c                 S   s   g | ]}|j qS r   )name).0r   r   r   r   
<listcomp>x   s    z:PorterDuffImageComposite.define_schema.<locals>.<listcomp>)optionsdefaultnode_idsearch_aliasesdisplay_namecategoryinputsoutputs)
r   SchemaImageInputMaskCombor   r.   rO   Outputclsr   r   r   define_schemal   s   



z&PorterDuffImageComposite.define_schemarK   rL   rM   rN   returnc                 C   s  t t|t|t|t|}g }g }t|D ]}	||	 }
||	 }|
jd |jd ks-J ||	 d}||	 d}|jd d |jd d krp|ddddd}tjj||jd |jd ddd}|dddd	d}|
j|jkr|
ddddd}tjj||jd |jd ddd}|dddd	d}
|j|jkr|ddddd}tjj||jd |jd ddd}|dddd	d}t
|
|||t| \}}|| ||	d qtt|t|S )Nr   r   r   r   bicubiccenter)upscale_methodcrop)rC   lenranger   	unsqueezepermutecomfyutilscommon_upscaler   rH   r   appendr   
NodeOutputr   stack)rb   rK   rL   rM   rN   r   
batch_size
out_images
out_alphasir=   r?   r>   r@   upscale_inputupscale_outputrG   rF   r   r   r   execute   s2   """
z PorterDuffImageComposite.executeN
r(   r)   r*   classmethodrc   r   Tensorr   rq   ry   r   r   r   r   rI   k   s
    
.rI   c                   @   s2   e Zd Zedd ZedejdejfddZ	dS )SplitImageWithAlphac              	   C   s4   t jdg dddt jdgt j t j gdS )Nr}   )zextract alphazseparate transparencyzremove alphazSplit Image with AlpharJ   imagerT   )r   r[   r\   r]   r`   r^   ra   r   r   r   rc      s   
z!SplitImageWithAlpha.define_schemar~   rd   c                 C   s8   dd |D }dd |D }t t|dt| S )Nc                 S   s&   g | ]}|d d d d d df qS )Nr   r   rP   rv   r   r   r   rQ      s   & z/SplitImageWithAlpha.execute.<locals>.<listcomp>c                 S   sL   g | ]"}|j d  dkr|dddddf nt|dddddf qS )r   r   Nr   )r   r   	ones_liker   r   r   r   rQ      s   L       ?)r   rq   r   rr   )rb   r~   rt   ru   r   r   r   ry      s   zSplitImageWithAlpha.executeNrz   r   r   r   r   r}      s
    
r}   c                   @   s8   e Zd Zedd ZedejdejdejfddZ	dS )	JoinImageWithAlphac              	   C   s6   t jdg dddt jdt jdgt j gdS )Nr   )zadd transparencyzapply alphazcomposite alphaRGBAzJoin Image with AlpharJ   r~   alpharT   )r   r[   r\   r]   r^   r`   ra   r   r   r   rc      s   


z JoinImageWithAlpha.define_schemar~   r   rd   c              	   C   s   t t|t|}g }dt||jdd   }t|D ] }|tj|| d d d d d df || dfdd qt	
t|S )Nr   r   r   r   )dim)rC   ri   r   r   rj   rp   r   catrk   r   rq   rr   )rb   r~   r   rs   rt   rv   r   r   r   ry      s   >zJoinImageWithAlpha.executeNrz   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 )CompositingExtensionrd   c                    s   t ttgS N)rI   r}   r   )selfr   r   r   get_node_list   s
   z"CompositingExtension.get_node_listN)	r(   r)   r*   r   listtyper   	ComfyNoder   r   r   r   r   r      s    r   rd   c                      s   t  S r   )r   r   r   r   r   comfy_entrypoint   s   r   )r   comfy.utilsrm   enumr   typing_extensionsr   comfy_api.latestr   r   r   r   r|   rH   r   rI   r}   r   r   r   r   r   r   r   <module>   s    &K9
