
    'j(                    >   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d0dZd1d!Z d2d#Z!d3d%Z"d4d(Z# G d) d*e          Z$d+S )5    )annotations)SequenceIteratorIterableOptionalno_type_check)	TypeAlias)Vec2BoundingBox2dMatrix44)path   )FontMeasurements)	GlyphPathGlyphs)loadsLCFontGlyph
GlyphCachesstrreturnr   c                    |                      d          }t          |          \  }}}t          |||          }t          |          D ]\  }}|                    ||           |S )N
)splitparse_propertiesr   parse_glyphsadd)r   linesnameletter_spacingword_spacinglcfglyphparent_codes           I/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/fonts/lff.pyr   r      sn    GGDMME)9%)@)@&D.,
~|
4
4C*511 $ ${{####J    c                  @    e Zd ZdZ	 dddZddZddZdddZddZdS ) r   z+Low level representation of LibreCAD fonts.         r    r   r!   floatr"   r   Nonec                V    || _         || _        || _        t                      | _        d S N)r    r!   r"   dict_glyphs)selfr    r!   r"   s       r&   __init__zLCFont.__init__   s*     	%3#/)-r'   intc                *    t          | j                  S r.   )lenr0   )r1   s    r&   __len__zLCFont.__len__$   s    4<   r'   itemr   c                    | j         |         S r.   )r0   )r1   r7   s     r&   __getitem__zLCFont.__getitem__'   s    |D!!r'   r   r$   r%   c                    |r5	 | j         |         }n# t          $ r Y d S w xY w|                    |          }|| j         |j        <   d S r.   )r0   KeyErrorextendcode)r1   r$   r%   parent_glyphs       r&   r   z
LCFont.add*   sf     	/#|K8    ''..E#(UZ   s    
  r=   Optional[Glyph]c                8    | j                             |d           S r.   )r0   get)r1   r=   s     r&   rA   z
LCFont.get3   s    |d+++r'   N)r)   r*   r*   )r    r   r!   r+   r"   r+   r   r,   )r   r3   )r7   r3   r   r   )r   )r$   r   r%   r3   r   r,   )r=   r3   r   r?   )	__name__
__module____qualname____doc__r2   r6   r9   r   rA    r'   r&   r   r      s        55QT0 0 0 0 0! ! ! !" " " ") ) ) ) ), , , , , ,r'   r	   Polylinec                  .    e Zd ZdZdZddZdd
ZddZdS )r   z-Low level representation of a LibreCAD glyph.)r=   	polylinesr=   r3   rI   Sequence[Polyline]c                <    || _         t          |          | _        d S r.   )r=   tuplerI   )r1   r=   rI   s      r&   r2   zGlyph.__init__>   s    	-29-=-=r'   r$   r   c                    t          | j                  }|                    |j                   t          |j        |          S r.   )listrI   r<   r   r=   )r1   r$   rI   s      r&   r<   zGlyph.extendB   s9    ((	)))UZ+++r'   r   c                   ddl m} t          j                    } |            }| j        D ]P}t          j                    }t          j        |t          |          dd|           |                    |           Qt          |          S )Nr   )OCSF)close	elevationocs)	
ezdxf.mathrP   r   PathrI   add_2d_polylineconvert_bulge_valuesextend_multi_pathr   )r1   rP   
final_pathrS   polylineps         r&   to_pathzGlyph.to_pathG   s    """"""Y[[
cee 	, 	,H	A '11!QT    ((++++$$$r'   N)r=   r3   rI   rJ   )r$   r   r   r   r   r   )rB   rC   rD   rE   	__slots__r2   r<   r\   rF   r'   r&   r   r   :   s[        77%I> > > >, , , ,
% % % % % %r'   r   rZ   Iterator[Sequence[float]]c              #     K   t          |           dz
  }t          |           D ]E\  }}d}||k     r%| |dz            }	 |d         }n# t          $ r Y nw xY w|d         |d         |fV  Fd S )Nr   r*      r   )r5   	enumerate
IndexError)rZ   
last_indexindexvertexbulgenext_vertexs         r&   rW   rW   U   s      X"J"8,, * *v:"519-K#A   QiE)))))* *s   A
AAr   	list[str]tuple[str, float, float]c                   d}d}d}| D ]}|                                 }|                    d          s,	 |                    d          \  }}n# t          $ r Y Rw xY w|dd                                           }|dk    r|                                 }|dk    r!	 t	          |          }# t          $ r Y w xY w|dk    r!	 t	          |          }# t          $ r Y w xY w|||fS )	Nr)   r*   #:r   NameLetterSpacingWordSpacing)strip
startswithr   
ValueErrorr+   )r   	font_namer!   r"   liner    values          r&   r   r   c   s=   INL  zz||s## 		**S//KD%% 	 	 	H	 ABBx~~6>>II_$$!&u   ]""$U||    #
 nl22s5   A
