§
    œ"²c)  ã                   óf   — d dl Z ddlmZmZ dZg d¢Zg d¢Z G d„ d¦  «        Z G d	„ d
¦  «        ZdS )é    Né   )ÚImageÚ_imagingmorphi   )	é   é   r   é   é   r   é   é   é   )	r   r   r   r   r	   r   r
   r   r   c                   ó>   — e Zd ZdZd
d„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
dS )Ú
LutBuilderaT  A class for building a MorphLut from a descriptive language

    The input patterns is a list of a strings sequences like these::

        4:(...
           .1.
           111)->1

    (whitespaces including linebreaks are ignored). The option 4
    describes a series of symmetry operations (in this case a
    4-rotation), the pattern is described by:

    - . or X - Ignore
    - 1 - Pixel is on
    - 0 - Pixel is off

    The result of the operation is described after "->" string.

    The default is to return the current pixel value, which is
    returned if no other match is found.

    Operations:

    - 4 - 4 way rotation
    - N - Negate
    - 1 - Dummy op for no other operation (an op must always be given)
    - M - Mirroring

    Example::

        lb = LutBuilder(patterns = ["4:(... .1. 111)->1"])
        lut = lb.build_lut()

    Nc                 ó´   — |�|| _         ng | _         d | _        |�=ddgdgddgdgddgg d¢dœ}||vrd	|z   d
z   }t          |¦  «        ‚||         | _         d S d S )Nú1:(... ... ...)->0z4:(00. 01. ...)->1z4:(... .0. .1.)->1z4:(... .0. ..1)->1z4:(... .1. .0.)->0z4:(... .1. ..0)->0)r   z4:(.0. .1. ...)->1z4:(01. .1. ...)->1)ÚcornerÚ	dilation4Ú	dilation8Úerosion4Úerosion8ÚedgezUnknown pattern ú!)ÚpatternsÚlutÚ	Exception)Úselfr   Úop_nameÚknown_patternsÚmsgs        ú0/usr/lib/python3/dist-packages/PIL/ImageMorph.pyÚ__init__zLutBuilder.__init__@   s§   € ØÐØ$ˆDŒMˆMàˆDŒMØˆŒØÐà/Ð1EÐFØ2Ð3Ø2Ð4HÐIØ1Ð2Ø1Ð3GÐHðð ð ðð ˆNð ˜nÐ,Ð,Ø(¨7Ñ2°SÑ8�Ý ‘n”nÐ$à*¨7Ô3ˆDŒMˆMˆMð# Ðó    c                 ó&   — | xj         |z  c_         d S ©N©r   )r   r   s     r   Úadd_patternszLutBuilder.add_patternsY   s   € ØˆŒ˜Ñ!ˆŒˆˆr!   c                 ó|   ‡‡— ddgŠdŠt          ˆˆfd„t          t          ¦  «        D ¦   «         ¦  «        | _        d S )Nr   r   é   c              3   ó6   •K  — | ]}‰|‰z  d k             V — ŒdS )r   N© )Ú.0ÚiÚmÚsymbolss     €€r   ú	<genexpr>z/LutBuilder.build_default_lut.<locals>.<genexpr>_   s0   øè è € ÐKÐK°a˜W a¨!¡e¨q¢[Ô1ÐKÐKÐKÐKÐKÐKr!   )Ú	bytearrayÚrangeÚLUT_SIZEr   )r   r,   r-   s    @@r   Úbuild_default_lutzLutBuilder.build_default_lut\   sC   øø€ Ø�a�&ˆØˆÝÐKÐKÐKÐKÐK½5Å¹?¼?ÐKÑKÔKÑKÔKˆŒˆˆr!   c                 ó   — | j         S r#   ©r   )r   s    r   Úget_lutzLutBuilder.get_luta   s	   € ØŒxˆr!   c                 óp   ‡— t          |¦  «        dk    sJ ‚d                     ˆfd„|D ¦   «         ¦  «        S )z„string_permute takes a pattern and a permutation and returns the
        string permuted according to the permutation list.
        é	   Ú c              3   ó(   •K  — | ]}‰|         V — Œd S r#   r)   )r*   ÚpÚpatterns     €r   r.   z-LutBuilder._string_permute.<locals>.<genexpr>i   s'   øè è € Ð7Ð7 a�w˜q”zÐ7Ð7Ð7Ð7Ð7Ð7r!   )ÚlenÚjoin)r   r;   Úpermutations    ` r   Ú_string_permutezLutBuilder._string_permuted   sE   ø€ õ �;ÑÔ 1Ò$Ð$Ð$Ð$Ø�wŠwÐ7Ð7Ð7Ð7¨;Ð7Ñ7Ô7Ñ7Ô7Ð7r!   c                 óŠ  — ||fg}d|v r\|d         d         }t          d¦  «        D ]>}|                     |                      |d         d         t          ¦  «        |f¦  «         Œ?d|v rOt	          |¦  «        }|d|…         D ]5\  }}|                     |                      |t
          ¦  «        |f¦  «         Œ6d|v r†t	          |¦  «        }|d|…         D ]l\  }}|                     d	d
