
    ]Mh0Y              
          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
mZ ddlZddlmZ ddlZ ej        e          Z G d	 d
e          ZdZdZdddddddddd	ZefdZ G d de          ZdZ ej        e          ZdZ ej        e          ZdZ ej        e          Z dZ! ej        e!          Z"dZ# ej        e#          Z$ G d d e          Z% G d! d"e%          Z& G d# d$e%          Z' G d% d&          Z(d' Z)d( Z*d) Z+ed*k    r,ddl,Z,ddl-Z- e,j.         e-j/                    j0                   dS dS )+a  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.
    )BytesIO)SimpleNamespace)Tag)sstruct)
TTLibErrorTTLibFileIsCollectionErrorN)OrderedDictc                   J    e Zd Zd ZddZd ZeZd Zd Zd Z	d	 Z
d
 Zd ZdS )
SFNTReaderc                 @   |r| t           u rz|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      wOF2)WOFF2Reader)r   seekr   readfontTools.ttLib.woff2r   object__new__)clsargskwargsinfilesfntVersionr   s         T/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/ttLib/sfnt.pyr   zSFNTReader.__new__   s      		3C:%%!WFKKNNNfkk!nn--KKKNNNf$$======~~k222~~c"""    r   c                 >   || _         || _        d | _        d | _        t          | _        | j                             d           | j                             d          | _        | j                             d           | j        dk    rt          | j                   }|j
        }d|cxk    r|k     sn t          d|dz
  z            || _
        | j                             |j        |                    | j                             t                    }t          |          t          k    rt          d          t!          j        t$          ||            n| j        dk    rud| _        t&          | _        | j                             t(                    }t          |          t(          k    rt          d	          t!          j        t*          ||            na| j                             t                    }t          |          t          k    rt          d
          t!          j        t$          ||            t-          | j                  | _        | j        dvrt          d          i }t/          | j                  D ]I}|                                 }	|	                    | j                    t-          |	j                  }
|	||
<   Jt7          t9          |                                d                     | _        | j        dk    rt?          |           | _        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))   OTTOtruez1Not a TrueType or OpenType font (bad sfntVersion)c                     | d         j         S )Nr   )offset)is    r   <lambda>z%SFNTReader.__init__.<locals>.<lambda>]   s    qt{ r   )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+   
fontNumberheaderr1   datar@   r'   entryr=   s              r   __init__zSFNTReader.__init__/   s   	,0	q9>>!,,	qw&&"49--FH
----X----0H!|%   %DMINN6-j9:::9>>"344D4yy--- !JKKKN.d;;;;(( DK"4D9>>"344D4yy--- !DEEEN.d;;;;9>>"344D4yy--- !TUUUN.d;;;t/00#GGGPQQQt~&& 	  	 A''))ENN49%%%ei..CF3KK!&=R=R"S"S"STT ;&  ,T22DOOO ! r   c                     || j         v S Nr@   rB   r=   s     r   has_keyzSFNTReader.has_keyc   s    dk!!r   c                 4    | j                                         S rI   )r@   keysrB   s    r   rN   zSFNTReader.keysh   s    {!!!r   c                    | j         t          |                   }|                    | j                  }| j        r|dk    r&t          |dd         dz   |dd         z             }nt          |          }| j        dk    r||j        k    sJ d|z              n&||j        k    rt                              d|           |S )zFetch the raw table data.headN             r   zbad checksum for '%s' table)	r@   r   loadDatar*   r+   calcChecksumcheckSumlogwarning)rB   r=   rF   rE   checksums        r   __getitem__zSFNTReader.__getitem__k   s    CHH%~~di(( 	@f}}'RaR;(>bcc(JKK'--"Q&&5>1113PSV3V1111U^++93???r   c                 0    | j         t          |          = d S rI   )r@   r   rK   s     r   __delitem__zSFNTReader.__delitem__}   s    KC!!!r   c                 8    | j                                          d S rI   )r*   closerO   s    r   r_   zSFNTReader.close   s    	r   c                     t          | j        t                    r| j        S | j                                        }|d= | j        j        |d<   | j                                        |d<   |S )Nr*   	_filename_filepos)
isinstancer*   r   __dict__copynametellrB   states     r   __getstate__zSFNTReader.__getstate__   sc    di)) 	!=  ""$$&M!Y^k INN,,jr   c                     d|vrUt          |                    d          d          | _        | j                            |                    d                     | j                            |           d S )Nr*   ra   rbrb   )openpopr*   r   rd   updaterh   s     r   __setstate__zSFNTReader.__setstate__   sf    UYY{33T::DIINN599Z00111U#####r   N)r   r   )__name__
__module____qualname__r   rG   rL   __contains__rN   r[   r]   r_   rj   rp    r   r   r   r      s        # # #"23 23 23 23h" " " L" " "  $" " "  
 
 
$ $ $ $ $r   r      Fr         rR   
         2   d   )	r      rw   r   rx   rv      rR   	   c                     d|cxk    rdk    sn t          d|z            t          r|dk    rddlm}  || |          S ddlm}  || t
          |                   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   r   zBad compression level: %s)compress)numiterations)
ValueError
USE_ZOPFLIzlibr   zopfli.zlibZOPFLI_LEVELS)rE   levelr   s      r   r   r      s     OOOO!OOOO4u<=== B!!!!!!!xe$$$((((((xM%,@AAAAr   c                   L    e Zd Zd Z	 	 	 ddZd Zd Zd Zd Zd	 Z	d
 Z
d ZdS )
SFNTWriterc                     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,   rw   woff2r   )WOFF2Writer)r4   r   r   r   r   r   )r   r   r   r,   r   s        r   r   zSFNTWriter.__new__   s      	h&((H%FF 	c$ii!mm!WF*  ======~~k222~~c"""r   r"   Nc                 &   || _         || _        t          |          | _        || _        || _        | j        dk    rCt          | _        t          | _	        t          | _        d| _        t          |t          z  z   | _        nb| j        rJ d| j        z              t           | _        t          | _	        t"          | _        ddlm}  ||d          \  | _        | _        | _        | j                                         | _        | j        | j	        z   || j        j        z  z   | _        | j                             | j                   | j                             d| j        | j                                         z
  z             t;                      | _        d S )Nr!   wOFFUnknown flavor '%s'r   getSearchRange       )r*   r;   r   r   r,   r-   r9   directoryFormatr8   directorySizer7   r/   	signaturer3   sfntDirectoryEntrySizeorigNextTableOffsetr6   r.   fontTools.ttLibr   searchRangeentrySelector
