o
    jY                  
   @  s  d Z ddlmZ ddlmZ ddl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Zdd
lmZ dd	lZeeZG dd deZdZdZdddddddddd	ZefddZG dd deZdZeeZ dZ!ee!Z"dZ#ee#Z$d Z%ee%Z&d!Z'ee'Z(G d"d# d#eZ)G d$d% d%e)Z*G d&d' d'e)Z+G d(d) d)Z,d*d+ Z-d,d- Z.d.d/ Z/ed0krdd	l0Z0dd	l1Z1e02e13 j4 d	S d	S )1a  ttLib/sfnt.py -- low-level module to deal with the sfnt file format.

Defines two public classes:

- SFNTReader
- SFNTWriter

(Normally you don't have to use these classes explicitly; they are
used automatically by ttLib.TTFont.)

The reading and writing of sfnt files is separated in two distinct
classes, since whenever the number of tables changes or whenever
a table's length changes you need to rewrite the whole file anyway.
    )annotations)KeysView)BytesIO)SimpleNamespace)Tag)sstruct)
TTLibErrorTTLibFileIsCollectionErrorN)OrderedDictc                   @  sd   e Zd Zdd ZdddZdddZeZdddZd ddZd!ddZ	d"ddZ
dd Zdd ZdS )#
SFNTReaderc                 O  s^   |r*| t u r*|d }|d t|d}|d |dkr*ddlm} t|S t| S )zmReturn an instance of the SFNTReader sub-class which is compatible
        with the input file type.
        r      ZwOF2)WOFF2Reader)r   seekr   readfontTools.ttLib.woff2r   object__new__)clsargskwargsinfilesfntVersionr    r   U/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/fontTools/ttLib/sfnt.pyr   !   s   



