U
    Âmœdî4  ã                   @   s¾   d dl mZ d dlZd dlZd dlZd dlmZm	Z	m
Z
 d dlmZmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ e e¡ZG d
d„ dƒZeƒ ZG dd„ deƒZ dS )é    )ÚOrderedDictN)Ú_apiÚ_text_helpersÚdviread)ÚFontPropertiesÚget_fontÚfontManager)ÚLOAD_NO_HINTINGÚLOAD_TARGET_LIGHT)ÚMathTextParser)ÚPath)Ú
TexManager)ÚAffine2Dc                   @   sŠ   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
ddd„Zd dd„Zd!dd„Zejddd�dd„ ƒZd"dd„Zedd„ ƒZdS )#Ú
TextToPathz'A class that converts strings to paths.g      Y@éH   c                 C   s   t dƒ| _d | _d S )NÚpath)r   Úmathtext_parserÚ_texmanager©Úself© r   úL/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/matplotlib/textpath.pyÚ__init__   s    
zTextToPath.__init__c                 C   s&   t  |¡}t|ƒ}| | j| j¡ |S )zX
        Find the `FT2Font` matching font properties *prop*, with its size set.
        )Ú_fontManagerZ_find_fonts_by_propsr   Úset_sizeÚ
FONT_SCALEÚDPI)r   ÚpropÚ	filenamesÚfontr   r   r   Ú	_get_font   s    
zTextToPath._get_fontc                 C   s   t S )N)r	   r   r   r   r   Ú_get_hinting_flag'   s    zTextToPath._get_hinting_flagc                 C   s   t j |j› d|d›�¡S )zO
        Return a unique id for the given font and character-code set.
        ú-Úx)ÚurllibÚparseÚquoteZpostscript_name)r   r   Úccoder   r   r   Ú_get_char_id*   s    zTextToPath._get_char_idc                 C   sÊ   |  ¡ }|dkrtƒ  ||¡S || j }|rn| ¡ }| | j¡ | j |d|¡^}}}}	|| || || fS |  |¡}
|
j	|dt
d� |
 ¡ \}}|d }|d }|
 ¡ }|d }|| || || fS )NÚTeXr   g        ©Úflagsg      P@)Úget_size_in_pointsr   Úget_text_width_height_descentr   Úcopyr   r   r%   r    Zset_textr	   Zget_width_heightZget_descent)r   Úsr   ÚismathÚfontsizeÚscaleÚwidthÚheightÚdescentÚ_r   ÚwÚhÚdr   r   r   r-   0   s$    
ÿ

z(TextToPath.get_text_width_height_descentFc                 C   sÐ   |dkr|   ||¡\}}}n4|s>|  |¡}|  ||¡\}}}n|  ||¡\}}}g g  }}	|D ]8\}
}}}||
 \}}| || ||g ¡ |	 |¡ q^|D ]\}}| |¡ |	 |¡ qœ|sÈt d¡}||	fS )a§  
        Convert text *s* to path (a tuple of vertices and codes for
        matplotlib.path.Path).

        Parameters
        ----------
        prop : `~matplotlib.font_manager.FontProperties`
            The font properties for the text.

        s : str
            The text to be converted.

        ismath : {False, True, "TeX"}
            If True, use mathtext parser.  If "TeX", use tex for rendering.

        Returns
        -------
        verts : list
            A list of numpy arrays containing the x and y coordinates of the
            vertices.

        codes : list
            A list of path codes.

        Examples
        --------
        Create a list of vertices and codes from a text, and create a `.Path`
        from those::

            from matplotlib.path import Path
            from matplotlib.text import TextToPath
            from matplotlib.font_manager import FontProperties

            fp = FontProperties(family="Humor Sans", style="italic")
            verts, codes = TextToPath().get_text_path(fp, "ABC")
            path = Path(verts, codes, closed=False)

        Also see `TextPath` for a more direct way to create a path from a text.
        r)   )r   é   )Úget_glyphs_texr    Úget_glyphs_with_fontÚget_glyphs_mathtextÚextendÚnpÚempty)r   r   r/   r0   Z
glyph_infoÚ	glyph_mapÚrectsr   ZvertsÚcodesZglyph_idZ	xpositionZ	ypositionr2   Zverts1Zcodes1r   r   r   Úget_text_pathH   s"    (



