
    eU                        d dl mZ d dlZddlmZmZ  G d d      Zd Zd Zd	 Z	d
 Z
d Zd Zd Zi Z e e       j#                               D ]  \  ZZedd dk(  seeedd <    i fdZy)    )annotationsN   )Image_imagingmathc                      e Zd ZdZd Zd Zd%dZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d  Z!d! Z"d" Z#d# Z$d$ Z%y)&_Operandz4Wraps an image operand, providing standard operatorsc                    || _         y N)im)selfr   s     //usr/lib/python3/dist-packages/PIL/ImageMath.py__init__z_Operand.__init__   s	        c                    t        |t              r{|j                  j                  dv r|j                  j	                  d      S |j                  j                  dv r|j                  S d|j                  j                   }t        |      t        |t        t        f      rC| j                  j                  dv r+t        j                  d| j                  j                  |      S t        j                  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   im1msgs      r   __fixupz_Operand.__fixup   s    c8$vv{{j(vv~~c**
*vv*366;;-8 o% #U|,1PyydggllC88yydggllC88r   Nc                   | j                  |      }|t        j                  |xs |j                  |j                  d       }|j                          	 t        t        |dz   |j                  z         }t        j                  ||j                  j                  |j                  j                         t#        |      S | j                  |      }|j                  |j                  k7  r@|j                  dk7  r|j                  d      }|j                  dk7  r|j                  d      }|j                  |j                  k7  rt        |j                  d   |j                  d         t        |j                  d   |j                  d         f}|j                  |k7  r|j                  d|z         }|j                  |k7  r|j                  d|z         }t        j                  |xs |j                  |j                  d       }|j                          |j                          	 t        t        |dz   |j                  z         }t        j                   ||j                  j                  |j                  j                  |j                  j                         t#        |      S # t        $ r}d| d}t        |      |d }~ww xY w# t        $ r}d| d}t        |      |d }~ww xY w)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   opr   im2r   outer   r   s	            r   applyz_Operand.apply0   s@   ll3;))D,CHHchh=CHHJ,\28chh+>? b#&&))SVVYY74 }/ ,,s#Cxx388#88s?++c*C88s?++c*Cxx388#CHHQK!5s388A;QR7TU88t#((6D=1C88t#((6D=1C))D,CHHchh=CHHJHHJ,\28chh+>? r36699cffiiC}; " ,.rd!4n!+,2 " ,.rd!4n!+,s0    J" # K "	K+J==K	K%K  K%c                :    | j                   j                         d uS r
   )r   getbboxr   s    r   __bool__z_Operand.__bool__X   s    ww ,,r   c                &    | j                  d|       S )Nabsr1   r4   s    r   __abs__z_Operand.__abs__\       zz%&&r   c                    | S r
    r4   s    r   __pos__z_Operand.__pos___   s    r   c                &    | j                  d|       S )Nnegr8   r4   s    r   __neg__z_Operand.__neg__b   r:   r   c                (    | j                  d| |      S Naddr8   r   others     r   __add__z_Operand.__add__f       zz%u--r   c                (    | j                  d||       S rB   r8   rD   s     r   __radd__z_Operand.__radd__i       zz%--r   c                (    | j                  d| |      S Nsubr8   rD   s     r   __sub__z_Operand.__sub__l   rG   r   c                (    | j                  d||       S rL   r8   rD   s     r   __rsub__z_Operand.__rsub__o   rJ   r   c                (    | j                  d| |      S Nmulr8   rD   s     r   __mul__z_Operand.__mul__r   rG   r   c                (    | j                  d||       S rR   r8   rD   s     r   __rmul__z_Operand.__rmul__u   rJ   r   c                (    | j                  d| |      S Ndivr8   rD   s     r   __truediv__z_Operand.__truediv__x   rG   r   c                (    | j                  d||       S rX   r8   rD   s     r   __rtruediv__z_Operand.__rtruediv__{   rJ   r   c                (    | j                  d| |      S Nmodr8   rD   s     r   __mod__z_Operand.__mod__~   rG   r   c                (    | j                  d||       S r^   r8   rD   s     r   __rmod__z_Operand.__rmod__   rJ   r   c                (    | j                  d| |      S Npowr8   rD   s     r   __pow__z_Operand.__pow__   rG   r   c                (    | j                  d||       S rd   r8   rD   s     r   __rpow__z_Operand.__rpow__   rJ   r   c                &    | j                  d|       S )Ninvertr8   r4   s    r   
__invert__z_Operand.__invert__   s    zz(D))r   c                (    | j                  d| |      S Nandr8   rD   s     r   __and__z_Operand.__and__   rG   r   c                (    | j                  d||       S rm   r8   rD   s     r   __rand__z_Operand.__rand__   rJ   r   c                (    | j                  d| |      S Norr8   rD   s     r   __or__z_Operand.__or__       zz$e,,r   c                (    | j                  d||       S rs   r8   rD   s     r   __ror__z_Operand.__ror__   s    zz$t,,r   c                (    | j                  d| |      S Nxorr8   rD   s     r   __xor__z_Operand.__xor__   rG   r   c                (    | j                  d||       S rz   r8   rD   s     r   __rxor__z_Operand.__rxor__   rJ   r   c                (    | j                  d| |      S )Nlshiftr8   rD   s     r   
__lshift__z_Operand.__lshift__       zz(D%00r   c                (    | j                  d| |      S )Nrshiftr8   rD   s     r   
__rshift__z_Operand.__rshift__   r   r   c                (    | j                  d| |      S )Neqr8   rD   s     r   __eq__z_Operand.__eq__   rv   r   c                (    | j                  d| |      S )Nner8   rD   s     r   __ne__z_Operand.__ne__   rv   r   c                (    | j                  d| |      S )Nltr8   rD   s     r   __lt__z_Operand.__lt__   rv   r   c                (    | j                  d| |      S )Nler8   rD   s     r   __le__z_Operand.__le__   rv   r   c                (    | j                  d| |      S )Ngtr8   rD   s     r   __gt__z_Operand.__gt__   rv   r   c                (    | j                  d| |      S )Nger8   rD   s     r   __ge__z_Operand.__ge__   rv   r   )NN)&__name__
__module____qualname____doc__r   r#   r1   r5   r9   r=   r@   rF   rI   rN   rP   rT   rV   rZ   r\   r`   rb   rf   rh   rk   ro   rq   ru   rx   r|   r~   r   r   r   r   r   r   r   r   r<   r   r   r   r      s    >9$%P-''............*..--..11------r   r   c                J    t        | j                  j                  d            S )Nr   r   r   r   r4   s    r   imagemath_intr          DGGOOC())r   c                J    t        | j                  j                  d            S )Nr   r   r4   s    r   imagemath_floatr      r   r   c                ,    | j                  d| |d      S )Nr   r   r   r8   rD   s     r   imagemath_equalr          ::dD%c:22r   c                ,    | j                  d| |d      S )Nr   r   r   r8   rD   s     r   imagemath_notequalr      r   r   c                (    | j                  d| |      S )Nr*   r8   rD   s     r   imagemath_minr          ::eT5))r   c                (    | j                  d| |      S )Nmaxr8   rD   s     r   imagemath_maxr      r   r   c                J    t        | j                  j                  |            S r
   r   )r   r   s     r   imagemath_convertr      s    DGGOOD)**r   
   
imagemath_c                F  	 t         j                         t        |j                               t        |j                               z   D ]'  }d|v st	        t
        |      sd| d}t        |       j                  |       j                  |       j                         D ]   \  }}t	        |d      st        |      |<   " t        | dd      	fd	 	       t        j                  | dd	t        ii      }	 |j                  S # t        $ r |cY S w xY w)
a  
    Evaluates an image expression.

    :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>evalc                    | j                   D ]!  }t        |      t              u s |       # | j                  D ]  }|vs|dk7  sd| d}t        |       y )Nr7   r"   r   )	co_conststypeco_namesr   )codeconstnamer   argscompiled_codescans       r   r   zeval.<locals>.scan   si    ^^ 	EE{d=11U	 MM 	&D4DEM$}- o%	&r   
__builtinsr7   )opscopylistkeyshasattrbuiltinsr   updateitemsr   compiler   r7   r   r&   )

expression_dictkwkr   vr/   r   r   r   s
          @@@r   r   r      s    88:D%**,$rwwy/1 "19!,aS&CS/!"
 	KKKKO

 "11dqkDG" J
F;M& 	
--
\E3<$@$
GCvv 
s   D D D )
__future__r   r    r   r   r   r   r   r   r   r   r   r   r   r   globalsr   r   r   r   r<   r   r   <module>r      s   " #  !_- _-F**
33**+ 	"# DAq"vAbcF
  +r   