
    rbiY              
         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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	l0Z0dd	l1Z1 e0j2         e1j3                    j4                   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.
    )annotations)KeysView)BytesIO)SimpleNamespace)Tag)sstruct)
TTLibErrorTTLibFileIsCollectionErrorN)OrderedDictc                  T    e Zd Zd ZddZdd	ZeZddZddZddZ	d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         d/var/www/html/mdtn/previsions/meteo_cartes/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headerr3   datarB   r)   entryr?   s              r   __init__zSFNTReader.__init__2   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   r?   str | bytesreturnboolc                    || j         v S NrB   rD   r?   s     r   has_keyzSFNTReader.has_keyf   s    dk!!r   KeysView[Tag]c                4    | j                                         S rN   )rB   keysrD   s    r   rT   zSFNTReader.keysk   s    {!!!r   bytesc                   | 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)	rB   r   loadDatar,   r-   calcChecksumcheckSumlogwarning)rD   r?   rH   rG   checksums        r   __getitem__zSFNTReader.__getitem__n   s    CHH%~~di(( 	@f}}'RaR;(>bcc(JKK'--"Q&&5>1113PSV3V1111U^++93???r   Nonec                0    | j         t          |          = d S rN   )rB   r   rP   s     r   __delitem__zSFNTReader.__delitem__   s    KC!!!r   c                8    | j                                          d S rN   )r,   closerU   s    r   rg   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rD   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,   ri   rbrj   )openpopr,   r   rl   updaterp   s     r   __setstate__zSFNTReader.__setstate__   sf    UYY{33T::DIINN599Z00111U#####r   N)r   r   )r?   rJ   rK   rL   )rK   rR   )r?   rJ   rK   rV   )r?   rJ   rK   rc   )rK   rc   )__name__
__module____qualname__r   rI   rQ   __contains__rT   rb   re   rg   rr   rx    r   r   r   r       s        # # #"23 23 23 23h" " " " L" " " "   $" " " "   
 
 
$ $ $ $ $r   r      Fr          rY   
         2   d   )	r       r   r   r   r~      rY   	   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)rG   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.   r   woff2r   )WOFF2Writer)r6   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/   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   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)rB   r	   )rD   r?   rH   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   rX   NrY   rZ   r[   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__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 rN   rO   rP   s     r   rb   zSFNTWriter.__getitem__1  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   r[   r   r   r   Nr   z>HHr   rY   r   r   r   rX   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   rg   zSFNTWriter.close4  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                $   g }| j                                         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   }[t.          t1          | j                   t2          z  z   }|t1          |          k    sJ |                    t5          |                     t7          |          dz  }	d|	z
  dz  }
|
S )Nr   r   r       l   /ac )rB   rT   appendr^   r1   r0   r   r   r=   r   r   r   r   r   r8   r@   rA   r?   r   r(   r   r   r   r5   r6   r   r]   sum)rD   r   	checksumsr?   r   rB   rH   	sfntEntrydirectory_endra   checksumadjustments              r   _calcMasterChecksumzSFNTWriter._calcMasterChecksum{  s   	;##%% 	8 	8CT[-67777"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 )NrX   rY   z>L)r   r,   r   rB   r(   r   r   r   )rD   r   r   s      r   r   zSFNTWriter.writeMasterChecksum  s`    !55i@@	t{6*1A5666	D*<==>>>>>r   c                    dS NFr}   rU   s    r   reordersTableszSFNTWriter.reordersTables  s    ur   )r$   NN)ry   rz   r{   r   rI   r   r   rb   rg   r   r   r   r}   r   r   r   r      s        # # #, '/$ /$ /$ /$b! ! !" " "<     E# E# E#N" " "@? ? ?    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 )r1   c                    d| _         d S r   )r   rU   s    r   rI   zDirectoryEntry.__init__  s    !r   c                l    t          j        | j        |                    | j                  |            d S rN   )r   r7   formatr   r   )rD   r,   s     r   r>   zDirectoryEntry.fromFile  s,    t{DIIdo$>$>EEEEEr   c                <    t          j        | j        ||            d S rN   )r   r7   r   )rD   strs     r   
fromStringzDirectoryEntry.fromString  s    t{C.....r   c                6    t          j        | j        |           S rN   )r   r   r   rU   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__ry   r?   idrU   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   r6   r   r   r   rD   r,   rG   s      r   r\   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   r6   r   r   r(   r   r   s      r   r   zDirectoryEntry.saveData  s`    4><00 	)??4((D$ii		$+

4r   c                    |S rN   r}   )rD   rawDatas     r   r   zDirectoryEntry.decodeData
  s    r   c                    |S rN   r}   )rD   rG   s     r   r   zDirectoryEntry.encodeData  s    r   N)ry   rz   r{   rI   r>   r   r   r   r\   r   r   r   r}   r   r   r1   r1     s        " " "F F F/ / // / /F F F          r   r1   c                      e Zd ZeZeZdS )r0   N)ry   rz   r{   sfntDirectoryEntryFormatr   r   r   r}   r   r   r0   r0     s        %F'JJJr   r0   c                  2     e Zd ZeZeZ fdZd Zd Z	 xZ
S )r9   c                    t          t          |                                            t          t          d          st          | _        d S d S )NzlibCompressionLevel)superr9   rI   r   ZLIB_COMPRESSION_LEVELr   )rD   r   s    r   rI   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   
decompressr6   )rD   r   r   rG   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 rN   )r6   r   r   r   r   r   )rD   rG   compressedDatar   s       r   r   zWOFFDirectoryEntry.encodeData0  ss    d))  	G%dD,EFFN 	'N 3 3t F FG/DKK$Gg,,DKr   )ry   rz   r{   woffDirectoryEntryFormatr   woffDirectoryEntrySizer   rI   r   r   __classcell__)r   s   @r   r9   r9     s`        %F'J	? 	? 	? 	? 	?	 	 	      r   r9   c                       e Zd ZdZddZd ZdS )rC   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 rN   )r   r   r   r   r   r,   r   r   r   r6   _decompressr   r   r   )rD   readerr   rG   s       r   rI   zWOFFFlavorData.__init__A  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   )rD   r   r   s      r   r   zWOFFFlavorData._decompressV  s    w'''r   rN   )ry   rz   r{   FlavorrI   r   r}   r   r   rC   rC   >  s<        F% % % %*( ( ( ( (r   rC   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   )r6   r<   r   r7   r   )rG   	remaindervalue	blockSizer)   blocklongss          r   r]   r]   \  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   ttcHeaderSizer6   r	   r   r   r7   ttcHeaderFormatTTCTagVersionr   r3   r4   )r,   rG   rD   s      r   r2   r2   t  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  r3   r   r   r   r   r  ro   r   )r,   r3   rD   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__)5__doc__
__future__r   collections.abcr   ior   typesr   fontTools.misc.textToolsr   fontTools.miscr   r   r	   r
   r   collectionsr   logging	getLoggerry   r_   r   r   r   r   r   r   r   r  calcsizer  r8   r5   r   r   r;   r:   r   r   r1   r0   r9   rC   r]   r2   r  sysdoctestexittestmodfailedr}   r   r   <module>r%     s<    # " " " " " $ $ $ $ $ $       ! ! ! ! ! ! ( ( ( ( ( ( " " " " " " B B B B B B B B  # # # # # #  g!!|$ |$ |$ |$ |$ |$ |$ |$@   
 					
  0 B B B B&Y Y Y Y Y Y Y Y|	 ! 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   