U
    ڲg)                  
   @  sR  d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlZddl	m
Z
 dddd	d
dZdddddZdddddZddddZdddddZdddddZddddd Zddd!d"Zd#d$d%d&d'd(d)d*d+d,	Zdd-dd.d/Zdddd0d1Zddd2d3Zdd-dd4d5Zdddd6d7Zddd8d9Zd@d;dd<d=d>d?ZdS )A    )annotationsN)IO   )Image)PIL._imagingZPILLOW_VERSION)zPIL._tkinter_finderZ
tk_version)PIL._imagingftZfreetype2_version)zPIL._imagingcmsZlittlecms_version)	PIL._webpZwebpdecoder_version)piltkinter	freetype2
littlecms2webpstrbool)featurereturnc              
   C  s   | t krd|  }t|t |  \}}zt| W dS  tk
rJ   Y dS  tk
r~ } ztt| W Y dS d}~X Y nX dS )z
    Checks if a module is available.

    :param feature: The module to check for.
    :returns: ``True`` if available, ``False`` otherwise.
    :raises ValueError: If the module is not defined in this version of Pillow.
    zUnknown module TFN)modules
ValueError
__import__ModuleNotFoundErrorImportErrorwarningswarnr   )r   msgmoduleverex r   0/tmp/pip-unpacked-wheel-xela2va7/PIL/features.pycheck_module   s    
r   z
str | Nonec                 C  s,   t | sdS t|  \}}tt||gd|S )z
    :param feature: The module to check for.
    :returns:
        The loaded version number as a string, or ``None`` if unknown or not available.
    :raises ValueError: If the module is not defined in this version of Pillow.
    Nfromlist)r   r   getattrr   )r   r   r   r   r   r   version_module.   s    r#   z	list[str])r   c                   C  s   dd t D S )z4
    :returns: A list of all supported modules.
    c                 S  s   g | ]}t |r|qS r   )r   .0fr   r   r   
<listcomp>A   s      z)get_supported_modules.<locals>.<listcomp>)r   r   r   r   r   get_supported_modules=   s    r(   )ZjpegZjpeglib)Zjpeg2kZjp2klib)zipzlib)libtiffr+   )jpgjpg_2000r*   r+   c                 C  s:   | t krd|  }t|t |  \}}| dttjkS )z
    Checks if a codec is available.

    :param feature: The codec to check for.
    :returns: ``True`` if available, ``False`` otherwise.
    :raises ValueError: If the codec is not defined in this version of Pillow.
    zUnknown codec _encoder)codecsr   dirr   core)r   r   codeclibr   r   r   check_codecL   s
    
r4   c                 C  sN   t | sdS t|  \}}ttj| d}| dkrJ|dd dd S |S )a  
    :param feature: The codec to check for.
    :returns:
        The version number as a string, or ``None`` if not available.
        Checked at compile time for ``jpg``, run-time otherwise.
    :raises ValueError: If the codec is not defined in this version of Pillow.
    N_versionr+   
r   zVersion r   )r4   r/   r"   r   r1   split)r   r2   r3   versionr   r   r   version_codec]   s    r9   c                   C  s   dd t D S )z3
    :returns: A list of all supported codecs.
    c                 S  s   g | ]}t |r|qS r   )r4   r$   r   r   r   r'   v   s      z(get_supported_codecs.<locals>.<listcomp>)r/   r   r   r   r   get_supported_codecsr   s    r:   )r   ZHAVE_WEBPANIMN)r   ZHAVE_WEBPMUXN)r   ZHAVE_TRANSPARENCYN)r   Z	HAVE_RAQMZraqm_version)r   ZHAVE_FRIBIDIZfribidi_version)r   ZHAVE_HARFBUZZZharfbuzz_version)r   ZHAVE_LIBJPEGTURBOlibjpeg_turbo_version)r   ZHAVE_LIBIMAGEQUANTZimagequant_version)r   ZHAVE_XCBN)		webp_animwebp_muxtransp_webpraqmfribidiharfbuzzlibjpeg_turbolibimagequantxcbzbool | Nonec              
   C  s   | t krd|  }t|t |  \}}}zt|dgd}t||W S  tk
rX   Y dS  tk
r } ztt| W Y dS d}~X Y nX dS )z
    Checks if a feature is available.

    :param feature: The feature to check for.
    :returns: ``True`` if available, ``False`` if unavailable, ``None`` if unknown.
    :raises ValueError: If the feature is not defined in this version of Pillow.
    zUnknown feature PILr    N)	featuresr   r   r"   r   r   r   r   r   )r   r   r   flagr   Zimported_moduler   r   r   r   check_feature   s    
