
    Mcg0Y              
          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j6                  e      ZdZ ej6                  e      ZdZ ej6                  e      Z dZ! ej6                  e!      Z"dZ# ej6                  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(  r4ddl,Z,ddl-Z- e,j\                   e-j^                         j`                         yy)+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                   H    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y
)
SFNTReaderc                    |ri| t         u ra|d   }|j                  d       t        |j                  d            }|j                  d       |dk(  rddlm} t        j                  |      S t        j                  |       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         O/var/www/html/bid-api/venv/lib/python3.12/site-packages/fontTools/ttLib/sfnt.pyr   zSFNTReader.__new__   sh     C:%!WFKKNfkk!n-KKKNf$=~~k22~~c""    c                    || _         || _        d | _        d | _        t        | _        | j                   j                  d       | j                   j                  d      | _        | j                   j                  d       | j                  dk(  rt        | j                         }|j                  }d|cxk  r|k  sn t        d|dz
  z        || _
        | j                   j                  |j                  |          | j                   j                  t              }t        |      t        k7  rt        d      t!        j"                  t$        ||        n| j                  dk(  rjd| _        t&        | _        | j                   j                  t(              }t        |      t(        k7  rt        d	      t!        j"                  t*        ||        nW| j                   j                  t              }t        |      t        k7  rt        d
      t!        j"                  t$        ||        t-        | j                        | _        | j                  dvrt        d      i }t/        | j0                        D ]G  }| j                         }	|	j3                  | j                          t-        |	j4                        }
|	||
<   I t7        t9        |j;                         d             | _        | j                  dk(  rt?        |       | _        y y )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headerr0   datar?   r&   entryr<   s              r   __init__zSFNTReader.__init__/   sW   	,0		q99>>!,		qw&"499-FH
-X-0H!|%  %DMIINN6--j9:99>>"34D4y-- !JKKNN.d;( DK"4D99>>"34D4y-- !DEENN.d;99>>"34D4y-- !TUUNN.d;t//0#GGPQQt~~&A'')ENN499%eii.CF3K	 '
 "&=R"ST ;;& ,T2DO !r   c                     || j                   v S Nr?   rA   r<   s     r   has_keyzSFNTReader.has_keyc   s    dkk!!r   c                 6    | j                   j                         S rH   )r?   keysrA   s    r   rM   zSFNTReader.keysh   s    {{!!r   c                 r   | j                   t        |         }|j                  | j                        }| j                  rw|dk(  rt        |dd dz   |dd z         }nt        |      }| j                  dkD  r||j                  k(  s
J d|z         |S ||j                  k7  rt        j                  d|       |S )zFetch the raw table data.headN             r   zbad checksum for '%s' table)	r?   r   loadDatar)   r*   calcChecksumcheckSumlogwarning)rA   r<   rE   rD   checksums        r   __getitem__zSFNTReader.__getitem__k   s    CH%~~dii(f}'Ra;(>bc(JK'-""Q&5>>1V3PSV3VV1  U^^+93?r   c                 0    | j                   t        |      = y rH   )r?   r   rJ   s     r   __delitem__zSFNTReader.__delitem__}   s    KKC!r   c                 8    | j                   j                          y rH   )r)   closerN   s    r   r^   zSFNTReader.close   s    		r   c                     t        | j                  t              r| j                  S | j                  j	                         }|d= | j                  j
                  |d<   | j                  j                         |d<   |S )Nr)   	_filename_filepos)
