
    'jG                       d dl mZ d dlZd dlmZmZmZmZ d dlZd dl	Z	d dl
Z
d dl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  ej        d	          Zd
ZdZdZej                            dd          Zde dgZg dZddgZeeeeeeiZ g dZ!dZ" G d de          Z#ddddZ$ G d d          Z%d7d$Z&d8d&Z'h d'Z(h d(Z) e            Z*g d)Z+g d*Z, G d+ d,e-          Z. G d- d.e-          Z/ G d/ d0          Z0d9d1Z1d:d5Z2d:d6Z3dS );    )annotationsN)Iterable
NamedTupleOptionalSequence)Path)TTFont
TTLibError   )FontFace)	shapefilelffezdxfWindowsLinuxDarwin
SystemRootz
C:/Windowsz'~/AppData/Local/Microsoft/Windows/Fontsz/Fonts)z/usr/share/fontsz/usr/local/share/fontsz~/.fontsz~/.local/share/fontsz~/.local/share/texmf/fontsz/Library/Fonts/z/System/Library/Fonts/)zArialUni.ttfzArial Unicode.ttfz	Arial.ttfzDejaVuSansCondensed.ttfzDejaVuSans.ttfzLiberationSans-Regular.ttfzOpenSans-Regular.ttf   c                  $    e Zd ZU ded<   ded<   dS )
CacheEntryr   	file_pathr   	font_faceN)__name__
__module____qualname____annotations__     R/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/fonts/font_manager.pyr   r   7   s'         OOOr   r   zDejaVu SerifzDejaVu SanszDejaVu Sans Mono)serif
sans-serif	monospacec                      e Zd Zd+dZd,dZd-d
Zd.dZd Zd+dZe	d/d            Z
d0dZd1dZd2dZ	 	 	 	 	 d3d4d%Zd5d'Zd6d(Zd7d+d)Zd*S )8	FontCachereturnNonec                ,    t                      | _        d S N)dict_cacheselfs    r   __init__zFontCache.__init__D   s     .2VVr   	font_namestrboolc                :    |                      |          | j        v S r(   )keyr*   r,   r.   s     r   __contains__zFontCache.__contains__I   s    xx	""dk11r   itemr   c                B    | j         |                     |                   S r(   r*   r2   )r,   r5   s     r   __getitem__zFontCache.__getitem__L   s    {488D>>**r   entryc                @    || j         |                     |          <   d S r(   r7   )r,   r5   r9   s      r   __setitem__zFontCache.__setitem__O   s    &+DHHTNN###r   c                *    t          | j                  S r(   )lenr*   r+   s    r   __len__zFontCache.__len__R   s    4;r   c                8    | j                                          d S r(   )r*   clearr+   s    r   r@   zFontCache.clearU   s    r   c                D    t          |                                           S r(   r/   lower)r.   s    r   r2   zFontCache.keyX   s    9~~##%%%r   	font_pathr   r   r   c                f    t          ||          | j        |                     |j                  <   d S r(   )r   r*   r2   name)r,   rD   r   s      r   	add_entryzFontCache.add_entry\   s,    0:9i0P0PDHHY^,,---r   fallbackc                    	 | j         |                     |                   S # t          $ rC | j                             |                     |                    }||cY S t	          d          w xY w)Nz+no fonts available, not even fallback fonts)r*   r2   KeyErrorgetFontNotFoundError)r,   r.   rH   r9   s       r   rK   zFontCache.get_   s}    	W;txx	2233 	W 	W 	WKOODHHX$6$677E '(UVVV	Ws   " ;A/A/Optional[FontFace]c                    | j                             |                     |j                  d           }|r|j        S |                     |j        |j        |j        |j	        |j
                  S )N)familystyleweightwidthitalic)r*   rK   r2   filenamer   find_best_match_exrO   rP   rQ   rR   	is_italic)r,   r   r9   s      r   find_best_matchzFontCache.find_best_matchi   so    ); < <dCC 	#?"&&#/#/& ' 
 
 	
