
    'j~                       d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	m
Z
mZmZ d dlmZ ddlmZmZ dd	lmZ dd
lmZmZ dZdZ e            Z G d de          Z G d d          Z G d de          ZddZ G d de          ZdS )    )annotations)Anyno_type_check)BasePen)TTFont)Matrix44UVecBoundingBox2d)Path   )FontManagerUnsupportedFont)FontMeasurements)	GlyphPathGlyphsi%  i  c                  `     e Zd Zd fdZedd            ZddZdd	ZddZddZ	ddZ
 xZS )PathPenreturnNonec                p    t                                          |           t                      | _        d S N)super__init__r   _path)self	glyph_set	__class__s     M/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/fonts/ttfonts.pyr   zPathPen.__init__   s*    ###VV


    r   c                *    t          | j                  S r   )r   r   r   s    r   pathzPathPen.path   s    $$$r   ptr	   c                :    | j                             |           d S r   )r   move_tor   r#   s     r   _moveTozPathPen._moveTo       
2r   c                :    | j                             |           d S r   )r   line_tor&   s     r   _lineTozPathPen._lineTo    r(   r   pt1pt2pt3c                >    | j                             |||           d S r   )r   	curve4_to)r   r,   r-   r.   s       r   _curveToOnezPathPen._curveToOne#   s"    
S#s+++++r   c                <    | j                             ||           d S r   )r   	curve3_to)r   r,   r-   s      r   _qCurveToOnezPathPen._qCurveToOne&   s     
S#&&&&&r   c                8    | j                                          d S r   )r   close_sub_pathr!   s    r   
_closePathzPathPen._closePath)   s    
!!#####r   )r   r   )r   r   )r#   r	   r   r   )r,   r	   r-   r	   r.   r	   r   r   )r,   r	   r-   r	   r   r   )__name__
__module____qualname__r   propertyr"   r'   r+   r1   r4   r7   __classcell__)r   s   @r   r   r      s              % % % X%      , , , ,' ' ' '$ $ $ $ $ $ $ $r   r   c                      e Zd ZddZdS )		NoKerningc0strc1r   floatc                    dS N         r   r?   rA   s      r   getzNoKerning.get.   s    sr   Nr?   r@   rA   r@   r   rB   )r8   r9   r:   rH   rF   r   r   r>   r>   -   s(             r   r>   c                  $    e Zd ZdZdddZddZdS )KerningTable)_cmap_kern_tabler   fontr   fmtintc                T    || _         |d                             |          | _        d S )Nkern)rL   getkernrM   )r   rN   cmaprO   s       r   r   zKerningTable.__init__5   s)    
<//44r   r?   r@   rA   r   rB   c                    	 | j         | j        t          |                   | j        t          |                   f         S # t          t          f$ r Y dS w xY wrD   )rM   rL   ordKeyError	TypeErrorrG   s      r   rH   zKerningTable.get9   s[    	#TZB%8$*SWW:M$NOO)$ 	 	 	33	s   >A AAN)r   )rN   r   rO   rP   rI   )r8   r9   r:   	__slots__r   rH   rF   r   r   rK   rK   2   sF        (I5 5 5 5 5     r   rK   rN   r   r   r@   c                    | d         j         }|D ];}|j        dk    r.|j                            |                                          c S <dS )Nnamer   unknown)namesnameIDstringdecodegetEncoding)rN   r]   records      r   get_fontnamerc   @   s\    LE > >=A=''(:(:(<(<===== 9r   c                      e Zd ZdddZedd            Zedd	            ZddZd dZ	d!dZ
d"dZ	 d#d$dZd%dZd&d'dZ	 d#d(dZdS ))TTFontRendererFrN   r   c                P   t                      | _        t                      | _        t                      | _        || _        | j                                        | _        | j        t          d| j         d          | j        	                                | _
        t                      | _        |r1	 t          | j        | j                  | _        n# t          $ r Y nw xY w| j
        d         | _        |                                 | _        |                                 | _        d S )Nzfont 'z' has no character map.z.notdef)dict_glyph_path_cache_generic_glyph_cache_glyph_width_cacherN   getBestCmaprT   r   	font_namegetGlyphSetr   r>   kerningrK   rW   undefined_generic_glyph_get_font_measurementsfont_measurementsdetect_space_widthspace_width)r   rN   rn   s      r   r   zTTFontRenderer.__init__I   s   7;vv48FF!48FF	I))++	9!"R4>"R"R"RSSS..00 {{ 	+DItyAA   '+~i'@$!%!<!<!>!>2244s   2C 
CCr   r@   c                *    t          | j                  S r   )rc   rN   r!   s    r   rl   zTTFontRenderer.font_name\   s    DI&&&r   r   c                   t          |                     d                                                    }|j        j        }|j        j        |z
  }t          |                     d                                                    }|j        j        |z
  }t          |                     d                                                    }||j        j        z
  }t          ||||          S )NxAp)baseline
cap_heightx_heightdescender_height)r
   get_glyph_pathcontrol_verticesextminyextmaxr   )r   bboxry   r{   rz   r|   s         r   rp   z%TTFontRenderer._get_font_measurements`   s    T0055FFHHII;=;=8+T0055FFHHII[]X-
