
    /~hd1                         d dl Z d dlZd dlZd dlmZ ddlmZmZ ddlm	Z	m
Z
mZmZmZ ddgZddgZd	d
dZddZd Zd ad Zd Zd Zd Zd Zd Zd Zd Zd Z G d de      ZddZ G d de      Z d Z!d dZ"y)!    N)UnsupportedOperation   )UnknownExtensionUnknownFormat)Image	ImageFileStringIOstring_typesgetattrsafePNGWEBPGIFz.jpgz.png)JPEGr   c                 0    t        | t               |||      S N)
save_imager	   )imgformatautoconvertoptionss       U/var/www/peopleoo.sandbox-dev.co.uk/venv/lib/python3.12/site-packages/pilkit/utils.pyimg_to_fobjr      s    c8:vwDD    c                 N    | j                  d       t        j                  |       S )Nr   )seekr   open)targets    r   
open_imager      s    
KKN::fr   c                  D    t         dk  rt        j                          da yy)zLoads the standard PIL file format drivers. Returns True if ``preinit()``
    was called (and there's a potential that more drivers were loaded) or False
    if there is no possibility that new drivers were loaded.

    r   TF)	_pil_initr   preinit r   r   _preinit_pilr#      s     1}	r   c                  X    t                t        dk  rt        j                          dayy)zLoads all PIL file format drivers. Returns True if ``init()`` was called
    (and there's a potential that more drivers were loaded) or False if there is
    no possibility that new drivers were loaded.

       TF)r#   r    r   initr"   r   r   	_init_pilr'   +   s$     N1}

	r   c                 \    t         j                  j                  | j                               S r   )r   	EXTENSIONgetlower)	extensions    r   _extension_to_formatr-   :   s    ??y011r   c                     | rd| j                         } | t        v rt        |    }|t        j                  v r|S t        j                  j	                         D ]  \  }}|| k(  s|c S  y r   )upperDEFAULT_EXTENSIONSr   r)   items)r   extkvs       r   _format_to_extensionr5   >   sg    ''$V,C eoo%
OO))+ 	DAqF{	 r   c                 n    	 d| xs dz  }t        j                  |      d   }|S # t        $ r d }Y |S w xY w)Nza%s r   )	mimetypes
guess_type
IndexError)r2   filenamemimetypes      r   extension_to_mimetyper=   N   sL    CI2&''1!4 O  Os   !% 44c                 *    t        t        |             S r   )r=   format_to_extension)r   s    r   format_to_mimetyper@   W   s     !4V!<==r   c                     t        |       }|st               rt        |       }|st               rt        |       }|st        |       |S )zDReturns the format that corresponds to the provided extension.

    )r-   r#   r'   r   )r,   r   s     r   extension_to_formatrB   [   sC     "),Fln%i0ik%i0y))Mr   c                     d}| r9t        |       }|st               rt        |       }|st               rt        |       }|st        |       |S )zCReturns the first extension that matches the provided format.

    N)r5   r#   r'   r   )r   r,   s     r   r?   r?   i   sL     I(0	\^,V4IY[,V4IF##r   c                 Z   t         j                  j                  |       d   }	 t        |      }|j	                         |j	                         k(  r|}|S 	 t        |      }|j	                         |j	                         k(  r|}|S |}|S # t        $ r |}Y |S w xY w# t        $ r |}Y |S w xY w)Nr   )ospathsplitextr?   r+   rB   r   r   )namer   original_extensionsuggested_extensionr,   original_formats         r   suggest_extensionrL   y   s    ))$/241&9 $$&*<*B*B*DD*I 	4"56H"I
 <<>_%:%:%<< 2I  !4I $ 0/	 0  '&	 !'s#   B B	 	BBB*)B*c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )FileWrapperc                 .    t         t        |   d|       y )N_wrapped)superrN   __setattr__)selfwrapped	__class__s     r   __init__zFileWrapper.__init__   s    k4,ZAr   c                 ^    	 | j                   j                         S # t        $ r t        w xY wr   )rP   filenor   AttributeErrorrS   s    r   rX   zFileWrapper.fileno   s/    	!==''))# 	!  	!s    ,c                 .    t        | j                  |      S r   )getattrrP   )rS   rH   s     r   __getattr__zFileWrapper.__getattr__   s    t}}d++r   c                 0    t        | j                  ||      S r   )setattrrP   )rS   rH   values      r   rR   zFileWrapper.__setattr__   s    t}}dE22r   c                 .    t        | j                  |      S r   )delattrrP   )rS   keys     r   __delattr__zFileWrapper.__delattr__   s    t}}c**r   )	__name__