rangeShiftrg   directoryOffset
formatSizenextTableOffsetr   writer	   r@   )rB   r*   r;   r   r,   r-   r   s          r   rG   zSFNTWriter.__init__   s    	"{++$;&  #6D !2D"4D#DN "I0F$FF $$ {GG$9DK$GGGG#6D !2D"4D666666DRN2E EADd0$/  $y~~//  !$-889 	 		t+,,,	!5	8H8H!HIJJJ!mmr   c                 P    || j         v rt          d|z            || j         |<   d S )Ncannot rewrite '%s' table)r@   r   )rB   r=   rF   s      r   setEntryzSFNTWriter.setEntry
  s5    $+83>??? Cr   c                    || j         v rt          d|z            |                                 }||_        | j        |_        |dk    r9t          |dd         dz   |dd         z             |_        || _        d|_	        nt          |          |_        |
                    | j        |           | j        dk    r'| j        |_        | xj        |j        d	z   d
z  z  c_        | j        |j        d	z   d
z  z   | _        | j                            d| j        | j                                        z
  z             | j        | j                                        k    sJ |                     ||           dS )zWrite raw table data to disk.r   rQ   NrR   rS   rT   Tr!   rw   r   )r@   r   r/   r=   r   r&   rV   rW   	headTableuncompressedsaveDatar*   r,   r   
