Ë
    £èh*  ã                  ó  — U d dl mZ d dlmZmZmZmZ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 ddlmZmZ g d	¢Zdd„Z G d„ d
«      Zeee      Zded<    G d„ d«      Zdd„Zdd„Zdd„Zd d„Zd!d„Z d"d„Z!d#d„Z"d$d„Z# G d„ de«      Z$y)%é    )Úannotations)ÚSequenceÚIteratorÚIterableÚOptionalÚno_type_check)Ú	TypeAlias)ÚVec2ÚBoundingBox2dÚMatrix44)Úpathé   )ÚFontMeasurements)Ú	GlyphPathÚGlyphs)ÚloadsÚLCFontÚGlyphÚ
GlyphCacher   c                óª   — | j                  d«      }t        |«      \  }}}t        |||«      }t        |«      D ]  \  }}|j	                  ||«       Œ |S )NÚ
)ÚsplitÚparse_propertiesr   Úparse_glyphsÚadd)ÚsÚlinesÚnameÚletter_spacingÚword_spacingÚlcfÚglyphÚparent_codes           ú/lib/python3.12/site-packages/ezdxf/fonts/lff.pyr   r      sU   € Ø�G‰G�D‹M€EÜ)9¸%Ó)@Ñ&€Dˆ.˜,Ü
��~ |Ó
4€CÜ*¨5Ö1Ñˆˆ{Ø�‰��{Õ#ð 2à€Jó    c                  óL   — e Zd ZdZ	 d	 	 	 	 	 	 	 d	d„Zd
d„Zdd„Zddd„Zdd„Zy)r   z+Low level representation of LibreCAD fonts.c                óL   — || _         || _        || _        t        «       | _        y ©N)r   r   r    ÚdictÚ_glyphs)Úselfr   r   r    s       r$   Ú__init__zLCFont.__init__   s$   € ð ˆŒ	Ø%3ˆÔØ#/ˆÔÜ)-«ˆ�r%   c                ó,   — t        | j                  «      S r(   )Úlenr*   )r+   s    r$   Ú__len__zLCFont.__len__$   s   € Ü�4—<‘<Ó Ð r%   c                ó    — | j                   |   S r(   )r*   )r+   Úitems     r$   Ú__getitem__zLCFont.__getitem__'   s   € Ø�|‰|˜DÑ!Ð!r%   c                óš   — |r!	 | j                   |   }|j                  |«      }|| j                   |j                  <   y # t        $ r Y y w xY wr(   )r*   ÚKeyErrorÚextendÚcode)r+   r"   r#   Úparent_glyphs       r$   r   z
LCFont.add*   sP   € ÙðØ#Ÿ|™|¨KÑ8�ð !×'Ñ'¨Ó.ˆEØ#(ˆ�‰�U—Z‘ZÒ øô ò Ùðús   „> ¾	A
Á	A
c                ó:   — | j                   j                  |d «      S r(   )r*   Úget)r+   r6   s     r$   r9   z
LCFont.get3   s   € Ø�|‰|×Ñ  dÓ+Ð+r%   N)Ú ç        r;   )r   Ústrr   Úfloatr    r=   ÚreturnÚNone)r>   Úint)r1   r@   r>   r   )r   )r"   r   r#   r@   r>   r?   )r6   r@   r>   zOptional[Glyph])	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r/   r2   r   r9   © r%   r$   r   r      sA   „ Ù5àQTð0Øð0Ø.3ð0ØINð0à	ó0ó!ó"ô)ô,r%   r	   ÚPolylinec                  ó,   — e Zd ZdZdZdd„Zdd„Zd	d„Zy)
r   z-Low level representation of a LibreCAD glyph.)r6   Ú	polylinesc                ó2   — || _         t        |«      | _        y r(   )r6   ÚtuplerH   )r+   r6   rH   s      r$   r,   zGlyph.__init__>   s   € ØˆŒ	Ü-2°9Ó-=ˆ�r%   c                óŽ   — t        | j                  «      }|j                  |j                  «       t        |j                  |«      S r(   )ÚlistrH   r5   r   r6   )r+   r"   rH   s      r$   r5   zGlyph.extendB   s3   € Ü˜Ÿ™Ó(ˆ	Ø×Ñ˜Ÿ™Ô)Ü�U—Z‘Z Ó+Ð+r%   c                ó  — ddl m} t        j                  «       } |«       }| j                  D ]J  }t        j                  «       }t        j
                  |t        |«      dd|¬«       |j                  |«       ŒL t        |«      S )Nr   )ÚOCSF)ÚcloseÚ	elevationÚocs)	Ú
