o
    i(                     @  s   d dl mZ d dlZddlmZmZ dZer(d dlmZ d dl	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d+d$d%Zd,d&d'ZdS )-    )annotationsN   )Image_imagingmathF)Callable)CodeType)Anyc                   @  sj  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dZdHdIZ dZdJdK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   E/home/air/sos/back/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 rHt|p|j|jd }ztt| d|j }W n ty8 } zd| d}t||d }~ww t	||
 |
  t|S |  |}	|j|	jkrg|jdkr]|d}|	jdkrg|	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||
 |
 |	
  t|S )N_zbad operand type for ''r   r   r   )r   r   )_Operand__fixupr   r   r   r   getattrr   AttributeError	TypeErrorunopgetimr   mincropbinopr	   )r   r"   r   r$   r   im_1outer    im_2r   r   r   r   apply6   sH   









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r6   r9   r   r   r   __abs__h      z_Operand.__abs__c                 C  s   | S r   r   r9   r   r   r   __pos__k   s   z_Operand.__pos__c                 C  r;   )Nnegr=   r9   r   r   r   __neg__n   r?   z_Operand.__neg__otherc                 C     |  d| |S Naddr=   r   rC   r   r   r   __add__r      z_Operand.__add__c                 C     |  d|| S rE   r=   rG   r   r   r   __radd__u   rI   z_Operand.__radd__c                 C  rD   Nsubr=   rG   r   r   r   __sub__x   rI   z_Operand.__sub__c                 C  rJ   rL   r=   rG   r   r   r   __rsub__{   rI   z_Operand.__rsub__c                 C  rD   Nmulr=   rG   r   r   r   __mul__~   rI   z_Operand.__mul__c                 C  rJ   rP   r=   rG   r   r   r   __rmul__   rI   z_Operand.__rmul__c                 C  rD   Ndivr=   rG   r   r   r   __truediv__   rI   z_Operand.__truediv__c                 C  rJ   rT   r=   rG   r   r   r   __rtruediv__   rI   z_Operand.__rtruediv__c                 C  rD   Nmodr=   rG   r   r   r   __mod__   rI   z_Operand.__mod__c                 C  rJ   rX   r=   rG   r   r   r   __rmod__   rI   z_Operand.__rmod__c                 C  rD   Npowr=   rG   r   r   r   __pow__   rI   z_Operand.__pow__c                 C  rJ   r\   r=   rG   r   r   r   __rpow__   rI   z_Operand.__rpow__c                 C  r;   )Ninvertr=   r9   r   r   r   
__invert__   r?   z_Operand.__invert__c                 C  rD   Nandr=   rG   r   r   r   __and__   rI   z_Operand.__and__c                 C  rJ   rb   r=   rG   r   r   r   __rand__   rI   z_Operand.__rand__c                 C  rD   Norr=   rG   r   r   r   __or__   rI   z_Operand.__or__c                 C  rJ   rf   r=   rG   r   r   r   __ror__   rI   z_Operand.__ror__c                 C  rD   Nxorr=   rG   r   r   r   __xor__   rI   z_Operand.__xor__c                 C  rJ   rj   r=   rG   r   r   r   __rxor__   rI   z_Operand.__rxor__c                 C  rD   )Nlshiftr=   rG   r   r   r   
__lshift__   rI   z_Operand.__lshift__c                 C  rD   )Nrshiftr=   rG   r   r   r   
__rshift__   rI   z_Operand.__rshift__c                 C  rD   )Neqr=   rG   r   r   r   __eq__   rI   z_Operand.__eq__c                 C  rD   )Nner=   rG   r   r   r   __ne__   rI   z_Operand.__ne__c                 C  rD   )Nltr=   rG   r   r   r   __lt__   rI   z_Operand.__lt__c                 C  rD   )Nler=   rG   r   r   r   __le__   rI   z_Operand.__le__c                 C  rD   )Ngtr=   rG   r   r   r   __gt__   rI   z_Operand.__gt__c                 C  rD   )Nger=   rG   r   r   r   __ge__   rI   z_Operand.__ge__)r
   r   )r   r   r   r   )NN)
r"   r#   r   r   r$   r%   r   r&   r   r	   )r   r7   )r   r	   )rC   r   r   r	   )&__name__
__module____qualname____doc__r   r)   r6   r:   r>   r@   rB   rH   rK   rN   rO   rR   rS   rV   rW   rZ   r[   r^   r_   ra   rd   re   rh   ri   rl   rm   ro   rq   rs   ru   rw   ry   r{   r}   r   r   r   r   r	      sL    


.




























r	   r   r   c                 C     t | jdS )Nr   r	   r
   r   r9   r   r   r   imagemath_int      r   c                 C  r   )Nr   r   r9   r   r   r   imagemath_float   r   r   rC   r%   c                 C     | j d| |ddS )Nrr   r   r   r=   rG   r   r   r   imagemath_equal      r   c                 C  r   )Nrt   r   r   r=   rG   r   r   r   imagemath_notequal   r   r   c                 C  rD   )Nr/   r=   rG   r   r   r   imagemath_min   rI   r   c                 C  rD   )Nmaxr=   rG   r   r   r   imagemath_max   rI   r   r   r#   c                 C  s   t | j|S r   r   )r   r   r   r   r   imagemath_convert   r   r   )r   r   equalnotequalr/   r   r   
expressionCallable[[dict[str, Any]], Any]kwr   c                 K  sd   t  }|| | D ]\}}t|tjrt|||< q| |}z|jW S  ty1   | Y S w )a1  
    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 **kw: Values to add to the function's dictionary.
    :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.
    )	opscopyupdateitemsr   r   r	   r
   r+   )r   r   argskvr3   r   r   r   lambda_eval   s   
r   c                   s   t   |D ]}d|v stt|rd| d}t|q |   D ]\}}t|tjr5t	| |< q%t
| ddd fd
d t| ddtii }z|jW S  tyc   | 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 **kw: Values to add to the evaluation context.
    :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 allowedz<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   +  s   

zunsafe_eval.<locals>.scan
__builtinsr<   N)r   r   r   r   )r   r   hasattrbuiltinsr   r   r   r   r   r	   compiler   r<   r
   r+   )r   r   r   r    r   r3   r   r   r   unsafe_eval  s(   

r   )r   r	   r   r	   )r   r	   rC   r%   r   r	   )r   r	   r   r#   r   r	   )r   r   r   r   r   r   )r   r#   r   r   r   r   )
__future__r   r    r   r   TYPE_CHECKINGcollections.abcr   typesr   typingr   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s6    
*