AAB--
B:9B:C
C! C!Iterable[str]Iterator[list[str]]c              #     K   g }| D ]H}|                     d          r|r|V  |                                 |r|                    |           I|r|V  d S d S )N[)rr   clearappend)r   r$   ru   s      r&   scan_glyphsr}      s      E  ??3 	 KKMMM 	LL  r'   Iterator[str]c              #  n   K   | D ]/}|                                 }|                    d          s|V  0d S )Nrl   )rq   rr   )r   ru   s     r&   strip_clutterr      sJ        zz||s## 	JJJ r'   r3   c                d   ddl m t          |           dk    rdS 	 |                     d          }n# t          $ r t          |           }Y nw xY w| d|                                         } d                    fd| D                       } 	 t          | d          S # t          $ r Y dS w xY w)Nr   )	hexdigits]r   r)   c              3  $   K   | ]
}|v |V  d S r.   rF   ).0cr   s     r&   	<genexpr>zscan_int_ex.<locals>.<genexpr>   s'      //aY//r'      )stringr   r5   re   rs   lowerjoinr3   )r   endr   s     @r&   scan_int_exr      s          
1vv{{qggcll   !ff	!C%A
////1/////A1bzz   qqs!   4 AAB! !
B/.B/Iterator[tuple[Glyph, int]]c              #  ~  K   g }t          t          |                     D ]}d}|                                 |                    d          }|d         dk    r;	 t	          |d|                    d                   d          }n# t          $ r t          |          }Y nw xY w|dk    r|d         }|                    d          r?|                    d           	 t	          |dd          d          }n# t          $ r Y w xY wt          t          |                    }t          ||          |fV  d S )Nr   rz   r   r   r   C)r}   r   r{   popr3   re   rs   r   rr   rN   parse_polylinesr   )r   rI   r$   r%   ru   r=   s         r&   r   r      sg      "I]51122 2 2yy||7c>>	%tA

3/0"55DD 	% 	% 	%t$$DDD	%199Qx??3 	IIaLLL!$qrr(B//   //00	D)$$k11111)2 2s$   +B		B%$B%"C;;
DDIterator[Polyline]c              #  6  K   g }| D ]}|                                  |                    d          D ]T}t          |                    d                    }t          |          dk    r|                    |d d                    Ut          |          V  d S )N;,r      )r{   r   	to_floatsr5   r|   rL   )r   rZ   ru   rf   valuess        r&   r   r      s      &(H  jjoo 	, 	,Fv||C0011F6{{Qrr
+++Hoo r'   r   Sequence[float]c                B    ddt          fd| D                       S )Nrv   r   r   r+   c                    |                      d          r
| dd          } 	 t          |           S # t          $ r Y dS w xY w)NAr   r*   )rr   r+   rs   )rv   s    r&   rq   zto_floats.<locals>.strip   sX    C   	!""IE	<< 	 	 	33	s   0 
>>c              3  .   K   | ]} |          V  d S r.   rF   )r   rv   rq   s     r&   r   zto_floats.<locals>.<genexpr>   s+      22%u222222r'   )rv   r   r   r+   )rL   )r   rq   s    @r&   r   r      s<        22226222222r'   c                  r    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dS )$r   zDText render engine for LibreCAD fonts with integrated glyph caching.fontr   r   r,   c                    || _         t                      | _        t                      | _        | j         j        | _        |                                 | _        |                                 | _	        d S r.   )
r   r/   _glyph_cache_advance_width_cacher"   space_widthget_empty_box	empty_box_get_font_measurementsfont_measurements)r1   r   s     r&   r2   zGlyphCache.__init__   s[     	26&&6:ff!"&)"8$($6$6$8$8373N3N3P3Pr'   
cap_heightr+   c                D    	 || j         j        z  S # t          $ r Y dS w xY w)N      ?)r   r   ZeroDivisionError)r1   r   s     r&   get_scaling_factorzGlyphCache.get_scaling_factor   s:    	 6 AAA  	 	 	33	s    
r   c                2   |                      d          }t          |                                          }|j        j        }|j        j        }|j        }t          j        |          }|	                    |t          |d          z              |	                    |t          ||          z              |	                    |t          d|          z              |                                 |                    |j                   t          |          S )NA   r   )	get_shaper   control_verticessizeyxstartr   rU   line_tor
   rQ   move_tor   r   )r1   glyph_Aboxheightwidthr   r[   s          r&   r   zGlyphCache.get_empty_box   s    ..$$G446677
Ie			%$ua..()))			%$uf---...			%$q&//)***							'+||r'   c                    	 | j         |         }n,# t          $ r |dk    r	| j        cY S t          d          w xY w|                                S )N    1space and non-printable characters are not glyphs)r   r;   r   rs   r\   )r1   shape_numberr$   s      r&   _render_shapezGlyphCache._render_shape   sm    	RIl+EE 	R 	R 	Rb  ~%%%PQQQ	R }}s    99r   r3   c                   |dk    rt          d          	 | j        |                                         S # t          $ r Y nw xY w|                     |          }|| j        |<   d}t          |          r6|                                }|j        J |j        j        | j	        j
        z   }|| j        |<   |                                S )Nr   r   r*   )rs   r   cloner;   r   r5   bboxextmaxr   r   r!   r   )r1   r   r$   advance_widthr   s        r&   r   zGlyphCache.get_shape   s    2PQQQ	$\288::: 	 	 	D	""<00*/,'u:: 	D**,,C:)))JL49+CCM2?!,/{{}}s   6 
