o
    f,                     @  s   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Zd,ddZd-ddZd-ddZd-ddZd-ddZd.ddZeeeeeeedZi fd/d%d&Zi fd0d'd(Zi fd1d*d+ZdS )2    )annotationsN)CodeType)AnyCallable   )Image_imagingmath)	deprecatec                   @  sf  e Zd ZdZdTddZdUd	d
Z		dVdWddZdXddZdYddZdYddZ	dYddZ
dZddZdZd d!ZdZd"d#ZdZd$d%ZdZd&d'ZdZd(d)ZdZd*d+ZdZd,d-ZdZd.d/ZdZd0d1ZdZd2d3ZdZd4d5ZdYd6d7ZdZd8d9ZdZd:d;ZdZd<d=ZdZd>d?ZdZd@dAZdZdBdCZdZdDdEZdZdFdGZdHdI Z dJdK Z!dZdLdMZ"dZdNdOZ#dZdPdQZ$dZdRdSZ%dS )[_Operandz4Wraps an image operand, providing standard operatorsimImage.Imagec                 C  s
   || _ d S N)r   )selfr    r   F/home/ubuntu/webapp/venv/lib/python3.10/site-packages/PIL/ImageMath.py__init__   s   
z_Operand.__init__im1_Operand | floatreturnc                 C  s   t |tr%|jjdv r|jdS |jjdv r|jS d|jj }t|t |ttfr;| jjdv r;t	d| jj
|S t	d| jj
|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   __fixup!   s   
z_Operand.__fixupNopstrim2_Operand | float | Noner   
str | Nonec              
   C  s  |  |}|d u rLt|p|j|jd }|  ztt| d|j }W n ty< } zd| d}t	||d }~ww t
||jj|jj t|S |  |}	|j|	jkrk|jdkra|d}|	jdkrk|	d}	|j|	jkrt|jd |	jd t|jd |	jd f}
|j|
kr|d|
 }|	j|
kr|	d|
 }	t|p|j|jd }|  |	  ztt| d|j }W n ty } zd| d}t	||d }~ww 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	TypeErrorunopr   idr   mincropbinopr
   )r   r#   r   r%   r   im_1outer!   im_2r    r   r   r   apply3   sN   









z_Operand.applyboolc                 C  s   | j  d uS r   )r   getbboxr   r   r   r   __bool__d   s   z_Operand.__bool__c                 C     |  d| S )Nabsr8   r;   r   r   r   __abs__h      z_Operand.__abs__c                 C  s   | S r   r   r;   r   r   r   __pos__k   s   z_Operand.__pos__c                 C  r=   )Nnegr?   r;   r   r   r   __neg__n   rA   z_Operand.__neg__otherc                 C     |  d| |S Naddr?   r   rE   r   r   r   __add__r      z_Operand.__add__c                 C     |  d|| S rG   r?   rI   r   r   r   __radd__u   rK   z_Operand.__radd__c                 C  rF   Nsubr?   rI   r   r   r   __sub__x   rK   z_Operand.__sub__c                 C  rL   rN   r?   rI   r   r   r   __rsub__{   rK   z_Operand.__rsub__c                 C  rF   Nmulr?   rI   r   r   r   __mul__~   rK   z_Operand.__mul__c                 C  rL   rR   r?   rI   r   r   r   __rmul__   rK   z_Operand.__rmul__c                 C  rF   Ndivr?   rI   r   r   r   __truediv__   rK   z_Operand.__truediv__c                 C  rL   rV   r?   rI   r   r   r   __rtruediv__   rK   z_Operand.__rtruediv__c                 C  rF   Nmodr?   rI   r   r   r   __mod__   rK   z_Operand.__mod__c                 C  rL   rZ   r?   rI   r   r   r   __rmod__   rK   z_Operand.__rmod__c                 C  rF   Npowr?   rI   r   r   r   __pow__   rK   z_Operand.__pow__c                 C  rL   r^   r?   rI   r   r   r   __rpow__   rK   z_Operand.__rpow__c                 C  r=   )Ninvertr?   r;   r   r   r   
__invert__   rA   z_Operand.__invert__c                 C  rF   Nandr?   rI   r   r   r   __and__   rK   z_Operand.__and__c                 C  rL   rd   r?   rI   r   r   r   __rand__   rK   z_Operand.__rand__c                 C  rF   Norr?   rI   r   r   r   __or__   rK   z_Operand.__or__c                 C  rL   rh   r?   rI   r   r   r   __ror__   rK   z_Operand.__ror__c                 C  rF   Nxorr?   rI   r   r   r   __xor__   rK   z_Operand.__xor__c                 C  rL   rl   r?   rI   r   r   r   __rxor__   rK   z_Operand.__rxor__c                 C  rF   )Nlshiftr?   rI   r   r   r   
__lshift__   rK   z_Operand.__lshift__c                 C  rF   )Nrshiftr?   rI   r   r   r   
__rshift__   rK   z_Operand.__rshift__c                 C  rF   )Neqr?   rI   r   r   r   __eq__   rK   z_Operand.__eq__c                 C  rF   )Nner?   rI   r   r   r   __ne__   rK   z_Operand.__ne__c                 C  rF   )Nltr?   rI   r   r   r   __lt__   rK   z_Operand.__lt__c                 C  rF   )Nler?   rI   r   r   r   __le__   rK   z_Operand.__le__c                 C  rF   )Ngtr?   rI   r   r   r   __gt__   rK   z_Operand.__gt__c                 C  rF   )Nger?   rI   r   r   r   __ge__   rK   z_Operand.__ge__)r   r   )r   r   r   r   )NN)
r#   r$   r   r   r%   r&   r   r'   r   r
   )r   r9   )r   r
   )rE   r   r   r
   )&__name__
