
    
3j                     x    S SK JrJr  S SKJr  S SKrS SKJs  Jr	  S SK
Jr  SSKJrJrJrJr   " S S5      r\/rg)	    )ceilsqrt)castN)Image   )
hex_to_rgblog
pil2tensor
tensor2pilc                   ~    \ rS rSrSr\S 5       rSrSrSr	      SS\
R                  S	\S
\S\S\S\S\4S jjrSrg)MTB_TransformImage   zSave torch tensors (image, mask or latent) to disk, useful to debug things outside comfy

it return a tensor representing the transformed images with the same shape as the input tensor
c                     SSSSSSS.4SSSSSS.4SSS	S
S.4SSSSSS.4SSSSSS.4/ SQSS04SSSS.4S./ SQSS04SSS	SS
S.4SSS	SS
S.4SSSS.4S.S.$ ) NIMAGEFLOATr      i i   )defaultstepminmax      ?gMbP?g{Gz?)r   r   r   iih  )edgeconstantreflect	symmetricr   r   COLORz#000000	MTB_COLOR)r   
widgetType)imagexyzoomangleshearborder_handlingconstant_colornearestboxbilinearhammingbicubiclanczosr+   g      $@)r   r   r   r   BOOLEANFz9If true, transform values are scaled to image dimensions.)r   tooltip)filter_type	stretch_x	stretch_yuse_normalized)requiredoptional )clss    F/home/wildlama/comfy/ComfyUI/custom_nodes/comfy_mtb/nodes/transform.pyINPUT_TYPESMTB_TransformImage.INPUT_TYPES   s    $ !1U4H
  !1U4H
  #E4@
  !1T#F
  !1U4H
 A'$
  )E#5B 
+
   #E$M
  #E$M
 #(#^#)A<
 <	
    	transformr   zmtb/transformNr    r!   r"   r#   r$   r%   r4   c                    [         R                  [         R                  [         R                  [         R                  [         R
                  [         R                  S.nX   nUR                  5       u  nnnnU(       a  [        U5      U-  n[        U5      U-  n[        U5      n[        U5      n[        U5      n[        R                  " SU SU SU SU SU SU
 SU 35        UR                  S	5      S	:X  a  [        R                  " S	5      4$ / n[        UU-  5      [        UU-  5      nn[        R                  " S
U SU 35        [        US-  US-  -   5      n[        UU-  [!        UU5      -
  5      n[        UU-
  5      n[        UU-
  5      nU[#        U5      -  nU[#        U5      -  n[%        S	UU-   5      [%        S	UU-   5      [%        S	UU-
  5      [%        S	UU-
  5      /n['        U5      n[        R                  " SU 35        [)        U5       GH  n[*        R,                  " UUUU=(       d    S	S9nU
S:w  d  US:w  a  [/        [         R                   [*        R0                  " UUUX#/UUS95      nUR                  u  nnUS-  US-  4nSU
-  nSU-  nUS	US	   US	   U-  -
  S	UUS   US   U-  -
  /n UR3                  UR                  [         R4                  U U5      nO2[/        [         R                   [*        R0                  " UUUX#/UUS95      n[#        US	   5      n![#        US   5      n"UR6                  [#        US   5      -
  n#UR8                  [#        US   5      -
  n$[        R                  " S5        [        R                  " SU! SU" SU# SU$ 35        UR;                  U!U"U#U$45      nUR=                  U5        GM     [?        U5      4$ )Nr(   zZoom: z | x: z, y: z	, angle: z	, shear: z | stretch_x: z, stretch_y: r   zNew height: z, New width: r   zFill Tuple: )paddingpadding_modefillr   )r$   scale	translater%   interpolationr      z*crop is [left, top, right, bottom] for PILzcrop is z, ) r   NEARESTBOXBILINEARHAMMINGBICUBICLANCZOSsizefloatintr	   debugtorchzerosr   r   r   absr   r   r   TFpadr   affiner=   AFFINEwidthheightcropappendr
   )%selfr    r!   r"   r#   r$   r%   r&   r'   r1   r2   r3   r4   
filter_mapresampling_filter_frame_heightframe_widthtransformed_images
new_height	new_widthdiagonalmax_paddingpwphr?   imgrW   rX   centerstretch_x_factorstretch_y_factormatrixleftupperrightbottoms%                                        r9   r=   MTB_TransformImage.transformU   s     }}99}}}}}}

 '3*/**,'<aa;&Aa<'AFFE
		TF&59UG9UG>ZcYddqr{q|}	
 ::a=AKKN$$ t#$d"# 

 			LM)EF Qq898d?Sl-KKLy()
*+
c+
c+ 26N26N26N26N	
 $N3		L 012e$C&&,#(q	C C9#3KKII#"#$&#&7
 !$v1*fk2#&? #&?  %1Iq	,< <<$1Iq	,< << mmHHellF4E KKII#"#$&#&7
 wqz?D
OEIIGAJ/EZZ#gaj/1F IIBCIIbr%6(CD((D%78C%%c*} %@ -.00r<   r7   )r   Nr)   r   r   F)__name__
__module____qualname____firstlineno____doc__classmethodr:   FUNCTIONRETURN_TYPESCATEGORYrP   TensorrM   boolr=   __static_attributes__r7   r<   r9   r   r      s    
 =
 =
~ HLH $D1||D1 D1 	D1
 D1 D1 D1 D1 D1r<   r   )mathr   r   typingr   rP   !torchvision.transforms.functional
transforms
functionalrS   PILr   utilsr   r	   r
   r   r   	__nodes__r7   r<   r9   <module>r      s4       . .  ; ;N1 N1b   	r<   