AAc                    |dk     rdS |dk    r| j         S 	 | j        |         S # t          $ r Y nw xY w|                     |          }| j        |         S )Nr   r*   )r   r   r;   r   )r1   r   _s      r&   get_advance_widthzGlyphCache.get_advance_width  sx    "32##	,\:: 	 	 	D	NN<(((66s   $ 
11r   c                    t          |                     t          d                                                              }|j        j        }|j        j        |z
  }t          |                     t          d                                                              }|j        j        |z
  }t          |                     t          d                                                              }||j        j        z
  }t          ||||          S )Nr   r   r[   )baseliner   x_heightdescender_height)r   r   ordr   extminr   r   r   )r1   r   r   r   r   r   s         r&   r   z!GlyphCache._get_font_measurements  s     T^^CHH55FFHHII;=;=8+T^^CHH55FFHHII[]X-
T^^CHH55FFHHII#dkm3!-	
 
 
 	
r'   r   textr   width_factorc                p                           |          |z  }t           fd|D                       |z  S )Nc              3  \   K   | ]&}                     t          |                    V  'd S r.   )r   r   )r   r   r1   s     r&   r   z-GlyphCache.get_text_length.<locals>.<genexpr>2  s7      @@a4))#a&&11@@@@@@r'   )r   sum)r1   r   r   r   scaling_factors   `    r&   get_text_lengthzGlyphCache.get_text_length.  sE     00<<|K@@@@4@@@@@>QQr'   list[GlyphPath]c                `   g }|                      |          }||z  }t          j        ||d          }d}|D ]v}	t          |	          }
|
dk    rD|                     |
          }||d<   |                    |           |                    |           ||                     |
          |z  z  }w|S )Nr   r*   r   )r   r   )r   r   scaler   r   transform_inplacer|   r   )r1   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0,N2r1%% 	J 	JAq66Lb  |44*$''***""5))) 6 6| D Dr IIr'   N)r   r   r   r,   )r   r+   r   r+   r]   )r   r3   r   r   )r   r3   r   r+   )r   r   )r   )r   r   r   r+   r   r+   r   r+   )r   r   r   r+   r   r+   r   r   )rB   rC   rD   rE   r2   r   r   r   r   r   r   r   r   r   rF   r'   r&   r   r      s        NNQ Q Q Q            "
7 
7 
7 
7 
 
 
 ]
& CFR R R R R CF      r'   r   N)r   r   r   r   )rZ   rG   r   r_   )r   ri   r   rj   )r   rw   r   rx   )r   ri   r   r~   )r   r   r   r3   )r   ri   r   r   )r   rw   r   r   )r   rw   r   r   )%
__future__r   typingr   r   r   r   r   typing_extensionsr	   rT   r
   r   r   ezdxfr   r   r   glyphsr   r   __all__r   r   r+   rG   __annotations__r   rW   r   r}   r   r   r   r   r   r   rF   r'   r&   <module>r      s   # " " " " " " H H H H H H H H H H H H H H ' ' ' ' ' ' 4 4 4 4 4 4 4 4 4 4       / / / / / / % % % % % % % %
4
4
4   , , , , , , , ,: x/ / / / /% % % % % % % %6* * * *3 3 3 3:
 
 
 
      "2 2 2 24   	3 	3 	3 	3n n n n n n n n n nr'   