U
    M»{jÖ,  ã                   @  s4  d dl mZ d dlZd dlmZ d dlmZmZ ddlm	Z	m
Z
 ddlmZ G dd	„ d	ƒZd	d	d
œdd„Zd	d	d
œdd„Zd	dd	dœdd„Zd	dd	dœdd„Zd	dd	dœdd„Zd	dd	dœdd„Zd	dd	dœdd„ZeeeeeeedœZi fddd d d!œd"d#„Zi fddd d d!œd$d%„Zi fddd d d&œd'd(„ZdS ))é    )ÚannotationsN)ÚCodeType)ÚAnyÚCallableé   )ÚImageÚ_imagingmath)Ú	deprecatec                   @  s  e Zd ZdZddœdd„Zdddœdd	„ZdRddddd dœdd„Zddœdd„Zd dœdd„Z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"d#„Zd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,d-„Zdd dœd.d/„Zdd dœd0d1„Zdd dœd2d3„Zd dœd4d5„Zdd dœd6d7„Zdd dœd8d9„Zdd dœd:d;„Zdd dœd<d=„Zdd dœd>d?„Zdd dœd@dA„Zdd dœdBdC„Zdd dœdDdE„ZdFdG„ Z dHdI„ Z!dd dœdJdK„Z"dd dœdLdM„Z#dd dœdNdO„Z$dd dœdPdQ„Z%d
S )SÚ_Operandz4Wraps an image operand, providing standard operatorszImage.Image©Úimc                 C  s
   || _ d S ©Nr   )Úselfr   © r   úL/var/www/html/bwave/python/venv/lib/python3.8/site-packages/PIL/ImageMath.pyÚ__init__   s    z_Operand.__init__z_Operand | float)Úim1Úreturnc                 C  sŽ   t |tƒrL|jjdkr"|j d¡S |jjdkr4|jS d|jj› �}t|ƒ‚n>t |ttfƒrx| jjdkrxt 	d| jj
|¡S t 	d| jj
|¡S d S )N)Ú1ÚLÚI)r   ÚFzunsupported mode: )r   r   r   r   )Ú
isinstancer
   r   ÚmodeÚconvertÚ
ValueErrorÚintÚfloatr   ÚnewÚsize)r   r   Úmsgr   r   r   Z__fixup!   s    

z_Operand.__fixupNÚstrú_Operand | float | Nonez
str | None)Úopr   Úim2r   r   c              
   C  sì  |   |¡}|d kržt |p|j|jd ¡}| ¡  ztt|› d|j› �ƒ}W n8 tk
r‚ } zd|› d�}t	|ƒ|‚W 5 d }~X Y nX t 
||jj|jj¡ �nF|   |¡}	|j|	jkrÜ|jdkrÈ| d¡}|	jdkrÜ|	 d¡}	|j|	jk�rJt|jd |	jd ƒt|jd |	jd ƒf}
|j|
k�r0| d|
 ¡}|	j|
k�rJ|	 d|
 ¡}	t |�pX|j|jd ¡}| ¡  |	 ¡  ztt|› d|j› �ƒ}W n: tk
�rÆ } zd|› d�}t	|ƒ|‚W 5 d }~X Y nX t ||jj|jj|	jj¡ t|ƒS )NÚ_zbad operand type for 'ú'r   r   r   )r   r   )Ú_Operand__fixupr   r   r   r   ÚloadÚgetattrr   ÚAttributeErrorÚ	TypeErrorZunopr   Úidr   ÚminÚcropZbinopr
   )r   r#   r   r$   r   Zim_1ÚoutÚer    Zim_2r   r   r   r   Úapply3   sD    