origOffset
origLengthlengthr   rg   r   )rB   r=   rE   rF   s       r   __setitem__zSFNTWriter.__setitem__  sl   $+83>???##%%	+&==)$rr([*@49*LMMEN!DN!%E)$//ENty$''';&  #7E$$)9A)=(CC$$#3q8HB7NO
 		!5	8H8H!HIJJJ#ty~~'7'77777c5!!!!!r   c                     | j         |         S rI   rJ   rK   s     r   r[   zSFNTWriter.__getitem__.  s    {3r   c                    t          | j                                                  }t          |          | j        k    r&t          d| j        t          |          fz            | j        dk    rd| _        d| _        d| _	        | xj	        dt          |          z  z  c_	        |D ] \  }}| xj	        |j
        dz   dz  z  c_	        !| j        r| j        nt                      }|j         |j        |j        | _        |j        | _        nNt          | d
          r0t!          j        d| j        dd                   \  | _        | _        ndx| _        | _        |j        rt          |j                  | _        | j                            dd           | j                                        | _        t3          |j                  }t          |          | _        | j                            |           ndx| _        x| _        | _        |j        r| j                            dd           | j                                        }|dz   dz  }| j                            d||z
  z             | j                                        | _        t          |j                  | _        | j                            |j                   ndx| _        | _        | j                            dd           | j                                        | _        n| j        rJ d| j        z              	 tA          j!        | j"        |           }| j                            | j#        | j$        z              d}	|D ]$\  }}|dk    rd}	||%                                z   }%|	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   rT   r   rw   r   Nr   z>HHr   rR   r~   r   r   rQ   r   )'r>   r@   r?   r4   r;   r   r,   r   reservedtotalSfntSizer   r-   rA   majorVersionminorVersionhasattrstructr5   r   metaDatametaOrigLengthr*   r   rg   
metaOffsetr   
metaLengthr   privData
privOffset
privLengthr   r   packr   r   r   toStringwriteMasterChecksum)
rB   r@   r=   rF   rE   compressedMetaDataoff	paddedOff	directoryseenHeads
             r   r_   zSFNTWriter.close1  s    ))++,,v;;$.((?>3v;;/0  
 ;&  $DNDM!#D"s6{{"22$ B B
U""u'7!';r&AA"""&*oK4??>;K;KD ,1B1N$($5!$($5!!4-- >;A=t~ac2< <8D%t'8'8 =>=D%(9} L&)$-&8&8#	q!$$$"&).."2"2%-dm%<%<""%&8"9"9	 23333JKKK$/D4G} 	6	q!$$$inn&& 1WN		S 9:::"&).."2"2"%dm"4"4	....455$/INN1a   )..**DKK {GG$9DK$GGGGL!5t<<		t+d.@@AAA  	5 	5JCf}}!ENN$4$44II 	0$$Y///	t+,,,		"""""r   c                    t          | j                                                  }g }t          t	          |                    D ]-}|                    | j        ||                  j                   .| j        t          k    rddl	m
}  || j        d          \  | _        | _        | _        t          j        t"          |           }t%          | j                                                  }|D ]Z\  }}t                      }	|j        |	_        |j        |	_        |j        |	_        |j        |	_        ||	                                z   }[t4          t	          | j                  t6          z  z   }
|
t	          |          k    sJ |                    t9          |                     t;          |          dz  }d|z
  dz  }|S )Nr   r   r       l   /ac )listr@   rN   r:   r4   appendrW   r/   r.   r   r   r;   r   r   r   r   r   r6   r>   r?   r=   r   r&   r   r   r   r3   r   rV   sum)rB   r   tags	checksumsr'   r   r@   r=   rF   	sfntEntrydirectory_endrZ   checksumadjustments                r   _calcMasterChecksumzSFNTWriter._calcMasterChecksumx  s   DK$$&&''	s4yy!! 	< 	<AT[a1:;;;;"444666666DRNE EADd0$/  %8$??IDK--//00F$ = =
