Ë
    ™2Úi)  ã                   óX   — 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y)é    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
y)Ú
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 | _        |�5ddgdgddgdgddgg d¢dœ}||vrd	|z   d
z   }t        |«      ‚||   | _         y y )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        úE/var/www/html/acx/venv/lib/python3.12/site-packages/PIL/ImageMorph.pyÚ__init__zLutBuilder.__init__@   sŠ   € ØÐØ$ˆD�MàˆDŒMØˆŒØÐà/Ð1EÐFØ2Ð3Ø2Ð4HÐIØ1Ð2Ø1Ð3GÐHòñˆNð ˜nÑ,Ø(¨7Ñ2°SÑ8�Ü “nÐ$à*¨7Ñ3ˆD�Mð# ó    c                 ó.   — | xj                   |z  c_         y ©N©r   )r   r   s     r   Úadd_patternszLutBuilder.add_patternsY   s   € Ø�Š˜Ñ!Žr!   c                 ób   ‡‡— ddgŠdŠt        ˆˆfd„t        t        «      D «       «      | _        y )Nr   r   é   c              3   ó4   •K  — | ]  }‰|‰z  d kD     –— Œ y­w)r   N© )Ú.0ÚiÚmÚsymbolss     €€r   ú	<genexpr>z/LutBuilder.build_default_lut.<locals>.<genexpr>_   s   øè ø€ ÒK°a˜W a¨!¡e¨q¡[Õ1ÑKùs   ƒ)Ú	bytearrayÚrangeÚLUT_SIZEr   )r   r,   r-   s    @@r   Úbuild_default_lutzLutBuilder.build_default_lut\   s'   ù€ Ø�a�&ˆØˆÜÔK¼5Ä»?ÔKÓKˆ�r!   c                 ó   — | j                   S r#   ©r   )r   s    r   Úget_lutzLutBuilder.get_luta   s   € Ø�x‰xˆr!   c                 óX   ‡— t        |«      dk(  sJ ‚dj                  ˆ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  — | ]	  }‰|   –— Œ y ­wr#   r)   )r*   ÚpÚpatterns     €r   r.   z-LutBuilder._string_permute.<locals>.<genexpr>i   s   øè ø€ Ò7 a�w˜q•zÑ7ùs   ƒ)ÚlenÚjoin)r   r;   Úpermutations    ` r   Ú_string_permutezLutBuilder._string_permuted   s-   ø€ ô �;Ó 1Ò$Ð$Ð$Ø�w‰wÓ7¨;Ô7Ó7Ð7r!   c                 ó  — ||fg}d|v rE|d   d   }t        d«      D ]/  }|j                  | j                  |d   d   t        «      |f«       Œ1 d|v r?t	        |«      }|d| D ],  \  }}|j                  | j                  |t
        «      |f«       Œ. d|v rkt	        |«      }|d| D ]X  \  }}|j                  d	d
«      j                  dd	«      j                  d
d«      }dt        |«      z
  }|j                  ||f«       ŒZ |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   s(  € ð # LÐ1Ð2ˆð �'‰>Ø˜2‘,˜q‘/ˆCÜ˜1“Xò �Ø—‘Ø×)Ñ)¨(°2©,°q©/¼?ÓKÈSÐQõðð
 �'‰>Ü�H“ˆAØ (¨¨! ò U‘�˜Ø—‘ ×!5Ñ!5°g¼}Ó!MÈsÐ SÕTðUð �'‰>Ü�H“ˆAØ (¨¨! ò 0‘�˜à!Ÿ/™/¨#¨sÓ3×;Ñ;¸CÀÓE×MÑMÈcÐSVÓW�Øœ#˜c›(‘l�Ø—‘ ¨# Õ/ð	0ð ˆr!   c                 óD  — | j                  «        g }| j                  D ]±  }t        j                  d|j	                  dd«      «      }|sd|z   dz   }t        |«      ‚|j                  d«      }|j                  d«      }t        |j                  d«      «      }|j	                  d	d«      j	                  dd«      }|| j                  |||«      z  }Œ³ t        |«      D ]I  \  }}|d
   j	                  dd«      j	                  dd«      }t        j                  |«      }||d   f||<   ŒK t        t        «      D ]Z  }t        |«      dd }	ddt        |	«      z
  z  |	z   ddd…   }	|D ]+  \  }}