isinstancer)   r   __dict__copynametellrA   states     r   __getstate__zSFNTReader.__getstate__   sa    dii)==  ""$&M!YY^^k IINN,jr   c                     d|vrJt        |j                  d      d      | _        | j                  j                  |j                  d             | j                  j                  |       y )Nr)   r`   rbra   )openpopr)   r   rc   updaterg   s     r   __setstate__zSFNTReader.__setstate__   sL    UYY{3T:DIIINN599Z01U#r   N)r   )__name__
__module____qualname__r   rF   rK   __contains__rM   rZ   r\   r^   ri   ro    r   r   r   r      s7    #"23h" L"$"
$r   r      Fr         rQ   
         2   d   )	r      rw   r   rx   rv      rQ   	   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)rD   levelr   s      r   r   r      sN     O!O4u<==!!e$$(M%,@AAr   c                   J    e Zd Zd Z	 	 	 ddZd Zd Zd Zd Zd Z	d	 Z
d
 Zy)
SFNTWriterc                     d}|r
d|v r|d   }n|rt        |      dkD  r|d   }| t        u r |dk(  rddlm} t        j                  |      S t        j                  |       S )zpReturn an instance of the SFNTWriter sub-class which is compatible
        with the specified 'flavor'.
        Nr+   rw   woff2r   )WOFF2Writer)r3   r   r   r   r   r   )r   r   r   r+   r   s        r   r   zSFNTWriter.__new__   sd     h&(H%Fc$i!m!WF* =~~k22~~c""r   Nc                 X   || _         || _        t        |      | _        || _        || _        | j                  dk(  r>t        | _        t        | _	        t        | _        d| _        t        |t        z  z   | _        nc| j                  rJ d| j                  z         t         | _        t        | _	        t"        | _        ddlm}  ||d      \  | _        | _        | _        | j                   j/                         | _        | j0                  | j                  z   || j                  j2                  z  z   | _        | j                   j7                  | j4                         | j                   j9                  d| j4                  | j                   j/                         z
  z         t;               | _        y )Nr    wOFFUnknown flavor '%s'r   getSearchRange       )r)   r:   r   r   r+   r,   r8   directoryFormatr7   directorySizer6   r.   	signaturer2   sfntDirectoryEntrySizeorigNextTableOffsetr5   r-   fontTools.ttLibr   searchRangeentrySelector
rangeShiftrf   directoryOffset
formatSizenextTableOffsetr   writer	   r?   )rA   r)   r:   r   r+   r,   r   s          r   rF   zSFNTWriter.__init__   s`    	"{+$;;& #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    || j                   v rt        d|z        || j                   |<   y )Ncannot rewrite '%s' table)r?   r   )rA   r<   rE   s      r   setEntryzSFNTWriter.setEntry
  s-    $++83>?? Cr   c                    || j                   v rt        d|z        | j                         }||_        | j                  |_        |dk(  r+t        |dd dz   |dd z         |_        || _        d|_	        nt        |      |_        |j                  | j                  |       | j                  dk(  r6| j                  |_        | xj                  |j                  d	z   d
z  z  c_        | j                  |j                   d	z   d
z  z   | _        | j                  j#                  d| j                  | j                  j%                         z
  z         | j                  | j                  j%                         k(  sJ | j'                  ||       y)zWrite raw table data to disk.r   rP   NrQ   rR   rS   Tr    rw   r   )r?   r   r.   r<   r   r%   rU   rV   	headTableuncompressedsaveDatar)   r+   r   
origOffset
origLengthlengthr   rf   r   )rA   r<   rD   rE   s       r   __setitem__zSFNTWriter.__setitem__  sM   $++83>??##%	++&=)$r([*@49*LMEN!DN!%E)$/ENtyy$';;& #77E$$)9)9A)=(CC$#33q8HB7NO
 			!5!5		8H!HIJ##tyy~~'7777c5!r   c                      | j                   |   S rH   rI   rJ   s     r   rZ   zSFNTWriter.__getitem__.  s    {{3r   c                 h   t        | j                  j                               }t        |      | j                  k7  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                  | _        nKt        | d
      r1t!        j"                  d| j$                  dd       \  | _        | _        ndx| _        | _        |j&                  rt        |j&                        | _        | j*                  j-                  dd       | j*                  j/                         | _        t3        |j&                        }t        |      | _        | j*                  j7                  |       ndx| _        x| _        | _        |j8                  r| j*                  j-                  dd       | j*                  j/                         }|dz   dz  }| j*                  j7                  d||z
  z         | j*                  j/                         | _        t        |j8                        | _        | j*                  j7                  |j8                         ndx| _        | _        | j*                  j-                  dd       | j*                  j/                         | _        n!| j                  rJ d| j                  z         	 tA        jB                  | jD                  |       }| j*                  j-                  | jF                  | jH                  z          d}	|D ]  \  }}|dk(  rd}	||jK                         z   }! |	r| jM                  |       | j*                  j-                  | jF                         | j*                  j7                  |       y	)zTAll tables must have been written to disk. Now write the
        directory.
        z-wrong number of tables; expected %d, found %dr    r   r   rS   r   rw   r   Nr   z>HHr   rQ   r~   r   r   rP   r   )'r=   r?   r>   r3   r:   r   r+   r   reservedtotalSfntSizer   r,   r@   majorVersionminorVersionhasattrstructr4   r   metaDatametaOrigLengthr)   r   rf   