U.00	 %		%*^	"#(#3	 #(#3	 %	(:(:(<(<<		)C,<,<?U,UUI....i00111y>>J.(83zA!!r   c                     |                      |          }| j                            | j        d         j        dz              | j                            t          j        d|                     d S )NrQ   rR   z>L)r   r*   r   r@   r&   r   r   r   )rB   r   r   s      r   r   zSFNTWriter.writeMasterChecksum  s`    !55i@@	t{6*1A5666	D*<==>>>>>r   c                     dS NFru   rO   s    r   reordersTableszSFNTWriter.reordersTables  s    ur   )r"   NN)rq   rr   rs   r   rG   r   r   r[   r_   r   r   r   ru   r   r   r   r      s        # # #, '/$ /$ /$ /$b! ! !" " "<     E# E# E#N" " "B? ? ?    r   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                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )r/   c                     d| _         d S r   )r   rO   s    r   rG   zDirectoryEntry.__init__  s    !r   c                 l    t          j        | j        |                    | j                  |            d S rI   )r   r5   formatr   r   )rB   r*   s     r   r<   zDirectoryEntry.fromFile  s,    t{DIIdo$>$>EEEEEr   c                 <    t          j        | j        ||            d S rI   )r   r5   r   )rB   strs     r   
fromStringzDirectoryEntry.fromString  s    t{C.....r   c                 6    t          j        | j        |           S rI   )r   r   r   rO   s    r   r   zDirectoryEntry.toString  s    |DK...r   c                     t          | d          r$d| j        j        | j        t	          |           fz  S d| j        j        t	          |           fz  S )Nr=   z<%s '%s' at %x>z
<%s at %x>)r   	__class__rq   r=   idrO   s    r   __repr__zDirectoryEntry.__repr__  sO    4 	F$(?2d88'TTT4>#:BtHH"EEEr   c                     |                     | j                   |                    | j                  }t	          |          | j        k    sJ t          | j        d          r|                     |          }|S )N
decodeData)r   r&   r   r   r4   r   r   r   rB   r*   rE   s      r   rU   zDirectoryEntry.loadData  sl    		$+yy%%4yyDK''''4><00 	)??4((Dr   c                     t          | j        d          r|                     |          }t          |          | _        |                    | j                   |                    |           d S )N
encodeData)r   r   r   r4   r   r   r&   r   r   s      r   r   zDirectoryEntry.saveData  s`    4><00 	)??4((D$ii		$+

4r   c                     |S rI   ru   )rB   rawDatas     r   r   zDirectoryEntry.decodeData  s    r   c                     |S rI   ru   )rB   rE   s     r   r   zDirectoryEntry.encodeData  s    r   N)rq   rr   rs   rG   r<   r   r   r   rU   r   r   r   ru   r   r   r/   r/     s        " " "F F F/ / // / /F F F          r   r/   c                       e Zd ZeZeZdS )r.   N)rq   rr   rs   sfntDirectoryEntryFormatr   r   r   ru   r   r   r.   r.     s        %F'JJJr   r.   c                   2     e Zd ZeZeZ fdZd Zd Z	 xZ
S )r7   c                     t          t          |                                            t          t          d          st          | _        d S d S )NzlibCompressionLevel)superr7   rG   r   ZLIB_COMPRESSION_LEVELr   )rB   r   s    r   rG   zWOFFDirectoryEntry.__init__  sN     $''00222 )+ABB 	?(>D%%%	? 	?r   c                     dd l }| j        | j        k    r|}nA| j        | j        k     sJ |                    |          }t	          |          | j        k    sJ |S Nr   )r   r   r   
decompressr4   )rB   r   r   rE   s       r   r   zWOFFDirectoryEntry.decodeData#  se    ;$/))DD;0000??7++Dt99////r   c                     t          |          | _        | j        st          || j                  }| j        st          |          | j        k    r|}| j        | _        n|}t          |          | _        |S rI   )r4   r   r   r   r   r   )rB   rE   compressedDatar   s       r   r   zWOFFDirectoryEntry.encodeData.  ss    d))  	G%dD,EFFN 	'N 3 3t F FG/DKK$Gg,,DKr   )rq   rr   rs   woffDirectoryEntryFormatr   woffDirectoryEntrySizer   rG   r   r   __classcell__)r   s   @r   r7   r7     s`        %F'J	? 	? 	? 	? 	?	 	 	      r   r7   c                        e Zd ZdZddZd ZdS )rA   r!   Nc                 r   d | _         d | _        d | _        d | _        |r|j         | _         |j        | _        |j        r|j                            |j                   |j                            |j                  }t          |          |j        k    sJ | 
                    |          }t          |          |j        k    sJ || _        |j        rc|j                            |j                   |j                            |j                  }t          |          |j        k    sJ || _        d S d S d S rI   )r   r   r   r   r   r*   r   r   r   r4   _decompressr   r   r   )rB   readerr   rE   s       r   rG   zWOFFFlavorData.__init__?  s=      	% & 3D & 3D  %  !2333 +**6+<==7||v'88888''004yyF$99999 $  %  !2333{''(9::4yyF$55555 $	% 	%% %r   c                 4    dd l }|                    |          S r   )r   r   )rB   r   r   s      r   r   zWOFFFlavorData._decompressT  s    w'''r   rI   )rq   rr   rs   FlavorrG   r   ru   r   r   rA   rA   <  s<        F% % % %*( ( ( ( (r   rA   c                 8   t          |           dz  }|r| dd|z
  z  z  } d}d}|dz  dk    sJ t          dt          |           |          D ]L}| |||z            }t          j        dt          |          dz  z  |          }|t	          |          z   dz  }M|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   )r4   r:   r   r5   r   )rE   	remaindervalue	blockSizer'   blocklongss          r   rV   rV   Z  s     D		AI (Y''EIq=A1c$ii++ 2 2QY&'fE

