
    
3j0                     8   S SK Jr  S SKrS SKJs  Jr  SSKJr   " S S\5      r " S S5      r	 " S	 S
5      r
 " S S5      r " S S5      r " S S5      rSS\S\\\4   S-  4S jjr SS\S\\\4   S-  4S jjr " S S5      r " S S5      r\\	\\\
\\/rg)    )
NamedTupleN   )logc                   B    \ rS rSr% Sr\\S'   \\S'   \\S'   \\S'   Srg)	BoundingBox	   zThe bounding box tuple.xywidthheight N)__name__
__module____qualname____firstlineno____doc__int__annotations____static_attributes__r       A/home/wildlama/comfy/ComfyUI/custom_nodes/comfy_mtb/nodes/crop.pyr   r   	   s    !
F
FJKr   r   c                   X    \ rS rSrSr\S 5       rSrSrSr	S\
S\
S	\
S
\
S\\   4
S jrSrg)MTB_Bbox   zA literal bounding box.c           
      L    SSSSSSS.4SSSSSS.4SSSSSS.4SSSSSS.4S.0$ )	NrequiredINTr   逖    defaultmaxminstep   r	   r
   r   r   r   clss    r   INPUT_TYPESMTB_Bbox.INPUT_TYPES   sn       !(1aH
  !(1aH
  #HQJ
  #HQJ
 	
r   BBOXdo_cropmtb/cropr	   r
   r   r   returnc                     [        XX45      4$ N)r   )selfr	   r
   r   r   s        r   r-   MTB_Bbox.do_crop1   s     A%022r   r   N)r   r   r   r   r   classmethodr)   RETURN_TYPESFUNCTIONCATEGORYr   tupler   r-   r   r   r   r   r   r      sZ    !
 
. LHH333%(3253	{	3r   r   c                   J    \ rS rSrSr\S 5       rSrSrSr	Sr
S\S	\4S
 jrSrg)MTB_SplitBbox7   zSplit the components of a bbox.c                     SSS00$ )Nr   bboxr+   r   r'   s    r   r)   MTB_SplitBbox.INPUT_TYPES:   s     +
 	
r   r.   
split_bbox)r   r   r   r   r&   r=   r/   c                     U$ r1   r   )r2   r=   s     r   r?   MTB_SplitBbox.split_bboxE   s    r   r   N)r   r   r   r   r   r4   r)   r7   r6   r5   RETURN_NAMESr   r?   r   r   r   r   r:   r:   7   s@    )
 

 HH/L0L{ { r   r:   c                   L    \ rS rSr\S 5       rSrSrSrS\	S\
S\\	   4S	 jrS
rg)MTB_UpscaleBboxByI   c                     SSSSS04S.0$ )Nr   r+   FLOATr!         ?)r=   scaler   r'   s    r   r)   MTB_UpscaleBboxBy.INPUT_TYPESJ   s&     !!Is#34
 	
r   r.   r+   upscaler=   rI   r/   c                     Uu  p4pVX5S-  -   nXFS-  -   n[        XR-  5      n	[        Xb-  5      n
[        XyS-  -
  5      n[        XS-  -
  5      n[        XX5      4$ )Nr   )r   r   )r2   r=   rI   r	   r
   r   r   center_xcenter_y	new_width
new_heightnew_xnew_ys                r   rK   MTB_UpscaleBboxBy.upscaleX   sl    "eqy=z>&	(
H1},-HA~-.E)@BBr   r   N)r   r   r   r   r4   r)   r7   r5   r6   r   floatr8   rK   r   r   r   r   rD   rD   I   sH    
 
 HLHCK C C%:L Cr   rD   c                       \ rS rSrSr\S 5       rSrSrSr	Sr
SS	S
.S\R                  S\S\R                  S	-  S\\\R                  S	-  4   4S jjrSrg	)MTB_BboxFromMaskg   z%From a mask extract the bounding box.c                 &    SSSS04S.SSSS	040S
.$ )NMASKBOOLEANr!   F)maskinvertimageIMAGEtooltipzOptional imager   optionalr   r'   s    r   r)   MTB_BboxFromMask.INPUT_TYPESj   s:     "$y%&89
 'I/?#@A
 	