r   r!   Regular     FrO   rP   rQ   intrR   rS   Optional[bool]c                   t                               ||          }t          || j                                                  }t          |          dk    rd S t          |          dk    r|d         j        S t          ||          }t          |          dk    r|d         j        S t          |          r|}t          |fd          }|d         j        S )Nr   r   c                    t          | j        j        z
            | j        j        ut          | j        j        z
            fS r(   )absr   rQ   rV   rR   )erS   rQ   rR   s    r   <lambda>z.FontCache.find_best_match_ex.<locals>.<lambda>   sA    AK&/00%V3AK%-.. r   )r2   )	GENERIC_FONT_FAMILYrK   filter_familyr*   valuesr=   r   filter_stylesorted)	r,   rO   rP   rQ   rR   rS   entriesentries_results	      ```   r   rU   zFontCache.find_best_match_exu   s     %((88(:(:(<(<==w<<14\\Q1:''w//x==AA;((]] 	G      
 
 
 ay""r   sc                2   t                      }	 t          j        |          }n"# t          j        $ r t	          d          w xY w	 |d         }|d         }n# t
          $ r t	          d          w xY w|t          k    r|D ]|}	 |\  }}}}	}
n# t          $ r t	          d          w xY wt          |          }t          |j
        |||	|
          }t          ||          ||                     |j
                  <   }nt	          d          || _        d S )Nzinvalid JSON file formatversion
font-faceszinvalid cache file format)rT   rO   rP   rQ   rR   zinvalid cache file version)r)   jsonloadsJSONDecodeErrorIOErrorrJ   CURRENT_CACHE_VERSION
ValueErrorr   r   rF   r   r2   r*   )r,   rj   cachecontentrl   r9   r   rO   rP   rQ   rR   pathr   s                r   ro   zFontCache.loads   sh   '+vv	6jmmGG# 	6 	6 	64555	6	7i(Gl+GG 	7 	7 	75666	7+++  I I?>C;Ivufee! ? ? ?!"=>>>?I$!Y!!  	 .8i-H-Hdhhty))**I 6777s!   % AA A3BB)c                    d | j                                         D             }t          |d}t          j        |d          S )Nc                    g | ]C}t          |j                  |j        j        |j        j        |j        j        |j        j        fDS r   )r/   r   r   rO   rP   rQ   rR   ).0r9   s     r   
<listcomp>z#FontCache.dumps.<locals>.<listcomp>   sY     	
 	
 	
  EO$$&%&%	
 	
 	
r   )rl   rm   r   )indent)r*   rd   rr   rn   dumps)r,   facesdatas      r   r|   zFontCache.dumps   sT    	
 	
 ++--	
 	
 	
 1FFz$q))))r   c                   | j                                         D ] }t          |j                    |s|j        j                                        }|j        }|dv rt          d|j         d           ]|dk    rt          d|j         d           |t          d|j         d           t          d|j                    t          d|j	                    t          d	|j
         d
|j                    t          d|j         d
|j                    t          dt          | j                    d           d S )N).shx.shpz  Shape font file: ''.lffz  LibreCAD font file: 'z   TrueType/OpenType font file: 'z
  family: z	  style: z
  weight: z, z	  width: z
found z fonts)r*   rd   printr   suffixrC   r   rT   rO   rP   rQ   
weight_strrR   	width_strr=   )r,   verboser9   	font_typeffs        r   print_available_fontszFontCache.print_available_fonts   sp   ['')) 	> 	>EU_&''' .4466IB,,,;R[;;;<<<<f$$>>>>????GGGGHHH.29..///,"(,,---?29????@@@<"(<<bl<<====1T[))11122222r   Nr%   r&   r.   r/   r%   r0   )r5   r/   r%   r   )r5   r/   r9   r   r%   r&   )r.   r/   r%   r/   )rD   r   r   r   r%   r&   )r.   r/   rH   r/   r%   r   )r   r   r%   rM   r!   rX   rY   rZ   F)rO   r/   rP   r/   rQ   r[   rR   r[   rS   r\   r%   rM   rj   r/   r%   r&   r%   r/   F)r   r   r   r-   r4   r8   r;   r>   r@   staticmethodr2   rG   rK   rW   rU   ro   r|   r   r   r   r   r$   r$   C   sW       4 4 4 4
2 2 2 2+ + + +, , , ,         & & & \&Q Q Q QW W W W

 

 

 

 #!&# # # # #B   <* * * *3 3 3 3 3 3 3r   r$   rO   r/   rg   Iterable[CacheEntry]r%   list[CacheEntry]c                b    t          |                                           fd|D             S )Nc                v    g | ]5}|j         j                                                                      3|6S r   )r   rO   rC   
startswithry   r`   r2   s     r   rz   z!filter_family.<locals>.<listcomp>   s=    MMM!!+"4":":"<"<"G"G"L"LMAMMMr   rB   )rO   rg   r2   s     @r   rc   rc      s4    
f++



