o
    h3                     @   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	 d dl
mZmZmZ d dl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)_text_helpersdviread)FontPropertiesget_fontfontManager)	LoadFlags)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		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   g/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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.
        )_fontManager_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 jS )N)r   
NO_HINTINGr   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quotepostscript_name)r   r   ccoder   r   r   _get_char_id*   s   zTextToPath._get_char_idc                 C   s   |  }|dkrt ||S || j }|r7| }|| j | j|d|^}}}}	|| || || fS | |}
|
j	|dt
jd |
 \}}|d }|d }|
 }|d }|| || || fS )NTeXr   g        flagsg      P@)get_size_in_pointsr   get_text_width_height_descentr   copyr   r   r%   r   set_textr   r    get_width_height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|  ||\}}}n|s| |}| ||\}}}n	| ||\}}}g g }}	|D ]\}
}}}||
 \}}||| ||g  |	| q/|D ]\}}|| |	| qN|sdt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 arrays containing the (x, 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="Comic Neue", 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   r3   r4   
glyph_info	glyph_maprectsr   vertscodesglyph_id	xposition	ypositionr6   verts1codes1r   r   r   get_text_pathH   s"   $



zTextToPath.get_text_pathNc                 C   s   |du rt  }|rt  }n|}g }g }t||D ]"}| |jt|j}	||	 ||j |	|vr;|j	 ||	< q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   layoutr)   	ft_objectordcharappendr#   get_pathlenlistzip)r   r   r3   rF   return_new_glyphs_onlyglyph_map_new
xpositions	glyph_idsitemchar_id
ypositionssizesrG   r   r   r   r@      s(   
zTextToPath.get_glyphs_with_fontc                 C   st  |  }|| j | j|| j|\}}}}}	|st }|r#t }
n|}
g }g }g }g }|D ]D\}}}}}| ||}||vrZ|  || j| j |j	|t
jd | |
|< || || || || j }|| q/g }|	D ]5\}}}}||f||| f|| || f|| |f||fdg}tjtjtjtjtjtjg}|||f qxt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   r    rU   rT   r
   MOVETOLINETO	CLOSEPOLYrW   rX   )r   r   r3   rF   rY   r7   r8   r9   glyphsrG   rZ   r[   r_   r\   r`   r   r5   r(   oxoyr^   sizemyrectsr;   r<   vert1code1r   r   r   rA      sN   



zTextToPath.get_glyphs_mathtextc                 C   s  t  || j}t|| j}|\}W d   n1 sw   Y  |du r)t }|r/t }n|}g g g g f\}	}
}}|jD ]n}t|j	}| 
||j}||vr|  || j| j |j}t|trr||}|j|tjd nt|tr| | |j|tjd ntd|| ||< |	| |
|j ||j ||j| j  q>g }|jD ]5\}}}}||f|| |f|| || f||| f||fdg}tj tj!tj!tj!tj!tj"g}|||f qt#t$|	|
||||fS )z?Convert the string *s* to vertices and codes using usetex mode.Nr+   zGlyph spec of unexpected type: ra   )%r   make_dvir   r   Dvir   r   textr   	font_pathr)   glyphrb   r   glyph_name_or_index
isinstancestrget_name_index
load_glyphr   TARGET_LIGHTint_select_native_charmaprc   	TypeErrorrU   rT   r#   y	font_sizeboxesr
   rd   re   rf   rW   rX   )r   r   r3   rF   rY   dvifiledvipagerZ   r\   r[   r_   r`   rp   r   r^   rs   indexrk   rh   ri   r<   r;   rl   rm   r   r   r   r?      s\   






zTextToPath.get_glyphs_texc              
   C   sD   dD ]}z	|  | W  d S  ttfy   Y qw td| j d S )N)iCBDAiBODAz#No supported encoding in font (%s).)select_charmap
ValueErrorRuntimeError_logwarningfname)r   charmap_coder   r   r   rz     s   z!TextToPath._select_native_charmap)F)NF)__name__
__module____qualname____doc__r   r   r   r   r!   r)   r.   rO   r@   rA   r?   staticmethodrz   r   r   r   r   r      s*    	
<

3
:r   c                       sV   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u 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)r4   T)_interpolation_stepsreadonlyF)matplotlib.textr   r   	_from_anyr-   _xyr   _cached_vertices_preprocess_mathsuperr   text_to_pathrO   _should_simplify)	r   xyr3   rj   r   r   r   r   r4   	__class__r   r   r   *  s   -


zTextPath.__init__c                 C   s   || _ d| _dS )zSet the text size.TN)_size_invalid)r   rj   r   r   r   r   h  s   
zTextPath.set_sizec                 C      | j S )zGet the text size.)r   r   r   r   r   get_sizem  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   verticesq  s   zTextPath.verticesc                 C   r   )z"
        Return the codes
        )_codesr   r   r   r   rI   y  s   zTextPath.codesc                 C   sR   | j s| jdu r't | jtj j| j }|	| j
| _d| jj_d| _ dS 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   r6   r   r   r   	translater   	transform	_verticesr,   	writeable)r   trr   r   r   r     s   

zTextPath._revalidate_path)NNr   F)r   r   r   r   r   r   r   propertyr   rI   r   __classcell__r   r   r   r   r   %  s    >

r   )collectionsr   loggingurllib.parser$   numpyrC   
matplotlibr   r   matplotlib.font_managerr   r   r   r   matplotlib.ft2fontr   matplotlib.mathtextr	   matplotlib.pathr
   matplotlib.texmanagerr   matplotlib.transformsr   	getLoggerr   r   r   r   r   r   r   r   r   <module>   s"    
  