¦  «                             dd	¦  «                             d
d¦  «        }dt          |¦  «        z
  }|                     ||f¦  «         Œm|S )zÉpattern_permute takes a basic pattern and its result and clones
        the pattern according to the modifications described in the $options
        parameter. It returns a list of all cloned patterns.Ú4éÿÿÿÿr   r	   r   ÚMNÚNÚ0ÚZÚ1)r0   Úappendr?   ÚROTATION_MATRIXr<   ÚMIRROR_MATRIXÚreplaceÚint)	r   Úbasic_patternÚoptionsÚbasic_resultr   Úresr+   Únr;   s	            r   Ú_pattern_permutezLutBuilder._pattern_permutek   sh  € ð # LÐ1Ð2ˆð �'ˆ>ˆ>Ø˜2”,˜q”/ˆCÝ˜1‘X”Xð ð �Ø—’Ø×)Ò)¨(°2¬,°q¬/½?ÑKÔKÈSÐQñô ð ð ð �'ˆ>ˆ>Ý�H‘”ˆAØ (¨¨!¨¤ð Uð U‘�˜Ø—’ ×!5Ò!5°g½}Ñ!MÔ!MÈsÐ SÑTÔTÐTÐTð �'ˆ>ˆ>Ý�H‘”ˆAØ (¨¨!¨¤ð 0ð 0‘�˜à!Ÿ/š/¨#¨sÑ3Ô3×;Ò;¸CÀÑEÔE×MÒMÈcÐSVÑWÔW�Ø�#˜c™(œ(‘l�Ø—’ ¨# Ñ/Ô/Ð/Ð/àˆr!   c                 ó¼  — |                       ¦   «          g }| j        D ]Ô}t          j        d|                     dd¦  «        ¦  «        }|sd|z   dz   }t          |¦  «        ‚|                     d¦  «        }|                     d¦  «        }t          |                     d¦  «        ¦  «        }|                     d	d¦  «                             dd¦  «        }||                      |||¦  «        z  }ŒÕt          |¦  «        D ]V\  }}|d
                              dd¦  «                             dd¦  «        }t          j
        |¦  «        }||d         f||<   ŒWt          t          ¦  «        D ]i}t          |¦  «        dd…         }	ddt          |	¦  «        z
  z  |	z   ddd…         }	|D ],\  }}
|                     |	¦  «        rd
dg|
         | j        |<   Œ-Œj| j        S )zlCompile all patterns into a morphology lut.

        TBD :Build based on (file) morphlut:modify_lut
        z(\w*):?\s*\((.+?)\)\s*->\s*(\d)ú
r8   zSyntax error in pattern "ú"r   r   r   ú r   ú.ÚXz[01]NrE   r7   rB   )r2   r   ÚreÚsearchrK   r   ÚgrouprL   rR   Ú	enumerateÚcompiler0   r1   Úbinr<   Úmatchr   )r   r   r:   r,   r   rN   r;   Úresultr+   Ú
bitpatternÚrs              r   Ú	build_lutzLutBuilder.build_lut‰   sç  € ð
 	×ÒÑ Ô Ð Øˆð ”ð 	Hð 	HˆAÝ”	Ð<¸a¿iºiÈÈbÑ>QÔ>QÑRÔRˆAØð %Ø1°AÑ5¸Ñ;�Ý ‘n”nÐ$Ø—g’g˜a‘j”jˆGØ—g’g˜a‘j”jˆGÝ˜Ÿš ™œ‘_”_ˆFð —o’o c¨2Ñ.Ô.×6Ò6°t¸RÑ@Ô@ˆGà˜×-Ò-¨g°wÀÑGÔGÑGˆHˆHõ $ HÑ-Ô-ð 	*ð 	*‰JˆAˆwØ˜”
×"Ò" 3¨Ñ,Ô,×4Ò4°S¸&ÑAÔAˆAÝ”
˜1‘”ˆAØ˜g aœj˜/ˆH�Q‰KˆKõ
 •x‘”ð 	,ð 	,ˆAå˜Q™œ   œˆJØ ¥S¨¡_¤_Ñ!4Ñ5¸