CMMMMwMMMMr   rP   c                b    t          |                                           fd|D             S )Nc                T    g | ]$}|j         j                                        v "|%S r   )r   rP   rC   r   s     r   rz   z filter_style.<locals>.<listcomp>   s4    CCC!#):)@)@)B)B"B"BA"B"B"Br   rB   )rP   rg   r2   s     @r   re   re      s4    
e**



CCCCCwCCCCr   >   .otf.ttc.ttf>   r   r   r   )ztxt.shxztxt.shpziso.shxziso.shp)zstandard.lffziso.lffzsimplex.lffc                      e Zd ZdS )rL   Nr   r   r   r   r   r   rL   rL              Dr   rL   c                      e Zd ZdS )UnsupportedFontNr   r   r   r   r   r      r   r   r   c                      e Zd Zd6dZd7d6dZd8d	Zd6d
Zd9dZd9dZd9dZ	d:d;dZ
d<dZd=dZd>dZd?dZ	 	 	 	 	 d@dAd$ZdBd%ZdCdDd*ZdEdFd-ZdGd/ZdHd2Zd9d3ZdId5Zd&S )JFontManagerr%   r&   c                   t          j                    | _         t                      | _        t	                      | _        t	                      | _        t	                      | _        t	                      | _        d| _	        d| _
        d| _        d S N )platformsystemr$   _font_cacher)   _match_cache_loaded_ttf_fonts_loaded_shape_file_glyph_caches_loaded_lff_glyph_caches_fallback_font_name_fallback_shape_file_fallback_lffr+   s    r   r-   zFontManager.__init__   sm     ))&/kk;?6648FFPTPVPV,CG66%#% $&!r   Fc                <    | j                             |           d S )N)r   )r   r   )r,   r   s     r   r   z!FontManager.print_available_fonts   s"    ..w.?????r   r.   r/   r0   c                    || j         v S r(   )r   r3   s     r   has_fontzFontManager.has_font  s    D,,,r   c                l    t                      | _        | j                                         d| _        d S r   )r$   r   r   r@   r   r+   s    r   r@   zFontManager.clear  s1    $;;$$&&&#%   r   c                    | j         }|r|S t          d         }t          D ];}	 | j                            ||          }|j        j        } n# t          $ r Y 8w xY w|| _         |S )Nr   )r   DEFAULT_FONTSr   rK   r   rF   rL   )r,   fallback_namerF   cache_entrys       r   fallback_font_namezFontManager.fallback_font_name	  s    0 	!  %a(! 	 	D".224GG + 5 :$   #0 s   'A