ezdxf.mathrN   r   ÚPathrH   Úadd_2d_polylineÚconvert_bulge_valuesÚextend_multi_pathr   )r+   rN   Ú
final_pathrQ   ÚpolylineÚps         r$   Úto_pathzGlyph.to_pathG   sm   € Ý"ä—Y‘Y“[ˆ
Ù‹eˆØŸœˆHÜ—	‘	“ˆAÜ× Ñ ØÔ'¨Ó1¸È!ÐQTõð ×(Ñ(¨Õ+ð 'ô ˜Ó$Ð$r%   N)r6   r@   rH   zSequence[Polyline])r"   r   r>   r   ©r>   r   )rA   rB   rC   rD   Ú	__slots__r,   r5   rZ   rE   r%   r$   r   r   :   s   „ Ù7Ø%€Ió>ó,ô
%r%   r   c              #  ó°   K  — t        | «      dz
  }t        | «      D ]'  \  }}d}||k  r| |dz      }	 |d   }|d   |d   |f–— Œ) y # t        $ r Y Œw xY w­w)Nr   r;   é   r   )r.   Ú	enumerateÚ
IndexError)rX   Ú
last_indexÚindexÚvertexÚbulgeÚnext_vertexs         r$   rU   rU   U   sz   è ø€ ä�X“ Ñ"€JÜ" 8Ö,‰ˆˆvØˆØ�:ÒØ" 5¨1¡9Ñ-ˆKðØ# A™�ð �Q‰i˜ ™ EÐ)Ó)ñ -øô ò Ùðüs'   ‚/A²A·AÁ	AÁAÁAÁAc                óˆ  — d}d}d}| D ]†  }|j                  «       }|j                  d«      sŒ%	 |j                  d«      \  }}|dd  j                  «       }|dk(  r|j                  «       }Œc|dk(  r	 t	        |«      }Œu|dk(  sŒ{	 t	        |«      }Œˆ |||fS # t        $ r Y Œ™w xY w# t        $ r Y Œ¨w xY w# t        $ r Y Œ·w xY w)	Nr:   r;   Ú#Ú:r   ÚNameÚLetterSpacingÚWordSpacing)ÚstripÚ
startswithr   Ú
ValueErrorr=   )r   Ú	font_namer   r    Úliner   Úvalues          r$   r   r   c   sè   € Ø€IØ€NØ€LÛˆØ�z‰z‹|ˆØ�‰˜sÔ#Øð	ØŸ*™* S›/‰KˆD�%ð �A�Bˆx�~‰~ÓˆØ�6Š>ØŸ™›‰IØ�_Ò$ðÜ!& u£‘ð �]Ó"ðÜ$ U›|‘ð' ð, �n lÐ2Ð2øô! ò 	Ùð	ûô ò Ùðûô
 ò Ùðús5   ¯BÁ2B&ÂB5Â	B#Â"B#Â&	B2Â1B2Â5	CÃ Cc              #  ó¢   K  — g }| D ]=  }|j                  d«      r|r|–— |j                  «        |sŒ-|j                  |«       Œ? |r|–— y y ­w)NÚ[)rm   ÚclearÚappend)r   r"   rp   s      r$   Úscan_glyphsrv   €   sP   è ø€ Ø€EÛˆØ�?‰?˜3ÔÙØ’Ø�K‰KŒMÚØ�L‰L˜Õð ñ Ø‹ð ùs
   ‚1A´Ac              #  óf   K  — | D ](  }|j                  «       }|j                  d«      rŒ%|–— Œ* y ­w)Nrg   )rl   rm   )r   rp   s     r$   Ústrip_clutterrx   �   s,   è ø€ ÛˆØ�z‰z‹|ˆØ�‰˜sÕ#Ø‹Jñ ùs   ‚'1ª1c                ó  ‡— ddl mŠ t        | «      dk(  ry	 | j                  d«      }| d| j                  «       } dj                  ˆfd„| D «       «      } 	 t        | d«      S # t        $ r t        | «      }Y ŒPw xY w# t        $ r Y yw xY w)Nr   )Ú	hexdigitsÚ]r   r:   c              3  ó,   •K  — | ]  }|‰v sŒ|–— Œ y ­wr(   rE   )Ú.0Úcrz   s     €r$   Ú	<genexpr>zscan_int_ex.<locals>.<genexpr>ž   s   øè ø€ Ð/™1�a  Y¢”™1ùs   ƒ	�é   )Ústringrz   r.   rb   rn   ÚlowerÚjoinr@   )r   Úendrz   s     @r$   Úscan_int_exr…   ”   sŒ   ø€ Ý ä
