
    +j                         S SK r S SKrS SKrS SKrS SKJr  S SKrS SKrS SK	J
r
JrJr  S SKJr  S\S\\\\4   4S jr " S S	\R&                  5      r " S
 S\
5      rS rg)    N)Image)ComfyExtensionioUI)override	hex_colorreturnc                     U R                  S5      n [        U 5      S:w  a  g[        U SS S5      S-  n[        U SS S5      S-  n[        U SS S5      S-  nXU4$ )	N#   )        r   r   r              o@   )lstriplenint)r   rgbs       :/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_painter.py
hex_to_rgbr      sp      %I
9~IaNB%'AIaNB%'AIaNB%'A!9    c                   h    \ rS rSr\S 5       r\SS\R                  4S jj5       r\SS j5       r	Sr
g)	PainterNode   c                    [         R                  " SSSS[         R                  R                  SSSS9[         R                  R                  SSSSSS	.S
9[         R
                  R                  SSSSSSSS0S9[         R
                  R                  SSSSSSSS0S9[         R                  R                  SSS9/[         R                  R                  S5      [         R                  R                  S5      /S9$ )NPainterimageTz!Optional base image to paint over)optionaltooltipmask PAINTER)
widgetTypeimage_upload)default
socketless
extra_dictwidthi   @   i   hidden)r(   minmaxstepr)   r*   heightbg_color#000000)r(   IMAGEMASK)node_iddisplay_namecategoryhas_intermediate_outputinputsoutputs)	r   Schemar   InputStringIntColorOutputMask)clss    r   define_schemaPainterNode.define_schema   s   yy"$(!?  
 		#.7N	    # ($/   # ($/   z9==B (v&K)
 )	
r   Nr	   c                    Ub#  US S nUR                   S   UR                   S   pOZX2p[        U5      u  pn[        R                  " SXxS4[        R                  S9nXSS S 2S S 2S4'   XSS S 2S S 2S4'   XSS S 2S S 2S4'   U(       Gaj  UR                  5       (       GaT  [        R                  " U5      n[        R                  " [        R                  U5      nUR                  S5      nUR                  X4:w  a!  UR                  X4[        R                  5      n[         R"                  " U5      R%                  [         R                  5      S-  nUS S 2S S 2S S24   nUS S 2S S 2SS24   n[        R&                  " US S 2S S 2S4   5      R)                  S5      nUS   R+                  5       R-                  5       nUU-  US	U-
  -  -   n[        R&                  " U5      R)                  S5      nO'[        R                  " SXx4[        R                  S9nUn[.        R0                  " UU[2        R4                  " U5      S
9$ )N   r      )dtyper   RGBAr   r   g      ?)ui)shaper   torchzerosfloat32stripfolder_pathsget_annotated_filepathnode_helperspillowr   openconvertsizeresizeLANCZOSnparrayastype
from_numpy	unsqueezecpunumpyr   
NodeOutputr   PreviewImage)rC   r#   r+   r1   r2   r    
base_imagehwr   r   r   	mask_pathpainter_img
painter_nppainter_rgbpainter_alphamask_tensorbase_np
composited	out_images                        r   executePainterNode.executeF   s   rJ##A&
(8(8(;qq *GA!aq\GJ%&q!Qz"%&q!Qz"%&q!Qz"DJJLL$;;DAI&--ejj)DK%--f5KA6))00!G+.55bjjAEIJ$Q2A2X.K&q!QqSy1M**:aAg+>?II!LK m'')//1G$}4w#BU7VVJ((4>>qAI++q!iu}}EK"I}}Y	8RSSr   c                    U(       a  UR                  5       (       a  [        R                  " U5      n[        R                  R                  U5      (       ag  [        R                  " 5       n[        US5       nUR                  UR                  5       5        S S S 5        UR                  5       R                  5       $ g! , (       d  f       N-= f)Nrbr$   )rP   rQ   rR   ospathexistshashlibsha256rU   updatereaddigesthex)	rC   r#   r+   r1   r2   r    rf   mfs	            r   fingerprint_inputsPainterNode.fingerprint_inputsj   s    DJJLL$;;DAIww~~i((NN$)T*aHHQVVX& +xxz~~'' +*s   8 B??
C )r3   N)__name__
__module____qualname____firstlineno__classmethodrD   r   ra   ro   r~   __static_attributes__r   r   r   r   r      sL    *
 *
X !TR]] !T !TF  r   r   c                   $    \ rS rSr\S 5       rSrg)PainterExtensionw   c                    #    [         /$ 7fN)r   )selfs    r   get_node_listPainterExtension.get_node_listx   s     }s   
r   N)r   r   r   r   r   r   r   r   r   r   r   r   w   s     r   r   c                     #    [        5       $ 7fr   )r   r   r   r   comfy_entrypointr   }   s     s   )rv   rs   r`   rZ   rM   PILr   rQ   rS   comfy_api.latestr   r   r   typing_extensionsr   strtuplefloatr   	ComfyNoder   r   r   r   r   r   <module>r      sf     	      3 3 &# %ue(;"< [",, [~~ r   