B
    ·ôJd:  ã               @   s¶   d dl mZ d dl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 d dlmZ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)Ú_text_helpersÚdvireadÚfont_manager)ÚFontPropertiesÚget_font)ÚLOAD_NO_HINTINGÚLOAD_TARGET_LIGHT)ÚMathTextParser)ÚPath)Ú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dd„ Zd dd„Zee d¡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   úE/var/www/html/venv/lib/python3.7/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.
        )r   Zfindfontr   Úset_sizeÚ
FONT_SCALEÚDPI)r   ÚpropÚfnameÚ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r8|   ¡ }| ¡ }|j||d d\}}}|||fS | ¡ }|| j }	|r| ¡ }| | j¡ | j |d|¡^}
}}}|
|	 ||	 ||	 fS |  |¡}|j	|dt
d | ¡ \}}|d }|d }| ¡ }|d }||	 ||	 ||	 fS )NÚTeX)Úrendererr   g        )Úflagsg      P@)Úget_texmanagerÚget_size_in_pointsÚget_text_width_height_descentr   Úcopyr   r   r!   r   Zset_textr   Zget_width_heightZget_descent)r   Úsr   ÚismathZ
texmanagerÚfontsizeÚwÚhÚdÚscaleÚwidthÚheightÚdescentÚ_r   r   r   r   r*   .   s*    


z(TextToPath.get_text_width_height_descentFc             C   sê   |dkr|   ||¡\}}}n4|s>|  |¡}|  ||¡\}}}n|  ||¡\}}}g g  }}	xR|D ]J\}
}}}||
 \}}t|ƒr`t |¡| ||g }| |¡ |	 |¡ q`W x$|D ]\}}| |¡ |	 |¡ q´W |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.textpath 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ÚlenÚnpÚarrayÚextendÚempty)r   r   r,   r-   Z