ˆ1ƒv�‚{ØðØ�g‰g�c‹lˆð 	
ˆ!ˆCˆ�‰Ó€AØ
�‰Ó/™1Ó/Ó/€AðÜ�1�b‹zÐøô ò Ü�!‹fŠðûô ò Ùðús#   ˜A# ÁA= Á#A:Á9A:Á=	B	ÂB	c              #  óì  K  — g }t        t        | «      «      D ]®  }d}|j                  «        |j                  d«      }|d   dk7  rŒ/	 t	        |d|j                  d«       d«      }|dk(  rŒT|d   }|j                  d«      r!|j                  d«       	 t	        |dd  d«      }t        t        |«      «      }t        ||«      |f–— Œ° y # t        $ r t        |«      }Y Œzw xY w# t        $ r Y Œ×w xY w­w)Nr   rs   r   r{   r€   ÚC)rv   rx   rt   Úpopr@   rb   rn   r…   rm   rL   Úparse_polylinesr   )r   rH   r"   r#   rp   r6   s         r$   r   r   ¥   sü   è ø€ à "€IÜœ]¨5Ó1Ö2ˆØˆØ�‰ÔØ�y‰y˜‹|ˆØ�‰7�cŠ>Øð	%Ü�t˜A §
¡
¨3£Ð0°"Ó5ˆDð �1Š9ØØ�Q‰xˆØ�?‰?˜3ÔØ�I‰I�aŒLðÜ! $ q r (¨BÓ/�ô œ¨Ó/Ó0ˆ	Ü�D˜)Ó$ kÐ1Ó1ñ) 3øô ò 	%Ü˜tÓ$ŠDð	%ûô ò ÙðüsN   ‚AC4Á	CÁ'-C4ÂC%Â$'C4ÃC"ÃC4Ã!C"Ã"C4Ã%	C1Ã.C4Ã0C1Ã1C4c              #  óþ   K  — g }| D ]r  }|j                  «        |j                  d«      D ]?  }t        |j                  d«      «      }t        |«      dkD  sŒ,|j	                  |d d «       ŒA t        |«      –— Œt y ­w)NÚ;Ú,r   é   )rt   r   Ú	to_floatsr.   ru   rJ   )r   rX   rp   rc   Úvaluess        r$   r‰   r‰   ¿   sm   è ø€ Ø&(€HÛˆØ�‰ÔØ—j‘j –oˆFÜ˜vŸ|™|¨CÓ0Ó1ˆFÜ�6‹{˜Q‹Ø—‘  r¨ 
Õ+ð &ô �H‹oÓñ ùs   ‚AA=Á&A=c                ó4   ‡— dd„Št        ˆfd„| D «       «      S )Nc                ód   — | j                  d«      r| dd  } 	 t        | «      S # t        $ r Y yw xY w)NÚAr   r;   )rm   r=   rn   )rq   s    r$   rl   zto_floats.<locals>.stripË   s<   € Ø×Ñ˜CÔ Ø˜!˜"�IˆEð	Ü˜“<ÐøÜò 	Ùð	ús   ˜
# £	/®/c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wr(   rE   )r}   rq   rl   s     €r$   r   zto_floats.<locals>.<genexpr>Ó   s   øè ø€ Ð2©6 %‘�u—©6ùs   ƒ)rq   r<   r>   r=   )rJ   )r�   rl   s    @r$   rŽ   rŽ   Ê   s   ø€ óô Ó2©6Ó2Ó2Ð2r%   c                  ó†   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	e
dd„«       Z	 d	 	 	 	 	 	 	 dd	„Z	 d	 	 	 	 	 	 	 dd
„Zy)r   zDText render engine for LibreCAD fonts with integrated glyph caching.c                óØ   — || _         t        «       | _        t        «       | _        | j                   j                  | _        | j                  «       | _        | j                  «       | _	        y r(   )
Úfontr)   Ú_glyph_cacheÚ_advance_width_cacher    Úspace_widthÚget_empty_boxÚ	empty_boxÚ_get_font_measurementsÚfont_measurements)r+   r–   s     r$   r,   zGlyphCache.__init__Ù   sP   € Ø ˆŒ	Ü26³&ˆÔÜ6:³fˆÔ!Ø"&§)¡)×"8Ñ"8ˆÔØ$(×$6Ñ$6Ó$8ˆŒØ37×3NÑ3NÓ3PˆÕr%   c                óT   — 	 || j                   j                  z  S # t        $ r Y yw xY w)Nç      ð?)r�   Ú
cap_heightÚZeroDivisionError)r+   r    s     r$   Úget_scaling_factorzGlyphCache.get_scaling_factorá   s0   € ð	Ø × 6Ñ 6× AÑ AÑAÐAøÜ ò 	Ùð	ús   ‚ ›	'¦'c                ó  — | j                  d«      }t        |j                  «       «      }|j                  j                  }|j                  j
                  }|j                  }t        j                  |«      }|j                  |t        |d«      z   «       |j                  |t        ||«      z   «       |j                  |t        d|«      z   «       |j                  «        |j                  |j                  «       t        |«      S )NéA   r   )Ú	get_shaper   Úcontrol_verticesÚsizeÚyÚxÚstartr   rS   Úline_tor
   rO   Úmove_tor„   r   )r+   Úglyph_AÚboxÚheightÚwidthrª   rY   s          r$   rš   zGlyphCache.get_empty_boxç   s½   € Ø—.‘. Ó$ˆÜ˜G×4Ñ4Ó6Ó7ˆØ—‘—‘ˆØ—‘—