þz_Operand.applyÚbool)r   c                 C  s   | j  ¡ d k	S r   )r   Zgetbbox©r   r   r   r   Ú__bool__d   s    z_Operand.__bool__c                 C  s   |   d| ¡S )NÚabs©r1   r3   r   r   r   Ú__abs__h   s    z_Operand.__abs__c                 C  s   | S r   r   r3   r   r   r   Ú__pos__k   s    z_Operand.__pos__c                 C  s   |   d| ¡S )NÚnegr6   r3   r   r   r   Ú__neg__n   s    z_Operand.__neg__)Úotherr   c                 C  s   |   d| |¡S ©NÚaddr6   ©r   r;   r   r   r   Ú__add__r   s    z_Operand.__add__c                 C  s   |   d|| ¡S r<   r6   r>   r   r   r   Ú__radd__u   s    z_Operand.__radd__c                 C  s   |   d| |¡S ©NÚsubr6   r>   r   r   r   Ú__sub__x   s    z_Operand.__sub__c                 C  s   |   d|| ¡S rA   r6   r>   r   r   r   Ú__rsub__{   s    z_Operand.__rsub__c                 C  s   |   d| |¡S ©NÚmulr6   r>   r   r   r   Ú__mul__~   s    z_Operand.__mul__c                 C  s   |   d|| ¡S rE   r6   r>   r   r   r   Ú__rmul__�   s    z_Operand.__rmul__c                 C  s   |   d| |¡S ©NÚdivr6   r>   r   r   r   Ú__truediv__„   s    z_Operand.__truediv__c                 C  s   |   d|| ¡S rI   r6   r>   r   r   r   Ú__rtruediv__‡   s    z_Operand.__rtruediv__c                 C  s   |   d| |¡S ©NÚmodr6   r>   r   r   r   Ú__mod__Š   s    z_Operand.__mod__c                 C  s   |   d|| ¡S rM   r6   r>   r   r   r   Ú__rmod__�   s    z_Operand.__rmod__c                 C  s   |   d| |¡S ©NÚpowr6   r>   r   r   r   Ú__pow__�   s    z_Operand.__pow__c                 C  s   |   d|| ¡S rQ   r6   r>   r   r   r   Ú__rpow__“   s    z_Operand.__rpow__c                 C  s   |   d| ¡S )NÚinvertr6   r3   r   r   r   Ú
__invert__—   s    z_Operand.__invert__c                 C  s   |   d| |¡S ©NÚandr6   r>   r   r   r   Ú__and__š   s    z_Operand.__and__c                 C  s   |   d|| ¡S rW   r6   r>   r   r   r   Ú__rand__�   s    z_Operand.__rand__c                 C  s   |   d| |¡S ©NÚorr6   r>   r   r   r   Ú__or__    s    z_Operand.__or__c                 C  s   |   d|| ¡S r[   r6   r>   r   r   r   Ú__ror__£   s    z_Operand.__ror__c                 C  s   |   d| |¡S ©NÚxorr6   r>   r   r   r   Ú__xor__¦   s    z_Operand.__xor__c                 C  s   |   d|| ¡S r_   r6   r>   r   r   r   Ú__rxor__©   s    z_Operand.__rxor__c                 C  s   |   d| |¡S )NÚlshiftr6   r>   r   r   r   Ú
__lshift__¬   s    z_Operand.__lshift__c                 C  s   |   d| |¡S )NÚrshiftr6   r>   r   r   r   Ú
__rshift__¯   s    z_Operand.__rshift__c                 C  s   |   d| |¡S )NÚeqr6   r>   r   r   r   Ú__eq__³   s    z_Operand.__eq__c                 C  s   |   d| |¡S )NÚner6   r>   r   r   r   Ú__ne__¶   s    z_Operand.__ne__c                 C  s   |   d| |¡S )NÚltr6   r>   r   r   r   Ú__lt__¹   s    z_Operand.__lt__c                 C  s   |   d| |¡S )NÚler6   r>   r   r   r   Ú__le__¼   s    z_Operand.__le__c                 C  s   |   d| |¡S )NÚgtr6   r>   r   r   r   Ú__gt__¿   s    z_Operand.__gt__c                 C  s   |   d| |¡S )NÚger6   r>   r   r   r   Ú__ge__Â   s    z_Operand.__ge__)NN)&Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r'   r1   r4   r7   r8   r:   r?   r@   rC   rD   rG   rH   rK   rL   rO   rP   rS   rT   rV   rY   rZ   r]   r^   ra   rb   rd   rf   rh   rj   rl   rn   rp   rr   r   r   r   r   r
      sJ     û1r
   )r   r   c                 C  s   t | j d¡ƒS )Nr   ©r
   r   r   r3   r   r   r   Úimagemath_intÇ   s    rx   c                 C  s   t | j d¡ƒS )Nr   rw   r3   r   r   r   Úimagemath_floatË   s    ry   r"   )r   r;   r   c                 C  s   | j d| |dd�S )Nrg   r   ©r   r6   r>   r   r   r   Úimagemath_equalÐ   s    r{   c                 C  s   | j d| |dd�S )Nri   r   rz   r6   r>   r   r   r   Úimagemath_notequalÔ   s    r|   c                 C  s   |   d| |¡S )Nr-   r6   r>   r   r   r   Úimagemath_minØ   s    r}   c                 C  s   |   d| |¡S )NÚmaxr6   r>   r   r   r   Úimagemath_maxÜ   s    r   r!   )r   r   r   c                 C  s   t | j |¡ƒS r   rw   )r   r   r   r   r   Úimagemath_convertà   s    r€   )r   r   ÚequalZnotequalr-   r~   r   zCallable[[dict[str, Any]], Any]zdict[str, Any]r   )Ú