T0055FFHHII#dkm3!-	
 
 
 	
r   rz   rB   c                &    d| j         j        z  |z  S )N      ?)rq   rz   )r   rz   s     r   get_scaling_factorz!TTFontRenderer.get_scaling_factorp   s    T+66CCr   charc                    	 | j         |         S # t          $ r Y nw xY w	 | j        | j        t	          |                            }n# t          $ r
 | j        }Y nw xY w|| j         |<   |S r   )ri   rW   r   rT   rV   ro   )r   r   generic_glyphs      r   get_generic_glyphz TTFontRenderer.get_generic_glyphs   s    	,T22 	 	 	D		9 N49SYY+?@MM 	9 	9 	9 8MMM	9*7!$'s    
%A AAr   c                $   	 | j         |                                         S # t          $ r Y nw xY wt          | j                  }|                     |                              |           |j        }|| j         |<   |                                S )z8Returns the raw glyph path, without any scaling applied.)rh   clonerW   r   r   r   drawr"   )r   r   pen
glyph_paths       r   r}   zTTFontRenderer.get_glyph_path   s    	)$/55777 	 	 	D	dn%%t$$))#...X
'1t$!!!s   ! 
..c                    	 | j         |         S # t          $ r Y nw xY wd}	 |                     |          j        }n# t          $ r Y nw xY w|| j         |<   |S )z9Returns the raw glyph width, without any scaling applied.rE   )rj   rW   r   width)r   r   r   s      r   get_glyph_widthzTTFontRenderer.get_glyph_width   s    	*400 	 	 	D		**4006EE 	 	 	D	(-%s    
= 
A
	A
r   swidth_factorlist[GlyphPath]c                    g }d}t          | j        t                    }|                     |          }|}||z  }	t	          j        |	|d          }
| j        j         |z  |
d<   d}|D ]}|r!|| j                            ||          |	z  z  }||
d<   | 	                    |          }|
                    |
           t          |          r|                    |           ||                     |          |	z  z  }|}|S )zFReturns the glyph paths of string `s` as a list, scaled to cap height.r   r   )   r    )r   r   )
isinstancern   rK   r   r   scalerq   ry   rH   r}   transform_inplacelenappendr   )r   r   rz   r   glyph_pathsx_offsetrequires_kerningresize_factory_factorx_factorm	prev_charr   r   s                 r   get_text_glyph_pathsz#TTFontRenderer.get_text_glyph_paths   s&    (*%dlLAA//
;;  </N8Xs33)22X=$	 
	 
	D IDL,,Y==HHAdG,,T22J((+++: /"":...,,T22X==HIIr   c                ,    |                      d          S )z4Returns the space width for the raw (unscaled) font. )r   r!   s    r   rr   z!TTFontRenderer.detect_space_width   s    ##C(((r   c                    d}d}| j         j        }| j        }|D ]}| |||           ||          z   z  }|} ||                     |          z  S )NrE   r   )rn   rH   r   r   )r   r   rz   lengthr?   rR   r   rA   s           r   _get_text_length_with_kerningz,TTFontRenderer._get_text_length_with_kerning   sn    |$ 	 	Bdd2rllUU2YY..FBB//
;;;;r   c                    t          | j        t                    r|                     ||          |z  S | j        t          fd|D                       |                     |          z  |z  S )Nc              3  .   K   | ]} |          V  d S r   rF   ).0cr   s     r   	<genexpr>z1TTFontRenderer.get_text_length.<locals>.<genexpr>   s+      $$Qa$$$$$$r   )r   rn   rK   r   r   sumr   )r   r   rz   r   r   s       @r   get_text_lengthzTTFontRenderer.get_text_length   s     dlL11 	T55aDD|SS$$$$$!$$$$$%%j112	
r   N)F)rN   r   )r   r@   )r   r   )rz   rB   r   rB   )r   r@   )r   r@   r   r   )r   r@   r   rB   )r   r   )r   r@   rz   rB   r   rB   r   r   )r   rB   )r   )r   r@   rz   rB   r   rB   )r   r@   rz   rB   r   rB   r   rB   )r8   r9   r:   r   r;   rl   r   rp   r   r   r}   r   r   rr   r   r   rF   r   r   re   re   H   s.       5 5 5 5 5& ' ' ' X' 
 
 
 ]
D D D D
 
 
 

" 
" 
" 
"    FI    :) ) ) )< < < < < FI

 

 

 

 

 

 

r   re   N)rN   r   r   r@   )
__future__r   typingr   r   fontTools.pens.basePenr   fontTools.ttLibr   
ezdxf.mathr   r	   r
   
ezdxf.pathr   font_managerr   r   rq   r   glyphsr   r   UNICODE_WHITE_SQUAREUNICODE_REPLACEMENT_CHARr   r>   rK   rc   re   rF   r   r   <module>r      s   # " " " " " % % % % % % % % * * * * * * " " " " " " 4 4 4 4 4 4 4 4 4 4       6 6 6 6 6 6 6 6 / / / / / / % % % % % % % %   {}}$ $ $ $ $g $ $ $2       
    9      F
 F
 F
 F
 F
V F
 F
 F
 F
 F
r   