‘
ˆØ—‘ˆÜ�I‰I�eÓˆØ	�	‰	�%œ$˜u a›.Ñ(Ô)Ø	�	‰	�%œ$˜u fÓ-Ñ-Ô.Ø	�	‰	�%œ$˜q &›/Ñ)Ô*Ø	�‰Œ	Ø	�	‰	�'—+‘+ÔÜ˜‹|Ðr%   c                ó˜   — 	 | j                   |   }|j	                  «       S # t        $ r |dkD  r| j                  cY S t        d«      ‚w xY w)Né    ú1space and non-printable characters are not glyphs)r–   r4   r›   rn   rZ   )r+   Úshape_numberr"   s      r$   Ú_render_shapezGlyphCache._render_shapeõ   sU   € ð	RØ—I‘I˜lÑ+ˆEð
 �}‰}‹Ðøô	 ò 	RØ˜bÒ Ø—~‘~Ò%ÜÐPÓQÐQð	Rús   ‚! ¡A	½A	c                óª  — |dk  rt        d«      ‚	 | j                  |   j                  «       S # t        $ r Y nw xY w| j	                  |«      }|| j                  |<   d}t        |«      rK|j                  «       }|j                  €J ‚|j                  j                  | j                  j                  z   }|| j                  |<   |j                  «       S )Nr²   r³   r;   )rn   r—   Úcloner4   rµ   r.   ÚbboxÚextmaxr©   r–   r   r˜   )r+   r´   r"   Úadvance_widthr®   s        r$   r¥   zGlyphCache.get_shapeþ   sÆ   € Ø˜2ÒÜÐPÓQÐQð	Ø×$Ñ$ \Ñ2×8Ñ8Ó:Ð:øÜò 	Ùð	úà×"Ñ" <Ó0ˆØ*/ˆ×Ñ˜,Ñ'ØˆÜˆuŒ:Ø—*‘*“,ˆCØ—:‘:Ð)Ð)Ð)ØŸJ™JŸL™L¨4¯9©9×+CÑ+CÑCˆMØ2?ˆ×!Ñ! ,Ñ/Ø�{‰{‹}Ðs   ’/ ¯	;º;c                ó®   — |dk  ry|dk(  r| j                   S 	 | j                  |   S # t        $ r Y nw xY w| j                  |«      }| j                  |   S )Nr²   r;   )r™   r˜   r4   r¥   )r+   r´   Ú_s      r$   Úget_advance_widthzGlyphCache.get_advance_width  sh   € Ø˜"ÒØØ˜2ÒØ×#Ñ#Ð#ð	Ø×,Ñ,¨\Ñ:Ð:øÜò 	Ùð	úà�N‰N˜<Ó(ˆØ×(Ñ(¨Ñ6Ð6s   ™( ¨	4³4c                ó  — t        | j                  t        d«      «      j                  «       «      }|j                  j
                  }|j                  j
                  |z
  }t        | j                  t        d«      «      j                  «       «      }|j                  j
                  |z
  }t        | j                  t        d«      «      j                  «       «      }||j                  j
                  z
  }t        ||||¬«      S )Nr©   r’   rY   )Úbaseliner    Úx_heightÚdescender_height)r   r¥   Úordr¦   Úextminr¨   r¹   r   )r+   r¸   r¿   rÀ   r    rÁ   s         r$   rœ   z!GlyphCache._get_font_measurements  sÁ   € ô ˜TŸ^™^¬C°«HÓ5×FÑFÓHÓIˆØ—;‘;—=‘=ˆØ—;‘;—=‘= 8Ñ+ˆä˜TŸ^™^¬C°«HÓ5×FÑFÓHÓIˆØ—[‘[—]‘] XÑ-ˆ