rH   c                 C  s:   t | sdS t|  \}}}|dkr&dS tt||gd|S )z
    :param feature: The feature to check for.
    :returns: The version number as a string, or ``None`` if not available.
    :raises ValueError: If the feature is not defined in this version of Pillow.
    Nr    )rH   rF   r"   r   )r   r   rG   r   r   r   r   version_feature   s    rI   c                   C  s   dd t D S )z5
    :returns: A list of all supported features.
    c                 S  s   g | ]}t |r|qS r   )rH   r$   r   r   r   r'      s      z*get_supported_features.<locals>.<listcomp>)rF   r   r   r   r   get_supported_features   s    rJ   c                 C  sJ   | t krt| S | tkr t| S | tkr0t| S tjd|  ddd dS )z
    :param feature: A module, codec, or feature name.
    :returns:
        ``True`` if the module, codec, or feature is available,
        ``False`` or ``None`` otherwise.
    zUnknown feature 'z'.   )
stacklevelF)r   r   r/   r4   rF   rH   r   r   r   r   r   r   check   s    rN   c                 C  s4   | t krt| S | tkr t| S | tkr0t| S dS )z
    :param feature:
        The module, codec, or feature to check for.
    :returns:
        The version number as a string, or ``None`` if unknown or not available.
    N)r   r#   r/   r9   rF   rI   rM   r   r   r   r8      s    r8   c                  C  s"   t  } | t  | t  | S )zJ
    :returns: A list of all supported modules, features, and codecs.
    )r(   extendrJ   r:   )retr   r   r   get_supported   s    rQ   TzIO[str] | NoneNone)outsupported_formatsr   c              	   C  s  | dkrt j} t  td| d tdtj | d t j }td|d 	  | d |dd D ]}td|	  | d qftd| d td	t j
pd
 | d t jt jkrtdt j | d tdt j | d td| d tdtjtj | d tdtjtjj | d td| d dD ]\}}t|r(d}|dkrltd}|dk	rld| }|dkr~t|}|dk	r|dk}|dkrtdd |dD dk }|rdnd}	|dkr dD ],}
t|
}|dk	r|d|
 d| 7 }qtd|d |	|| d ntd|d!| d ntd"|d#| d q0td| d |rtt}tj D ]\}}|| | qbttjD ]}| }|tjkr| dtj|  }t|| d ||krtd$d t|| | d g }|tj!kr |d% |tj"kr|d& |tj#kr,|d' |tj$krB|d( |tj%krX|d) td*d || d td| d qdS )+a  
    Prints information about this installation of Pillow.
    This function can be called with ``python3 -m PIL``.
    It can also be called with ``python3 -m PIL.report`` or ``python3 -m PIL --report``
    to have "supported_formats" set to ``False``, omitting the list of all supported
    image file formats.

    :param out:
        The output stream to print to. Defaults to ``sys.stdout`` if ``None``.
    :param supported_formats:
        If ``True``, a list of all supported image file formats will be printed.
    NzD--------------------------------------------------------------------)filezPillow zPython r   r   z       zPython executable is unknownz%Environment Python files loaded from z System Python files loaded from z"Python Pillow modules loaded from z"Binary Pillow modules loaded from ))r	   zPIL CORE)r
   ZTKINTER)r   Z	FREETYPE2)r   Z
LITTLECMS2)r   ZWEBP)r>   zWEBP Transparency)r=   ZWEBPMUX)r<   zWEBP Animation)r,   ZJPEG)r-   zOPENJPEG (JPEG2000))r*   zZLIB (PNG/ZIP))r+   ZLIBTIFF)r?   zRAQM (Bidirectional Text))rC   z#LIBIMAGEQUANT (Quantization method))rD   zXCB (X protocol)r,   rB   zlibjpeg-turbo )r	   r,   r   c                 s  s   | ]}t |V  qd S )N)int)r%   xr   r   r   	<genexpr>)  s     zpilinfo.<locals>.<genexpr>.)rK      zcompiled forZloadedr?   )r@   rA   z,  z---zsupport ok,z
support okz***zsupport not installedzExtensions: {}opensaveZsave_alldecodeencodezFeatures: {})&sysstdoutr   initprintrE   __version__r8   
splitlinesstrip
executableprefixbase_prefixospathdirname__file__r1   rN   rI   tupler7   collectionsdefaultdictlistZ	EXTENSIONitemsappendsortedZIDZMIMEformatjoinZOPENZSAVEZSAVE_ALLZDECODERSZENCODERS)rS   rT   Zpy_version_lines
py_versionnamer   vr;   Zversion_statictr&   Zv2
extensionsextilinerF   r   r   r   pilinfo   s    










 




r   )NT)
__future__r   rp   rk   ra   r   typingr   rE    r   r   r   r#   r(   r/   r4   r9   r:   rF   rH   rI   rJ   rN   r8   rQ   r   r   r   r   r   <module>   sR   	