r   )r,   r_   )r=   zimage (optional)extract_bounding_boxr.   FN)r]   r^   r\   r]   r^   r/   c                   U(       a  SU-
  OUn[         R                  " U5      nUR                  5       S:X  a&  [        R                  " S5        [        SSSS5      U4$ [         R                  " USS9R                  n[         R                  " USS9R                  nUS   R                  5       US   R                  5       pUS   R                  5       US   R                  5       pX-
  S-   nX-
  S-   n[        [        U5      [        U5      [        U5      [        U5      5      nS nUb  US S 2XyS-   2XS-   2S S 24   nX4$ )Nr   r   z8BboxFromMask: Mask is empty. Returning a (0,0,0,0) bbox.)dimr   )torchnonzeronumelr   warningr   r#   valuesr"   itemr   )r2   r\   r]   r^   non_zero_indices
min_coords
max_coordsmin_ymin_xmax_ymax_xr   r   bounding_boxcropped_images                  r   rd   %MTB_BboxFromMask.extract_bounding_box   s:    "q4xt ==.!!#q(KKJ  1a+U33YY/Q7>>
YY/Q7>>
!!}))+Z]-?-?-Au!!}))+Z]-?-?-Au!""JE
CJF
 !!UQY%6	8I1"LMM,,r   r   )r   r   r   r   r   r4   r)   r5   rB   r6   r7   rg   Tensorboolr8   r   rd   r   r   r   r   rV   rV   g   s    /	
 	
LL &HH %)!-ll!- 	!-
 ||d"!- 
{ELL4//	0!- !-r   rV   c                       \ rS rSrSr\S 5       rSrSrSr	SSSS	S	SS
.S\
R                  S\
R                  S-  S\S\S\S\S\S-  4S jjrSrg)MTB_Crop   zrCrop an image and an optional mask to a given bounding box.

The BBOX input takes precedence over the tuple input
c                 V    SS0SSSSSSS.4SSSSSS.4SS	SSSS.4SS	SSSS.4S
S.S.$ )Nr^   r_   rY   r   r   r   r   r    r%   r+   r\   r	   r
   r   r   r=   ra   r   r'   s    r   r)   MTB_Crop.INPUT_TYPES   s}      " !(1aH
  !(1aH
  #HQJ
  #HQJ "%	
 	
r   )r_   rZ   r,   r-   r.   Nr   r%   r~   r^   r\   r	   r
   r   r   r=   c                F   Ub  Uu  p4pVUS::  d  US::  aJ  [         R                  " S5        [        R                  " U5      Ub  [        R                  " U5      OS X4XV44$ US S 2XDU-   2X3U-   2S S 24   nUb  US S 2XDU-   2X3U-   24   OS n	[	        X4XV5      n
UU	b  U	U
4$ S U
4$ )Nr   zBCrop dimensions must be positive. Check the BBOX or widget inputs.)r   errorrg   
zeros_liker   )r2   r^   r\   r	   r
   r   r   r=   ru   cropped_mask	crop_datas              r   r-   MTB_Crop.do_crop   s     "&A%A:1IIT   '*.*:  &u%  aZYAB  AF
NAE	M12 	
  e4	 (4L
 	
:>
 	
r   r   )r   r   r   r   r   r4   r)   r5   r6   r7   rg   rw   r   r   r-   r   r   r   r   rz   rz      s    
 
 
6 -LHH %)#'$
||$
 llT!	$

 $
 $
 $
 $
 D $
 $
