
    h0Y              
          S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
Jr  SSKrSSKJr  SSKr\R                   " \5      r " S	 S
\5      rSrSrSSSSSSSSSS.	r\4S jr " S S\5      rSr\R6                  " \5      rSr\R6                  " \5      rSr\R6                  " \5      r Sr!\R6                  " \!5      r"Sr#\R6                  " \#5      r$ " S S \5      r% " S! S"\%5      r& " S# S$\%5      r' " S% S&5      r(S' r)S( r*S) r+\S*:X  a4  SSK,r,SSK-r-\,R\                  " \-R^                  " 5       R`                  5        gg)+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                   R    \ rS rSrS rSS jrS r\rS rS r	S r
S rS	 rS
 rSrg)
SFNTReader   c                    U(       ak  U [         L ab  US   nUR                  S5        [        UR                  S5      5      nUR                  S5        US:X  a  SSKJn  [        R                  U5      $ [        R                  U 5      $ )z]Return 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         F/var/www/html/env/lib/python3.13/site-packages/fontTools/ttLib/sfnt.pyr   SFNTReader.__new__   sh     C:%!WFKKNfkk!n-KKKNf$=~~k22~~c""    c                    Xl         X l        S U l        S U l        [        U l        U R                   R                  S5        U R                   R                  S5      U l        U R                   R                  S5        U R                  S:X  a  [        U R                   5      nUR                  nSUs=::  a  U:  d  O  [        SUS-
  -  5      eXPl
        U R                   R                  UR                  U   5        U R                   R                  [        5      n[        U5      [        :w  a  [        S5      e[         R"                  " [$        X`5        OU R                  S:X  ak  SU l        [&        U l        U R                   R                  [(        5      n[        U5      [(        :w  a  [        S	5      e[         R"                  " [*        X`5        OXU R                   R                  [        5      n[        U5      [        :w  a  [        S
5      e[         R"                  " [$        X`5        [-        U R                  5      U l        U R                  S;  a  [        S5      e0 n[/        U R0                  5       HG  nU R                  5       n	U	R3                  U R                   5        [-        U	R4                  5      n
XU
'   MI     [7        [9        UR;                  5       S S95      U l        U R                  S:X  a  [?        U 5      U l        g g )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                      U S   R                   $ )Nr   )offset)is    r   <lambda>%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headerr3   datarB   r(   entryr?   s              r   __init__SFNTReader.__init__/   sI   	,0		q99>>!,		qw&"499-FH
-X-0H!|%  %MIINN6--j9:99>>"34D4y-- !JKKNN.;( DK"4D99>>"34D4y-- !DEENN.;99>>"34D4y-- !TUUNN.;t//0#GGPQQt~~&A'')ENN499%eii.C3K	 '
 "&=R"ST ;;& ,T2DO !r   c                     XR                   ;   $ NrB   rD   r?   s     r   has_keySFNTReader.has_keyc   s    kk!!r   c                 6    U R                   R                  5       $ rL   )rB   keysrD   s    r   rR   SFNTReader.keysh   s    {{!!r   c                    U R                   [        U5         nUR                  U R                  5      nU R                  (       az  US:X  a  [        USS S-   USS -   5      nO[        U5      nU R                  S:  a  XBR                  :X  d
   SU-  5       e U$ XBR                  :w  a  [        R                  SU5        U$ )zFetch the raw table data.headN             r   zbad checksum for '%s' table)	rB   r   loadDatar,   r-   calcChecksumcheckSumlogwarning)rD   r?   rH   rG   checksums        r   __getitem__SFNTReader.__getitem__k   s    CH%~~dii(f}'Ra;(>bc(JK'-""Q&>>1V3PSV3VV1  ^^+93?r   c                 0    U R                   [        U5      	 g rL   )rB   r   rN   s     r   __delitem__SFNTReader.__delitem__}   s    KKC!r   c                 8    U R                   R                  5         g rL   )r,   closerS   s    r   rf   SFNTReader.close   s    		r   c                    [        U R                  [        5      (       a  U R                  $ U R                  R	                  5       nUS	 U R                  R
                  US'   U R                  R                  5       US'   U$ )Nr,   	_filename_filepos)
isinstancer,   r   __dict__copynametellrD   states     r   __getstate__SFNTReader.__getstate__   sd    dii))==  ""$&M!YY^^k IINN,jr   c                     SU;  aJ  [        UR                  S5      S5      U l        U R                  R                  UR                  S5      5        U R                  R                  U5        g )Nr,   ri   rbrj   )openpopr,   r   rl   updaterp   s     r   __setstate__SFNTReader.__setstate__   sL    UYY{3T:DIIINN599Z01U#r   )r1   r-   r,   r.   r/   r3   r   rB   N)r   )__name__
__module____qualname____firstlineno__r   rI   rO   __contains__rR   r`   rc   rf   rr   ry   __static_attributes__ r   r   r   r      s7    #"23h" L"$"
$r   r      Fr         rW   
         2   d   )	r      r   r   r   r      rW   	   c                     SUs=::  a  S::  d  O  [        SU-  5      e[        (       a  US:X  a  SSKJn  U" X5      $ SSKJn  U" U [
        U   S9$ )a1  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)rG   levelr   s      r   r   r      sN     O!O4u<==:!!$$(M%,@AAr   c                   T    \ rS rSrS r   SS jrS rS rS rS r	S	 r
S
 rS rSrg)
SFNTWriter   c                     SnU(       a  SU;   a  US   nOU(       a  [        U5      S:  a  US   nU [        L a!  US:X  a  SSKJn  [        R                  U5      $ [        R                  U 5      $ )z`Return an instance of the SFNTWriter sub-class which is compatible
with the specified 'flavor'.
Nr.   r   woff2r   )WOFF2Writer)r6   r   r   r   r   r   )r   r   r   r.   r   s        r   r   SFNTWriter.__new__   sd     h&(H%Fc$i!m!WF* =~~k22~~c""r   Nc                 Z   Xl         X l        [        U5      U l        X@l        XPl        U R                  S:X  a>  [        U l        [        U l	        [        U l        SU l        [        U[        -  -   U l        OhU R                  (       a   SU R                  -  5       e[         U l        [        U l	        ["        U l        SSKJn  U" US5      u  U l        U l        U l        U R                   R/                  5       U l        U R0                  U R                  -   X R                  R2                  -  -   U l        U R                   R7                  U R4                  5        U R                   R9                  SU R4                  U R                   R/                  5       -
  -  5        [;        5       U l        g )Nr"   wOFFUnknown flavor '%s'r   getSearchRange       )r,   r=   r   r   r.   r/   r;   directoryFormatr:   directorySizer9   r1   	signaturer5   sfntDirectoryEntrySizeorigNextTableOffsetr8   r0   fontTools.ttLibr   searchRangeentrySelector
rangeShiftro   directoryOffset
formatSizenextTableOffsetr   writer	   rB   )rD   r,   r=   r   r.   r/   r   s          r   rI   SFNTWriter.__init__   sV    	"{+$;;& #6D !2D"4D#DN "I0F$FF $ {{G$9DKK$GG?#6D !2D"4D6DR2EADd0$/  $yy~~/    !--8889 	 			t++,		!5!5		8H!HIJ!mr   c                 Z    XR                   ;   a  [        SU-  5      eX R                   U'   g )Ncannot rewrite '%s' table)rB   r   )rD   r?   rH   s      r   setEntrySFNTWriter.setEntry
  s)    ++83>?? Cr   c                    XR                   ;   a  [        SU-  5      eU R                  5       nXl        U R                  Ul        US:X  a*  [        USS S-   USS -   5      Ul        X l        SUl	        O[        U5      Ul        UR                  U R                  U5        U R                  S:X  a6  U R                  Ul        U =R                  UR                  S	-   S
-  -  sl        U R                  UR                   S	-   S
-  -   U l        U R                  R#                  SU R                  U R                  R%                  5       -
  -  5        U R                  U R                  R%                  5       :X  d   eU R'                  X5        g)zWrite raw table data to disk.r   rV   NrW   rX   rY   Tr"   r   r   )rB   r   r1   r?   r   r'   r[   r\   	headTableuncompressedsaveDatar,   r.   r   
origOffset
origLengthlengthr   ro   r   )rD   r?   rG   rH   s       r   __setitem__SFNTWriter.__setitem__  sE   ++83>??##%	++&=)$r([*@49*LMEN!N!%E)$/ENtyy$';;& #77E$$)9)9A)=(CC$#33q8HB7NO
 			!5!5		8H!HIJ##tyy~~'7777c!r   c                      U R                   U   $ rL   rM   rN   s     r   r`   SFNTWriter.__getitem__.  s    {{3r   c                    [        U R                  R                  5       5      n[        U5      U R                  :w  a#  [        SU R                  [        U5      4-  5      eU R                  S:X  Ga  SU l        SU l        SU l	        U =R                  S[        U5      -  -  sl	        U H*  u  p#U =R                  UR                  S-   S-  -  sl	        M,     U R                  (       a  U R                  O	[        5       nUR                  b0  UR                  b#  UR                  U l        UR                  U l        OQ[        U S
5      (       a2  [         R"                  " SU R$                  SS 5      u  U l        U l        OS=U l        U l        UR&                  (       a  [        UR&                  5      U l        U R*                  R-                  SS5        U R*                  R/                  5       U l        [3        UR&                  5      n[        U5      U l        U R*                  R7                  U5        OS=U l        =U l        U l        UR8                  (       a  U R*                  R-                  SS5        U R*                  R/                  5       nUS-   S-  nU R*                  R7                  SXv-
  -  5        U R*                  R/                  5       U l        [        UR8                  5      U l        U R*                  R7                  UR8                  5        OS=U l        U l        U R*                  R-                  SS5        U R*                  R/                  5       U l        O&U R                  (       a   SU R                  -  5       e [@        RB                  " U RD                  U 5      nU R*                  R-                  U RF                  U RH                  -   5        Sn	U H  u  p#US:X  a  Sn	XRK                  5       -   nM!     U	(       a  U RM                  U5        U R*                  R-                  U RF                  5        U R*                  R7                  U5        g	)zDAll tables must have been written to disk. Now write the
directory.
z-wrong number of tables; expected %d, found %dr"   r!   r   rY   r   r   r   Nr   z>HHr   rW   r   r   r   rV   r   )'r@   rB   rA   r6   r=   r   r.   r   reservedtotalSfntSizer   r/   rC   majorVersionminorVersionhasattrstructr7   r   metaDatametaOrigLengthr,   r   ro   
metaOffsetr   
metaLengthr   privData
privOffset
privLengthr   r   packr   r   r   toStringwriteMasterChecksum)
rD   rB   r?   rH   rG   compressedMetaDataoff	paddedOff	directoryseenHeads
             r   rf   SFNTWriter.close1  s<    ))+,v;$..(?>>3v;/0 
 ;;& $DNDM!#D"s6{"22$
""u'7'7!';r&AA" % '+oo4??>;KD  ,1B1B1N$($5$5!$($5$5!4--;A==t~~a2<8D%t'8 =>=D%(9}}&)$--&8#		q!$"&)).."2%-dmm%<""%&8"9		 23JKKK$/D4G}}		q!$iinn& 1WN			 9:"&)).."2"%dmm"4		.455$/IINN1a ))..*DK {{G$9DKK$GG?LL!5!5t<			t++d.@.@@A JCf}!NN$44I ! $$Y/		t++,			"r   c                 t   [        U R                  R                  5       5      n/ n[        [	        U5      5       H-  nUR                  U R                  X$      R                  5        M/     U R                  [        :w  a  SSK	J
n  U" U R                  S5      u  U l        U l        U l        [        R                   " ["        U 5      n[%        U R                  R'                  5       5      nU He  u  px[        5       n	UR(                  U	l        UR                  U	l        UR*                  U	l        UR.                  U	l        XR3                  5       -   nMg     [4        [	        U R                  5      [6        -  -   n
U
[	        U5      :X  d   eUR                  [9        U5      5        [;        U5      S-  nSU-
  S-  nU$ )Nr   r   r       l   /ac )listrB   rR   r<   r6   appendr\   r1   r0   r   r   r=   r   r   r   r   r   r8   r@   rA   r?   r   r'   r   r   r   r5   r   r[   sum)rD   r   tags	checksumsr(   r   rB   r?   rH   	sfntEntrydirectory_endr_   checksumadjustments                r   _calcMasterChecksumSFNTWriter._calcMasterChecksumx  sm   DKK$$&'	s4y!AT[[1::; " "446DREADd0$/  %8$?IDKK--/0F$
.0	 %			%*^^	"#(#3#3	 #(#3#3	 %(:(:(<<	 % *C,<?U,UUI...i01y>J.(83zA!!r   c                     U R                  U5      nU R                  R                  U R                  S   R                  S-   5        U R                  R                  [        R                  " SU5      5        g )NrV   rW   z>L)r   r,   r   rB   r'   r   r   r   )rD   r   r   s      r   r   SFNTWriter.writeMasterChecksum  sS    !55i@		t{{6*11A56		D*<=>r   c                     gNFr   rS   s    r   reordersTablesSFNTWriter.reordersTables  s    r   )r1   r   r   r   r   r,   r.   r/   r   r   r   r   r   r   r   r   r=   r   r   r   r   r   r   r   r   rB   r   )r#   NN)r|   r}   r~   r   r   rI   r   r   r`   rf   r   r   r   r   r   r   r   r   r      s>    #, '/$b!"< 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                   J    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)r1   i  c                     SU l         g r   )r   rS   s    r   rI   DirectoryEntry.__init__  s
    !r   c                 z    [         R                  " U R                  UR                  U R                  5      U 5        g rL   )r   r7   formatr   r   )rD   r,   s     r   r>   DirectoryEntry.fromFile  s#    t{{DIIdoo$>Er   c                 F    [         R                  " U R                  X5        g rL   )r   r7   r   )rD   strs     r   
fromStringDirectoryEntry.fromString  s    t{{C.r   c                 D    [         R                  " U R                  U 5      $ rL   )r   r   r   rS   s    r   r   DirectoryEntry.toString  s    ||DKK..r   c                     [        U S5      (       a/  SU R                  R                  U R                  [	        U 5      4-  $ SU R                  R                  [	        U 5      4-  $ )Nr?   z<%s '%s' at %x>z
<%s at %x>)r   	__class__r|   r?   idrS   s    r   __repr__DirectoryEntry.__repr__  sQ    4$(?(?2d8'TTT4>>#:#:BtH"EEEr   c                     UR                  U R                  5        UR                  U R                  5      n[	        U5      U R                  :X  d   e[        U R                  S5      (       a  U R                  U5      nU$ )N
decodeData)r   r'   r   r   r6   r   r   r   rD   r,   rG   s      r   rZ   DirectoryEntry.loadData  s^    		$++yy%4yDKK'''4>><00??4(Dr   c                     [        U R                  S5      (       a  U R                  U5      n[        U5      U l        UR                  U R                  5        UR                  U5        g )N
encodeData)r   r   r  r6   r   r   r'   r   r   s      r   r   DirectoryEntry.saveData  sH    4>><00??4(D$i		$++

4r   c                     U$ rL   r   )rD   rawDatas     r   r   DirectoryEntry.decodeData  s    r   c                     U$ rL   r   )rD   rG   s     r   r  DirectoryEntry.encodeData  s    r   )r   r   N)r|   r}   r~   r   rI   r>   r   r   r   rZ   r   r   r  r   r   r   r   r1   r1     s1    "F//Fr   r1   c                       \ rS rSr\r\rSrg)r0   i  r   N)	r|   r}   r~   r   sfntDirectoryEntryFormatr   r   r   r   r   r   r   r0   r0     s    %F'Jr   r0   c                   <   ^  \ rS rSr\r\rU 4S jrS r	S r
SrU =r$ )r9   i  c                 l   > [         [        U ]  5         [        [        S5      (       d  [        U l        g g )NzlibCompressionLevel)superr9   rI   r   ZLIB_COMPRESSION_LEVELr  )rD   r   s    r   rI   WOFFDirectoryEntry.__init__  s0     $02 )+ABB(>D% Cr   c                     SS K nU R                  U R                  :X  a  UnU$ U R                  U R                  :  d   eUR                  U5      n[	        U5      U R                  :X  d   eU$ Nr   )r   r   r   
decompressr6   )rD   r  r   rG   s       r   r   WOFFDirectoryEntry.decodeData#  sb    ;;$//)D
  ;;000??7+Dt9///r   c                    [        U5      U l        U R                  (       d  [        XR                  5      nU R                  (       d  [        W5      U R                  :  a  UnU R                  U l        U$ Un[        U5      U l        U$ rL   )r6   r   r   r   r  r   )rD   rG   compressedDatar  s       r   r  WOFFDirectoryEntry.encodeData.  sm    d)  %d,E,EFNN 3t FG//DK  %Gg,DKr   )r   r   r  )r|   r}   r~   r   woffDirectoryEntryFormatr   woffDirectoryEntrySizer   rI   r   r  r   __classcell__)r   s   @r   r9   r9     s!    %F'J	?	 r   r9   c                   (    \ rS rSrSrSS jrS rSrg)rC   i<  r"   Nc                    S U l         S U l        S U l        S U l        U(       GaH  UR                   U l         UR                  U l        UR                  (       a  UR
                  R                  UR                  5        UR
                  R                  UR                  5      n[        U5      UR                  :X  d   eU R                  U5      n[        U5      UR                  :X  d   eX0l        UR                  (       al  UR
                  R                  UR                  5        UR
                  R                  UR                  5      n[        U5      UR                  :X  d   eX0l        g g g rL   )r   r   r   r   r   r,   r   r   r   r6   _decompressr   r   r   )rD   readerr  rG   s       r   rI   WOFFFlavorData.__init__?  s!      & 3 3D & 3 3D    !2!23 ++**6+<+<=7|v'8'8888''04yF$9$9999 $    !2!23{{''(9(9:4yF$5$5555 $	 ! r   c                 ,    SS K nUR                  U5      $ r  )r   r  )rD   r  r   s      r   r  WOFFFlavorData._decompressT  s    w''r   )r   r   r   r   rL   )r|   r}   r~   r   FlavorrI   r  r   r   r   r   rC   rC   <  s    F%*(r   rC   c                    [        U 5      S-  nU(       a  U SSU-
  -  -  n SnSnUS-  S:X  d   e[        S[        U 5      U5       H@  nXXC-    n[        R                  " S[        U5      S-  -  U5      nU[	        U5      -   S-  nMB     U$ )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   )r6   r<   r   r7   r   )rG   	remaindervalue	blockSizer(   blocklongss          r   r[   r[   Z  s     D	AIY''EIq=A1c$i+'fE
a8%@U#z1 , Lr   c                 "   U R                  S5        U R                  [        5      n[        U5      [        :w  a  [	        S5      e[        5       n[        R                  " [        X5        UR                  S:w  a  [	        S5      eUR                  S:X  d$  UR                  S:X  d   SUR                  -  5       e[        R                  " SUR                  -  U R                  UR                  S	-  5      5      Ul        UR                  S:X  a   U$ )
Nr   r    ttcfzNot a Font Collection   i   zunrecognized TTC version 0x%08xr$  r   )r   r   ttcHeaderSizer6   r   r   r   r7   ttcHeaderFormatTTCTagVersionr   r3   r4   )r,   rG   rD   s      r   r2   r2   r  s    IIaL99]#D
4yM!BCCDNN?D/{{f011<<:%)C )DLL8C }}		$--!*; <D ||z!Kr   c                 Z   [        5       nSUl        SUl        Xl        U R	                  S5        U R                  [        R                  " [        U5      5        U R                  5       nU R                  [        R                  " SUR                  -  /S/UR                  -  Q76 5        U$ )Nr+  r,  r   r$  )r   r/  r0  r3   r   r   r   r   r.  ro   r   )r,   r3   rD   r'   s       r   writeTTCHeaderr2    s}    DDKDLMIIaLJJw||OT23YY[FJJv{{6DMM1JaS4==5HJKMr   __main__)1__doc__ior   typesr   fontTools.misc.textToolsr   fontTools.miscr   r   r   r   r   collectionsr	   logging	getLoggerr|   r]   r   r   r  r   r   r   r   r.  calcsizer-  r8   r5   r
  r   r;   r:   r  r  r1   r0   r9   rC   r[   r2   r2  sysdoctestexittestmodfailedr   r   r   <module>rB     s    ! ( " B  #  !|$ |$@   
 					
 0 B&Z Z~	   1  $$%89   !))*BC  " $$%89   !))*BC &V &R( (
% %P( (<0(	 zHHW__%%&	 r   