
    %^g                         d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ  e j                   e      Z ej&                  d      Z G d	 d
e      Z G d de      Zy)    N)OrderedDict)NamedTemporaryFile)	smart_str)
EXTENSIONS)settings)
EngineBasez+^(?:.+) (?:[A-Z0-9]+) (?P<x>\d+)x(?P<y>\d+)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d Zd Zy)EnginezC
    Image object is a dict with source path, options and size
    c                    |d   dk(  r(|j                  dt        j                        rd|d   d<   |d   |d   d<   t        j                  j	                  d      }|j                  |d	   d
z          |d   D ]5  }|d   |   }|j                  d|z         |"|j                  d|z         7 d}d|v r|d   }t        j                  r|dk(  s|j                  d       dt        |d      z  }t        |d      5 }	|j                  |	j                         t        t        t        |            }t        j                  |t        j                  t        j                        }
|
j!                         }|
j#                         \  }}|r t%        ddj'                  |      d|      |rt(        j+                  d|       |j-                  |	j/                                ddd       y# 1 sw Y   yxY w)z,
        Writes the thumbnail image
        formatJPEGprogressivelineoptions	interlacequality source[0]z-%sNz%sonflattenoffz-flattenz.%srb)suffixmodestdoutstderrzThe command 'z?' exited with a non-zero exit code and printed this to stderr:
zCaptured stderr: %s)getr   THUMBNAIL_PROGRESSIVETHUMBNAIL_CONVERTsplitappendTHUMBNAIL_FLATTENr   r   namelistmapr   
subprocessPopenPIPEwaitcommunicateEngineErrorjoinloggererrorwriteread)selfimager   	thumbnailargskvr   r   fpp
returncodeouterrs                 i/var/www/html/webapps/promises/venv/lib/python3.12/site-packages/sorl/thumbnail/engines/convert_engine.pyr1   zEngine.write   s    8&7;;x==,?,2E)[)&-i&8i#))//4E(Oe+,y! 	&Ai #AKK	"}D1H%		& i(G%%g.>KK
#GH$566vD9 	'RKK It,-D  joojooVAJ}}HC! xx~s, 
 2C8OOBGGI&!	' 	' 	's   <C%G**G3c                 4    t        j                  |d          y )Nr   )osremove)r3   r4   s     r>   cleanupzEngine.cleanupF   s    
		%/"    c                    t         j                  j                  |j                        \  }}t	        dd|      5 }|j                  |j                                ddd       j                  t               ddS # 1 sw Y   !xY w)zM
        Returns the backend image objects from a ImageFile instance
        wbF)r   deleter   N)r   r   size)r@   pathsplitextr%   r   r1   r2   r   )r3   r   _r   r9   s        r>   	get_imagezEngine.get_imageI   sh    
 GG$$V[[1	6T%G 	$2HHV[[]#	$''kmTJJ	$ 	$s    A;;Bc                    |d   t         j                  j                  d      }|j                  |d   dz          t	        j
                  |t        j                  t        j                        }|j                          t        j                  t        |j                  j                                     }t        |j                  d            t        |j                  d            f|d<   |d   S )z?
        Returns the image width and height as a tuple
        rG   r   r   r   r   xy)r   THUMBNAIL_IDENTIFYr"   r#   r(   r)   r*   r+   size_rematchstrr   r2   intgroup)r3   r4   r6   r:   ms        r>   get_image_sizezEngine.get_image_sizeT   s     = ..44S9DKKh%/0  joojooVAFFHc!((--/23A-s1773</@@E&MV}rC   c                    t        d      5 }|j                  |       |j                          t        j                  j                  d      }|j                  |j                  dz          t        j                  |t        j                  t        j                        }|j                         }ddd       |dk(  S # 1 sw Y   dk(  S xY w)z
        This is not very good for imagemagick because it will say anything is
        valid that it can use as input.
        rE   )r   r   r   r   Nr   )r   r1   flushr   rO   r"   r#   r%   r(   r)   r*   r+   )r3   raw_datar9   r6   r:   retcodes         r>   is_valid_imagezEngine.is_valid_imagea   s    
  T* 	bHHXHHJ..44S9DKK%(  joojooVAffhG	 !|	 !|s   B#B==C
c                 z   t         j                  j                         }|j                  dd|d   g       t	        j
                  |t        j                  t        j                        }|j                          |j                  j                         j                         }	 t        |      S # t        $ r Y y w xY w)Nz-formatz%[exif:orientation]r   r   )r   rO   r"   extendr(   r)   r*   r+   r   r2   striprS   