|j                  |	«      sŒd
dg|
   | 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ˆAÜ—	‘	Ð<¸a¿i¹iÈÈbÓ>QÓRˆAÙØ1°AÑ5¸Ñ;�Ü “nÐ$Ø—g‘g˜a“jˆGØ—g‘g˜a“jˆGÜ˜Ÿ™ ›“_ˆFð —o‘o c¨2Ó.×6Ñ6°t¸RÓ@ˆGà˜×-Ñ-¨g°wÀÓGÑG‰Hð	Hô $ HÓ-ò 	*‰JˆAˆwØ˜‘
×"Ñ" 3¨Ó,×4Ñ4°S¸&ÓAˆAÜ—
‘
˜1“ˆAØ˜g a™j˜/ˆH�QŠKð	*ô ”x“ò 	,ˆAä˜Q›  ˜ˆJØ ¤S¨£_Ñ!4Ñ5¸
ÑBÁDÀbÀDÑIˆJà ò ,‘��1Ø—7‘7˜:Õ&Ø#$ a &¨¡)�D—H‘H˜Q’Kñ,ð	,ð �x‰xˆr!   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r%   r2   r5   r?   rR   rc   r)   r!   r   r   r      s,   „ ñ!óF4ò2"òLò
ò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
y)ÚMorphOpz*A class for binary morphological operatorsNc                 óš   — || _         |� t        |¬«      j                  «       | _         y|� t        |¬«      j                  «       | _         yy)z&Create a binary morphological operatorN)r   r$   )r   r   rc   )r   r   r   r   s       r   r    zMorphOp.__init__¸   sD   € àˆŒØÐÜ!¨'Ô2×<Ñ<Ó>ˆD�HØÐ!Ü!¨8Ô4×>Ñ>Ó@ˆD�Hð "r!   c                 ón  — | j                   €d}t        |«      ‚|j                  dk7  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‰8ÐØ&ˆCÜ˜C“.Ð à�:‰:˜ÒØ(ˆCÜ˜S“/Ð!Ü—9‘9˜UŸZ™Z¨¯©°TÓ:ˆÜ×#Ñ#¤E¨$¯(©(£O°U·X±X·[±[À(Ç+Á+Ç.Á.ÓQˆØ�hˆÐr!   c                 óæ   — | j                   €d}t        |«      ‚|j                  dk7  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`.rl   rm   rn   )	r   r   ro   rp   r   r_   rt   ru   rv   ©r   rw   r   s      r   r_   zMorphOp.matchÐ   s[   € ð �8‰8ÐØ&ˆCÜ˜C“.Ð à�:‰:˜ÒØ(ˆCÜ˜S“/Ð!Ü×"Ñ"¤5¨¯©£?°E·H±H·K±KÓ@Ð@r!   c                 óŒ   — |j                   dk7  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ß   s8   € ð �:‰:˜ÒØ(ˆCÜ˜S“/Ð!Ü×*Ñ*¨5¯8©8¯;©;Ó7Ð7r!   c                 óâ   — t        |d«      5 }t        |j                  «       «      | _        ddd«       t	        | j                  «      t
        k7  rd| _        d}t        |«      ‚y# 1 sw Y   Œ:xY w)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ê   sb   € ä�(˜DÓ!ð 	+ QÜ  §¡£Ó*ˆDŒH÷	+ô ˆt�x‰x‹=œHÒ$ØˆDŒHØ-ˆCÜ˜C“.Ð ð %÷	+ð 	+ús   �A%Á%A.c                 ó®   — | j                   €d}t        |«      ‚t        |d«      5 }|j                  | j                   «       ddd«       y# 1 sw Y   yxY w)zSave an operator to an mrl fileNrl   Úwb)r   r   r€   Úwrite)r   r‚   r   rƒ   s       r   Úsave_lutzMorphOp.save_lutô   sL   € à�8‰8ÐØ&ˆCÜ˜C“.Ð Ü�(˜DÓ!ð 	 QØ�G‰G�D—H‘HÔ÷	÷ 	ñ 	ús   ¦AÁAc                 ó   — || _         y)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óAòò Aò	8ò!òór!   ri   )	rY   r8   r   r   r1   rI   rJ   r   ri   r)   r!   r   ú<module>r‹      s9   ðó 
ç "à€ò€ò
€÷Vñ V÷rIò Ir!   