
    +j                         S SK r S SKJr  S SKJr  S SKJrJr  SS jr " S S\R                  5      r
 " S S\5      rS	\4S
 jrg)    N)override)ComfyExtensionioc                 l   U R                   U R                  pTU R                  [        R                  5      n [
        R                  " U SS9n[
        R                  " USS9n[        R                  " UR                  US9U-  nUn[        [        UR                  5      S-
  5       H=  n	U	S-   n
UR                  U
   S-  n[        X;5      nUR                  XU-
  US-  5      nM?     XSS& Xg-  n[
        R                  " USS9n[
        R                  " USS9R                   nUR                  U5      nU$ )a  
Apply frequency-dependent scaling to an image tensor using Fourier transforms.

Parameters:
    x:           Input tensor of shape (B, C, H, W)
    scale_low:   Scaling factor for low-frequency components (default: 1.0)
    scale_high:  Scaling factor for high-frequency components (default: 1.5)
    freq_cutoff: Number of frequency indices around center to consider as low-frequency (default: 20)

Returns:
    x_filtered: Filtered version of x in spatial domain with frequency-specific scaling applied.
))dim)device   N)dtyper
   totorchfloat32fftfftnfftshiftonesshaperangelenminnarrow	ifftshiftifftnreal)x	scale_low
scale_highfreq_cutoffr   r
   x_freqmaskmdr	   ccf_c
x_filtereds                 9/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_fresca.pyFourier_filterr(      s    GGQXX6 	
U]]A XXaX&F\\&h/F ::fll62Z?DA3v||$q()!e\\#!#+"HHSs(C!G,	 * aD ]F ]]6x0F6x055J u%J    c                   4    \ rS rSr\S 5       r\S 5       rSrg)FreSca8   c                 |   [         R                  " SS/SSS[         R                  R                  S5      [         R                  R                  SSSS	S
SSS9[         R                  R                  SSSS	S
SSS9[         R
                  R                  SSSSSSSS9/[         R                  R                  5       /SS9$ )Nr+   zfrequency guidanceexperimentalz3Applies frequency-dependent scaling to the guidancemodelr         ?r   
   g{Gz?z+Scaling factor for low-frequency componentsT)defaultr   maxsteptooltipadvancedr   g      ?z,Scaling factor for high-frequency componentsr         i'  zFNumber of frequency indices around center to consider as low-frequency)node_idsearch_aliasesdisplay_namecategorydescriptioninputsoutputsis_experimental)r   SchemaModelInputFloatIntOutput)clss    r'   define_schemaFreSca.define_schema9   s    yy01!#Mw'{CQBT'T_c  e|Tqbt'U`d  f]BA5q%mx|  ~ ! !%
 	
r)   c                    ^^^ UUU4S jnUR                  5       nUR                  U5        [        R                  " U5      $ )Nc                    > U S   n[        U5      S::  d  S U S   S S ;   a  U$ US   nUS   nX#-
  n[        UT	TTS9nXS-   nXc/USS  -   $ )N	conds_outr8   condsr   r   )r   r   r   )r   r(   )
argsrL   conduncondguidancefiltered_guidancefiltered_condr   r   r   s
          r'   custom_cfg_function+FreSca.execute.<locals>.custom_cfg_functionR   s    [)I9~"dd7mBQ.?&?  Q<Dq\F}H .#%'	! .6M!*Yqr]::r)   )clone"set_model_sampler_pre_cfg_functionr   
NodeOutput)rG   r/   r   r   r   rT   r"   s     ```  r'   executeFreSca.executeP   s3    	;$ KKM	,,-@A}}Qr)    N)__name__
__module____qualname____firstlineno__classmethodrH   rY   __static_attributes__r[   r)   r'   r+   r+   8   s(    
 
,    r)   r+   c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)FreScaExtensionj   returnc                    #    [         /$ 7fN)r+   )selfs    r'   get_node_listFreScaExtension.get_node_listk   s      
 	
s   
r[   N)r\   r]   r^   r_   r   listtyper   	ComfyNoderi   ra   r[   r)   r'   rc   rc   j   s)    
T$r||*<%= 
 
r)   rc   re   c                     #    [        5       $ 7frg   )rc   r[   r)   r'   comfy_entrypointro   r   s     s   )r0   g      ?r7   )r   	torch.fftr   typing_extensionsr   comfy_api.latestr   r   r(   rm   r+   rc   ro   r[   r)   r'   <module>rs      s@      & /-`/ R\\ / d
n 
 r)   