Ë
    ¦üàgs!  ã                  ód   — d dl mZ 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)é    )ÚannotationsNé   )ÚImageÚ_imagingmorphi   )	é   é   r   é   é   r   é   é   é   )	r   r   r   r   r
   r   r   r	   r   c                  óf   — e Zd ZdZ	 d
	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zdd„Z	 	 	 	 	 	 	 	 dd„Z	d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 | _        |�3ddgdgddgdgddgg d¢dœ}||vrd	|› d
�}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        úL/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/PIL/ImageMorph.pyÚ__init__zLutBuilder.__init__A   s‹   € ð ÐØ$ˆD�MàˆDŒMØ%)ˆŒØÐà/Ð1EÐFØ2Ð3Ø2Ð4HÐIØ1Ð2Ø1Ð3GÐHòñˆNð ˜nÑ,Ø(¨¨	°Ð3�Ü “nÐ$à*¨7Ñ3ˆD�Mð# ó    c                ó.   — | xj                   |z  c_         y ©N©r   )r   r   s     r    Úadd_patternszLutBuilder.add_patterns\   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>b   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_lutd   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>l   s   øè ø€ Ò7 a�w˜q•zÑ7ùs   ƒ)ÚlenÚjoin)r   r<   Úpermutations    ` r    Ú_string_permutezLutBuilder._string_permuteg   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)r1   Úappendr@   ÚROTATION_MATRIXr=   ÚMIRROR_MATRIXÚreplaceÚint)	r   Úbasic_patternÚoptionsÚbasic_resultr   Úresr,   Únr<   s	            r    Ú_pattern_permutezLutBuilder._pattern_permuten   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                ó`  — | j                  «        | j                  €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  }Œ³ g }|D ]P  }|d   j                  dd«      j                  dd«      }|j                  t        j                  |«      |d   f«       ŒR 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
        Nz(\w*):?\s*\((.+?)\)\s*->\s*(\d)ú
r9   zSyntax error in pattern "ú"r   r   r   ú r   ú.ÚXz[01]rF   r8   rC   )r3   r   r   ÚreÚsearchrL   r   ÚgrouprM   rS   rI   Úcompiler1   r2   Úbinr=   Úmatch)r   r   r;   r-   r   rO   r<   ÚresultÚcompiled_patternsr,   Ú
bitpatternÚrs               r    Ú	build_lutzLutBuilder.build_lutŽ   s¶  € ð
 	×ÑÔ Ø�x‰xÐ#Ð#Ð#Øˆð —‘ò 	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ð ÐØò 	BˆGØ˜‘
×"Ñ" 3¨Ó,×4Ñ4°S¸&ÓAˆAØ×$Ñ$¤b§j¡j°£m°W¸Q±ZÐ%@ÕAð	Bô ”x“ò 	,ˆAä˜Q›  ˜ˆJØ ¤S¨£_Ñ!4Ñ5¸
ÑBÁDÀbÀDÑIˆJà/ò ,‘
�˜Ø—=‘= Õ,Ø#$ a &¨¡)�D—H‘H˜Q’Kñ,ð	,ð �x‰xˆr"   )NN)r   úlist[str] | Noner   ú
str | NoneÚreturnÚNone)r   z	list[str]rg   rh   )rg   rh   )rg   úbytearray | None)r<   Ústrr?   z	list[int]rg   rj   )rN   rj   rO   rj   rP   rM   rg   zlist[tuple[str, int]])rg   r0   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r&   r3   r6   r@   rS   rd   r*   r"   r    r   r      sl   „ ñ!ðH HLð4Ø(ð4Ø:Dð4à	ó4ó6"óLó
ó8ðØ ðØ+.ðØ>Aðà	óô@*r"   r   c                  ó^   — e Zd ZdZ	 	 	 d
	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	d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   rd   )r   r   r   r   s       r    r!   zMorphOp.__init__¾   sF   € ð ˆŒØÐÜ!¨'Ô2×<Ñ<Ó>ˆD�HØÐ!Ü!¨8Ô4×>Ñ>Ó@ˆD�Hð "r"   c                óV  — | j                   €d}t        |«      ‚|j                  dk7  rd}t        |«      ‚t	        j
                  |j                  |j                  d«      }t        j                  t        | 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Úgetim)r   Úimager   ÚoutimageÚcounts        r    rz   zMorphOp.applyË   s…   € ð
 �8‰8ÐØ&ˆCÜ˜C“.Ð à�:‰:˜ÒØ(ˆCÜ˜S“/Ð!Ü—9‘9˜UŸZ™Z¨¯©°TÓ:ˆÜ×#Ñ#¤E¨$¯(©(£O°U·[±[³]ÀHÇNÁNÓDTÓUˆØ�hˆÐr"   c                óÚ   — | j                   €d}t        |«      ‚|j                  dk7  rd}t        |«      ‚t	        j
                  t        | 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`.rs   rt   ru   )r   r   rv   rw   r   r_   r{   r|   ©r   r}   r   s      r    r_   zMorphOp.matchÛ   sY   € ð �8‰8ÐØ&ˆCÜ˜C“.Ð à�:‰:˜ÒØ(ˆCÜ˜S“/Ð!Ü×"Ñ"¤5¨¯©£?°E·K±K³MÓBÐBr"   c                ó€   — |j                   dk7  rd}t        |«      ‚t        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`.rt   ru   )rv   rw   r   Úget_on_pixelsr|   r�   s      r    rƒ   zMorphOp.get_on_pixelsê   s6   € ð �:‰:˜ÒØ(ˆCÜ˜S“/Ð!Ü×*Ñ*¨5¯;©;«=Ó9Ð9r"   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!)Úopenr0   Úreadr   r=   r2   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 fileNrs   Ú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 sourceNr5   )r   r   s     r    Úset_lutzMorphOp.set_lut  s	   € àˆ�r"   )NNN)r   ri   r   rf   r   re   rg   rh   )r}   úImage.Imagerg   ztuple[int, Image.Image])r}   r‘   rg   zlist[tuple[int, int]])rˆ   rj   rg   rh   )r   ri   rg   rh   )rk   rl   rm   rn   r!   rz   r_   rƒ   rŠ   rŽ   r�   r*   r"   r    rp   rp   »   s_   „ Ù4ð !%Ø"Ø%)ð	AàðAð ðAð #ð	Að
 
óAóó Có	:ó!óôr"   rp   )Ú
__future__r   rZ   r9   r   r   r2   rJ   rK   r   rp   r*   r"   r    ú<module>r“      s<   ðõ #ã 	ç "à€ò€ò
€÷[ñ [÷|Nò Nr"   