o
    _h                     @   s   d Z ddlmZmZmZmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZ ddlmZ dd	lZdd	lZeeZd
ZeeZdZeeZG dd de
j
ZG dd deZeG dd deZd	S )aP  Compiles/decompiles SVG table.

https://docs.microsoft.com/en-us/typography/opentype/spec/svg

The XML format is:

.. code-block:: xml

	<SVG>
		<svgDoc endGlyphID="1" startGlyphID="1">
			<![CDATA[ <complete SVG doc> ]]
		</svgDoc>
	...
		<svgDoc endGlyphID="n" startGlyphID="m">
			<![CDATA[ <complete SVG doc> ]]
		</svgDoc>
	</SVG>
    )	bytesjoinsafeEvalstrjointobytestostr)sstruct   )DefaultTable)Sequence)	dataclassastuple)BytesIONzj
	>   # big endian
	version:                  H
	offsetToSVGDocIndex:      L
	reserved:                 L
z
	>   # big endian
	startGlyphID:             H
	endGlyphID:               H
	svgDocOffset:             L
	svgDocLength:             L
c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )table_S_V_G_zScalable Vector Graphics table

    The ``SVG`` table contains representations for glyphs in the SVG
    image format.

    See also https://learn.microsoft.com/en-us/typography/opentype/spec/stat
    c              	   C   sr  g | _ tt|d t |  | jdkrtd| j | j }}t	d|||d  d | _
|d7 }| j
dkr||d  }g }t| j
D ]}||t |d t  }tt|t }	||	 qD|D ]T}
|
j| }||
j }||| }d}|drdd l}t|}|jd d|d	}| }W d    n1 sw   Y  ~d
}t|d}| j t||
j|
j| qbd S d S )Nr   z9Unknown SVG table version '%s'. Decompiling as version 0.>H   r   F   r)fileobjTutf_8)docListr   unpackSVG_format_0SVG_format_0SizeversionlogwarningoffsetToSVGDocIndexstruct
numEntriesrangedoc_index_entry_format_0Sizedoc_index_entry_format_0DocumentIndexEntryappendsvgDocOffsetsvgDocLength
startswithgzipr   GzipFilereadr   SVGDocumentstartGlyphID
endGlyphID)selfdatattFontpossubTableStartdata2entriesirecord_datadocIndexEntryentrystartenddoc
compressedr'   bytesIO	gunzipper r>   Q/var/www/html/myenv/lib/python3.10/site-packages/fontTools/ttLib/tables/S_V_G_.py	decompile>   s\   







ztable_S_V_G_.decompilec              	   C   s  d}t }g }g }t| j}td|}|| t|t|  }i }	t| dd}
t| jD ]\}}t	|t
tfrAt| }|| j|< t|jdd}|
sM|jr|dsdd l}t }|jd d|dd	}|| W d    n1 srw   Y  | }t|t|k r|}~~t|}||	v r|	| }n|}||7 }||	|< || td
|j|j||}|| q-|| t|}d}td|||}||g}t|}|S )Nr   r   r;   Fr   )encodingr   w)r   mtimez>HHLLz>HLL)r   lenr   r   packr#   r    getattr	enumerate
isinstancelisttupler*   r   r.   r;   r&   r'   r   r(   writegetvaluer+   r,   extendr   )r-   r/   r   r   r   	entryListr   datum	curOffsetseenDocsallCompressedr4   r:   docBytesr'   r<   gzippergzipped	docLength	docOffsetr7   
svgDocDatareservedheaderr.   r>   r>   r?   compilem   s\   





ztable_S_V_G_.compilec                 C   s   t | jD ]A\}}t|ttfrt| }|| j|< |j|jd}|jr'd|d< |j	di | |
  ||j |
  |d |
  qd S )N)r+   r,   r   r;   svgDoc)r\   )rG   r   rH   rI   rJ   r*   r+   r,   r;   begintagnewline
writecdatar.   endtag)r-   writerr/   r4   r:   attrsr>   r>   r?   toXML   s   


ztable_S_V_G_.toXMLc           	      C   s   |dkr7t | dsg | _t|}| }t|d }t|d }tt|dd}| jt	|||| d S t
d|| d S )Nr\   r   r+   r,   r;   0zUnknown %s %s)hasattrr   r   stripintboolr   getr#   r*   r   r   )	r-   namerb   contentr/   r:   startGIDendGIDr;   r>   r>   r?   fromXML   s   
ztable_S_V_G_.fromXMLN)__name__
__module____qualname____doc__r@   r[   rc   rn   r>   r>   r>   r?   r   5   s    /6r   c                   @   s   e Zd Zdd Zdd ZdS )r"   c                 C   s   d | _ d | _d | _d | _d S )Nr+   r,   r$   r%   r-   r>   r>   r?   __init__   s   
zDocumentIndexEntry.__init__c                 C   s   d| j | j| j| jf S )NzDstartGlyphID: %s, endGlyphID: %s, svgDocOffset: %s, svgDocLength: %srs   rt   r>   r>   r?   __repr__   s   zDocumentIndexEntry.__repr__N)ro   rp   rq   ru   rv   r>   r>   r>   r?   r"      s    r"   c                   @   sB   e Zd ZU eed< eed< eed< dZeed< dd Zdd	 Z	d
S )r*   r.   r+   r,   Fr;   c                 C   s   t | d d | S N   )r   )r-   indexr>   r>   r?   __getitem__   s   zSVGDocument.__getitem__c                 C   s   dS rw   r>   rt   r>   r>   r?   __len__   s   zSVGDocument.__len__N)
ro   rp   rq   str__annotations__rg   r;   rh   rz   r{   r>   r>   r>   r?   r*      s   
 r*   ) rr   fontTools.misc.textToolsr   r   r   r   r   fontTools.miscr    r	   collections.abcr
   dataclassesr   r   ior   r   logging	getLoggerro   r   r   calcsizer   r!   r    r   objectr"   r*   r>   r>   r>   r?   <module>   s&    


 