a8%@@U#z1Lr   c                    |                      d           |                     t                    }t          |          t          k    rt	          d          t                      }t          j        t          ||           |j	        dk    rt	          d          |j
        dk    s|j
        dk    sJ d|j
        z              t          j        d|j        z  |                     |j        d	z                      |_        |j
        dk    r	 |S )
Nr   r   ttcfzNot a Font Collection   i   zunrecognized TTC version 0x%08xr   r   )r   r   ttcHeaderSizer4   r   r   r   r5   ttcHeaderFormatTTCTagVersionr   r1   r2   )r*   rE   rB   s      r   r0   r0   r  s    IIaLLL99]##D
4yyM!!BCCCDN?D$///{f0111<:%%)C)C)C)DL8 *D)C)C }		$-!*; < < D |z!!Kr   c                 d   t                      }d|_        d|_        ||_        |                     d           |                     t          j        t          |                     | 	                                }|                     t          j        d|j        z  gdg|j        z  R             |S )Nr  r  r   r   )r   r
  r  r1   r   r   r   r   r	  rg   r   )r*   r1   rB   r&   s       r   writeTTCHeaderr    s    DDKDLDMIIaLLLJJw|OT22333YY[[FJJv{6DM1JaS4=5HJJJKKKMr   __main__)1__doc__ior   typesr   fontTools.misc.textToolsr   fontTools.miscr   r   r   r   r   collectionsr	   logging	getLoggerrq   rX   r   r   r   r   r   r   r   r	  calcsizer  r6   r3   r   r   r9   r8   r   r   r/   r.   r7   rA   rV   r0   r  sysdoctestexittestmodfailedru   r   r   <module>r     s          ! ! ! ! ! ! ( ( ( ( ( ( " " " " " " B B B B B B B B  # # # # # #  g!!|$ |$ |$ |$ |$ |$ |$ |$@   
 					
  0 B B B B&Z Z Z Z Z Z Z Z~	 ! 11  %G$%899   *)*BCC  " %G$%899   *)*BCC & & & & &V & & &R( ( ( ( ( ( ( (
% % % % % % % %P( ( ( ( ( ( ( (<  0  (	 	 	 zJJJNNNCH_W_%&&&&&	 r   