
    h                       % S r SSKJr  SSKJrJrJrJrJrJ	r	J
r
Jr  SSKrSSKrSSKrSSKrSSKJrJrJrJrJrJr  SSKJr  SSKJr  SS	KJrJr   " S
 S\5      r " S S\5      r  " S S\5      r! " S S\5      r" " S S\5      r# " S S\5      r$ " S S\5      r% " S S\5      r& " S S\RN                  5      r( " S S\RN                  5      r) " S S\RN                  5      r*\+" 5       r,S \-S!'   S"r.\/" 5       r0S#\-S$'   \/" 5       r1\2" S%5      r3\2" S&5      r4\Rj                   " S' S(5      5       r6SKS) jr7 " S* S+5      r8SLS, jr9SMS- jr:SMS. jr;SNS/ jr<SOS0 jr=SOS1 jr>SOS2 jr?SOS3 jr@ " S4 S55      rAS6rBSPS7 jrCSQS8 jrDS9rESOS: jrFSRS; jrGSSS< jrH1 S=krISTSUS> jjrJSVS? jrKSVS@ jrL    SWSA jrM  SX         SYSB jjrN/ SCQrO/ SDQrP " SE SF5      rQSZSG jrRS[SH jrS " SI SJ\5      rTg)\aT  
This module provides support for fonts stored as SHX and SHP files.
(SHP is not the GIS file format!)

The documentation about the SHP file format can be found at Autodesk:
https://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-DE941DB5-7044-433C-AA68-2A9AE98A5713

Using bytes for strings because no encoding is defined in shape-files.

    )annotations)SequenceIterableIteratorCallableOptionalAnySetno_type_checkN)UVecVec2ConstructionEllipsebulge_to_arcBoundingBox2dMatrix44)path   )FontMeasurements)	GlyphPathGlyphsc                      \ rS rSrSrg)ShapeFileException+    N__name__