__module____qualname____doc__r   r*   r8   r<   r@   rB   rD   rJ   rM   rP   rQ   rT   rU   rX   rY   r\   r]   r`   ra   rc   rf   rg   rj   rk   rn   ro   rq   rs   ru   rw   ry   r{   r}   r   r   r   r   r   r
      sL    


1


























r
   r   r   c                 C     t | jdS )Nr   r
   r   r   r;   r   r   r   imagemath_int      r   c                 C  r   )Nr   r   r;   r   r   r   imagemath_float   r   r   rE   r&   c                 C     | j d| |ddS )Nrt   r   r   r?   rI   r   r   r   imagemath_equal      r   c                 C  r   )Nrv   r   r   r?   rI   r   r   r   imagemath_notequal   r   r   c                 C  rF   )Nr1   r?   rI   r   r   r   imagemath_min   rK   r   c                 C  rF   )Nmaxr?   rI   r   r   r   imagemath_max   rK   r   r   r$   c                 C  s   t | j|S r   r   )r   r   r   r   r   imagemath_convert   r   r   )r   r   equalnotequalr1   r   r   
expressionCallable[[dict[str, Any]], Any]optionsdict[str, Any]kwr   c                 K  sl   t  }|| || | D ]\}}t|dr!t|||< q| |}z|jW S  ty5   | Y S w )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   )opscopyupdateitemshasattrr
   r   r-   )r   r   r   argskvr5   r   r   r   lambda_eval   s   


r   c                   s   t   t| t|  D ]}d|v stt|r%d| d}t|q |  |   D ]\}}t|drCt	| |< q4t
| ddd fdd t| ddtii }z|jW S  tyq   | Y S w )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>evalcoder   r   Nonec                   sX   | j D ]}t|tu r| q| jD ]}| vr)|dkr)d| d}t|qd S )Nr>   r)   r   )	co_conststypeco_namesr   )r   constnamer!   r   compiled_codescanr   r   r   9  s   

zunsafe_eval.<locals>.scan
__builtinsr>   N)r   r   r   r   )r   r   listkeysr   builtinsr   r   r   r
   compiler   r>   r   r-   )r   r   r   r   r!   r   r5   r   r   r   unsafe_eval  s*   



r   _dictc                 K  s   t ddd t| |fi |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   )r   r
   r   r
   )r   r
   rE   r&   r   r
   )r   r
   r   r$   r   r
   )r   r   r   r   r   r   r   r   )r   r$   r   r   r   r   r   r   )r   r$   r   r   r   r   r   r   )
__future__r   r   typesr   typingr   r    r   r   
_deprecater	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s:    
-





%;