AAc                X    | j         }|r|S t          D ]}|| j        v r|| _         |c S dS r   )r   FALLBACK_SHAPE_FILESr   )r,   fallback_shape_filerF   s      r   fallback_shapefilezFontManager.fallback_shapefile  sS    "7 	'&&( 	 	Dt''',0) ( rr   c                X    | j         }|r|S t          D ]}|| j        v r|| _        |c S dS r   )r   r   r   r   )r,   fallback_lffrF   s      r   r   zFontManager.fallback_lff#  sR    ) 	 ( 	 	Dt''',0) ( rr   r   font_numberr[   r	   c                   	 | j         |         S # t          $ r Y nw xY w|                                 }	 t          | j                            ||          j        |          }nW# t          $ r!}t          t          |                    d }~wt          $ r!}t          t          |                    d }~ww xY w|| j         |<   |S )N
fontNumber)r   rJ   r   r	   r   rK   r   rq   rL   r/   r
   )r,   r.   r   r   fontr`   s         r   get_ttf_fontzFontManager.get_ttf_font.  s    	))44 	 	 	D	//11	, $$Y>>H&  DD  	, 	, 	,#CFF+++ 	, 	, 	,#CFF+++	,,0y)s/    
/A$ $
B8.B

B8B33B8r   r   c                Z    |                      t          |j                  j                  S r(   )r   r   rT   rF   r,   r   s     r   ttf_font_from_font_facez#FontManager.ttf_font_from_font_face@  s$      i&8!9!9!>???r   shapefile.GlyphCachec           	     b   	 | j         |         S # t          $ r Y nw xY w|                                 }	 | j                            ||          j        }n!# t          $ r t          d| d          w xY w	 t          j        t          |                    }nU# t          $ r t          d| d          t          j        $ r'}t          d| dt          |                     d }~ww xY w	 t          j        |          }n!# t          $ r t          d| d          w xY w|| j         |<   |S )Nzshape font '' not foundzshape file 'zunsupported font '': #can't create glyph-cache for font ''.)r   rJ   r   r   rK   r   rL   r   readfiler/   rq   UnsupportedShapeFiler   
GlyphCache	Exception)r,   r.   r   r   filer`   glyph_caches          r   get_shapefile_glyph_cachez%FontManager.get_shapefile_glyph_cacheC  s   	7	BB 	 	 	D	//11	K(,,YFFPII 	K 	K 	K#$I9$I$I$IJJJ	K	O%c)nn55DD 	K 	K 	K#$I9$I$I$IJJJ- 	O 	O 	O!"My"M"MSVV"M"MNNN	O	W#.t44KK 	W 	W 	W!"U	"U"U"UVVV	W:E,Y7s;    
 A A37!B +C+"C&&C+/D D"lff.GlyphCachec                0   	 | j         |         S # t          $ r Y nw xY w|                                 }	 | j                            ||          j        }n!# t          $ r t          d| d          w xY w	 t          j        |          	                    d          }t          j        |          }n!# t          $ r t          d| d          w xY w	 t          j        |          }n!# t          $ r t          d| d          w xY w|| j         |<   |S )NzLibreCAD font 'r   utf8)encodingzLibreCAD font file 'r   r   )r   rJ   r   r   rK   r   rL   pathlibr   	read_textr   ro   rq   r   r   r   )r,   r.   r   r   rj   r   r   s          r   get_lff_glyph_cachezFontManager.get_lff_glyph_cacheZ  su   	0;; 	 	 	D	))++	N(,,YFFPII 	N 	N 	N#$Li$L$L$LMMM	N	SY''1161BBA9Q<<DD 	S 	S 	S#$Q9$Q$Q$QRRR	S	W...KK 	W 	W 	W!"U	"U"U"UVVV	W 4?%i0s/    
 A A37<B4 4CC+ +D	c                j    | j                             ||                                           }|j        S r(   )r   rK   r   r   )r,   r.   r   s      r   get_font_facezFontManager.get_font_faceq  s/    &**9d6M6M6O6OPP$$r   r!   rX   rY   rZ   rO   rP   rS   r\   rM   c                    t          |||||f          }	 | j        |         S # t          $ r Y nw xY w| j                            |||||          }|| j        |<   |S r(   )hashr   rJ   r   rU   )r,   rO   rP   rQ   rR   rS   r2   r   s           r   rW   zFontManager.find_best_matchu  s     FE65&9::	$S)) 	 	 	D	$77E65&
 
	 "+#s   # 
00c                    | j                             |          }|.|                     |                                           }|j        S |j        S )zuReturns the font file name of the font without parent directories
        e.g. "LiberationSans-Regular.ttf".
        )r   rW   r   r   rT   r   s     r   find_font_namezFontManager.find_font_name  sQ     $44Y??	**4+B+B+D+DEEI%%%%r   NTfoldersOptional[Sequence[str]]c                    ddl m} |rt          |          }n%t                              | j        t                    }|r|t          |j                  z   }|                     |           dS )a  Adds all supported font types located in the given `folders` to the font
        manager. If no directories are specified, the known font folders for Windows,
        Linux and macOS are searched by default, except `support_dirs` is ``False``.
        Searches recursively all subdirectories.

        The folders stored in the config SUPPORT_DIRS option are scanned recursively for
        .shx, .shp and .lff fonts, the basic stroke fonts included in CAD applications.

        r   )optionsN)	ezdxf._optionsr   listFONT_DIRECTORIESrK   r   LINUX_FONT_DIRSsupport_dirsscan_all)r,   r   r   r   dirss        r   buildzFontManager.build  sx     	+***** 	H==DD#''GGD 	5$w3444Ddr   synonymsdict[str, str]c                    | j         }|                                D ]\  }}||vr