r   rz   r=   target_sizec           	      (   U(       d  U $ [        U R                  U R                  [        US   U R                  -
  U R                  5      [        US   U R                  -
  U R
                  5      5      nX :w  a  [        R                  " SU 35        U$ )Nr   r   zBBox too big, constrained to )r   r	   r
   r#   r   r   r   rj   )r=   r   new_bboxs      r   
bbox_checkr      sy    KNTVV#TZZ0KNTVV#T[[1	H 3H:>?Or   c                     [        X5      n U R                  U R                  U R                  U R                  -   U R                  U R                  -   4$ r1   )r   r	   r
   r   r   )r=   r   s     r   bbox_to_regionr     sA     d(D FFDFFDFFTZZ/$++1EFFr   c            	       |    \ rS rSrSr\S 5       rSrSrSr	 SS\
R                  S\
R                  S	\S
\4S jjrSrg)
MTB_Uncropi  z(Uncrop an image to a given bounding box.c           
      "    SSSSSSSSSS	.4S
.0$ )Nr   r}   r+   rG         ?g        rH   g{Gz?)r!   r#   r"   r$   )r^   
crop_imager=   border_blendingr   r'   s    r   r)   MTB_Uncrop.INPUT_TYPES  s3     #(! $SdK$	

 
	
r   r}   	do_uncropr.   r^   r   r=   r   c                 T   [        U5      S:  a#  [        U5      [        U5      :w  a  [        S5      eSS KnUR                  R	                  S5      nUR
                  n[        R                  " SU 35        UR                  U5      n[        U5      S:X  a,  [        U5      S:  a  UR                  [        U5      SSS5      nUR                  u  ppUR                  u  ppUu  pnnUU4X4:w  a  [        R                  " SX4 S35        UR                  SSSS	5      n[        R                  R                  R!                  UUU4S
SS9nUR                  SS	SS5      nUR#                  S5        [%        US5      n[%        US5      n['        UU-   U
5      n['        UU-   U	5      n[%        SU* 5      n[%        SU* 5      nUUU-
  -   nUUU-
  -   nUU:  d  UU:  a  [        R                  " S5        U4$ UR#                  S5        US S 2UU2UU2S S 24   nUR)                  5       nUUS S 2UU2UU2S S 24'   UR#                  S5        [+        [%        UU5      U-  S-  5      nUS:  Ga  Un[        R,                  R/                  5       (       a  [        R
                  " S5      n[        R                  " S5        [        R0                  " XU
4US9nSUS S 2UU2UU24'   S	U-  S-   n [        R                  " S5        [2        R4                  " UR7                  S5      U U /S9R9                  S5      nUR7                  S5      n[        R                  " S5        UR                  U5      U-  UR                  U5      SU-
  -  -   nUR#                  S5        UR                  U5      4$ )Nr   zXUncrop: Batch size of background 'image' must be 1 or match the 'crop_image' batch size.r      zWorking on device: zUncrop: crop_image size z; differs from bbox {(width, height)}. Resizing to fit bbox.   r   bicubicF)sizemodealign_cornerszPUncrop: BBOX is entirely outside the image boundaries. Returning original image.g      ?cudazProcessing blending)devicerH   zGaussian blur...)kernel_sizezApplying blending)len
ValueErrorcomfy.utilsutilsProgressBarr   r   debugtorepeatshaperj   permuterg   nn
functionalinterpolateupdater"   r#   cloner   r   is_availablezerosTFgaussian_blur	unsqueezesqueeze)!r2   r^   r   r=   r   comfypbarr   
batch_sizebg_hbg_w_fg_hfg_wr	   r
   r   r   resized_croppaste_x1paste_y1paste_x2paste_y2crop_x1crop_y1crop_x2crop_y2source_slicefinal_imageblend_radius_device
alpha_maskr   s!                                    r   r   MTB_Uncrop.do_uncrop*  s    u:>c%jC
O;j  	{{&&q)		'x01]]6*
u:?s:2LLZ!Q:E$)KK!
$%++"eV6?tl*KK*D<. 9M M
 "))!Q15xx**66%	 7 
 $++Aq!Q7Aq!9q!9q5y$'q6z4( a!*a!*X01X01x8x#7KKb 8OA#Aww$JKkkmBNAx((8*;Q>?A3uf-?#EF!Gzz&&((,,v.II+,j%=gNJBEJq(8+Xh->>?l*Q.KII()))$$Q'k;5Ogaj  $--b1JII)*%..1J>Bz!B# #K 	Av&((r   r   N)r   )r   r   r   r   r   r4   r)   r5   r6   r7   rg   rw   r   rT   r   r   r   r   r   r   r     sk    2
 
 LHH "&^)||^) LL^) 	^)
 ^) ^)r   r   c                       \ rS rSrSr\S 5       rSrSrSr	SSS	.S
\
\\\\4   S\S\S\S\R                  S-  S\
\
\\\\4      4S jjrSrg)MTB_BBoxForceDimensionsi  z|
Resize a BBOX to new dimensions while keeping its center.

Optionally constrains the BBOX to stay within image boundaries.
c                 :    SSSSSS.4SSSSS.4SSS	04S
.SS0S.$ )Nr+   r   i   r   i    )r!   r#   r"   r[   r!   T)r=   r   r   constrain_to_imager^   r}   ra   r   r'   s    r   r)   #MTB_BBoxForceDimensions.INPUT_TYPES  sM     "S4!HI c!D"IJ'09d2C&D	 

 
	
r   r.   r+   force_dimensionsTN)r   r^   r=   r   r   r   r^   r/   c                   Uu  pgpXhS-  -   n
XyS-  -   nXS-  -
  nXS-  -
  nU(       aZ  UbW  UR                   SS u  p[        S[        XU-
  5      5      n[        S[        XU-
  5      5      n[        X/5      n[        X>5      nXX#44$ )Nr   r   r   r   )r   r"   r#   )r2   r=   r   r   r   r^   r	   r
   
curr_widthcurr_heightrM   rN   rQ   rR   
img_height	img_widths                   r   r   (MTB_BBoxForceDimensions.force_dimensions  s     )-%jQ&a''A:%Q;&%"3$)KK!$4!J3u%&789E3u6&9:;E)E,Fu-//r   r   )r   r   r   r   r   r4   r)   r7   r5   r6   r8   r   rx   rg   rw   r   r   r   r   r   r   r     s     
 
 HL!H $(%)0 Cc3&'0 	0
 0 !0 ||d"0 
uS#sC'(	)0 0r   r   r1   )typingr   rg   !torchvision.transforms.functional
transformsr   r   r   r   r   r:   rD   rV   rz   r8   r   r   r   r   r   	__nodes__r   r   r   <module>r      s      . . * "3 "3J $C C<;- ;-|K
 K
n[ uS#X/E " >BG
G$)#s(Od$:Gs) s)l10 10j 	r   