__module____qualname____firstlineno____static_attributes__r       G/var/www/html/env/lib/python3.13/site-packages/ezdxf/fonts/shapefile.pyr   r   +       r!   r   c                      \ rS rSrSrg)UnsupportedShapeFile/   r   Nr   r   r!   r"   r%   r%   /   r#   r!   r%   c                      \ rS rSrSrg)UnsupportedShapeNumber3   r   Nr   r   r!   r"   r(   r(   3   r#   r!   r(   c                      \ rS rSrSrg)InvalidFontDefinition7   r   Nr   r   r!   r"   r+   r+   7   r#   r!   r+   c                      \ rS rSrSrg)InvalidFontParameters;   r   Nr   r   r!   r"   r.   r.   ;   r#   r!   r.   c                      \ rS rSrSrg)InvalidShapeRecord?   r   Nr   r   r!   r"   r1   r1   ?   r#   r!   r1   c                      \ rS rSrSrg)FileStructureErrorC   r   Nr   r   r!   r"   r4   r4   C   r#   r!   r4   c                      \ rS rSrSrg)StackUnderflowG   r   Nr   r   r!   r"   r7   r7   G   r#   r!   r7   c                       \ rS rSrSrSrSrSrg)FontEmbeddingK   r   r      r   N)r   r   r   r   ALLOWED
DISALLOWEDREADONLYr    r   r!   r"   r:   r:   K   s    GJHr!   r:   c                       \ rS rSrSrSrSrSrg)FontEncodingQ   r   r   r<   r   N)r   r   r   r   UNICODEPACKED_MULTIBYTE_1
SHAPE_FILEr    r   r!   r"   rA   rA   Q   s    GJr!   rA   c                      \ rS rSrSrSrSrg)FontModeW   r   r<   r   N)r   r   r   r   
HORIZONTALBIDIRECTr    r   r!   r"   rG   rG   W   s    JHr!   rG   Sequence[int]NO_DATAFzSet[int]DEBUG_CODES0-c                  P    \ rS rSr% S\S'   S\S'   S\S'   \rS\S'   SSS	 jjrS
rg)Symbole   intnumber
byte_countbytesnamerK   datac                    U(       a  UOU R                   nSUS SU R                   S3R                  5       U R                  -   /nUR	                  [        U R                  5      5        U$ )N*05X,)rT   rU   encoderW   extendformat_shape_data_stringrX   )selfas_numnumexports       r"   
export_strSymbol.export_strl   sZ    fDKKc#Ya0299;diiGH.tyy9:r!   r   Nr   )ra   rS   returnlist[bytes])	r   r   r   r   __annotations__rL   rX   rd   r    r   r!   r"   rQ   rQ   e   s%    KO
K!D-! r!   rQ   c                    / nSnU  HS  nX# S3R                  5       -   n[        U5      S:  a  UnM+  UR                  US S 5        SU S3R                  5       nMU     U(       a  UR                  US S 5        U$ )Nr!   r\   P   )r]   lenappend)rX   rc   srb   s2s        r"   r_   r_   s   s    FA5!!##r7R<AMM!CR&!C5
!!#A  	afMr!   c                  8   \ rS rSrSr\R                  \R                  \	R                  4     SS jjr\SS j5       r\SS j5       r\SS j5       r\SS j5       rSS jrS	 rS
 r\SS j5       rSS jrSS jrSSS jjrSSS jjrSSS jjrSS S jjrSrg)!	ShapeFile   z+Low level representation of a SHX/SHP file.c                j    [        5       U l        Xl        X l        X0l        X@l        XPl        X`l        g N)dictshapesrW   abovebelowmodeencodingembed)r`   rW   rx   ry   rz   r{   r|   s          r"   __init__ShapeFile.__init__   s+     *.	

	 
r!   c                ,    [        U R                  5      $ ru   )floatrx   r`   s    r"   
cap_heightShapeFile.cap_height       TZZ  r!   c                ,    [        U R                  5      $ ru   )r   ry   r   s    r"   	descenderShapeFile.descender   r   r!   c                <    U R                   [        R                  :g  $ ru   r{   rA   rE   r   s    r"   is_fontShapeFile.is_font       }} 7 777r!   c                <    U R                   [        R                  :H  $ ru   r   r   s    r"   is_shape_fileShapeFile.is_shape_file   r   r!   c                l    U R                   R                  5        H  nXR                  :X  d  M  Us  $    g ru   )rw   valuesrW   )r`   rW   symbols      r"   findShapeFile.find   s-    kk((*F{{" + r!   c                ,    [        U R                  5      $ ru   )rm   rw   r   s    r"   __len__ShapeFile.__len__   s    4;;r!   c                     U R                   U   $ ru   )rw   )r`   items     r"   __getitem__ShapeFile.__getitem__   s    {{4  r!   c                   [        U 5      S:X  Ga  [        R                  nSnSn[        R                  n[
        R                  nSnU u  px UR                  SSS9u  pnU	S:X  a   UR                  S5      u  p#pQpFO0U	S:X  a   UR                  S5      tp#p\US   nO[        R                  n[        U5      S:X  d   e[        UR                  5       [        U5      [        U5      [        [        U5      5      [        [        U5      5      [        [        U5      5      5      $ g ! [         a    [        5       ef = f! [         a    [        U5      ef = f! [         a    [        U5      ef = f)Nr<   r      ,maxsplit   *UNIFONT   *0rl   )rm   rA   rC   r:   r=   rG   rI   split
ValueErrorr+   r.   rE   rS   rr   strip)recordsr{   rx   ry   r|   rz   endheaderparamsspec_rW   rests                r"   from_ascii_recordsShapeFile.from_ascii_records   sj   w<1#++HEE!))E&&DC$NF. &TA > {"8?E||D?Q<E$% 806T0B-E$r(C (22s8q= =

E
E
T#S]+c%j) 9   .+--.
 " 8/778 " 8/778s$   D$ &D< E $D9<EE+c                <   U H  n[        U5      S:  a  [        U5      e [        US   5      u  p4n[        U5      S:  d   eUS   [
        :X  a  [        USS  S5      nO[        USS  S5      n[        U[        U5      U5      nSR                  USS  5      n[        [        [        U5      5      5      Ul        UR                  S   S:X  a  XpR                  U'   M  US   R                  SS	9n	[	        S
U	 S35      e   g ! [         a    [	        US   5      ef = f)Nr<   r   r      
   r!   rl   ignore)errorsz file structure error at symbol <>)rm   r1   split_def_recordr   r4   ORD_NULLrS   rQ   jointupleparse_codessplit_recordrX   rw   decode)
r`   r   recordrT   rU   rW   int_numr   rX   ro   s
             r"   parse_ascii_recordsShapeFile.parse_ascii_records   s    F6{Q(004+;F1I+F(D v;?"?ayH$fQRj"-fQRj"-GS_d;F88F12J'DL,> ?@FK{{2!#'-G$1I$$H$5(+KA3a)PQQ+ 
  4(334s   DDc                l    U R                   R                  U5      nUc  [        U5      eUR                  $ ru   )rw   getr(   rX   )r`   rT   r   s      r"   	get_codesShapeFile.get_codes   s.    (>(00{{r!   c                .    [        U/U R                  US9$ N)stackedrender_shapesr   )r`   rT   r   s      r"   render_shapeShapeFile.render_shape   s    fXt~~wGGr!   c                *    [        XR                  US9$ r   r   )r`   numbersr   s      r"   r   ShapeFile.render_shapes   s    WnngFFr!   c                l    U Vs/ s H  n[        U5      PM     nn[        X@R                  USS9$ s  snf )NT)r   reset_to_baseline)ordr   r   )r`   textr   charr   s        r"   render_textShapeFile.render_text   s7    )-.3t9.^^W
 	
 /s   1c                >    U R                   U   R                  U5      $ ru   )rw   rd   )r`   shape_numberra   s      r"   shape_stringShapeFile.shape_string  s    {{<(33F;;r!   )rx   ry   r|   r{   rz   rW   rw   N)rW   rV   rx   rS   ry   rS   )rg   r   rg   bool)rW   rV   rg   zOptional[Symbol])r   Sequence[bytes])r   zIterable[Sequence[bytes]]rg   None)rT   rS   rg   rK   F)rT   rS   rg   r   )r   rK   rg   r   )r   strrg   r   rf   )r   rS   ra   rS   rg   rh   )r   r   r   r   __doc__rG   rI   rA   rC   r:   r=   r}   propertyr   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r    r   r!   r"   rr   rr      s    5   %%##  	" ! ! ! ! 8 8 8 8 ! $ $LR0HG
< <r!   rr   c                   [         R                  " U 5      R                  5       nU R                  5       n U R	                  S5      (       a  [        U5      $ U R	                  S5      (       a  [        U5      $ [        S5      e)zLoad shape-file `filename`, the file type is detected by the file
name extension and should be ".shp" or ".shx" otherwise rises an
exception :class:`UnsupportedShapeFile`.
z.shpz.shxzunknown filetype)pathlibPath
read_byteslowerendswithshp_loadshx_loadr%   )filenamerX   s     r"   readfiler     si    
 <<!,,.D~~H  ~			6	"	"~"#566r!   c                B    [        S U R                  SSS9 5       5      $ )Nc              3  @   #    U  H  oR                  5       v   M     g 7fru   r   .0ro   s     r"   	<genexpr>#split_def_record.<locals>.<genexpr>  s     C$Bq$B   r   r<   r   r   r   r   s    r"   r   r     s     CFLLL$BCCCr!   c                D    [        S U R                  S5       5       5      $ )Nc              3  @   #    U  H  oR                  5       v   M     g 7fru   r   r   s     r"   r   split_record.<locals>.<genexpr>  s     7$6q$6r   r   r   r   s    r"   r   r     s    7FLL$6777r!   c              #     #    U  Hq  nUR                  S5      nUS:X  a  M  US   [        :X  a  [        US5      v   M9  US   [        :X  a  US   [        :X  a  [        US5      v   Mc  [        US5      v   Ms     g 7f)Ns   ()r!   r   r   r   r   )r   r   rS   	ORD_MINUS)codescodes     r"   r   r     sn     zz% 3;7hdB-!W	!d1g&9dB-dB- s   A9A;c           	     *   [        [        [        U R                  S5      5      5      5      nSU;   a  UR	                  S5      nOSU;   a  UR	                  S5      nOSn[
        R                  U5      nUR                  UR                  5       5        U$ )N   
r   r   )s   _,_,_r!   )	parse_string_recordsmerge_linesfilter_noiser   poprr   r   r   r   )rX   r   font_definitionshps       r"   r   r   *  s|    ";|DJJu<M/N#OPGg!++k2	'	!++e, *

&
&
7CGNN,-Jr!   c                    U R                  S5      (       a  [        U 5      $ U R                  S5      (       a  [        U 5      $ U R                  S5      (       a  [        U 5      $ U R                  S5      (       a  [	        S5      e[	        S5      e)Ns   AutoCAD-86 shapes 1.0s   AutoCAD-86 shapes 1.1s   AutoCAD-86 unifont 1.0s   AutoCAD-86 bigfont 1.0z$BIGFONT shapes are not supported yetzunknown shape file format)
startswithload_shx_shape_file_1_0load_shx_shape_file_1_1load_shx_unifont_file_1_0r%   rX   s    r"   r   r   9  s{    /00&t,,	1	2	2&t,,	2	3	3(..	2	3	3"#IJJ
:
;;r!   c                   SnSn[         R                  nSn[        U 5      nUR                  S5      nU(       a5  UR	                  S5        UR
                  nUS   nUS   n[        US   5      n[        XAX#S9nXXl        U$ )Nr   r!   r   r<   )rx   ry   rz   )rG   rI   parse_shx_shapesr   r  rX   rr   rw   )	rX   rx   ry   rz   rW   rw   r  
shape_data
shape_files	            r"   r  r  E  s    EEDDd#FjjmO

1$))
11
1&4EEJr!   c                    [        U 5      $ ru   )r  r	  s    r"   r  r  X  s    "4((r!   c                  |    \ rS rSrSSS jjr\SS j5       rSS jrSS jrSS jr	SS jr
SS jrSS	 jrSS
 jrSrg)
DataReaderi]  c                    Xl         X l        g ru   rX   index)r`   rX   r  s      r"   r}   DataReader.__init__^  s    	
r!   c                F    U R                   [        U R                  5      :  $ ru   )r  rm   rX   r   s    r"   has_dataDataReader.has_datab  s    zzC		N**r!   c                .    U =R                   U-  sl         g ru   )r  )r`   ns     r"   skipDataReader.skipf  s    

a
r!   c                b    U R                   nU =R                   S-  sl         U R                  U   $ )Nr   r  rX   r`   r  s     r"   u8DataReader.u8i  s'    



a
yyr!   c                ~    U R                   U R                     nU =R                  S-  sl        US:  a  US-  S-
  $ U$ )Nr         r  r`   values     r"   i8DataReader.i8n  s<    		$**%

a
3;CK3&&r!   c                    U R                   U R                     nU =R                  S-  sl        US-  (       a  US-  * $ U$ )Nr   r#  r"  r  r$  s     r"   octantDataReader.octantu  s9    		$**%

a
3;S[>!Lr!   c                r    [        5       n U R                  5       nU(       a  UR                  U5        OU$ M-  ru   )	bytearrayr  rn   )r`   rX   r   s      r"   read_strDataReader.read_str}  s0    {779DD! r!   c                f    U R                   nU =R                   U-  sl         U R                  X"U-    $ ru   r  )r`   r  r  s      r"   r   DataReader.read_bytes  s+    



a
yy++r!   c                    U R                   nU =R                   S-  sl         U R                  U   U R                  US-      S-  -   $ )Nr<   r      r  r  s     r"   u16DataReader.u16  s>    



a
yy499UQY#71#<==r!   r  Nrf   )rX   rV   r   )r  rS   rg   r   )rg   rS   )rg   rV   )r  rS   rg   rV   )r   r   r   r   r}   r   r  r  r  r&  r)  r-  r   r3  r    r   r!   r"   r  r  ]  s>     + + 
,
>r!   r     c           
        [        5       n[        U [        5      nUR                  5       S:w  a  [	        S5      eUR                  5       nUR                  5       nUR                  5       n/ n[        U5       H5  nUR                  5       nUR                  5       n	UR                  X45        M7     US   S   U:w  a  [	        S5      eUS   S   U:w  a  [	        S5      eU HC  u  pUR                  U
5      n [        U5      u  pU
[        U5      -
  S
-
  n[        XX5      X'   ME     UR                  S5      S:w  a  [	        S5      eU$ ! [         a    [	        SUS S	[        U5       35      ef = f)zSHX/SHP shape parser.   signature byte 0x1A not foundr   z"invalid first entry in index tablerl   z!invalid last entry in index tablezSHX parsing error shape *r[   z: r      s   EOFzEOF marker not found)rv   r  SHX_SHAPES_START_INDEXr  r4   r3  rangern   r   parse_shx_data_record
IndexErrorr   rm   rQ   )rX   rw   readerfirst_numberlast_numbershape_countindex_tabler   r   	data_sizelengthr   rW   r  rU   s                  r"   r  r    sv    $F45Fyy{d !@AA::<L**,K**,K)+K;zz|JJL	L45   1~aL( !EFF2q[( !DEE +""6*	4V<D
 c$i'!+
%lQ !, v% !788M  	$+L+=RF}M 	s   7E		&E/c                T    [        U 5      nUR                  5       n[        U5      nX#4$ )z&Low level SHX/SHP shape record parser.)r  r-  parse_shape_codes)rX   r>  rW   r   s       r"   r<  r<    s*    F??Df%E;r!      c           	         [        U [        5      n[        U5      u  p#pEpg[        UUUUUUS9n [	        U5      Ul        U$ ! [         a    [        S5      ef = f)N)rx   ry   rz   r{   r|   zpre-mature end of file)r  SHX_UNIFONT_START_INDEXparse_shx_unifont_definitionrr   parse_shx_unifont_shapesrw   r=  r4   )	rX   r>  rW   rx   ry   rz   r{   r|   r  s	            r"   r  r    ss    56F0LV0T-DhJ;4V<
   ; !9::;s   A Ac                   U R                  5       S:w  a  [        S5      eU R                  S5        U R                  5       nU R                  5       nU R                  5       n[	        U R                  5       5      n[        U R                  5       5      n[        U R                  5       5      nU R                  S5        XX4XV4$ )Nr7  r8     r   )r  r4   r  r-  rG   rA   r:   )r>  rW   rx   ry   rz   r{   r|   s          r"   rJ  rJ    s    yy{d !@AA
KKN ??DIIKEIIKEFIIK DFIIK(H&))+&E
KKNX44r!   c                H   [        5       nU R                  (       a  U R                  5       nU R                  5       nU R                  5       nU[	        U5      -
  S-
  nU R                  U5      n[        [        U5      SS9n[        X#XF5      X'   U R                  (       a  M  U$ )Nr   T)unifont)	rv   r  r3  r-  rm   r   rF  r  rQ   )r>  rw   r   rU   rW   data_recordr   s          r"   rK  rK    s     $F
//zz|ZZ\
 #d)+a/
''
3!*["94H%lL /// Mr!   >   r   r<      rM     c                   / n U R                  5       nUR                  U5        US:X  a  [        U5      $ U[        ;   d  US:  a  ME  US:X  d  US:X  a!  UR                  U R                  5       5        GOUS:X  aI  U(       a!  UR                  U R	                  5       5        GOUR                  U R                  5       5        GOUS:X  a@  UR                  U R                  5       5        UR                  U R                  5       5        GOSUS:X  ah  Su  pEU(       d  U(       aT  U R                  5       nU R                  5       nUR                  U5        UR                  U5        U(       a  MK  U(       a  MT  GOUS	:X  a@  UR                  U R                  5       5        UR                  U R                  5       5        GOUS
:X  a  UR                  U R                  5       5        UR                  U R                  5       5        UR                  U R                  5       5        UR                  U R                  5       5        UR                  U R                  5       5        OUS:X  a^  UR                  U R                  5       5        UR                  U R                  5       5        UR                  U R                  5       5        OUS:X  a  Su  pEU(       d  U(       a  U R                  5       nU R                  5       nUR                  U5        UR                  U5        U(       d  U(       a  UR                  U R                  5       5        U(       a  Mx  U(       a  M  GM\  )Nr   rR  r9        r2  	   )r   r   r            )r  rn   r   SINGLE_CODESr3  r&  r)  )r>  rO  r   r   xys         r"   rF  rF    s8   E
yy{T19<\!TBYQY$!)LL%QYVZZ\*VYY[)QYLL%LL%QYDAqIIKIIKQQ	 !qq
 RZLL%LL)RZLL%LL%LL%LL%LL)RZLL%LL%LL%RZDAqIIKIIKQQLL- !qqO r!   c              #     #    U  H^  nUR                  S5        UR                  5       nU(       d  M-  UR                  S5      S   nUR                  5       nU(       d  MZ  Uv   M`     g 7f)Ns   
   ;r   )rstripr   r   )lineslines     r"   r   r   *  sS     Gzz|4::d#A&D::<Dt
 s   ,A()A(	A(c              #  @  #    SnU  H  nU(       d  UnM  UR                  S5      (       a$  UR                  S5      (       a  X-  nM@  Uv   UnMH  UR                  S5      (       a  X-  nMd  UR                  S5      (       a  X-  nM  Uv   UnM     U(       a  Uv   g g 7f)Nr!      *r   )r  r   )r`  current	next_lines      r"   r   r   5  s     G	G%%##D))$#d## G!!$'' GMG    s   BBc                R   [        5       nS n/ nU  H  nUR                  S5      (       a  [        S5      eUR                  S5      (       a7  Ub  [        U5      X'   UR	                  S5      S   R                  5       nU/nMq  UR                  U5        M     Ub  [        U5      X'   U$ )Ns   *BIGFONTz)BIGFONT shape files are not supported yetrc  r   r   )rv   r  r%   r   r   r   rn   )r`  r   rW   r   ra  s        r"   r   r   K  s     -1FGDF??;''&'RSS??4   %f::d#A&,,.DVFMM$  fNr!   c                    [        [        R                  " U5      SUUS9nU  H  n UR                  XdS9  M     [        UR                  5      $ ! [         a     M9  [
         a    [        SU 35      ef = f)z1Renders multiple shapes into a single glyph path.Tpen_downr   r   r   z-stack underflow while rendering shape number )ShapeRendererr   r   renderr(   r7   r   p)shape_numbersr   r   startr   ctxr   s          r"   r   r   a  s     		%	C &	JJ|JI & SUU & 	 	 ?~N 	s   A
A4A4)r   r   r         ?r         rl   rl   rl   rl   rl   rr  r   rq  r   r   )r   rq  r   r   r   r   r   rq  r   rr  rl   rl   rl   rl   rl   rr  c                      \ rS rSrSrSSSS.         SS jjr\SS j5       rSS	 jrSS
 jr	 S   SS jjr
SS jrSS jr        SS jr        SS jr          SS jrSS jrSrg)rk  i  z+Low level glyph renderer for SHX/SHP fonts.      ?TF)vector_lengthri  r   c                   Xl         [        U5      U l        X@l        XPl        / U l        X l        U R                   R                  R                  U l	        g ru   )
rm  r   ru  ri  r   _location_stack
_get_codesro  r\  _baseline_y)r`   rm  r   ru  ri  r   s         r"   r}   ShapeRenderer.__init__  sA     "=1 +-#66<<>>r!   c                @    [        U R                  R                  5      $ ru   )r   rm  r   r   s    r"   current_locationShapeRenderer.current_location  s    DFFJJr!   c                N    U R                   R                  U R                  5        g ru   )rw  rn   r|  r   s    r"   pushShapeRenderer.push  s    ##D$9$9:r!   c                j    U R                   R                  U R                  R                  5       5        g ru   )rm  move_torw  r  r   s    r"   r  ShapeRenderer.pop  s!    t++//12r!   c                8	   SU l         U R                  U5      nSnSnU[        U5      :  Ga  X4   n[        (       a&  U[        ;   a  U(       a  [
        R                  U5        US-  nUS:  a  U(       d  U R                  U5        GOVUS:X  a  GObUS:X  a  U(       d	  SU l         GO8US:X  a  U(       d	  SU l         GO"US:X  d  US:X  aK  X4   nUS-  nU(       d9  US:X  a  U =R                  U-  sl        OUS:X  a  U =R                  U-  sl        M  GOUS	:X  a  U(       d  U R                  5         GOUS
:X  a  U(       d   U R                  5         GOUS:X  a#  X4   nUS-  nU(       d  U R                  U5        GOcUS:X  a*  X4   n	X4S-      n
US-  nU(       d  U R                  X5        GO3US:X  a9   X4   n	X4S-      n
US-  nU	S:X  a  U
S:X  a  GOU(       d  U R                  X5        M8  US:X  a{  X4   n[        X4S-      5      u  pnUS:X  a  SnUS-  nU(       dN  U R!                  XR                  -  ["        R$                  " US-  5      ["        R$                  " US-  5      U5        GOsUS:X  a  X4   nX4S-      nX4S-      S-  X4S-      -   n[        X4S-      5      u  pnUS	-  nUS:X  a  SnSnUU-  nUU-  nU(       a  X-   S-
  nUS-  U-   nUS-  U-   nOX-
  S-   nUS-  U-
  nUS-  U-
  nU(       dH  U R'                  XR                  -  ["        R$                  " U5      ["        R$                  " U5      U5        OUS:X  a1  X4   n	X4S-      n
X4S-      nUS-  nU(       d  U R)                  XU5        OgUS:X  aE   X4   n	X4S-      n
U	S:X  a  U
S:X  a  US-  nOCX4S-      nUS-  nU(       d  U R)                  XU5        MD  US:X  a  U R*                  (       d  SnGM  SnU[        U5      :  a  GM  U(       a  ["        R,                  " U R.                  R0                  R2                  U R4                  5      (       dF  U R.                  R7                  U R.                  R0                  R8                  U R4                  45        g g g ! [         a    [        5       ef = f)NTr   Fr      r<   r9  rT  rQ  rM  rU  r2  rV  r   -   rW     g     ?g     F@rX  rY  rR  )ri  rx  rm   DEBUGrM   DEBUG_SHAPE_NUMBERSadddraw_vectorru  r  r  r=  r7   rl  draw_displacementdecode_octant_specsdraw_arc_spanmathradiansdraw_arc_start_to_end
draw_bulger   iscloserm  r   r\  ry  r  r[  )r`   r   r   r   r  	skip_nextr   factorsub_shape_numberr[  r\  radiusstart_octantoctant_spanccwstart_offset
end_offset
binary_degstart_offset_angleend_offset_angle
end_octantstart_angle	end_anglebulges                           r"   rl  ShapeRenderer.render  s   
 -	c%j <Du$+-<#''5QJEby  &9 $9 %dai
 qy**f4***f4* ! 9		9+HHJ #(< 
 KK 01L!)$
 **10Aai(AQJEAv!q&$..q4  1DUST9EU1V.3!#"#K
 &&!3!33\B%67[2%56	   %|"19-
	*a/53CC1DUST9EU1V.3
?!$J)
%1J%>"#-
#: !-!;a!?J"."58J"JK *T 14D DI!-!;a!?J"."58J"JK *T 14D DI ..!3!33[1Y/	 L!)$ai(
 OOA%0Aai(AAv!q&
!!),EQJE$e4  || $IIo c%j r <<

d.>.>??

d.>.>?@ @ } " +(**+s   ?R Rc                j    US-  nUS-	  S-  nU R                  [        U   U-  [        U   U-  5        g )Nr  rT  )r  VEC_XVEC_Y)r`   r   anglerD  s       r"   r  ShapeRenderer.draw_vector&  s;    CZqyC'uU|f4eElV6KLr!   c                    U R                   nU R                  [        X-  X#-  5      -   nU R                  (       a  U R                  R                  U5        g U R                  R                  U5        g ru   )ru  r|  r   ri  rm  line_tor  )r`   r[  r\  scaletargets        r"   r  ShapeRenderer.draw_displacement+  sO    ""&&ai)CC==FFNN6"FFNN6"r!   c                D    X$(       a  UOU* -   nU R                  XXT5        g ru   )r  )r`   r  r  
span_angler  r  s         r"   r  ShapeRenderer.draw_arc_span3  s$      ::+F	""6	Gr!   c                   US:  d   e[        US4UUUS9nU=R                  U R                  [        U(       a  UR                  OUR
                  5      -
  -  sl        U R                  (       a!  [        R                  " U R                  USS9  g U R                  R                  U(       a  UR
                  OUR                  5        g )N        r   )
major_axisstart_param	end_paramr  Freset)r   centerr|  r   start_point	end_pointri  r   add_ellipserm  r  )r`   r  r  r  r  arcs         r"   r  #ShapeRenderer.draw_arc_start_to_end:  s     ||!{#	
 	

d++d"COO/
 
 	

 ==TVVS6FFNNC3==S__Er!   c                    [        UUS4UUUS9nU R                  (       a!  [        R                  " U R                  USS9  g U R                  R                  U(       a  UR                  OUR                  5        g )Nr   )r  r  r  r  r  Fr  )r   ri  r   r  rm  r  r  r  )r`   r  r  r  r  r  r  s          r"   draw_arcShapeRenderer.draw_arcO  s\     "{#
 ==TVVS6FFNNC3==S__Er!   c                B   U R                   (       a}  U(       av  U R                  nU R                  nUS:  nU[        X-  X%-  5      -   n[	        U5      S-  nU(       a  [        XGU5      u  ppO[        XtU5      u  ppU R                  XXSS9  g U R                  X5        g )Nr   g     _@T)r  )ri  r|  ru  r   absr   r  r  )r`   r[  r\  r  r  r  r  r  r  r  r  r  s               r"   r  ShapeRenderer.draw_bulged  s    ==U//K&&E!)C#d19ai&@@IJ&E9EE:6Y :FE:6Y MM&+dMK""1(r!   )ry  rx  rw  rm  ri  r   ru  N)
rm  z	path.Pathr   Callable[[int], Sequence[int]]ru  r   ri  r   r   r   )rg   r   )rg   r   r   )r   rS   rg   r   )r   rS   rg   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   r  r   )r   r   r   r   r   r}   r   r|  r  r  rl  r  r  r  r  r  r  r    r   r!   r"   rk  rk    s%   5  #** 2*
 * * *"    ;3  EAEA 
	EANM
#HH*/H=BHIMHFF*/F<AFHLF*FF F 	F
 F F*)r!   rk  c                >    SnU S:  a  SnU * n U S-	  S-  nU S-  nX#U4$ )NTr   FrT  r  r   )specsr  r  r  s       r"   r  r  x  s<    
CqyQJ#%L#+Kc))r!   c                    SSK Jn  SSKJn  U" XR                  5      nSn [        U5      nUR                  U5      nUb  UR                  $ U$ ! [        [        4 a    Us $ f = f)a,  Returns the shape number for shape `name` from the shape-file, returns -1 if not
found.

The filename can be an absolute path or the shape-file will be searched in the
current directory and all directories stored in :attr:`ezdxf.options.support_dirs`.
Supports shape files of type ".shx" and ".shp".
r   )find_support_file)optionsrl   )
ezdxf.filemanagementr  ezdxfr  support_dirsr   IOErrorr   r   rT   )r   rW   r  r  shape_file_namer  rw   
shx_symbols           r"   find_shape_numberr    sq     7'2F2FGOE/* T"J   L '( s   A A$#A$c                      \ rS rSrSS jrSS jrSS jrSSS jjrSS jrSS jr	SS jr
\SS	 j5       r S       SS
 jjr S       SS jjrSrg)
GlyphCachei  c                    Xl         [        5       U l        [        5       U l        U R	                  UR
                  S9U l        U R                  5       U l        U R                  5       U l
        g)zCText render engine for SHX/SHP fonts with integrated glyph caching.)default_widthN)fontrv   _glyph_cache_advance_width_cachedetect_space_widthr   space_widthget_empty_box	empty_box_get_font_measurementsfont_measurements)r`   r  s     r"   r}   GlyphCache.__init__  sV    #	26&6:f!"&"9"9"9"X$($6$6$8373N3N3Pr!   c                T     XR                   R                  -  $ ! [         a     gf = f)Nrt  )r  r   ZeroDivisionError)r`   r   s     r"   get_scaling_factorGlyphCache.get_scaling_factor  s.    	 6 6 A AAA  		s    
''c                   SU R                   R                  ;   a%  U R                  S5      R                  R                  $ SU R                   R                  ;   a%  U R                  S5      R                  R                  $ U$ )N    A   )r  rw   	get_shaper   r[  )r`   r  s     r"   r  GlyphCache.detect_space_width  sb    !!!>>"%))+++!!!>>"%))+++r!   c                   U R                   nUR                  nU R                  n[        SS5      n[        US5      nXR                  ;   an  U R                  U5      n[        UR                  5       5      nUR                  R                  nUR                  R                  nUR                  nUR                  n[        R                  " U5      n	U	R                  U[        US5      -   5        U	R                  U[        XC5      -   5        U	R                  U[        SU5      -   5        U	R!                  5         U	R#                  U5        [%        U	5      $ )zReturns the empty box (tofu) representation based on the size of the given
character index.

The given index may not exist and a default box based on cap-height and space
width will be created.
r   )r  r   r  r   rw   r  r   control_verticessizer\  r[  ro  r   r   r   r  closer  r   )
r`   r   r  heightwidthro  r   glyphboxrm  s
             r"   r  GlyphCache.get_empty_box  s     yy  Q
5!n;;NN4(E 6 6 89CXXZZFHHJJEKKE))CIIe			%$ua.()			%$u--.			%$q&/)*					#|r!   c                    [        [        R                  " 5       SSU R                  R                  S9n UR                  USS9  [        UR                  5      $ ! [         a     N!f = f)NTFrh  rj  )	rk  r   r   r  r   rl  r7   r   rm  )r`   r   rp  s      r"   _render_shapeGlyphCache._render_shape  sb    IIKii))	
	JJ|uJ=   		s   A 
A'&A'c                    U R                   U   R                  5       $ ! [         a     Of = f U R                  U5      nO/! [         a"    US:  a  [        S 5      n OU R                  n Of = fX R                   U'    UR                  R                  nO! [         a    U R                  n Of = fX0R                  U'   UR                  5       $ Nr  )r  cloneKeyErrorr  r(   r   r  r   r[  r=  r  r  )r`   r   r  r  s       r"   r  GlyphCache.get_shape  s    	$$\288:: 			'&&|4E% 	'b !$		'
 +0,'	%IIKKE 	%$$E	%27!!,/{{}s5    
,,A A.A.-A. B B0/B0c                    US:X  a  U R                   $  U R                  U   $ ! [         a     Of = fU R                  U5      R                  R
                  $ r  )r  r  r  r  r   r[  )r`   r   s     r"   get_advance_widthGlyphCache.get_advance_width  sY    2###	,,\:: 		~~l+//111s   # 
00c                   [        U R                  [        S5      5      R                  5       S S 5      nUR                  R
                  nUR                  R
                  U-
  nU R                  R                  nUS:X  aM  [        U R                  [        S5      5      R                  5       S S 5      nUR                  R
                  U-
  nU R                  R                  nUS:X  aL  [        U R                  [        S5      5      R                  5       S S 5      nX!R                  R
                  -
  n[        UUUUS9$ )Nr[  rl   r   Arm  )baseliner   x_heightdescender_height)r   r  r   r  extminr\  extmaxr  rx   ry   r   )r`   bboxr  r   r   r  s         r"   r  !GlyphCache._get_font_measurements  s     T^^CH5FFH"MN;;==;;==8+YY__
? C!9!J!J!LSb!QRD1J99??q  C!9!J!J!LSb!QRD'++--7!-	
 	
r!   c                \   ^  T R                  U5      U-  n[        U 4S jU 5       5      U-  $ )Nc              3  X   >#    U  H  nTR                  [        U5      5      v   M!     g 7fru   )r  r   )r   cr`   s     r"   r   -GlyphCache.get_text_length.<locals>.<genexpr>  s#     @4a4))#a&114s   '*)r  sum)r`   r   r   width_factorscaling_factors   `    r"   get_text_lengthGlyphCache.get_text_length  s0     00<|K@4@@>QQr!   c                4   / nU R                  U5      nXS-  n[        R                  " XeS5      nSnU Ha  n	[        U	5      n
U
S:  a7  U R	                  U
5      nXS'   UR                  U5        UR                  U5        XR                  U
5      U-  -  nMc     U$ )zFReturns the glyph paths of string `s` as a list, scaled to cap height.r   r  r  )r9  r   )r  r   r  r   r  transform_inplacern   r  )r`   r   r   r  glyph_pathssysxmr|  r  r   r  s               r"   get_text_glyph_pathsGlyphCache.get_text_glyph_paths  s     (*$$Z0NN21%Aq6Lb |4*$''*""5) 6 6| Dr II  r!   )r  r  r  r  r  r  N)r  rr   rg   r   )r   r   rg   r   )r  r   rg   r   )r  )r   rS   rg   r   )rg   r   )r   rS   rg   r   )r   rS   rg   r   )rg   r   )rt  )r   r   r   r   r  r   rg   r   )rt  rt  )r   r   r   r   r  r   rg   zlist[GlyphPath])r   r   r   r   r}   r  r  r  r  r  r  r   r  r  r  r    r   r!   r"   r  r    s    Q> (2 
 
. CFRR%*R:?R	R IL%*@E	 r!   r  )rX   rK   rg   rh   )r   r   rg   rr   )r   rV   rg   r   )r   Iterable[bytes]rg   zIterator[int])rX   rV   rg   rr   )rX   rV   rg   dict[int, Symbol])rX   rV   rg   ztuple[bytes, Sequence[int]])r>  r  rg   zSequence[Any])r>  r  rg   r  r   )r>  r  rg   rK   )r`  r  rg   zIterator[bytes])r`  r  rg   zdict[bytes, Sequence[bytes]]))r   r   F)
rn  rK   r   r  r   r   ro  r   rg   r   )r  rS   rg   ztuple[int, int, bool])r   r   rW   rV   rg   rS   )Ur   
__future__r   typingr   r   r   r   r   r	   r
   r   dataclassesenumr  r   
ezdxf.mathr   r   r   r   r   r   r  r   r  r   glyphsr   r   	Exceptionr   r%   r(   r+   r.   r1   r4   r7   IntEnumr:   rA   rG   r   rL   ri   r  setrM   r  r   r   r   	dataclassrQ   r_   rr   r   r   r   r   r   r   r  r  r  r:  r  r<  rI  r  rJ  rK  rZ  rF  r   r   r   r   r  r  rk  r  r  r  r   r!   r"   <module>r#     s9  	 #	 	 	       / %	 		- 		/ 		. 		. 		+ 		+ 		' 	DLL 4<< t|| 
   X e s8H	 
 
 
A< A<H7D8
 	<&)
2> 2>l  B  $5&
  /.d,!4  -  	 8 	HGs) s)l*.O Or!   