||v r||         }|||<   |r5|                     d |                                D             d           d S d S )Nc                    i | ]\  }}||	S r   r   )ry   kvs      r   
<dictcomp>z,FontManager.add_synonyms.<locals>.<dictcomp>  s    AAA1q!AAAr   F)reverse)r   itemsadd_synonyms)r,   r   r   
font_cacher.   synonymr   s          r   r   zFontManager.add_synonyms  s    %
"*.."2"2 	. 	.Iw
***$$$Y/K"-Jw 	RAA0@0@AAA5QQQQQ	R 	Rr   Iterable[str]c                   |D ]}|                     d          }|s	 |                     t          |                                                     P# t          $ r&}t          t          |                     Y d }~{d }~ww xY wd S )Nz'")stripscan_folderr   
expanduserPermissionErrorr   r/   )r,   r   folderr`   s       r   r   zFontManager.scan_all  s     	 	F\\%((F   f!8!8!:!:;;;;"   c!ff	 	s   4A
BA>>Br  r   c           
     >   |                                 sd S |                                D ]}|                                r|                     |           ,|j                                        }|t          v rp	 t          |          }| j        	                    ||           z# t          $ r7}t                              d| dt          |                      Y d }~d }~ww xY w|t          v r*t          |          }| j        	                    ||           d S )Nzcannot open font 'r   )existsiterdiris_dirr   r   rC   SUPPORTED_TTF_TYPESget_ttf_font_facer   rG   r   loggerwarningr/   SUPPORTED_SHAPE_FILESget_shape_file_font_face)r,   r  r   extr   r`   s         r   r   zFontManager.scan_folder  sC   }} 	FNN$$ 	< 	<D{{}}   &&&+##%%C)))@ 1$ 7 7I $..tY???? ! K K KNN#I#I#IQ#I#IJJJJJJJJK ---4T::	 **4;;;	< 	<s   :B%%
C&/-C!!C&c                4    | j                                         S r(   )r   r|   r+   s    r   r|   zFontManager.dumps  s    %%'''r   rj   c                :    | j                             |           d S r(   )r   ro   )r,   rj   s     r   ro   zFontManager.loads  s    q!!!!!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   )rO   r/   rP   r/   rS   r\   r%   rM   )r   r   r%   r/   )NT)r   r   r%   r&   )T)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   rW   r   r   r   r   r   r|   ro   r   r   r   r   r      s       	  	  	  	 @ @ @ @ @- - - -& & & &
   	 	 	 		 	 	 	    $@ @ @ @   .   .% % % % #!&    &	& 	& 	& 	&    (
R 
R 
R 
R 
R	 	 	 	< < < <&( ( ( (" " " " " "r   r   c                    | dv rd} | S )N>   BookrX   r   )rP   s    r   normalize_styler    s    Lr   rD   r   r   c                $   t          | d          }|d         j        }d}d}|D ]w}|j        dk    r-|j                            |                                          }n7|j        dk    r,|j                            |                                          }|r|r nx	 |d         }|j        }|j        }n7# t          $ r* t          
                    d| j         d	           d
}d}Y nw xY wt          | j        |t          |          ||          S )zThe caller should catch ALL exception (see scan_folder function above) - strange
    things can happen when reading TTF files.
    r   r   rF   r   r   r   zOS/2z cannot load OS/2 table of font 'r   rY   rZ   rT   rO   rP   rR   rQ   )r	   namesnameIDstringdecodegetEncodingusWeightClassusWidthClassr   r	  inforF   r   r  )	rD   ttfr  rO   rP   record	os2_tablerQ   rR   s	            r   r  r    sM    q
)
)
)CKEFE  =A]))&*<*<*>*>??FF]aM((););)=)=>>E 	e 	E'K	 (&    Hy~HHHIII e$$   s   B5 51C)(C)c                    | j                                         }d}|dk    rd}|dk    rd}t          | j        | j                                        | j                                         |d          S )NrZ   r      r      rY   r  )r   rC   r   rF   stem)rD   r  rR   s      r   r  r     s~    


 
 
"
"C
 E
f}}
f}}~##%%$$&&   r   )rO   r/   rg   r   r%   r   )rP   r/   rg   r   r%   r   )rP   r/   r%   r/   )rD   r   r%   r   )4
__future__r   r   typingr   r   r   r   osr   rn   loggingr   fontTools.ttLibr	   r
   r   r   r   r   r   	getLoggerr	  WINDOWSLINUXMACOSenvironrK   WIN_SYSTEM_ROOTWIN_FONT_DIRSr   MACOS_FONT_DIRSr   r   rr   r   rb   r$   rc   re   r  r  NO_FONT_FACEr   FALLBACK_LFFr   rL   r   r   r  r  r  r   r   r   <module>r3     s   # " " " " "  ; ; ; ; ; ; ; ; ; ; ; ; 				          . . . . . . . .              		7	#	#
 *..|<< .
   %&>?]	?	?             #  P3 P3 P3 P3 P3 P3 P3 P3fN N N N
D D D D /.. 000 xzzCCC 999	 	 	 	 		 	 	 		 	 	 	 	i 	 	 	c" c" c" c" c" c" c" c"L      D     r   