expressionÚoptionsÚkwr   c                 K  sr   t  ¡ }| |¡ | |¡ | ¡ D ]\}}t|dƒr$t|ƒ||< q$| |ƒ}z|jW S  tk
rl   | Y S X dS )aŸ  
    Returns the result of an image function.

    :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band
    images, use the :py:meth:`~PIL.Image.Image.split` method or
    :py:func:`~PIL.Image.merge` function.

    :param expression: A function that receives a dictionary.
    :param options: Values to add to the function's dictionary. You
                    can either use a dictionary, or one or more keyword
                    arguments.
    :return: The expression result. This is usually an image object, but can
             also be an integer, a floating point value, or a pixel tuple,
             depending on the expression.
    r   N)ÚopsÚcopyÚupdateÚitemsÚhasattrr
   r   r*   )r‚   rƒ   r„   ÚargsÚkÚvr/   r   r   r   Úlambda_evalï   s    


r�   c                   sð   t  ¡ ‰ t| ¡ ƒt| ¡ ƒ D ]*}d|ks6tt|ƒr d|› d�}t|ƒ‚q ˆ  |¡ ˆ  |¡ ˆ  ¡ D ]\}}t|dƒrht	|ƒˆ |< qht
| ddƒ‰ddd	œ‡ ‡‡fd
d„‰ˆˆƒ t | ddtiiˆ ¡}z|jW S  tk
rê   | Y S X dS )aœ  
    Evaluates an image expression. This uses Python's ``eval()`` function to process
    the expression string, and carries the security risks of doing so. It is not
    recommended to process expressions without considering this.
    :py:meth:`~lambda_eval` is a more secure alternative.

    :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band
    images, use the :py:meth:`~PIL.Image.Image.split` method or
    :py:func:`~PIL.Image.merge` function.

    :param expression: A string containing a Python-style expression.
    :param options: Values to add to the evaluation context.  You
                    can either use a dictionary, or one or more keyword
                    arguments.
    :return: The evaluated expression. This is usually an image object, but can
             also be an integer, a floating point value, or a pixel tuple,
             depending on the expression.
    Ú__r&   ú' not allowedr   z<string>Úevalr   ÚNone)Úcoder   c                   sX   | j D ]}t|ƒtˆƒkrˆ|ƒ q| jD ](}|ˆ kr*|dkr*d|› d�}t|ƒ‚q*d S )Nr5   r&   r�   )Ú	co_constsÚtypeÚco_namesr   )r’   ÚconstÚnamer    ©rŠ   Zcompiled_codeÚscanr   r   r™   9  s    


zunsafe_eval.<locals>.scanZ
__builtinsr5   N)r…   r†   ÚlistÚkeysr‰   Úbuiltinsr   r‡   rˆ   r
   Úcompiler�   r5   r   r*   )r‚   rƒ   r„   r‹   r    rŒ   r/   r   r˜   r   Úunsafe_eval  s$    




rž   )r‚   Ú_dictr„   r   c                 K  s   t dddƒ t| |f|ŽS )a1  
    Evaluates an image expression.

    Deprecated. Use lambda_eval() or unsafe_eval() instead.

    :param expression: A string containing a Python-style expression.
    :param _dict: Values to add to the evaluation context.  You
                  can either use a dictionary, or one or more keyword
                  arguments.
    :return: The evaluated expression. This is usually an image object, but can
             also be an integer, a floating point value, or a pixel tuple,
             depending on the expression.

    ..  deprecated:: 10.3.0
    zImageMath.evalé   z.ImageMath.lambda_eval or ImageMath.unsafe_eval)r	   rž   )r‚   rŸ   r„   r   r   r   r�   K  s    ýr�   )Ú
__future__r   rœ   Útypesr   Útypingr   r   Ú r   r   Z
_deprecater	   r
   rx   ry   r{   r|   r}   r   r€   r…   r�   rž   r�   r   r   r   r   Ú<module>   s8    -ùþ%þ;þ