
    %^gQ)                        d dl mZ d dlmZ 	 d dlmZmZmZmZm	Z	  eed      rej                  j                  Znej                  Z eed      r-ej                  j                   Zej                  j"                  Znej                   Zej"                  ZdZd Zd	 Z eej
                  d
e      Zd Zd Z G d dej2                        Z G d de      Zy# e
$ r d dlZd dlZd dlZd dl	Z	Y w xY w)    )BytesIO)
EngineBase)Image	ImageDraw	ImageFileImageFilter	ImageModeN
Resampling	Transposei  c                     t        j                  | j                        }| j                  \  }}||z  t	        |j
                        z  S )z Return the number of color values in the input image --
        this is the number of pixels times the band count
        of the image.
    )r	   getmodemodesizelenbands)imagemode_descriptorwidthheights       e/var/www/html/webapps/promises/venv/lib/python3.12/site-packages/sorl/thumbnail/engines/pil_engine.pycolor_countr      s?    
  ''

3OJJME66>C 5 5666    c                     ddl m}m t        t	        |             fd| j                         D        } |fd|D               S )z0 Calculate the entropy of an images' histogram. r   )fsumlog2c              3   (   K   | ]	  }|z    y wN ).0histocolhistosums     r   	<genexpr>z'histogram_entropy_py.<locals>.<genexpr>)   s     GH$Gs   c              3   @   K   | ]  }|d k7  s	| |      z    yw)g        Nr   )r   pr   s     r   r"   z'histogram_entropy_py.<locals>.<genexpr>*   s     <18T!W<s   
)mathr   r   floatr   	histogram)r   r   	histonormr!   r   s      @@r   histogram_entropy_pyr)   %   s:    ['(HGU__5FGI<i<<<<r   entropyc                     t        j                  d| | fd      }t        j                  |      }|j	                  dd| dz  | dz  fdd|       |S )zDraw a round cornerLr           )fill)r   newr   Drawpieslice)radiusr0   cornerdraws       r   round_cornerr7   2   sQ    YYsVV,a0F>>&!DMM1a!VaZ0#sMFMr   c                 d   | \  }}t        j                  d| d      }t        |d      }|j                  |d       |j                  |j	                  d      d||z
  f       |j                  |j	                  d      ||z
  ||z
  f       |j                  |j	                  d      ||z
  df       |S )zDraw a rounded rectangler,      )r   r   Z   r   r.   r/   )r   r1   r7   pasterotate)r   r4   r0   r   r   	rectangler5   s          r   round_rectangler>   :   s    ME6		#tS)I&#&FOOFF#OOFMM"%(*OOFMM#&&(IJOOFMM#&(;<r   c                       e Zd Zd ZddZd Zy)GaussianBlurc                     || _         y r   )r4   )selfr4   s     r   __init__zGaussianBlur.__init__J   s	    r   c                 8    |j                  | j                        S r   )gaussian_blurr4   rB   r   s     r   filterzGaussianBlur.filterM   s    ""4;;//r   N)r-   )__name__
__module____qualname__namerC   rG   r   r   r   r@   r@   G   s    D0r   r@   c                       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 ee      Zd Zd Zd Zd Zd ZddZy)Enginec                 ^    t        |j                               }t        j                  |      S r   )r   readr   open)rB   sourcebuffers      r   	get_imagezEngine.get_imageR   s!    'zz&!!r   c                     |j                   S r   )r   rF   s     r   get_image_sizezEngine.get_image_sizeV   s    zzr   c                 "    |j                   xs i S r   )inforF   s     r   get_image_infozEngine.get_image_infoY   s    zzRr   c                     t        |      }	 t        j                  |      }|j                          y# t        $ r Y yw xY w)NFT)r   r   rP   verify	Exception)rB   raw_datarR   trial_images       r   is_valid_imagezEngine.is_valid_image\   sD    "	**V,K    		s   %3 	??c                 <    |d   }|d   }| j                  |||      S )z-
        Wrapper for ``_colorspace``
        