metaOffsetr   
metaLengthr   privData
privOffset
privLengthr   r   packr   r   r   toStringwriteMasterChecksum)
rA   r?   r<   rE   rD   compressedMetaDataoff	paddedOff	directoryseenHeads
             r   r^   zSFNTWriter.close1  sA    ))+,v;$..(?>>3v;/0 
 ;;& $DNDM!#D"s6{"22$
U""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			S 9:"&)).."2"%dmm"4		.455$/IINN1a ))..*DK {{G$9DKK$GG?LL!5!5t<			t++d.@.@@A JCf}!ENN$44I ! $$Y/		t++,			"r   c                 l   t        | j                  j                               }g }t        t	        |            D ]-  }|j                  | j                  ||      j                         / | j                  t        k7  rddl	m
}  || j                  d      \  | _        | _        | _        t        j                   t"        |       }t%        | j                  j'                               }|D ]f  \  }}t               }	|j(                  |	_        |j                  |	_        |j*                  |	_        |j.                  |	_        ||	j3                         z   }h t4        t	        | j                        t6        z  z   }
|
t	        |      k(  sJ |j                  t9        |             t;        |      dz  }d|z
  dz  }|S )Nr   r   r       l   /ac )listr?   rM   r9   r3   appendrV   r.   r-   r   r   r:   r   r   r   r   r   r5   r=   r>   r<   r   r%   r   r   r   r2   r   rU   sum)rA   r   tags	checksumsr&   r   r?   r<   rE   	sfntEntrydirectory_endrY   checksumadjustments                r   _calcMasterChecksumzSFNTWriter._calcMasterChecksumx  ss   DKK$$&'	s4y!AT[[a1::; " "446DREADd0$/  %8$?IDKK--/0F$
U.0	 %			%*^^	"#(#3#3	 #(#3#3	 %	(:(:(<<	 % *C,<?U,UUI...i01y>J.(83zA!!r   c                     | j                  |      }| j                  j                  | j                  d   j                  dz          | j                  j                  t        j                  d|             y )NrP   rQ   z>L)r   r)   r   r?   r%   r   r   r   )rA   r   r   s      r   r   zSFNTWriter.writeMasterChecksum  sS    !55i@		t{{6*11A56		D*<=>r   c                      yNFru   rN   s    r   reordersTableszSFNTWriter.reordersTables  s    r   )r!   NN)rq   rr   rs   r   rF   r   r   rZ   r^   r   r   r   ru   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                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)r.   c                     d| _         y r   )r   rN   s    r   rF   zDirectoryEntry.__init__  s
    !r   c                 x    t        j                  | j                  |j                  | j                        |        y rH   )r   r4   formatr   r   )rA   r)   s     r   r;   zDirectoryEntry.fromFile  s#    t{{DIIdoo$>Er   c                 F    t        j                  | j                  ||        y rH   )r   r4   r   )rA   strs     r   