zTextToPath.get_text_pathNc                 C   s°   |dkrt ƒ }|rt ƒ }n|}g }g }t ||¡D ]D}|  |jt|jƒ¡}	| |	¡ | |j¡ |	|kr2|j 	¡ ||	< q2dgt
|ƒ }
dgt
|ƒ }g }tt|||
|ƒƒ||fS )zW
        Convert string *s* to vertices and codes using the provided ttf font.
        Nr   g      ð?)r   r   Zlayoutr(   Z	ft_objectÚordÚcharÚappendr#   Úget_pathÚlenÚlistÚzip)r   r   r/   rA   Úreturn_new_glyphs_onlyÚglyph_map_newÚ
xpositionsÚ	glyph_idsÚitemÚchar_idÚ
ypositionsÚsizesrB   r   r   r   r<   ˆ   s(    
 ÿzTextToPath.get_glyphs_with_fontc                 C   sr  |  ¡ }| | j¡ | j || j|¡\}}}}}	|s:tƒ }|rFtƒ }
n|}
g }g }g }g }|D ]†\}}}}}|  ||¡}||kr²| ¡  | | j| j¡ |j	|t
d� | ¡ |
|< | |¡ | |¡ | |¡ || j }| |¡ q^g }|	D ]j\}}}}||f||| f|| || f|| |f||fdg}tjtjtjtjtjtjg}| ||f¡ qîtt||||ƒƒ|
|fS )zW
        Parse mathtext string *s* and convert it to a (vertices, codes) pair.
        r*   ©r   r   )r.   r   r   r   r%   r   r   r(   ÚclearÚ	load_charr	   rH   rG   r   ÚMOVETOÚLINETOÚ	CLOSEPOLYrJ   rK   )r   r   r/   rA   rL   r3   r4   r5   ZglyphsrB   rM   rN   rR   rO   rS   r   r1   r'   ÚoxÚoyrQ   ÚsizeÚmyrectsr7   r8   Úvert1Úcode1r   r   r   r=   §   s^      ÿ




  ÿ   þ ÿzTextToPath.get_glyphs_mathtextz3.6zTexManager())Úalternativec                 C   s   | j dkrtƒ | _ | j S )z5Return the cached `~.texmanager.TexManager` instance.N)r   r   r   r   r   r   Úget_texmanagerÚ   s    
zTextToPath.get_texmanagerc              	   C   sÔ  t ƒ  || j¡}t || j¡�}|\}W 5 Q R X |dkr>tƒ }|rJtƒ }n|}g g g g f\}	}
}}|jD ]Ú}t|j	ƒ}|  
||j¡}||k�r| ¡  | | j| j¡ |j}t|tƒrÐ| |¡}|j|td� n2t|tƒrô|  |¡ |j|td� ntd|›�ƒ‚| ¡ ||< |	 |¡ |
 |j¡ | |j¡ | |j| j ¡ qhg }|jD ]l\}}}}||f|| |f|| || f||| f||fdg}tjtj tj tj tj tj!g}| ||f¡ �qNt"t#|	|
||ƒƒ||fS )z?Convert the string *s* to vertices and codes using usetex mode.Nr*   zGlyph spec of unexpected type: rT   )$r   Zmake_dvir   r   ZDvir   r   Útextr   Z	font_pathr(   ZglyphrU   r   Úglyph_name_or_indexÚ
isinstanceÚstrZget_name_indexZ
load_glyphr
   ÚintÚ_select_native_charmaprV   Ú	TypeErrorrH   rG   r#   ÚyZ	font_sizeZboxesr   rW   rX   rY   rJ   rK   )r   r   r/   rA   rL   ZdvifileZdviÚpagerM   rO   rN   rR   rS   rb   r   rQ   rc   Úindexr]   rZ   r[   r8   r7   r^   r_   r   r   r   r;   á   sd    






 ÿ

  ÿ   þ ÿzTextToPath.get_glyphs_texc              
   C   sH   dD ]0}z|   |¡ W n ttfk