Ü˜TŸ^™^¬C°«HÓ5×FÑFÓHÓIˆØ# d§k¡k§m¡mÑ3ÐÜØØ!ØØ-ô	
ð 	
r%   c                óZ   ‡ — ‰ j                  |«      |z  }t        ˆ fd„|D «       «      |z  S )Nc              3  óR   •K  — | ]  }‰j                  t        |«      «      –— Œ  y ­wr(   )r½   rÂ   )r}   r~   r+   s     €r$   r   z-GlyphCache.get_text_length.<locals>.<genexpr>2  s!   øè ø€ Ð@¹4°a�4×)Ñ)¬#¨a«&×1¹4ùs   ƒ$')r¢   Úsum)r+   Útextr    Úwidth_factorÚscaling_factors   `    r$   Úget_text_lengthzGlyphCache.get_text_length.  s0   ø€ ð ×0Ñ0°Ó<¸|ÑKˆÜÓ@¹4Ó@Ó@À>ÑQÐQr%   c                ó4  — g }| j                  |«      }||z  }t        j                  ||d«      }d}|D ]a  }	t        |	«      }
|
dkD  r8| j	                  |
«      }||d<   |j                  |«       |j                  |«       || j                  |
«      |z  z  }Œc |S )Nr   r;   r²   )r�   r   )r¢   r   ÚscalerÂ   r¥   Útransform_inplaceru   r½   )r+   rÇ   r    rÈ   Úglyph_pathsÚsyÚsxÚmÚcurrent_locationr~   r´   r"   s               r$   Úget_text_glyph_pathszGlyphCache.get_text_glyph_paths4  s¬   € ð (*ˆØ×$Ñ$ ZÓ0ˆØ�,ÑˆÜ�N‰N˜2˜r 1Ó%ˆØÐÛˆAÜ˜q›6ˆLØ˜bÒ ØŸ™ |Ó4�Ø*��$‘Ø×'Ñ'¨Ô*Ø×"Ñ" 5Ô)Ø × 6Ñ 6°|Ó DÀrÑ IÑIÑð ð Ðr%   N)r–   r   r>   r?   )r    r=   r>   r=   r[   )r´   r@   r>   r   )r´   r@   r>   r=   )r>   r   )rŸ   )rÇ   r<   r    r=   rÈ   r=   r>   r=   )rÇ   r<   r    r=   rÈ   r=   r>   zlist[GlyphPath])rA   rB   rC   rD   r,   r¢   rš   rµ   r¥   r½   r   rœ   rÊ   rÓ   rE   r%   r$   r   r   Ö   s•   „ ÙNóQóóóóó"
7ð ò
ó ð
ð& CFðRØðRØ%*ðRØ:?ðRà	óRð CFðØðØ%*ðØ:?ðà	ôr%   r   N)r   r<   r>   r   )rX   rF   r>   zIterator[Sequence[float]])r   ú	list[str]r>   ztuple[str, float, float])r   úIterable[str]r>   zIterator[list[str]])r   rÔ   r>   zIterator[str])r   r<   r>   r@   )r   rÔ   r>   zIterator[tuple[Glyph, int]])r   rÕ   r>   zIterator[Polyline])r�   rÕ   r>   zSequence[float])%Ú
__future__r   Útypingr   r   r   r   r   Útyping_extensionsr	   rR   r
   r   r   Úezdxfr   r�   r   Úglyphsr   r   Ú__all__r   r   r=   rF   Ú__annotations__r   rU   r   rv   rx   r…   r   r‰   rŽ   r   rE   r%   r$   Ú<module>rÝ      s‹   ðö #ß HÕ HÝ 'ß 4Ñ 4Ý Ý /ß %â
4€ó÷,ñ ,ð: ˜x¨™Ñ/€ˆ)Ó /÷%ñ %ó6*ó3ó:
óóó"2ó4ó	3ôn�õ nr%   