ValueError)r3   r4   r6   r:   results        r>   _get_exif_orientationzEngine._get_exif_orientationo   s    **002Y 5uXGHT*//*//R	&&(	v; 		s   #
B. .	B:9B:c                 @   t         j                  j                  d      rv| j                  |      }|ra|d   }|dk(  rd |d<   |S |dk(  rd|d<   |S |dk(  rd |d	<   |S |d
k(  rd|d<   d |d<   |S |dk(  rd|d<   |S |dk(  rd|d<   d |d<   |S |dk(  rd|d<   |S d |d   d<   |S )Nz
gm convertr      flop   180rotate   flip   90      z-90   zauto-orient)r   r!   endswithra   )r3   r4   orientationr   s       r>   _orientationzEngine._orientationz   s    %%..|<44U;K	*!#&*GFO& % !A%(-GH%" ! !A%&*GFO  !A%(,GH%&*GFO  !A%(,GH%  !A%(-GH%&*GFO  !A%(-GH%
  /3E)]+rC   c                 4    | j                  |      }|xr |dv S )N)rj   rl   rm   rn   )ra   )r3   r4   rp   s      r>   _flip_dimensionszEngine._flip_dimensions   s"    007:{l::rC   c                     ||d   d<   |S )z
        `Valid colorspaces
        <http://www.graphicsmagick.org/GraphicsMagick.html#details-colorspace>`_.
        Backends need to implement the following::

            RGB, GRAY
        r   
colorspace )r3   r4   ru   s      r>   _colorspacezEngine._colorspace   s     *4i&rC   c                 :    |d|d|d||d   d<   ||f|d<   |S )z!
        Crops the image
        rM   +r   croprG   rv   )r3   r4   widthheightx_offsety_offsets         r>   _cropzEngine._crop   s.     5:68X#Vi frC   c                 R    ||z
  d||z
  d|d||d   d<   ||z
  ||z
  f|d<   |S )zg
        Crops the image to a set of x,y coordinates (x,y) is top left, (x2,y2) is bottom left
        rM   ry   r   rz   rG   rv   )r3   r4   rM   rN   x2y2s         r>   _cropboxzEngine._cropbox   s?     57FBFAq#Ii aa(frC   c                 0    |d|d|d   d<   ||f|d<   |S )z0
        Does the resizing of the image
        rM   !r   scalerG   rv   )r3   r4   r{   r|   s       r>   _scalezEngine._scale   s*     16v$>i!frC   c                 j    |j                  d      |d   d<   d|d   d<   |d   d|d   |d   d	<   |S )
z 
        Pads the image
        padding_colorr   
backgroundcentergravityr   rM      extent)r   )r3   r4   geometryr   s       r>   _paddingzEngine._padding   sL    
 *1_)Ei&&.i#08Xa[%Ii"rC   N)__name__
__module____qualname____doc__r1   rB   rK   rV   r[   ra   rq   rs   rw   r   r   r   r   rv   rC   r>   r
   r
      sJ    ,'\#	K	<;	rC   r
   c                       e Zd Zy)r-   N)r   r   r   rv   rC   r>   r-   r-      s    rC   r-   )loggingr@   rer(   collectionsr   django.core.files.tempr   django.utils.encodingr   sorl.thumbnail.baser   sorl.thumbnail.confr   sorl.thumbnail.engines.baser   	getLoggerr   r/   compilerP   r
   	Exceptionr-   rv   rC   r>   <module>r      sa     	 	  # 5 + * ( 2			8	$
"**C
DtZ tn	) 	rC   