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   -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   Z__fixup!   s   
z_Operand.__fixupNopstrim2_Operand | float | Noner   
str | Nonec              
   C  s  |  |}|d u rKt|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rj|jdkr`|d}|	jdkrj|	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	TypeErrorZunopr   idr   minZcropZbinopr
   )r   r"   r   r$   r   Zim_1outer!   Zim_2r    r   r   r   apply3   sN   









z_Operand.applyboolc                 C  s   | j  d uS r   )r   Zgetbboxr   r   r   r   __bool__d   s   z_Operand.__bool__c                 C     |  d| S )Nabsr2   r4   r   r   r   __abs__h      z_Operand.__abs__c                 C  s   | S r   r   r4   r   r   r   __pos__k   s   z_Operand.__pos__c                 C  r6   )Nnegr8   r4   r   r   r   __neg__n   r:   z_Operand.__neg__otherc                 C     |  d| |S Naddr8   r   r>   r   r   r   __add__r      z_Operand.__add__c                 C     |  d|| S r@   r8   rB   r   r   r   __radd__u   rD   z_Operand.__radd__c                 C  r?   Nsubr8   rB   r   r   r   __sub__x   rD   z_Operand.__sub__c                 C  rE   rG   r8   rB   r   r   r   __rsub__{   rD   z_Operand.__rsub__c                 C  r?   Nmulr8   rB   r   r   r   __mul__~   rD   z_Operand.__mul__c                 C  rE   rK   r8   rB   r   r   r   __rmul__   rD   z_Operand.__rmul__c                 C  r?   NZdivr8   rB   r   r   r   __truediv__   rD   z_Operand.__truediv__c                 C  rE   rO   r8   rB   r   r   r   __rtruediv__   rD   z_Operand.__rtruediv__c                 C  r?   Nmodr8   rB   r   r   r   __mod__   rD   z_Operand.__mod__c                 C  rE   rR   r8   rB   r   r   r   __rmod__   rD   z_Operand.__rmod__c                 C  r?   Npowr8   rB   r   r   r   __pow__   rD   z_Operand.__pow__c                 C  rE   rV   r8   rB   r   r   r   __rpow__   rD   z_Operand.__rpow__c                 C  r6   )Ninvertr8   r4   r   r   r   
__invert__   r:   z_Operand.__invert__c                 C  r?   Nandr8   rB   r   r   r   __and__   rD   z_Operand.__and__c                 C  rE   r\   r8   rB   r   r   r   __rand__   rD   z_Operand.__rand__c                 C  r?   Norr8   rB   r   r   r   __or__   rD   z_Operand.__or__c                 C  rE   r`   r8   rB   r   r   r   __ror__   rD   z_Operand.__ror__c                 C  r?   Nxorr8   rB   r   r   r   __xor__   rD   z_Operand.__xor__c                 C  rE   rd   r8   rB   r   r   r   __rxor__   rD   z_Operand.__rxor__c                 C  r?   )Nlshiftr8   rB   r   r   r   
__lshift__   rD   z_Operand.__lshift__c                 C  r?   )Nrshiftr8   rB   r   r   r   
__rshift__   rD   z_Operand.__rshift__c                 C  r?   )Neqr8   rB   r   r   r   __eq__   rD   z_Operand.__eq__c                 C  r?   )Nner8   rB   r   r   r   __ne__   rD   z_Operand.__ne__c                 C  r?   )Nltr8   rB   r   r   r   __lt__   rD   z_Operand.__lt__c                 C  r?   )Nler8   rB   r   r   r   __le__   rD   z_Operand.__le__c                 C  r?   )Ngtr8   rB   r   r   r   __gt__   rD   z_Operand.__gt__c                 C  r?   )Nger8   rB   r   r   r   __ge__   rD   z_Operand.__ge__)r   r   )r   r   r   r   )NN)
r"   r#   r   r   r$   r%   r   r&   r   r
   )r   r3   )r   r
   )r>   r   r   r
   )&__name__
__module____qualname____doc__r   r)   r2   r5   r9   r;   r=   rC   rF   rI   rJ   rM   rN   rP   rQ   rT   rU   rX   rY   r[   r^   r_   rb   rc   rf   rg   ri   rk   rm   ro   rq   rs   ru   rw   r   r   r   r   r
      sL    


1


























r
   r   r   c                 C     t | jdS )Nr   r
   r   r   r4   r   r   r   imagemath_int      r~   c                 C  r|   )Nr   r}   r4   r   r   r   imagemath_float   r   r   r>   r%   c                 C     | j d| |ddS )Nrl   r   r   r8   rB   r   r   r   imagemath_equal      r   c                 C  r   )Nrn   r   r   r8   rB   r   r   r   imagemath_notequal   r   r   c                 C  r?   )Nr/   r8   rB   r   r   r   imagemath_min   rD   r   c                 C  r?   )Nmaxr8   rB   r   r   r   imagemath_max   rD   r   r   r#   c                 C  s   t | j|S r   r}   )r   r   r   r   r   imagemath_convert   r   r   )r   r   ZequalZnotequalr/   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vr0   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 )Nr7   r(   r   )	co_conststypeco_namesr   )r   constnamer!   r   Zcompiled_codescanr   r   r   9  s   

zunsafe_eval.<locals>.scanZ
__builtinsr7   N)r   r   r   r   )r   r   listkeysr   builtinsr   r   r   r
   compiler   r7   r   r,   )r   r   r   r   r!   r   r0   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
   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   r   )Z
__future__r   r   typesr   typingr   r    r   r   Z
_deprecater	   r
   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s:    
-





%;