fromStringzDirectoryEntry.fromString  s    t{{C.r   c                 B    t        j                  | j                  |       S rH   )r   r   r   rN   s    r   r   zDirectoryEntry.toString  s    ||DKK..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<   idrN   s    r   __repr__zDirectoryEntry.__repr__  sN    4$(?(?2d8'TTT4>>#:#:BtH"EEEr   c                     |j                  | j                         |j                  | j                        }t	        |      | j                  k(  sJ t        | j                  d      r| j                  |      }|S )N
decodeData)r   r%   r   r   r3   r   r   r   rA   r)   rD   s      r   rT   zDirectoryEntry.loadData  s[    		$++yy%4yDKK'''4>><0??4(Dr   c                     t        | j                  d      r| j                  |      }t        |      | _        |j                  | j                         |j                  |       y )N
encodeData)r   r   r   r3   r   r   r%   r   r   s      r   r   zDirectoryEntry.saveData  sE    4>><0??4(D$i		$++

4r   c                     |S rH   ru   )rA   rawDatas     r   r   zDirectoryEntry.decodeData  s    r   c                     |S rH   ru   )rA   rD   s     r   r   zDirectoryEntry.encodeData  s    r   N)rq   rr   rs   rF   r;   r   r   r   rT   r   r   r   ru   r   r   r.   r.     s1    "F//Fr   r.   c                       e Zd ZeZeZy)r-   N)rq   rr   rs   sfntDirectoryEntryFormatr   r   r   ru   r   r   r-   r-     s    %F'Jr   r-   c                   2     e Zd ZeZeZ fdZd Zd Z	 xZ
S )r6   c                 b    t         t        |           t        t        d      st        | _        y y )NzlibCompressionLevel)superr6   rF   r   ZLIB_COMPRESSION_LEVELr   )rA   r   s    r   rF   zWOFFDirectoryEntry.__init__  s-     $02 )+AB(>D% Cr   c                     dd l }| j                  | j                  k(  r|}|S | j                  | j                  k  sJ |j                  |      }t	        |      | j                  k(  sJ |S Nr   )r   r   r   
decompressr3   )rA   r   r   rD   s       r   r   zWOFFDirectoryEntry.decodeData#  sb    ;;$//)D
  ;;000??7+Dt9///r   c                     t        |      | _        | j                  st        || j                        }| j                  st              | j                  k\  r|}| j                  | _        |S |}t        |      | _        |S rH   )r3   r   r   r   r   r   )rA   rD   compressedDatar   s       r   r   zWOFFDirectoryEntry.encodeData.  so    d)  %dD,E,EFNN 3t FG//DK  %Gg,DKr   )rq   rr   rs   woffDirectoryEntryFormatr   woffDirectoryEntrySizer   rF   r   r   __classcell__)r   s   @r   r6   r6     s    %F'J	?	r   r6   c                       e Zd ZdZddZd Zy)r@   r    Nc                    d | _         d | _        d | _        d | _        |r=|j                   | _         |j                  | _        |j                  r|j
                  j                  |j                         |j
                  j                  |j                        }t        |      |j                  k(  sJ | j                  |      }t        |      |j                  k(  sJ || _        |j                  rl|j
                  j                  |j                         |j
                  j                  |j                        }t        |      |j                  k(  sJ || _        y y y rH   )r   r   r   r   r   r)   r   r   r   r3   _decompressr   r   r   )rA   readerr   rD   s       r   rF   z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                 ,    dd l }|j                  |      S r   )r   r   )rA   r   r   s      r   r   zWOFFFlavorData._decompressT  s    w''r   rH   )rq   rr   rs   FlavorrF   r   ru   r   r   r@   r@   <  s    F%*(r   r@   c                 
   t        |       dz  }|r| dd|z
  z  z  } d}d}|dz  dk(  sJ t        dt        |       |      D ]@  }| |||z    }t        j                  dt        |      dz  z  |      }|t	        |      z   dz  }B |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   )r3   r9   r   r4   r   )rD   	remaindervalue	blockSizer&   blocklongss          r   rU   rU   Z  s     D	AIY''EIq=A1c$i+QY'fE
a8%@U#z1 , Lr   c                    | j                  d       | j                  t              }t        |      t        k7  rt	        d      t               }t        j                  t        ||       |j                  dk7  rt	        d      |j                  dk(  s#|j                  dk(  sJ d|j                  z         t        j                  d|j                  z  | j                  |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   ttcHeaderSizer3   r   r   r   r4   ttcHeaderFormatTTCTagVersionr   r0   r1   )r)   rD   rA   s      r   r/   r/   r  s    IIaL99]#D
4yM!BCCDNN?D$/{{f011<<:%)C )DLL8C }}		$--!*; <D ||z!Kr   c                 X   t               }d|_        d|_        ||_        | j	                  d       | j                  t        j                  t        |             | j                         }| j                  t        j                  d|j                  z  gdg|j                  z          |S )Nr  r  r   r   )r   r
  r  r0   r   r   r   r   r	  rf   r   )r)   r0   rA   r%   s       r   writeTTCHeaderr    s    DDKDLDM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	getLoggerrq   rW   r   r   r   r   r   r   r   r	  calcsizer  r5   r2   r   r   r8   r7   r   r   r.   r-   r6   r@   rU   r/   r  sysdoctestexittestmodfailedru   r   r   <module>r     s    ! ( " B  #  g!|$ |$@   
 					
 0 B&Z Z~	 !  1  %G$$%89   *))*BC  " %G$$%89   *))*BC &V &R( (
% %P( (<0(	 zCHH_W__%%&	 r   