zSFNTReader.__new__r   c                 C  s  || _ || _d | _d | _t| _| j d | j d| _| j d | jdkrft	| j }|j
}d|  kr9|k sBn td|d  || _
| j |j|  | j t}t|tkr^tdtt||  n:| jdkrd| _t| _| j t}t|tkrtd	tt||  n| j t}t|tkrtd
tt||  t| j| _| jdvrtdi }t| jD ]}|  }	|	| j  t|	j}
|	||
< qtt| dd d| _| jdkrt| | _d S d S )Nr   r   s   ttcfz2specify a font number between 0 and %d (inclusive)   'Not a Font Collection (not enough data)   wOFFwoffz!Not a WOFF font (not enough data)z1Not a TrueType or OpenType font (not enough data))   ZOTTOtruez1Not a TrueType or OpenType font (bad sfntVersion)c                 S  s
   | d j S )Nr   )offset)ir   r   r   <lambda>`   s   
 z%SFNTReader.__init__.<locals>.<lambda>)key) filecheckChecksumsflavor
flavorDataSFNTDirectoryEntryDirectoryEntryr   r   r   readTTCHeadernumFontsr	   offsetTablesfntDirectorySizelenr   r   unpacksfntDirectoryFormatWOFFDirectoryEntrywoffDirectorySizewoffDirectoryFormatr   range	numTablesfromFiletagr
   sorteditemstablesWOFFFlavorData)selfr%   r&   Z
fontNumberheaderr,   datar;   r"   entryr8   r   r   r   __init__2   s^   






zSFNTReader.__init__r8   str | bytesreturnboolc                 C  s
   || j v S Nr;   r=   r8   r   r   r   has_keyf      
zSFNTReader.has_keyKeysView[Tag]c                 C  s
   | j  S rE   )r;   keysr=   r   r   r   rK   k   rI   zSFNTReader.keysbytesc                 C  s   | j t| }|| j}| jrF|dkr%t|dd d |dd  }nt|}| jdkr;||jks9J d| |S ||jkrFtd| |S )zFetch the raw table data.headN             r   zbad checksum for '%s' table)	r;   r   loadDatar%   r&   calcChecksumcheckSumlogwarning)r=   r8   r@   r?   checksumr   r   r   __getitem__n   s   "

zSFNTReader.__getitem__Nonec                 C  s   | j t|= d S rE   )r;   r   rG   r   r   r   __delitem__   s   zSFNTReader.__delitem__c                 C  s   | j   d S rE   )r%   closerL   r   r   r   r[         zSFNTReader.closec                 C  s@   t | jtr	| jS | j }|d= | jj|d< | j |d< |S )Nr%   	_filename_filepos)
isinstancer%   r   __dict__copynametellr=   stater   r   r   __getstate__   s   
zSFNTReader.__getstate__c                 C  s<   d|vrt |dd| _| j|d | j| d S )Nr%   r]   rbr^   )openpopr%   r   r`   updaterd   r   r   r   __setstate__   s   zSFNTReader.__setstate__N)r   r   )r8   rB   rC   rD   )rC   rJ   )r8   rB   rC   rM   )r8   rB   rC   rY   )rC   rY   )__name__
__module____qualname__r   rA   rH   __contains__rK   rX   rZ   r[   rf   rk   r   r   r   r   r       s    

4



	r      Fr         rO   
         2   d   )	r      rq   r   rr   rp      rO   	   c                 C  s`   d|  kr
dksn t d| tr|dkr"ddlm} || |S ddlm} || t| dS )aE  Compress 'data' to Zlib format. If 'USE_ZOPFLI' variable is True,
    zopfli is used instead of the zlib module.
    The compression 'level' must be between 0 and 9. 1 gives best speed,
    9 gives best compression (0 gives no compression at all).
    The default value is a compromise between speed and compression (6).
    r   rz   zBad compression level: %s)compress)Znumiterations)
ValueError
USE_ZOPFLIzlibr{   Zzopfli.zlibZOPFLI_LEVELS)r?   levelr{   r   r   r   r{      s   
r{   c                   @  s\   e Zd Zdd Z			d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S )
SFNTWriterc                 O  sb   d}|rd|v r|d }n|rt |dkr|d }| tu r,|dkr,ddlm} t|S t| S )zpReturn an instance of the SFNTWriter sub-class which is compatible
        with the specified 'flavor'.
        Nr'   rq   Zwoff2r   )WOFF2Writer)r/   r   r   r   r   r   )r   r   r   r'   r   r   r   r   r      s   


zSFNTWriter.__new__r   Nc                 C  s   || _ || _t|| _|| _|| _| jdkr*t| _t| _	t
| _d| _t|t  | _n$| jr4J d| j t| _t| _	t| _ddlm} ||d\| _| _| _| j  | _| j| j	 || jj  | _| j | j | j d| j| j     t | _d S )Nr   ZwOFFUnknown flavor '%s'r   getSearchRange       )r%   r6   r   r   r'   r(   r4   directoryFormatr3   directorySizer2   r*   	signaturer.   sfntDirectoryEntrySizeorigNextTableOffsetr1   r)   fontTools.ttLibr   searchRangeentrySelector
rangeShiftrc   directoryOffset
formatSizenextTableOffsetr   writer
   r;   )r=   r%   r6   r   r'   r(   r   r   r   r   rA      s<   



zSFNTWriter.__init__c                 C  s$   || j v rtd| || j |< d S )Ncannot rewrite '%s' table)r;   r   )r=   r8   r@   r   r   r   setEntry  s   
zSFNTWriter.setEntryc                 C  s   || j v rtd| |  }||_| j|_|dkr2t|dd d |dd  |_|| _d|_	nt||_|
| j| | jdkrS| j|_|  j|jd	 d
@ 7  _| j|jd	 d
@  | _| jd| j| j    | j| j ksvJ | || dS )zWrite raw table data to disk.r   rN   NrO   rP   rQ   Tr   rq   r   )r;   r   r*   r8   r   r!   rS   rT   	headTableuncompressedsaveDatar%   r'   r   
origOffset
origLengthlengthr   rc   r   )r=   r8   r?   r@   r   r   r   __setitem__  s$   
"

zSFNTWriter.__setitem__c                 C  s
   | j | S rE   rF   rG   r   r   r   rX   1  rI   zSFNTWriter.__getitem__c           
      C  sz  t | j }t|| jkrtd| jt|f | jdkrd| _d| _d| _	|  j	dt| 7  _	|D ]\}}|  j	|j
d d@ 7  _	q4| jrK| jnt }|jd	ura|jd	ura|j| _|j| _nt| d
rvtd| jdd \| _| _nd | _| _|jrt|j| _| jdd | j | _t|j}t|| _| j| n	d | _ | _| _|jr| jdd | j }|d d@ }| jd||   | j | _t|j| _| j|j nd | _| _| jdd | j | _n| jrJ d| j 	 t !| j"| }| j| j#| j$  d}	|D ]\}}|dkrd}	||%  }q|	r.| &| | j| j# | j| d	S )zTAll tables must have been written to disk. Now write the
        directory.
        z-wrong number of tables; expected %d, found %dr   r   r   rQ   r   rq   r   Nr   z>HHr   rO   rx   r   r   rN   r   )'r9   r;   r:   r/   r6   r   r'   r   reservedZtotalSfntSizer   r(   r<   majorVersionminorVersionhasattrstructr0   r   metaDatametaOrigLengthr%   r   rc   
metaOffsetr{   
metaLengthr   privData
privOffset
privLengthr   r   packr   r   r   toStringwriteMasterChecksum)
r=   r;   r8   r@   r?   ZcompressedMetaDataoffZ	paddedOff	directoryZseenHeadr   r   r   r[   4  sn   







zSFNTWriter.closec                 C  s   g }| j  D ]}|| j | j q| jtkrWddlm} || jd\| _	| _
| _tt| }t| j  }|D ]\}}t }|j|_|j|_|j|_|j|_||  }q9tt| j t  }|t|kshJ |t| t|d@ }	d|	 d@ }
|
S )Nr   r   r       l   /ac )r;   rK   appendrT   r*   r)   r   r   r6   r   r   r   r   r   r1   r9   r:   r8   r   r!   r   r   r   r.   r/   r   rS   sum)r=   r   Z	checksumsr8   r   r;   r@   Z	sfntEntryZdirectory_endrW   checksumadjustmentr   r   r   _calcMasterChecksum{  s.   
zSFNTWriter._calcMasterChecksumc                 C  s:   |  |}| j| jd jd  | jtd| d S )NrN   rO   z>L)r   r%   r   r;   r!   r   r   r   )r=   r   r   r   r   r   r     s   
zSFNTWriter.writeMasterChecksumc                 C  s   dS NFr   rL   r   r   r   reordersTables     zSFNTWriter.reordersTables)r   NN)rl   rm   rn   r   rA   r   r   rX   r[   r   r   r   r   r   r   r   r      s    
1G r   a  
		> # big endian
		TTCTag:                  4s # "ttcf"
		Version:                 L  # 0x00010000 or 0x00020000
		numFonts:                L  # number of fonts
		# OffsetTable[numFonts]: L  # array with offsets from beginning of file
		# ulDsigTag:             L  # version 2.0 only
		# ulDsigLength:          L  # version 2.0 only
		# ulDsigOffset:          L  # version 2.0 only
z
		> # big endian
		sfntVersion:    4s
		numTables:      H    # number of tables
		searchRange:    H    # (max2 <= numTables)*16
		entrySelector:  H    # log2(max2 <= numTables)
		rangeShift:     H    # numTables*16-searchRange
zc
		> # big endian
		tag:            4s
		checkSum:       L
		offset:         L
		length:         L
ab  
		> # big endian
		signature:      4s   # "wOFF"
		sfntVersion:    4s
		length:         L    # total woff file size
		numTables:      H    # number of tables
		reserved:       H    # set to 0
		totalSfntSize:  L    # uncompressed size
		majorVersion:   H    # major version of WOFF file
		minorVersion:   H    # minor version of WOFF file
		metaOffset:     L    # offset to metadata block
		metaLength:     L    # length of compressed metadata
		metaOrigLength: L    # length of uncompressed metadata
		privOffset:     L    # offset to private data block
		privLength:     L    # length of private data block
z
		> # big endian
		tag:            4s
		offset:         L
		length:         L    # compressed length
		origLength:     L    # original length
		checkSum:       L    # original checksum
c                   @  sT   e Z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
dd ZdS )r*   c                 C  s
   d| _ d S r   )r   rL   r   r   r   rA     rI   zDirectoryEntry.__init__c                 C  s   t | j|| j|  d S rE   )r   r0   formatr   r   )r=   r%   r   r   r   r7     s   zDirectoryEntry.fromFilec                 C  s   t | j||  d S rE   )r   r0   r   )r=   strr   r   r   
fromString  s   zDirectoryEntry.fromStringc                 C  s   t | j| S rE   )r   r   r   rL   r   r   r   r     r\   zDirectoryEntry.toStringc                 C  s6   t | drd| jj| jt| f S d| jjt| f S )Nr8   z<%s '%s' at %x>z
<%s at %x>)r   	__class__rl   r8   idrL   r   r   r   __repr__  s   
zDirectoryEntry.__repr__c                 C  sD   | | j || j}t|| jksJ t| jdr | |}|S )N
decodeData)r   r!   r   r   r/   r   r   r   r=   r%   r?   r   r   r   rR     s   
zDirectoryEntry.loadDatac                 C  s:   t | jdr| |}t|| _|| j || d S )N
encodeData)r   r   r   r/   r   r   r!   r   r   r   r   r   r     s
   

zDirectoryEntry.saveDatac                 C     |S rE   r   )r=   rawDatar   r   r   r   
  r   zDirectoryEntry.decodeDatac                 C  r   rE   r   )r=   r?   r   r   r   r     r   zDirectoryEntry.encodeDataN)rl   rm   rn   rA   r7   r   r   r   rR   r   r   r   r   r   r   r   r*     s    r*   c                   @  s   e Zd ZeZeZdS )r)   N)rl   rm   rn   sfntDirectoryEntryFormatr   r   r   r   r   r   r   r)     s    r)   c                      s4   e Zd ZeZeZ fddZdd Zdd Z	  Z
S )r2   c                   s&   t t|   ttdst| _d S d S )NzlibCompressionLevel)superr2   rA   r   ZLIB_COMPRESSION_LEVELr   rL   r   r   r   rA     s   

zWOFFDirectoryEntry.__init__c                 C  sL   dd l }| j| jkr|}|S | j| jk sJ ||}t|| jks$J |S Nr   )r~   r   r   
decompressr/   )r=   r   r~   r?   r   r   r   r   %  s   
zWOFFDirectoryEntry.decodeDatac                 C  sR   t || _| jst|| j}| jst || jkr |}| j| _|S |}t || _|S rE   )r/   r   r   r{   r   r   )r=   r?   ZcompressedDatar   r   r   r   r   0  s   

zWOFFDirectoryEntry.encodeData)rl   rm   rn   woffDirectoryEntryFormatr   woffDirectoryEntrySizer   rA   r   r   __classcell__r   r   r   r   r2     s    r2   c                   @  s"   e Zd ZdZdddZdd ZdS )r<   r   Nc                 C  s   d | _ d | _d | _d | _|r`|j | _ |j| _|jrA|j|j |j|j}t	||jks0J | 
|}t	||jks>J || _|jrb|j|j |j|j}t	||jks[J || _d S d S d S rE   )r   r   r   r   r   r%   r   r   r   r/   _decompressr   r   r   )r=   readerr   r?   r   r   r   rA   A  s*   