ÑBÀDÀDÀbÀDÔIˆJà ð ,ð ,‘��1Ø—7’7˜:Ñ&Ô&ð ,Ø#$ a &¨¤)�D”H˜Q‘Køð,ð Œxˆr!   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r%   r2   r5   r?   rR   rc   r)   r!   r   r   r      s�   € € € € € ð!ð !ðF4ð 4ð 4ð 4ð2"ð "ð "ðLð Lð Lð
ð ð ð8ð 8ð 8ðð ð ð<)ð )ð )ð )ð )r!   r   c                   ó>   — e Zd ZdZd
d„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
dS )ÚMorphOpz*A class for binary morphological operatorsNc                 óÀ   — || _         |�)t          |¬¦  «                             ¦   «         | _         dS |�)t          |¬¦  «                             ¦   «         | _         dS dS )z&Create a binary morphological operatorN)r   r$   )r   r   rc   )r   r   r   r   s       r   r    zMorphOp.__init__¸   sa   € àˆŒØÐÝ!¨'Ð2Ñ2Ô2×<Ò<Ñ>Ô>ˆDŒHˆHˆHØÐ!Ý!¨8Ð4Ñ4Ô4×>Ò>Ñ@Ô@ˆDŒHˆHˆHð "Ð!r!   c                 ó*  — | j         €d}t          |¦  «        ‚|j        dk    rd}t          |¦  «        ‚t	          j        |j        |j        d¦  «        }t          j        t          | j         ¦  «        |j
        j        |j
        j        ¦  «        }||fS )z‡Run a single morphological operation on an image

        Returns a tuple of the number of changed pixels and the
        morphed imageNúNo operator loadedÚLúImage mode must be L)r   r   ÚmodeÚ
ValueErrorr   ÚnewÚsizer   ÚapplyÚbytesÚimÚid)r   Úimager   ÚoutimageÚcounts        r   rs   zMorphOp.applyÀ   s€   € ð
 Œ8ÐØ&ˆCÝ˜C‘.”.Ð àŒ:˜ÒÐØ(ˆCÝ˜S‘/”/Ð!Ý”9˜UœZ¨¬°TÑ:Ô:ˆÝÔ#¥E¨$¬(¡O¤O°U´X´[À(Ä+Ä.ÑQÔQˆØ�hˆÐr!   c                 óÌ   — | j         €d}t          |¦  «        ‚|j        dk    rd}t          |¦  «        ‚t	          j        t          | j         ¦  «        |j        j        ¦  «        S )zÈGet a list of coordinates matching the morphological operation on
        an image.

        Returns a list of tuples of (x,y) coordinates
        of all matching pixels. See :ref:`coordinate-system`.Nrl   rm   rn   )	r   r   ro   rp   r   r_   rt   ru   rv   ©r   rw   r   s      r   r_   zMorphOp.matchÐ   sZ   € ð Œ8ÐØ&ˆCÝ˜C‘.”.Ð àŒ:˜ÒÐØ(ˆCÝ˜S‘/”/Ð!ÝÔ"¥5¨¬¡?¤?°E´H´KÑ@Ô@Ð@r!   c                 óv   — |j         dk    rd}t          |¦  «        ‚t          j        |j        j        ¦  «        S )z©Get a list of all turned on pixels in a binary image

        Returns a list of tuples of (x,y) coordinates
        of all matching pixels. See :ref:`coordinate-system`.rm   rn   )ro   rp   r   Úget_on_pixelsru   rv   r{   s      r   r}   zMorphOp.get_on_pixelsß   s7   € ð Œ:˜ÒÐØ(ˆCÝ˜S‘/”/Ð!ÝÔ*¨5¬8¬;Ñ7Ô7Ð7r!   c                 ó  — t          |d¦  «        5 }t          |                     ¦   «         ¦  «        | _        ddd¦  «         n# 1 swxY w Y   t	          | j        ¦  «        t
          k    rd| _        d}t          |¦  «        ‚dS )z!Load an operator from an mrl fileÚrbNzWrong size operator file!)Úopenr/   Úreadr   r<   r1   r   )r   ÚfilenameÚfr   s       r   Úload_lutzMorphOp.load_lutê   s°   € å�(˜DÑ!Ô!ð 	+ QÝ  §¢¡¤Ñ*Ô*ˆDŒHð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+õ ˆtŒx‰=Œ=�HÒ$Ð$ØˆDŒHØ-ˆCÝ˜C‘.”.Ð ð %Ð$s   ‘'AÁAÁAc                 ó¼   — | j         €d}t          |¦  «        ‚t          |d¦  «        5 }|                     | j         ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zSave an operator to an mrl fileNrl   Úwb)r   r   r€   Úwrite)r   r‚   r   rƒ   s       r   Úsave_lutzMorphOp.save_lutô   s    € àŒ8ÐØ&ˆCÝ˜C‘.”.Ð Ý�(˜DÑ!Ô!ð 	 QØ�GŠG�D”HÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ©AÁAÁAc                 ó   — || _         dS )z#Set the lut from an external sourceNr4   )r   r   s     r   Úset_lutzMorphOp.set_lutü   s   € àˆŒˆˆr!   )NNN)rd   re   rf   rg   r    rs   r_   r}   r„   rˆ   rŠ   r)   r!   r   ri   ri   µ   s�   € € € € € Ø4Ð4ðAð Að Að Aðð ð ð Að Að Að	8ð 	8ð 	8ð!ð !ð !ðð ð ðð ð ð ð r!   ri   )	rY   r8   r   r   r1   rI   rJ   r   ri   r)   r!   r   ú<module>r‹      s¼   ðð 
€	€	€	à "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à€ðð ð €ð
ð ð €ðVð Vð Vð Vð Vñ Vô Vð VðrIð Ið Ið Ið Iñ Iô Ið Ið Ið Ir!   