__module____qualname__rV   rX   r]   rR   rd   __classcell__)rU   s   @r   rN   rN      s    B!,3+r   rN   c                     xs i |r"t               \   }|j                         |	 j                  d        fd}t	        fdt
        D              r}nt              }	  ||       	 j                  d       S # t        $ r Y Uw xY w# t        $ r t        dv rt        d         nddz    j                  d   dz  d j                  d   z   j                  d   z        }|t        j                  k  r t        j                  }	|t        _        	  ||       |	t        _        n# |	t        _        w xY wY w xY w# t        $ r Y S w xY w)	aR  
    Wraps PIL's ``Image.save()`` method. There are two main benefits of using
    this function over PIL's:

    1. It gracefully handles the infamous "Suspension not allowed here" errors.
    2. It prepares the image for saving using ``prepare_image()``, which will do
        some common-sense processing given the target format.

    r   c                 l    t               5   j                  | fi  d d d        y # 1 sw Y   y xY wr   )quietsave)fpr   r   r   s    r   rl   zsave_image.<locals>.save   s2    W 	,CHHR+7+	, 	, 	,s   *3c              3   6   K   | ]  }t        |        y wr   )
isinstance).0toutfiles     r   	<genexpr>zsave_image.<locals>.<genexpr>   s     
8a:gq!
8s   exif         r   )prepare_imageupdater   rY   anyr
   rN   IOErrormaxlensizer   MAXBLOCK)
r   rr   r   r   r   save_kwargsrl   wrappernew_maxblockold_maxblocks
   ````      r   r   r      sb    mG(f5[ 	7#Q, 
8<
88g&.W0Q N]  $  . %+w%6S!ABHHQK!OOchhqk)

 ),,, )))		.M!-II+.2  NsN   B /B 8E 	BBB
E%D9-E9EEE	EEc                       e Zd ZdZd Zd Zy)rk   z
    A context manager for suppressing the stderr activity of PIL's C libraries.
    Based on http://stackoverflow.com/a/978264/155370

    c                    	 t         j                  j                         | _        	 t        j                  t        j                  t        j                        | _
        t        j                  | j                        | _        t        j                  | j                  | j                         y # t        $ r Y y t
        $ r Y y w xY w# t        $ r Y y w xY wr   )sys
__stderr__rX   	stderr_fdrY   r   rE   r   devnullO_RDWRnull_fdOSErrordupolddup2rZ   s    r   	__enter__zquiet.__enter__   s    		 ^^224DN	772::ryy9DL
 66$..)
dnn-  	 # 	 	  	 	s(   #B, 7C ,	C7CC	CCc                    t        | dd       sy t        | dd       sy t        j                  | j                  | j                         t        j
                  | j                         t        j
                  | j                         y )Nr   r   )r\   rE   r   r   r   closer   )rS   argskwargss      r   __exit__zquiet.__exit__  sV    tY-tUD)
$..)

r   N)re   rf   rg   __doc__r   r   r"   r   r   rk   rk      s    
.(r   rk   c                    d}i }|j                         }| j                  dk(  r|t        v rn|t        v r| j	                          | j                         d   }t        j                  |d       }t        t        dd      }| j                  d      j                  d|d	
      } | j                  d	|       d	|d<   nd}n| j                  dk(  r9|t        v r	 | j                  d   |d<   nW|t        v r| j                  d      } n=d}n:| j                  d      } |dk(  r$t        t        dd      }| j                  d|      } |r+ddlm}  |       j                  |       j                  d      } |dk(  rd|d<   | |fS # t        $ r Y Fw xY w)a  
    Prepares the image for saving to the provided format by doing some
    common-sense conversions. This includes things like preserving transparency
    and quantizing. This function is used automatically by ``save_image()``
    immediately before saving unless you specify ``autoconvert=False``. It is
    provided as a utility for those doing their own processing.

    :param img: The image to prepare for saving.
    :param format: The format that the image will be saved to.

    FRGBAc                     | dk  rdS dS )N      r   r"   )as    r   <lambda>zprepare_image.<locals>.<lambda>9  s    a3hs A r   zPalette.ADAPTIVEADAPTIVERGBPr   )palettecolorstransparencyTr   )r   r   )
MakeOpaquer   optimize)r/   modeRGBA_TRANSPARENCY_FORMATSPALETTE_TRANSPARENCY_FORMATSloadsplitr   evalr   convertpasteinfoKeyError
processorsr   process)r   r   make_opaquer   alphamaskr   r   s           r   rx   rx     s    KK\\^F
xx6..33& HHJIIKOE::e%EFD!%);ZHG++e$,,S'#,NCIIc4 *-K' K	S11.1hh~.FN+ 00 ++f%CKkk%  U?!%);ZHG++c7+3C*l""3'//6"&J5  s   E< <	FFc                     ddl m} | j                  } ||xs g       j                  |       } |xs | j                  xs |xs d}|xs i }t	        | ||fi |S )Nr   )ProcessorPipeliner   )r   r   r   r   r   )r   r   r   r   r   r   rK   s          r   process_imager   h  s_    -jjO J,"
-
5
5c
:C>szz>_>FmGsFK;7;;r   )T)NT)NNTN)#rE   r8   r   ior   
exceptionsr   r   libr   r   r	   r
   r   r   r   r0   r   r   r    r#   r'   r-   r5   r=   r@   rB   r?   rL   objectrN   r   rk   rx   r   r"   r   r   <module>r      s    	  
 # 7 F F #FO  %u~  E
 	2 > .+& +*DN!F !HUp
<r   