zWOFFFlavorData.__init__c                 C  s   dd l }||S r   )r~   r   )r=   r   r~   r   r   r   r   V  s   
zWOFFFlavorData._decompressrE   )rl   rm   rn   ZFlavorrA   r   r   r   r   r   r<   >  s    
r<   c                 C  s   t | d }|r| dd|  7 } d}d}|d dksJ tdt | |D ]}| |||  }tdt |d  |}|t| d@ }q$|S )a,  Calculate the checksum for an arbitrary block of data.

    If the data length is not a multiple of four, it assumes
    it is to be padded with null byte.

            >>> print(calcChecksum(b"abcd"))
            1633837924
            >>> print(calcChecksum(b"abcdxyz"))
            3655064932
    r   r   r   i   >%dLr   )r/   r5   r   r0   r   )r?   	remaindervalueZ	blockSizer"   blockZlongsr   r   r   rS   \  s   rS   c                 C  s   |  d | t}t|tkrtdt }tt|| |j	dkr'td|j
dks8|j
dks8J d|j
 td|j | |jd	 |_|j
dkrN	 |S )
Nr   r   ttcfzNot a Font Collection   i   zunrecognized TTC version 0x%08xr   r   )r   r   ttcHeaderSizer/   r   r   r   r0   ttcHeaderFormatTTCTagVersionr   r,   r-   )r%   r?   r=   r   r   r   r+   t  s"   



r+   c                 C  sf   t  }d|_d|_||_| d | tt| | 	 }| t
jd|j gdg|j R   |S )Nr   r   r   r   )r   r   r   r,   r   r   r   r   r   rc   r   )r%   r,   r=   r!   r   r   r   writeTTCHeader  s   
&r   __main__)5__doc__
__future__r   collections.abcr   ior   typesr   ZfontTools.misc.textToolsr   ZfontTools.miscr   r   r   r	   r   collectionsr
   logging	getLoggerrl   rU   r   r   r   r}   r   r{   r   r   calcsizer   r1   r.   r   r   r4   r3   r   r   r*   r)   r2   r<   rS   r+   r   sysdoctestexittestmodfailedr   r   r   r   <module>   sf    
  _

	


	)(