r.   Y qX  qDqt d| j¡ d S )N)iCBDAiBODAz#No supported encoding in font (%s).)Zselect_charmapÚ
ValueErrorÚRuntimeErrorÚ_logÚwarningÚfname)r   Zcharmap_coder   r   r   rg     s    z!TextToPath._select_native_charmap)F)NF)NF)NF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r    r!   r(   r-   rD   r<   r=   r   Ú
deprecatedra   r;   Ústaticmethodrg   r   r   r   r   r      s,   	
@  ÿ
  ÿ
3
  ÿ
:r   c                       sR   e Zd ZdZd‡ fdd„	Zdd„ Zd	d
„ Zedd„ ƒZedd„ ƒZ	dd„ Z
‡  ZS )ÚTextPathz&
    Create a path from the text.
    Né   Fc           	         sz   ddl m} t |¡}|dkr&| ¡ }|| _|  |¡ d| _||d� |¡\}}t	ƒ j
tj|||d�|ddœŽ d| _dS )	a  
        Create a path from the text. Note that it simply is a path,
        not an artist. You need to use the `.PathPatch` (or other artists)
        to draw this path onto the canvas.

        Parameters
        ----------
        xy : tuple or array of two float values
            Position of the text. For no offset, use ``xy=(0, 0)``.

        s : str
            The text to convert to a path.

        size : float, optional
            Font size in points. Defaults to the size specified via the font
            properties *prop*.

        prop : `matplotlib.font_manager.FontProperties`, optional
            Font property. If not provided, will use a default
            ``FontProperties`` with parameters from the
            :ref:`rcParams<customizing-with-dynamic-rc-settings>`.

        _interpolation_steps : int, optional
            (Currently ignored)

        usetex : bool, default: False
            Whether to use tex rendering.

        Examples
        --------
        The following creates a path from the string "ABC" with Helvetica
        font face; and another path from the latex fraction 1/2::

            from matplotlib.text import TextPath
            from matplotlib.font_manager import FontProperties

            fp = FontProperties(family="Helvetica", style="italic")
            path1 = TextPath((12, 12), "ABC", size=12, prop=fp)
            path2 = TextPath((0, 0), r"$\frac{1}{2}$", size=12, usetex=True)

        Also see :doc:`/gallery/text_labels_and_annotations/demo_text_path`.
        r   )ÚTextN)Úusetex)r0   T)Ú_interpolation_stepsÚreadonlyF)Zmatplotlib.textry   r   Z	_from_anyr,   Ú_xyr   Ú_cached_verticesZ_preprocess_mathÚsuperr   Útext_to_pathrD   Z_should_simplify)	r   Zxyr/   r\   r   r{   rz   ry   r0   ©Ú	__class__r   r   r   5  s    -

ýzTextPath.__init__c                 C   s   || _ d| _dS )zSet the text size.TN)Ú_sizeÚ_invalid)r   r\   r   r   r   r   s  s    zTextPath.set_sizec                 C   s   | j S )zGet the text size.)rƒ   r   r   r   r   Úget_sizex  s    zTextPath.get_sizec                 C   s   |   ¡  | jS )zH
        Return the cached path after updating it if necessary.
        )Ú_revalidate_pathr~   r   r   r   r   Úvertices|  s    zTextPath.verticesc                 C   s   | j S )z"
        Return the codes
        )Ú_codesr   r   r   r   rC   „  s    zTextPath.codesc                 C   sN   | j s| jdkrJtƒ  | jtj ¡j| jŽ }| 	| j
¡| _d| jj_d| _ dS )zÇ
        Update the path if necessary.

        The path for the text is initially create with the font size of
        `.FONT_SCALE`, and this path is rescaled to other size when necessary.
        NF)r„   r~   r   r2   rƒ   r€   r   Ú	translater}   Z	transformÚ	_verticesr+   Z	writeable)r   Útrr   r   r   r†   ‹  s    
ÿþ
zTextPath._revalidate_path)NNrx   F)rq   rr   rs   rt   r   r   r…   Úpropertyr‡   rC   r†   Ú__classcell__r   r   r�   r   rw   0  s       ÿ>

rw   )!Úcollectionsr   ÚloggingÚurllib.parser$   Únumpyr?   Z
matplotlibr   r   r   Zmatplotlib.font_managerr   r   r   r   Zmatplotlib.ft2fontr	   r
   Zmatplotlib.mathtextr   Zmatplotlib.pathr   Zmatplotlib.texmanagerr   Zmatplotlib.transformsr   Ú	getLoggerrq   rn   r   r€   rw   r   r   r   r   Ú<module>   s    
  