glyph_infoÚ	glyph_mapÚrectsr   ZvertsÚcodesZglyph_idZ	xpositionZ	ypositionr2   Zverts1Zcodes1r   r   r   Úget_text_pathI   s&    (




zTextToPath.get_text_pathNc             C   s°   |dkrt ƒ }|rt ƒ }n|}g }g }xPt ||¡D ]@}|  |t|jƒ¡}	| |	¡ | |j¡ |	|kr4| ¡ ||	< q4W d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$   ÚordÚcharÚappendr   Úget_pathr;   ÚlistÚzip)r   r   r,   r@   Úreturn_new_glyphs_onlyÚglyph_map_newÚ
xpositionsÚ	glyph_idsÚitemÚchar_idÚ
ypositionsÚsizesrA   r   r   r   r9      s$    
zTextToPath.get_glyphs_with_fontc             C   sz  |  ¡ }| | j¡ | j || j|¡\}}}}}	|s:tƒ }|rFtƒ }
n|}
g }g }g }g }xŽ|D ]†\}}}}}|  ||¡}||kr´| ¡  | | j| j¡ |j	|t
d | ¡ |
|< | |¡ | |¡ | |¡ || j }| |¡ q`W g }xr|	D ]j\}}}}||f||| f|| || f|| |f||fdg}tjtjtjtjtjtjg}| ||f¡ qôW 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   rG   rF   r   ÚMOVETOÚLINETOÚ	CLOSEPOLYrH   rI   )r   r   r,   r@   rJ   r3   r4   r5   ZglyphsrA   rK   rL   rP   rM   rQ   r   r.   r#   ÚoxÚoyrO   ÚsizeÚmyrectsr/   r0   Úvert1Úcode1r   r   r   r:   ¬   sF    



zTextToPath.get_glyphs_mathtextc             C   s$   | j dkrddlm} |ƒ | _ | j S )z5Return the cached `~.texmanager.TexManager` instance.Nr   )Ú
TexManager)r   Zmatplotlib.texmanagerr]   )r   r]   r   r   r   r(   ß   s    
zTextToPath.get_texmanagerc          	   C   s¾  |   ¡  || j¡}t || j¡}|\}W dQ R X |dkr@tƒ }|rLtƒ }n|}g g g g f\}	}
}}xÄ|jD ]º\}}}}}|  |j	¡\}}|  
||¡}||krö| ¡  | | j| j¡ |dk	rÜ| || ¡}|j|td n|j|td | ¡ ||< |	 |¡ |
 |¡ | |¡ | |j| j ¡ qlW g }xv|jD ]l\}}}}||f|| |f|| || f||| f||fdg}tjtjtjtjtjtjg}| ||f¡ q6W tt|	|
||ƒƒ||fS )z?Convert the string *s* to vertices and codes using usetex mode.N)r'   )r   r   )r(   Zmake_dvir   r   ZDvir   r   ÚtextÚ_get_ps_font_and_encodingÚtexnamer$   rR   r   Zget_name_indexZ
load_glyphr	   rS   rG   rF   rY   Zboxesr   rT   rU   rV   rH   rI   )r   r   r,   r@   rJ   ZdvifileZdviÚpagerK   rM   rL   rP   rQ   Úx1Úy1ZdvifontZglyphr3   r   ÚencrO   ÚindexrZ   rW   rX   r0   r/   r[   r\   r   r   r   r8   æ   sD    


zTextToPath.get_glyphs_texé2   c          
   C   sª   t  t  d¡¡}||  }|jd kr:td|j› d| › dƒ‚t|jƒ}|jrXt  |j¡}nJxDdD ].}y| 	|¡ W n tt
fk
rˆ   Y q^X P q^W t d|j¡ d }||fS )Nz
pdftex.mapzNo usable font file found for z (z&). The font may lack a Type-1 version.)iCBDAiBODAz#No supported encoding in font (%s).)r   Z
PsfontsMapZfind_tex_fileÚfilenameÚ
ValueErrorZpsnamer   ÚencodingZ
_parse_encZselect_charmapÚRuntimeErrorÚ_logÚwarning)r`   Ztex_font_mapZpsfontr   rd   Zcharmap_coder   r   r   r_     s$    


z$TextToPath._get_ps_font_and_encoding)F)NF)NF)NF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r$   r*   rC   r9   r:   r(   r8   ÚstaticmethodÚ	functoolsÚ	lru_cacher_   r   r   r   r   r      s$   	
D 
 
2 
5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.textpath 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)r-   T)Ú_interpolation_stepsÚreadonlyF)Zmatplotlib.textrv   r   Z	_from_anyr)   Ú_xyr   Ú_cached_verticesZ_preprocess_mathÚsuperr   Útext_to_pathrC   Z_should_simplify)	r   Zxyr,   rY   r   rx   rw   rv   r-   )Ú	__class__r   r   r   Q  s    -


zTextPath.__init__c             C   s   || _ d| _dS )zSet the text size.TN)Ú_sizeÚ_invalid)r   rY   r   r   r   r     s    zTextPath.set_sizec             C   s   | j S )zGet the text size.)r   )r   r   r   r   Úget_size”  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
        )Ú_codes)r   r   r   r   rB      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   Ú	translaterz   Z	transformÚ	_verticesr'   Z	writeable)r   Útrr   r   r   r‚   §  s    
zTextPath._revalidate_path)NNru   F)rm   rn   ro   rp   r   r   r   Úpropertyrƒ   rB   r‚   Ú__classcell__r   r   )r~   r   rt   L  s    =rt   )Úcollectionsr   rr   ÚloggingÚurllib.parser    Únumpyr<   Z
matplotlibr   r   r   Zmatplotlib.font_managerr   r   Zmatplotlib.ft2fontr   r	   Zmatplotlib.mathtextr
   Zmatplotlib.pathr   Zmatplotlib.transformsr   Ú	getLoggerrm   rk   r   r}   rt   r   r   r   r   Ú<module>   s    
  9