colorspaceformat)_colorspace)rB   r   geometryoptionsr`   ra   s         r   r`   zEngine.colorspacee   s-     \*
"z6::r   c                 ,    |j                  ||||f      S r   crop)rB   r   xyx2y2s         r   _cropboxzEngine._cropboxn   s    zz1aR.))r   c                 v    	 |j                         }|r|j                  t              S y # t        $ r d }Y %w xY wr   )_getexifr[   getEXIF_ORIENTATION)rB   r   exifs      r   _get_exif_orientationzEngine._get_exif_orientationq   sA    	>>#D 88,--  	D	s   * 88c                    | j                  |      }|r|dk(  r|j                  t              }|S |dk(  r|j                  d      }|S |dk(  r|j                  t              }|S |dk(  r(|j                  dd      j                  t              }|S |d	k(  r|j                  dd      }|S |d
k(  r(|j                  dd      j                  t              }|S |dk(  r|j                  dd      }|S )Nr-      r.         i   )expand      r:      )rr   	transposeFLIP_LEFT_RIGHTr<   FLIP_TOP_BOTTOMrB   r   orientations      r   _orientationzEngine._orientation|   s   007a8  !S)  !8  !S3==oN  !S3  !R2<<_M  !R2r   c                 4    | j                  |      }|xr |dv S )N)rv   ry   rz   r{   )rr   r   s      r   _flip_dimensionszEngine._flip_dimensions   s"    007:{l::r   c                    |dk(  r|j                   dk(  r|dk7  r|S |j                   dk(  s"|j                   dk(  rvd|j                  v rh|dk7  rc|j                  d      }|j                  j                  d      }|3|j                  d      j	                         d   }|j                  |       |S |j                  d      S |dk(  r|j                  d	      S |S )
NRGBRGBAJPEGLAPtransparencyGRAYr,   )r   rW   convertro   splitputalpha)rB   r   r`   ra   newimager   masks          r   rb   zEngine._colorspace   s    zzV#&(8zzT!

c!n

&BvQWGW ==0$zz~~n=+ ==0668<D%%d+==''==%%r   c                 d   d d d d d}ddddd}dD ]w  }||   |dz  k  st        |d	z  d
      } ||   |||   |      }|j                  d|d   ||d   f      }	| j                  |	      dk  r||xx   |z  cc<   nl||   |dz  k  riy dD ]w  }||   |dz  k  st        |d	z  d
      } ||   |||   |      }
|j                  |
d   d|
d   |f      }	| j                  |	      dk  r||xx   |z  cc<   nl||   |dz  k  riy |j                  |d   |d   ||d   z
  ||d   z
  f      S )Nc                     |||z   fS r   r   iydyri   s      r   <lambda>z'Engine._remove_border.<locals>.<lambda>   s    b"q&\ r   c                     | |z
  |z
  | |z
  fS r   r   ixdxrh   s      r   r   z'Engine._remove_border.<locals>.<lambda>   s    R!R"W'= r   c                     | |z
  |z
  | |z
  fS r   r   r   s      r   r   z'Engine._remove_border.<locals>.<lambda>   s    b1b2g(> r   c                     |||z   fS r   r   r   s      r   r   z'Engine._remove_border.<locals>.<lambda>   s    r26l r   )toprightbottomleftr   )r   r   g      @   
   rw   g       @)r   r   r   r   r   r   )minrg   _get_image_entropy)rB   r   image_widthimage_heightbordersoffsetborder
slice_sizey_rangesectionx_ranges              r   _remove_borderzEngine._remove_border   s   1=>2	
 Q!QA' 
	F.<##55 r!126
)'&/,v
S**a['!*%MN**73c96Nj0N .<##55
	 ( 	F.;#44 !2B7
)'&/+vf~zR**gaj!WQZ%NO**73c96Nj0N .;#44	 zz6&>6%=+w:W'&*::< = 	=r   c                    ||z  }||z  |kD  rt        ||z
  d      }|j                  ||z
  d||f      }|j                  dd||f      }	| j                  |	      | j                  |      k  r|j                  |d||f      }n|j                  dd||z
  |f      }||z  }||z  |kD  r||z  |k  rt        ||z
  d      }
|j                  d||
z
  ||f      }|j                  dd||
f      }| j                  |      | j                  |      k  r|j                  dd|||
z
  f      }n|j                  d|
||f      }||
z  }||z  |k  r|S )Nr   r   )maxrg   r   r   )rB   r   geometry_widthgeometry_heightr   r   geometry_ratioslice_widthr   r   slice_heightr   r   s                r   _entropy_cropzEngine._entropy_crop   s   '/9 L(>9kN:B?KJJk 91k<XYE::q![,?@D&&t,t/F/Fu/MM

KK#NO

Aq,*Dl#ST;&K L(>9 L(>9|o=rBLZZL<$?l [\F**aK>?C&&v.1H1H1MM

Aq+|l7R#ST

A|[,#OPL(L L(>9 r   c                 4    |j                  ||ft              S )N)resample)resize	ANTIALIAS)rB   r   r   r   s       r   _scalezEngine._scale   s    ||UFOi|@@r   c                 8    |j                  ||||z   ||z   f      S r   rf   )rB   r   r   r   x_offsety_offsets         r   _cropzEngine._crop   s.    zz8X 8+Vh->@ A 	Ar   c                 V    t        |j                  |d      }|j                  |       |S )Nnotusedblack)r>   r   r   )rB   r   ris       r   _roundedzEngine._rounded   s%    EJJ>:qr   c                 6    |j                  t        |            S r   )rG   r@   )rB   r   r4   s      r   _blurzEngine._blur   s    ||L011r   c                 
   | j                  |      \  }}t        |d   |z
  dz        }t        |d   |z
  dz        }|j                  d      }t        j                  |j
                  ||      }	|	j                  |||f       |	S )Nr   r-   rw   padding_color)rU   intro   r   r1   r   r;   )
rB   r   rc   rd   x_imagey_imager   r   colorims
             r   _paddingzEngine._padding  s    ..u5HQK')Q./8A;(A-.O,YYuzz8U3
s$	r   Nc                    t        t        j                  |j                  d   |j                  d   z        t        _        t	               }||dd}d|v r|d   |d<   d }|dk(  r|rd|d<   	 |j                  di         |j                  |fi | |j                         }|j                          |S # t        $ r' |j                  d	        |j                  |fi | Y Aw xY w# |j                          w xY w)
Nr   rw   )ra   qualityoptimizeicc_profiler   Tprogressiverq   r   )
r   r   MAXBLOCKr   r   popsavegetvalueOSErrorclose)	rB   r   format_r   
image_infor   bfparamsr\   s	            r   _get_raw_datazEngine._get_raw_data  s     !3!3UZZ]UZZPQ]5RS	Y 
 J&$.}$=F=!f$(F=!	JJvr"EJJr$V$ {{}HHHJ  	%JJz"EJJr$V$	% HHJs*   ,%B3 C& 3-C# C& "C##C& &C8)NF)rH   rI   rJ   rS   rU   rX   r^   r`   rl   rr   r   r   rb   r   r   staticmethodhistogram_entropyr   r   r   r   r   r   r   r   r   r   rM   rM   Q   sn    " ;*	*;&!=J!H &&78AA
2 r   rM   )ior   sorl.thumbnail.engines.baser   PILr   r   r   r   r	   ImportErrorhasattrr
   LANCZOSr   r   r}   r~   rp   r   r)   getattrr   r7   r>   Filterr@   rM   r   r   r   <module>r      s     2GG 5,  ((II
5+oo55Ooo55O++O++O 7= EKK4HI 
0;%% 0ZZ ZU  	s   C C10C1