o
    PjO                    @   s(  d dl mZmZmZmZm	Z
mZ d dlmZ d dlmZmZ d dlmZmZmZmZmZ d dlmZ d dlmZmZ ddlmZmZm Z m!Z!m"Z" dd	l#m$Z$ dd
l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z0m1Z2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;Z;d dl<Z<d dl=m>Z> d dl?Z?d dl@mAZA e?BeCZDdd ZEdeFe$ fddZGG dd deHZIG dd deIZJG dd deJZKG dd deJZLG dd deLZMG d d! d!eLZNG d"d# d#eNZOG d$d% d%eKeNZPG d&d' d'eLZQG d(d) d)eLZRG d*d+ d+eLZSG d,d- d-eLZTG d.d/ d/eLZUG d0d1 d1eLZVG d2d3 d3eVeTZWG d4d5 d5eVeRZXG d6d7 d7eVeNZYG d8d9 d9eJZZG d:d; d;eJZ[G d<d= d=e[Z\G d>d? d?eRZ]G d@dA dAeRZ^G dBdC dCeJZ_G dDdE dEe_Z`G dFdG dGe_ZaG dHdI dIeaZbG dJdK dKeaZcG dLdM dMecZdG dNdO dOedZeG dPdQ dQeJZfG dRdS dSeJZgG dTdU dUeIZhG dVdW dWehZiG dXdY dYehZjG dZd[ d[ejZkG d\d] d]ejZlG d^d_ d_ehZmG d`da daejZnG dbdc dcekenZoG ddde deejZpG dfdg dgeLZqG dhdi dieqZrG djdk dkeIZsG dldm dmeIZtG dndo doeIZuG dpdq dqeIZvG drds dseIZwG dtdu dueIZxG dvdw dweIZyG dxdy dyeIZzG dzd{ d{eIZ{G d|d} d}Z|G d~d deIZ}G dd deRZ~G dd deTZG dd deZ/G dd deZ1G dd deAZG dd deIZi deSdeQdeMdeTdeRdeUdeNdegd#eOd%ePdQefd9eZd;e[d=e\d?e]dEe`dIebi dKecdMeddOeedehdedejdekdeldierdweydyezd{e{de~de/de1dAe^de8e}e|de8e}e'dewexeieieieudd dd dd dd dd dd dZdS )    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)TupleVariation)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)LazyList)OPTIMIZE_FONT_SPEEDgetSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)	FieldSpec)lookupTypesVarCompositeGlyphAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeModeNO_VARIATION_INDEX)zip_longest
accumulate)partial)SimpleNamespaceN)Optional)IntFlagc                 C   s
   t | tS N)
isinstancetuple)t r0   X/home/thesage/.local/lib/python3.10/site-packages/fontTools/ttLib/tables/otConverters.py<lambda>.   s   
 r2   	tableSpecc                 C   s  g }i }| D ]}|j }|j dr|jdksJ t}nT|j ds&|j dv r0tttd|j }n?|j dkr8t}n7|j dkr@t	}n/|j dkrHt
}n'|j d	krPt}n|j d
v rXt}n|jtvrhd|jvrh|j}t}nt|j|t}||j |j|j|jd}|jr|j}n|jdv r||j}n||}|js||_|j dv r|d |_|j D ]}	|	 D ]}
t|j |j|j|
||
j< qq|j d	kr|d |_|d	 |_|j D ]}
t|j |j|j|
||
j< q|| |j |vsJ |j |||j < q||fS )zGiven a table spec from otData.py, build a converter object for each
    field of the table. This is called for each table in otData.py, and
    the results are assigned to the corresponding class in otTables.py.ValueFormatuint16Count)StructLength	MorphType)uint8r5   uint32SubTableExtSubTable	SubStructFeatureParams)CIDGlyphMappingGlyphCIDMapping(description)	MortChainMortSubtable	MorxChain)r;   r<   r=   r   featureParamTypes)name
startswithtyper4   endswithComputedUInt8ComputedUShortComputedULongr;   r<   r=   r>   StructWithLengthconverterMappingStructevalrepeatauxrC   
tableClassgetr   valuesTable__name__rG   defaultFeatureParamsappend)r3   tableNamespace
convertersconvertersByNamespec	tableNameconverterClassconvrU   r/   clsr0   r0   r1   buildConverters1   sr   












rd   c                   @   sv   e Zd ZdZdddddZdd Zd	d
 Zdd Zdd ZdddZ	dd Z
dd ZedZdee fddZdS )BaseConverterz\Base class for converter objects. Apart from the constructor, this
    is an abstract class.N rB   c                C   sp   || _ || _|| _| jr| jst| jdd| _|| _|dp"|dv | _|dp,|dk| _|dv | _|| _	d S )Nz<string>rR   r6   )DesignAxisRecordSizeValueRecordSize
LookupTyper8   )
ClassCountClass2Count
FeatureTagSettingsCountVarRegionCountMappingCountRegionAxisCountDesignAxisCountrg   AxisValueCountrh   	AxisCountBaseGlyphRecordCountLayerRecordCountAxisIndicesList	NumGlyphsMaxGlyphMapEntryIndexMaxEntryIndex
NumEntries)
rH   rS   rT   compilerU   rK   isCountisLookupTypeisPropagatedrC   selfrH   rS   rT   rU   rC   r0   r0   r1   __init__{   s   

zBaseConverter.__init__c           	         s    j o|dk}|rtu rd}|s+g }t|D ]}| | q|S  fdd}| tfddt|D }|  |S )z(Read an array of values from the reader.   Fc                     s&     j  fdd} | S )Nc                    s     |     i S r,   )seekread)i)fontposreader_copy
recordSizer   r0   r1   	read_item   s   zABaseConverter.readArray.<locals>.get_read_item.<locals>.read_itemcopyr   r   )r   readerr   r   )r   r   r1   get_read_item   s   z.BaseConverter.readArray.<locals>.get_read_itemc                 3   s    | ]} V  qd S r,   r0   ).0r   r   r0   r1   	<genexpr>   s    z*BaseConverter.readArray.<locals>.<genexpr>)lazygetRecordSizeNotImplementedranger[   r   r   advance)	r   r   r   	tableDictcountr   lr   r   r0   )r   r   r   r   r   r1   	readArray   s   

zBaseConverter.readArrayc                 C   s   t | dr| jS tS )N
staticSize)hasattrr   r   r   r   r0   r0   r1   r      s   
zBaseConverter.getRecordSizec                 C      t | )zRead a value from the reader.NotImplementedErrorr   r   r   r   r0   r0   r1   r         zBaseConverter.readc              
   C   sT   zt |D ]\}}| ||||| qW d S  ty) } z|j|f |_ d }~ww r,   )	enumeratewrite	Exceptionargs)r   writerr   r   rW   r   valueer0   r0   r1   
writeArray   s   zBaseConverter.writeArrayc                 C   r   )zWrite a value to the writer.r   r   r   r   r   r   repeatIndexr0   r0   r1   r      r   zBaseConverter.writec                 C   r   )zRead a value from XML.r   r   attrscontentr   r0   r0   r1   xmlRead   r   zBaseConverter.xmlReadc                 C   r   )zWrite a value to XML.r   r   	xmlWriterr   r   rH   r   r0   r0   r1   xmlWrite   r   zBaseConverter.xmlWritezVarIndexBase\s*\+\s*(\d+)returnc                 C   s$   | j | j}|sdS t|dS )zJIf description has `VarIndexBase + {offset}`, return the offset else None.Nr   )varIndexBasePlusOffsetREsearchrC   intgroup)r   mr0   r0   r1   getVarIndexOffset   s   zBaseConverter.getVarIndexOffsetr,   )rY   
__module____qualname____doc__r   r   r   r   r   r   r   r   rer{   r   r*   r   r   r0   r0   r0   r1   re   w   s    $

re   c                   @   s4   e Zd Zedd Zedd Zdd Zdd Zd	S )
SimpleValuec                 C      | S r,   r0   r   r0   r0   r1   toString      zSimpleValue.toStringc                 C   r   r,   r0   r   r0   r0   r1   
fromString   r   zSimpleValue.fromStringc                 C   s(   | ||d| |fg  |  d S Nr   )	simpletagr   newliner   r0   r0   r1   r      s   zSimpleValue.xmlWritec                 C   s   |  |d S r   )r   r   r0   r0   r1   r         zSimpleValue.xmlReadN)rY   r   r   staticmethodr   r   r   r   r0   r0   r0   r1   r      s    

r   c                   @   s    e Zd ZdZdd Zdd ZdS )OptionalValueNc                 C   s6   || j kr|d| |f ||| |  d S r   )DEFAULTr[   r   r   r   r   r0   r0   r1   r      s   
zOptionalValue.xmlWritec                 C   s   d|v r|  |d S | jS r   )r   r   r   r0   r0   r1   r      s   zOptionalValue.xmlRead)rY   r   r   r   r   r   r0   r0   r0   r1   r      s    r   c                   @      e Zd Zedd ZdS )IntValuec                 C   
   t | dS Nr   r   r   r0   r0   r1   r        
zIntValue.fromStringNrY   r   r   r   r   r0   r0   r0   r1   r         r   c                   @   2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )Long   c                 C      |  S r,   readLongr   r0   r0   r1   r        z	Long.readc                 C   
   | |S r,   )readLongArrayr   r   r   r   r   r0   r0   r1   r        
zLong.readArrayNc                 C      | | d S r,   )	writeLongr   r0   r0   r1   r     r   z
Long.writec                 C   r   r,   )writeLongArrayr   r   r   r   rW   r0   r0   r1   r     r   zLong.writeArrayr,   rY   r   r   r   r   r   r   r   r0   r0   r0   r1   r   
      
r   c                   @   r   )ULongr   c                 C   r   r,   	readULongr   r0   r0   r1   r     r   z
ULong.readc                 C   r   r,   )readULongArrayr   r0   r0   r1   r      r   zULong.readArrayNc                 C   r   r,   
writeULongr   r0   r0   r1   r   #  r   zULong.writec                 C   r   r,   )writeULongArrayr   r0   r0   r1   r   &  r   zULong.writeArrayr,   r   r0   r0   r0   r1   r     r   r   c                   @   r   )Flags32c                 C      d|  S )Nz0x%08Xr0   r   r0   r0   r1   r   +  r   zFlags32.toStringN)rY   r   r   r   r   r0   r0   r0   r1   r   *  r   r   c                   @      e Zd ZeZdS )VarIndexN)rY   r   r   r%   r   r0   r0   r0   r1   r   0      r   c                   @   r   )Short   c                 C   r   r,   )	readShortr   r0   r0   r1   r   7  r   z
Short.readc                 C   r   r,   )readShortArrayr   r0   r0   r1   r   :  r   zShort.readArrayNc                 C   r   r,   )
writeShortr   r0   r0   r1   r   =  r   zShort.writec                 C   r   r,   )writeShortArrayr   r0   r0   r1   r   @  r   zShort.writeArrayr,   r   r0   r0   r0   r1   r   4  r   r   c                   @   r   )UShortr   c                 C   r   r,   
readUShortr   r0   r0   r1   r   G  r   zUShort.readc                 C   r   r,   )readUShortArrayr   r0   r0   r1   r   J  r   zUShort.readArrayNc                 C   r   r,   writeUShortr   r0   r0   r1   r   M  r   zUShort.writec                 C   r   r,   )writeUShortArrayr   r0   r0   r1   r   P  r   zUShort.writeArrayr,   r   r0   r0   r0   r1   r   D  r   r   c                   @   r   )Int8r   c                 C   r   r,   )readInt8r   r0   r0   r1   r   W  r   z	Int8.readc                 C   r   r,   )readInt8Arrayr   r0   r0   r1   r   Z  r   zInt8.readArrayNc                 C   r   r,   )	writeInt8r   r0   r0   r1   r   ]  r   z
Int8.writec                 C   r   r,   )writeInt8Arrayr   r0   r0   r1   r   `  r   zInt8.writeArrayr,   r   r0   r0   r0   r1   r   T  r   r   c                   @   r   )UInt8r   c                 C   r   r,   )	readUInt8r   r0   r0   r1   r   g  r   z
UInt8.readc                 C   r   r,   )readUInt8Arrayr   r0   r0   r1   r   j  r   zUInt8.readArrayNc                 C   r   r,   )
writeUInt8r   r0   r0   r1   r   m  r   zUInt8.writec                 C   r   r,   )writeUInt8Arrayr   r0   r0   r1   r   p  r   zUInt8.writeArrayr,   r   r0   r0   r0   r1   r  d  r   r  c                   @   "   e Zd ZdZdd ZdddZdS )UInt24   c                 C   r   r,   
readUInt24r   r0   r0   r1   r   w  r   zUInt24.readNc                 C   r   r,   writeUInt24r   r0   r0   r1   r   z  r   zUInt24.writer,   rY   r   r   r   r   r   r0   r0   r0   r1   r	  t      r	  c                   @      e Zd Zdd ZdS )ComputedIntc                 C   s*   |d ur| d||f  |  d S d S )Nz%s=%s)commentr   r   r0   r0   r1   r     s   zComputedInt.xmlWriteNrY   r   r   r   r0   r0   r0   r1   r  ~      r  c                   @      e Zd ZdS )rL   NrY   r   r   r0   r0   r0   r1   rL         rL   c                   @   r  )rM   Nr  r0   r0   r0   r1   rM     r  rM   c                   @   r  )rN   Nr  r0   r0   r0   r1   rN     r  rN   c                   @   r  )Tagr   c                 C   r   r,   )readTagr   r0   r0   r1   r     r   zTag.readNc                 C   r   r,   )writeTagr   r0   r0   r1   r     r   z	Tag.writer,   r  r0   r0   r0   r1   r    r  r  c                   @   s6   e Zd ZdZdZdd Zdd Zdd Zdd
dZd	S )GlyphIDr   Hc                 C   s   | || j| j|S r,   )getGlyphNameManyr   typecoder   r   r0   r0   r1   r     s   zGlyphID.readArrayc                 C   s   | || j| jS r,   )getGlyphName	readValuer  r   r   r0   r0   r1   r        zGlyphID.readc                 C      | | j|| d S r,   )r   r  getGlyphIDManyr   r0   r0   r1   r        zGlyphID.writeArrayNc                 C   r#  r,   )
writeValuer  
getGlyphIDr   r0   r0   r1   r     r%  zGlyphID.writer,   )	rY   r   r   r   r  r   r   r   r   r0   r0   r0   r1   r    s    r  c                   @   s   e Zd ZdZdZdS )	GlyphID32r   LN)rY   r   r   r   r  r0   r0   r0   r1   r(    s    r(  c                   @   r  )NameIDc                 C   s   | ||d|fg  |r>|r>|d}|r>||}|d |r(|| n|dkr2|d n|d td|  |  d S )Nr   rH       Nonezmissing from name tablez"name id %d missing from name table)r   rV   getDebugNamer   r  logwarningr   )r   r   r   r   rH   r   	nameTabler0   r0   r1   r     s   



zNameID.xmlWriteNr  r0   r0   r0   r1   r*    r  r*  c                   @   r  )	STATFlagsc                 C   sh   | ||d|fg  g }|d@ r|d |d@ r|d |r.|d |d| |  d S )Nr   r   OlderSiblingFontAttributer   ElidableAxisValueNamer+   )r   r[   r   r  joinr   r   r   r   r   rH   r   flagsr0   r0   r1   r     s   


zSTATFlags.xmlWriteNr  r0   r0   r0   r1   r2    r  r2  c                   @   r   )
FloatValuec                 C      t | S r,   )floatr   r0   r0   r1   r     r   zFloatValue.fromStringNr   r0   r0   r0   r1   r9    r   r9  c                   @   r  )
DeciPointsr   c                 C   s   |  d S N
   r   r   r0   r0   r1   r        zDeciPoints.readNc                 C   s   | t|d  d S r=  )r   roundr   r0   r0   r1   r     r"  zDeciPoints.writer,   r  r0   r0   r0   r1   r<    r  r<  c                   @   s^   e Zd ZeZeZeZeZdd ZdddZ	e
dd Ze
dd	 Ze
d
d Ze
dd ZdS )BaseFixedValuec                 C   s   |  t|| j S r,   )fromIntgetattrreaderMethodr   r0   r0   r1   r     s   zBaseFixedValue.readNc                 C   s   t || j| | d S r,   )rC  writerMethodtoIntr   r0   r0   r1   r     s   zBaseFixedValue.writec                 C      t || jS r,   )fi2flprecisionBitsrc   r   r0   r0   r1   rB       zBaseFixedValue.fromIntc                 C   rG  r,   )fl2firI  rJ  r0   r0   r1   rF    rK  zBaseFixedValue.toIntc                 C   rG  r,   )str2flrI  rJ  r0   r0   r1   r     rK  zBaseFixedValue.fromStringc                 C   rG  r,   )fl2strrI  rJ  r0   r0   r1   r     rK  zBaseFixedValue.toStringr,   )rY   r   r   r   r   rI  rD  rE  r   r   classmethodrB  rF  r   r   r0   r0   r0   r1   rA    s    



rA  c                   @      e Zd ZdZdZdZdZdS )Fixedr      r   r   NrY   r   r   r   rI  rD  rE  r0   r0   r0   r1   rQ     
    rQ  c                   @   rP  )F2Dot14r      r   r   NrS  r0   r0   r0   r1   rU    rT  rU  c                       sP   e Zd ZdZdZe fddZe fddZedd Zed	d
 Z	  Z
S )Angleg        g     ?c                    s   t  || j d S N   )superrB  biasrJ  	__class__r0   r1   rB       zAngle.fromIntc                    s   t  |d | j S rX  )rZ  rF  r[  rJ  r\  r0   r1   rF    r^  zAngle.toIntc                 C   s   t t|| j | j S r,   )r
   r;  factorrJ  r0   r0   r1   r     s   zAngle.fromStringc                 C   rG  r,   )r	   r_  rJ  r0   r0   r1   r   !  rK  zAngle.toString)rY   r   r   r[  r_  rO  rB  rF  r   r   __classcell__r0   r0   r\  r1   rW    s    
rW  c                   @   s   e Zd ZdZdS )BiasedAngleg      ?N)rY   r   r   r[  r0   r0   r0   r1   ra  &  s    ra  c                   @   sF   e Zd ZdZdd ZdddZedd Zed	d
 Zedd Z	dS )Versionr   c                 C   s   |  }|S r,   r   )r   r   r   r   r   r0   r0   r1   r   /  s   zVersion.readNc                 C   s   t |}|| d S r,   )fi2ver   r   r0   r0   r1   r   3  s   zVersion.writec                 C   r:  r,   )ve2fir   r0   r0   r1   r   7  r   zVersion.fromStringc                 C   r   )N0x%08xr0   r   r0   r0   r1   r   ;  r   zVersion.toStringc                 C   r   )NrR  )rL  )vr0   r0   r1   	fromFloat?  r   zVersion.fromFloatr,   )
rY   r   r   r   r   r   r   r   r   rg  r0   r0   r0   r1   rb  ,  s    


rb  c                   @   s&   e Zd ZdZdZdd ZdddZdS )	Char64zAn ASCII string with up to 64 characters.

    Unused character positions are filled with 0x00 bytes.
    Used in Apple AAT fonts in the `gcid` table.
    @   c                 C   s\   | | j}|d}|dkr|d | }t|ddd}|t|dddkr,td|  |S )N    r   asciireplaceencodingerrorsignorez%replaced non-ASCII characters in "%s")readDatar   findr   r/  r0  )r   r   r   r   datazeroPossr0   r0   r1   r   M  s   
zChar64.readNc                 C   sv   t |ddd}|t |dddkrtd|  t|| jkr(td|| jf  |d| j  d | j }|| d S )Nrk  rl  rm  rp  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesrj  )r   r/  r0  lenr   	writeData)r   r   r   r   r   r   rs  r0   r0   r1   r   W  s   zChar64.writer,   )rY   r   r   r   r   r   r   r0   r0   r0   r1   rh  D  s
    
rh  c                   @   s>   e Zd Zdd Zdd ZdddZdd	 Zd
d Zdd ZdS )rQ   c                 C   s   | j o| j |S r,   )rU   r   r   r0   r0   r1   r   d     zStruct.getRecordSizec                 C   s   |   }||| |S r,   )rU   	decompile)r   r   r   r   tabler0   r0   r1   r   g  s   zStruct.readNc                 C   s   | || d S r,   r{   r   r0   r0   r1   r   l     zStruct.writec                 C   sF   |d u r|r| ||dg  |  d S 	 d S |j||||d d S )N)emptyr   )rH   )r   r   toXMLr   r0   r0   r1   r   o  s   zStruct.xmlWritec                 C   s4  d|v rt |d rd S |  }|d}|d urt||_t|d }|r\d}| D ]/}|jr[d}t|ds;i |_|j}	|j	|	vsJJ |j	|	ft
||j	d  t|j|j	|	|j	< q,|D ]}
t|
trs|
\}}}||||| q^	 q^|jt|dd d |r|r| D ]}|jr|j}	|	|j	= |	s|`q|S )Nr}  FormatpostReadFT_propagator)
propagator)r   rU   rV   r   r  r   getConvertersr~   r  rH   setattrr   __dict__r-   r.   fromXMLpopulateDefaultsrC  )r   r   r   r   rz  r  
noPostReadcleanPropagationrb   r  elementrH   r0   r0   r1   r   |  sF   




zStruct.xmlReadc                 C   s   dt | j S )Nz
Struct of )reprrU   r   r0   r0   r1   __repr__  r   zStruct.__repr__r,   )	rY   r   r   r   r   r   r   r   r  r0   r0   r0   r1   rQ   c  s    
*rQ   c                   @      e Zd Zdd ZdddZdS )rO   c                 C   s.   |j }|  }||| |||j  |S r,   )r   rU   ry  r   r7   )r   r   r   r   r   rz  r0   r0   r1   r     s
   zStructWithLength.readNc                 C   s   t | D ]\}}|jdkr nqt|j| }t|tr"|d7 }dddd|j }	| }
|	|_	|
|| | |
 }| }||||| |j| dd |j ksXJ | |j|< d S )Nr7   r      i     >[= )r   r   r      ޭ)r   r  rH   rv  itemsr-   r   r   getDataLengthr7   r{   getSubWriterr   
getAllData)r   r   r   r   r   r   	convIndexrb   lengthIndexdeadbeefbeforelengthlengthWriterr0   r0   r1   r     s    

zStructWithLength.writer,   rY   r   r   r   r   r0   r0   r0   r1   rO     s    rO   c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )rX   r   c                 C   r   r,   r   r   r0   r0   r1   
readOffset  r   zTable.readOffsetc                 C      | d d S r   r   r   r   r0   r0   r1   writeNullOffset  r   zTable.writeNullOffsetc                 C   sN   |  |}|dkrd S |  }||}|jr||_||_|S ||| |S r   )r  rU   getSubReaderr   r   r   ry  )r   r   r   r   offsetrz  r0   r0   r1   r     s   

z
Table.readNc                 C   sT   |d u r|  | d S | }| j|_|d ur||_|j|| jd ||| d S )N
offsetSize)r  r  rH   r   writeSubTabler   r{   )r   r   r   r   r   r   	subWriterr0   r0   r1   r     s   zTable.writer,   )rY   r   r   r   r  r  r   r   r0   r0   r0   r1   rX     s    rX   c                   @       e Zd ZdZdd Zdd ZdS )LTabler   c                 C   r   r,   r   r   r0   r0   r1   r    r   zLTable.readOffsetc                 C   r  r   r   r  r0   r0   r1   r    r   zLTable.writeNullOffsetNrY   r   r   r   r  r  r0   r0   r0   r1   r        r  c                   @   r  )Table24r
  c                 C   r   r,   r  r   r0   r0   r1   r    r   zTable24.readOffsetc                 C   r  r   r  r  r0   r0   r1   r    r   zTable24.writeNullOffsetNr  r0   r0   r0   r1   r    r  r  c                       $   e Zd Zdd Z fddZ  ZS )r=   c                 C   $   | j | | }| | j| j| j|S r,   r   r]  rH   rS   rT   r   	tableType
lookupTyperU   r0   r0   r1   getConverter      zSubStruct.getConverterc                       t t| |||d | d S r,   )rZ  r=   r   r   r\  r0   r1   r        zSubStruct.xmlWriterY   r   r   r  r   r`  r0   r0   r\  r1   r=         r=   c                       r  )r;   c                 C   r  r,   r  r  r0   r0   r1   r  	  r  zSubTable.getConverterc                    r  r,   )rZ  r;   r   r   r\  r0   r1   r     r  zSubTable.xmlWriter  r0   r0   r\  r1   r;     r  r;   c                   @   s   e Zd ZdddZdS )r<   Nc                 C   s   d|_ t| ||||| d S )NT)	ExtensionrX   r   r   r0   r0   r1   r     s   zExtSubTable.writer,   )rY   r   r   r   r0   r0   r0   r1   r<     s    r<   c                   @   r  )r>   c                 C   s&   | j || j}| | j| j| j|S r,   )rG   rV   rZ   r]  rH   rS   rT   )r   
featureTagrU   r0   r0   r1   r       zFeatureParams.getConverterN)rY   r   r   r  r0   r0   r0   r1   r>     r  r>   c                   @   s2   e Zd ZdZdddddZdd Zdd	d
ZdS )r4   r   Nrf   rB   c                C   s4   t j| |||||d d|d dkrdnd | _d S )NrB   r4   21)re   r   whichr   r0   r0   r1   r      s   zValueFormat.__init__c                 C   s   |  }t||| j< |S r,   )r   r   r  r   r   r   r   formatr0   r0   r1   r   &  s   zValueFormat.readc                 C   s   | | t||| j< d S r,   )r   r   r  )r   r   r   r   r  r   r0   r0   r1   r   +  s   
zValueFormat.writer,   )rY   r   r   r   r   r   r   r0   r0   r0   r1   r4     s
    r4   c                   @   s6   e Zd Zdd Zdd ZdddZdd	 Zd
d ZdS )ValueRecordc                 C   s   dt || j  S Nr   )rv  r  r   r0   r0   r1   r   1  rx  zValueRecord.getRecordSizec                 C   s   || j  ||S r,   )r  readValueRecordr   r0   r0   r1   r   4  rx  zValueRecord.readNc                 C   s   || j  ||| d S r,   )r  writeValueRecordr   r0   r0   r1   r   7  r%  zValueRecord.writec                 C   s"   |d u rd S | ||| j| d S r,   )r~  rH   r   r0   r0   r1   r   :  s   zValueRecord.xmlWritec                 C   s&   ddl m} | }|d ||| |S )Nr   )r  )otBaser  r  )r   r   r   r   r  r   r0   r0   r1   r   @  s   zValueRecord.xmlReadr,   )rY   r   r   r   r   r   r   r   r0   r0   r0   r1   r  0  s    
r  c                   @   s   e Zd ZdZddddZdd Zd+d	d
Zedd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* ZdS ),	AATLookupr>  rf   rB   c                C   sP   t j| |||||d t| jtr| jdd d d| _d S tdd d | jd| _d S )NrB   Value)rH   rS   rT   )rH   rS   rT   rU   )re   r   
issubclassrU   r   	converterrX   r   r0   r0   r1   r   K  s   
zAATLookup.__init__c                 C   sx   |  }|dkr| ||S |dkr| ||S |dkr"| ||S |dkr,| ||S |dkr6| ||S J d| )Nr   r   r      r   Fzunsupported lookup format: %d)r   readFormat0readFormat2readFormat4readFormat6readFormat8r  r0   r0   r1   r   V  s   zAATLookup.readNc                    s   t t fdd| D }t ttd | | || | || | || | |g}|d \}}	}
| }|
  | | }||ksQJ d|	||f d S )Nc                    s   g | ]\}}  ||fqS r0   r'  )r   glyphvalr   r0   r1   
<listcomp>g  s    z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	listsortedr  filterbuildFormat0buildFormat2buildFormat6buildFormat8r  )r   r   r   r   r   r   rW   formatsdataSizelookupFormatwriteMethodr   
actualSizer0   r  r1   r   e  s4   
zAATLookup.writec                 C   sH   |  | |  | t||d\}}}|  | |  | |  | d S )N)nitemSize)r   r   )r   numUnitsunitSizesearchRangeentrySelector
rangeShiftr0   r0   r1   writeBinSearchHeader  s   



zAATLookup.writeBinSearchHeaderc                    sD   t   }t |krd S jj}d||  d fddfS )Nr   r   c                           S r,   )writeFormat0r0   r   r   rW   r   r0   r1   r2         z(AATLookup.buildFormat0.<locals>.<lambda>)rv  getGlyphOrderr  r   )r   r   r   rW   	numGlyphs	valueSizer0   r  r1   r    s   
zAATLookup.buildFormat0c                 C   s2   | d |D ]\}}| jj||d |d d qd S )Nr   r   r   r   )r   r  r   )r   r   r   rW   glyphID_r   r0   r0   r1   r    s   

zAATLookup.writeFormat0c                    s   |d \}}|}g |dd  D ]\}}||d ks||kr- |||f | }}|}q|}q |||f jj}	td |	d }
}dj |
|  d fddfS )Nr   r   r   r   c                      s     S r,   )writeFormat2r0   r   segmentsr   r   r0   r1   r2     r  z(AATLookup.buildFormat2.<locals>.<lambda>)r[   r  r   rv  BIN_SEARCH_HEADER_SIZE)r   r   r   rW   segStartsegValuesegEndglyphIDcurValuer  r  r  r0   r  r1   r    s    zAATLookup.buildFormat2c           
      C   s   | d | jj}t||d }}| ||| |D ]\}}}	| | | | | jj||d |	d d q| d | d |d|  d S )Nr   r   r  r,  rj  r   r  r   rv  r  r   rw  )
r   r   r   r  r  r  r  
firstGlyph	lastGlyphr   r0   r0   r1   r    s   





zAATLookup.writeFormat2c                    sD   j j}t|d }}dj |d |  d fddfS )Nr   r   r  c                      r  r,   )writeFormat6r0   r  r0   r1   r2     r  z(AATLookup.buildFormat6.<locals>.<lambda>)r  r   rv  r  )r   r   r   rW   r  r  r  r0   r  r1   r    s   zAATLookup.buildFormat6c           	      C   s|   | d | jj}t||d }}| ||| |D ]\}}| | | jj||d |d d q| d |d|  d S )Nr  r   r  r,  rj  r  )	r   r   r   rW   r  r  r  r  r   r0   r0   r1   r    s   



zAATLookup.writeFormat6c                    s^   d d d d }}t || d krd S jj}dt |  d fddfS )Nr   r  r   r  r   c                      r  r,   )writeFormat8r0   r  r0   r1   r2     r  z(AATLookup.buildFormat8.<locals>.<lambda>)rv  r  r   )r   r   r   rW   
minGlyphID
maxGlyphIDr  r0   r  r1   r    s   zAATLookup.buildFormat8c                 C   sV   |d d }| d | | | t| |D ]\}}| jj||d |d d qd S )Nr   r   r  )r   rv  r  r   )r   r   r   rW   firstGlyphID_r   r0   r0   r1   r    s   


zAATLookup.writeFormat8c                    s6   t   }| jj| d |d} fddt|D S )Nr   r   c                    s   i | ]
\}}  ||qS r0   r   r   kr   r  r0   r1   
<dictcomp>      z)AATLookup.readFormat0.<locals>.<dictcomp>)rv  r  r  r   r   )r   r   r   r  rs  r0   r  r1   r    s   zAATLookup.readFormat0c                 C   s   i }|j d }| | }}|d| jj ksJ |t|D ]3}||||  d  | }| }	| jj||d d}
|dkrSt|	|d D ]	}|
|||< qIq |S )Nr   r      r   r,  r   r   r   r  r   r   r   r   r   )r   r   r   mappingr   r  r  r   lastfirstr   r  r0   r0   r1   r    s   
zAATLookup.readFormat2c                 C   s   i }|j d }| }|dksJ |t| D ]I}||||  d  | }| }| }	|dkrb|d}
|
||	  | jj|
|d || d d}t|D ]\}}||||| < qTq|S )Nr   r  r
  r,  r   r   r  )	r   r   r   r   r  r  r   r   r   )r   r   r   r  r   r  r   r  r  r  
dataReaderrs  r  rf  r0   r0   r1   r    s&   

zAATLookup.readFormat4c           	      C   s   i }|j d }| }|d| jj ksJ |t| D ]%}||||  d  | }| jj||d d}|dkrB||||< q|S )Nr   r
  r  r,  r  )	r   r   r   r  r   r  r   r  r   r0   r0   r1   r    s   
zAATLookup.readFormat6c                    s<   |   |  }| jj|d |d} fddt|D S )Nr  c                    s    i | ]\}}  | |qS r0   r  r  r  r   r0   r1   r  )  s     z)AATLookup.readFormat8.<locals>.<dictcomp>)r   r  r   r   )r   r   r   r   rs  r0   r  r1   r  %  s   zAATLookup.readFormat8c           	      C   sF   i }|D ]}t |tr |\}}}|dkr | j|||||d < q|S )NLookupr  )r-   r.   r  r   )	r   r   r   r   r   r  rH   a
eltContentr0   r0   r1   r   +  s   

zAATLookup.xmlReadc                 C   s\   | || |  t| D ]\}}| jj|||dd|fgd q|| |  d S )Nr  r  )r   rH   r   )begintagr   r  r  r  r   endtag)r   r   r   r   rH   r   r  r0   r0   r1   r   4  s   
zAATLookup.xmlWriter,   )rY   r   r   r  r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r0   r0   r0   r1   r  H  s,    
 

	
	r  c                   @   .   e Zd Zdd Zd
ddZdd Zdd	 ZdS )AATLookupWithDataOffsetc                 C   sz   |  }|  }||}tdd d t}||||}i }	| D ]\}
}||| }|  }||| ||	|
< q!|	S NDataOffsets)r   r  r  r   r   r  rU   ry  )r   r   r   r   lookupOffset
dataOffsetlookupReaderlookupoffsetsresultr  r  r  itemr0   r0   r1   r   G  s   

zAATLookupWithDataOffset.readNc                 C   s   i i d}}}g }	t ||jdD ]0}
t }||
 || | }||d }|d kr=|}|t| }|||< |	| |||
< q| }t	dd d t
}|||||d  | }|j|dd |j|dd |	D ]}|| qjd S )Nr   )keyr  r   r  )r  r'  r   r{   r  rV   rv  r[   r  r  r   r   r  rw  )r   r   r   r   r   r   offsetByGlyphoffsetByDatadataLencompiledDatar  r  rs  r  lookupWriterr  
dataWriterdr0   r0   r1   r   U  s,   


zAATLookupWithDataOffset.writec                 C   s   t dd d | j}||||S r  )r  rU   r   )r   r   r   r   r  r0   r0   r1   r   x  s   zAATLookupWithDataOffset.xmlReadc                 C   s&   t dd d | j}|||||| d S r  )r  rU   r   )r   r   r   r   rH   r   r  r0   r0   r1   r   |  r  z AATLookupWithDataOffset.xmlWriter,   rY   r   r   r   r   r   r   r0   r0   r0   r1   r  F  s
    
#r  c                   @   sf   e Zd ZdddddZdd e D Zdd	d
ddZdd Zdd Zdd Z	dd Z
dddZdS )MorxSubtableConverterLayoutOrderReversedLayoutOrderLogicalOrderReversedLogicalOrder))FF)TFFT)TTc                 C   s   i | ]\}}||qS r0   r0   )r   r"  r  r0   r0   r1   r        z MorxSubtableConverter.<dictcomp>Nrf   rB   c                C   s   t j| |||||d d S NrB   )re   r   r   r0   r0   r1   r     s   
zMorxSubtableConverter.__init__c                 C   s6   |d@ dkrd|_ d S |d@ dkrd|_ d S d|_ d S )N    r   Any   Vertical
Horizontal)TextDirection)r   r8  subtabler0   r0   r1   "_setTextDirectionFromCoverageFlags  s
   


z8MorxSubtableConverter._setTextDirectionFromCoverageFlagsc                 C   s  |j }t }| |_| }|d@ dk|d@ dkf}| j| |_| || | |_	| j	|d@ d> O  _	| |_
| |_td |j
}|d u rTJ d|j
 |j | }	|j|j |j |j |	  }
t|
|j|	 ksrJ t|
|jd}| |_|j|| |||j  |S )	Nri  r   rR     morxFz!unsupported 'morx' lookup type %s)rs  tableTag)r   r"   r   r7   r  _PROCESSING_ORDERSProcessingOrderr:  r   Reservedr8   SubFeatureFlagsr   rV   rs  rv  r   r=  r=   ry  r   )r   r   r   r   r   r   r8  orderKeyrU   headerLengthrs  	subReaderr0   r0   r1   r     s,   




zMorxSubtableConverter.readc                 C   s   | || |  |d|j  |  |jd|jd |  |jd|jd |  |jdkrA|jdd|j d |  |d|j  |  |jd	d
|j	 d |  |j
|| || |  d S )NzStructLength=%dr8  r   r?  r   r@  z0x%04xzMorphType=%drA  re  )r  r   r  r7   r   r8  r?  r@  r8   rA  r=   r~  r  r   r0   r0   r1   r     s$   

zMorxSubtableConverter.xmlWritec           
      C   s0  t  }d}d|_tt|D ]~\}}}|dkr5t|d }|d@ dk|d@ dkf}	| j|	 |_| || q|dkrL|d |_|j| jv sKJ d|j q|dkrb|d |_	|j	d	v saJ d
|j	 q|dkrnt|d |_q|dkrzt|d |_
q|dr||||| qJ ||d@ d> |jB |_|S )Nr   CoverageFlagsr   ri  rR  r?  zunknown ProcessingOrder: %sr8  >   r4  r6  r7  zunknown TextDirection %sr@  rA  MorphFr;  )r"   r@  r  istupler   r>  r?  r:  _PROCESSING_ORDERS_REVERSEDr8  rA  rK   r  )
r   r   r   r   r   covFlagseltNameeltAttrsr  rB  r0   r0   r1   r     s8   


zMorxSubtableConverter.xmlReadc                 C   s   |j d@ d? }| j|j \}}||jdkrdndO }||rdndO }||jdkr*dndO }||r2dndO }||_t|j}	| }
d	|_|j }|j d
@ |_ |	|| ||_ |j|	 dks_J | |
 }t
d||j|	< d S )Ni   rR  r6  r5  r   ri  r4  r3  r  r,  r  z>L)r@  rH  r?  r8  rE  rv  r  r  r7   r{   structpack)r   r   r   r   r   r   rI  reverseOrderlogicalOrderr  r  origReservedr  r0   r0   r1   r     s&   
zMorxSubtableConverter.writer,   )rY   r   r   r>  r  rH  r   r:  r   r   r   r   r0   r0   r0   r1   r+    s     r+  c                   @   s   e Zd ZddddZdd Zdd Zd	d
 Zdd Zdd Zd&ddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% ZdS )'	STXHeaderrf   rB   c                C   s`   t j| |||||d t| jtsJ tdd d t| _t| jtr+tdd d t	| _
d S d | _
d S )NrB   GlyphClassesPerGlyphLookup)re   r   r  rU   r   r  r   classLookupr   r  perGlyphLookupr   r0   r0   r1   r     s   
zSTXHeader.__init__c                 C   s  t  }|j}|d}|d}|d}d }	d }
| |_|||   |||   |||   | jd urL|d}|||   t| jt	r|d}	|	||   |d}|||   |d}
|
||   |
j|j d }|dksJ |
||_| |
||_nt| jtr|d}	|	||   | j||||_t|j|j |jd  }t|D ]"}t }|j| t|jD ]}| }| ||||	|j|< qq| jd ur| ||||_|S )Nr   r   )r   r   r  r   GlyphClassCountr   rU  r  rU   r    r   LigComponents_readLigatures	Ligaturesr!   rT  r   rR  r   r   r   Statesr[   r   _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)r   r   r   r   rz  r   classTableReaderstateArrayReaderentryTableReaderactionReaderligaturesReaderperGlyphTableReaderligComponentReadernumLigComponents	numStates
stateIndexstate
glyphClass
entryIndexr0   r0   r1   r     s\   










zSTXHeader.readc                 C   s0   |   }||j||j  }|||| |S r,   )rU   r  r   r   ry  )r   r   rk  r   rb  
transitionentryReaderr0   r0   r1   r[  =  s   zSTXHeader._readTransitionc                 C   s(   t |j}||j d }|||S r  )rv  rs  r   r  r   )r   r   r   limitnumLigatureGlyphsr0   r0   r1   rX  E  s   
zSTXHeader._readLigaturesc                 C   sb   d}|j D ])}|j D ]!}t|tr-|jdkr t||jd }|jdkr-t||jd }qq|S )Nr   r,  r   )rZ  r\  rW   r-   r   	MarkIndexmaxCurrentIndex)r   rz  
numLookupsri  r/   r0   r0   r1   _countPerGlyphLookupsJ  s   



zSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t| |D ]}|d}|||   || j||i  q|S r   )	r   r   rt  r  r   r   r[   rU  r   )r   rz  r   r   r   lookupsr  r  r0   r0   r1   r]  Y  s   
zSTXHeader._readPerGlyphLookupsNc                 C   s  t  }| jj||||jd d t| d}t|j d }d}	| jd ur*|	d7 }	|	| j	j
7 }	| j	||j\}
}| ||j||\}}|	t| }|t| }|t| }t| ||d}|
d urk|t| }nd }d\}}| ||}| ||}|d urt|dksJ |t|
 }|t| }|| ||	 || || | jd ur|| |d ur|| |d ur|| || || || || || |
d ur||
 |d ur|| |d ur|| d S d S )N)r   r   r   rR  r   )NNr   )r   rT  r   rR  r   r  rq  rW   rU  rU   actionHeaderSizecompileActionsrZ  _compileStatesrv  _compilePerGlyphLookups_compileLigComponents_compileLigaturesr   rw  )r   r   r   r   r   r   glyphClassWriterglyphClassDataglyphClassCountglyphClassTableOffset
actionDataactionIndexstateArrayDataentryTableDatastateArrayOffsetentryTableOffsetperGlyphOffsetperGlyphDataactionOffsetligaturesOffsetligComponentsOffsetligComponentsDataligaturesDatar0   r0   r1   r   b  sd   
















zSTXHeader.writec                 C   s   t  }g i }}|D ]L}t|D ]E}	|j|	 }
t  }|
||| | }t||
jks:J dt|
|
jt|f ||}|d u rPt|}|||< |	| |
| qq
t| d}tt|d}||fS )Nz1%s has staticSize %d, but actually wrote %d bytesr   )r   r   r\  r{   r  rv  r   r  rV   r[   r   r   r   )r   r   statesr~  r  stateArrayWriterentriesentryIDsri  rj  rl  entryWriter	entryDatark  r  r  r0   r0   r1   rx    s2   



zSTXHeader._compileStatesc                 C   s   | j d u rdS | |}t|j|ksJ dt|j|f t }|jD ]}| }| j ||i |d  |j|dd q$| S )N    zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   r  )	rU  rt  rv  r^  r   r  r   r  r  )r   rz  r   rs  r   r  r'  r0   r0   r1   ry    s   


z!STXHeader._compilePerGlyphLookupsc                 C   s2   t |dsd S t }|jD ]}|| q| S )NrW  )r   r   rW  r   r  )r   rz  r   r   	componentr0   r0   r1   rz    s   

zSTXHeader._compileLigComponentsc                 C   s8   t |dsd S t }|jD ]
}||| q| S )NrY  )r   r   rY  r   r'  r  )r   rz  r   r   	glyphNamer0   r0   r1   r{    s   

zSTXHeader._compileLigaturesc                 C   s  | || |  |d|j  |  t|j D ]\}}|jd||d |  qt|j	D ]/\}}	|j d|d |  t|	j
 D ]\}
}|j||d|
idd qI|d |  q3t|jD ]/\}}|j d	|d |  t| D ]\}}|jd
||d |  q}|d	 |  qht|dr| d |  tt|dD ]\}}|jd||d |  q|d |  | ||||| || |  d S )NzGlyphClassCount=%s
GlyphClassr  r   StateindexonGlyphClass
Transition)r   r   rH   rS  r  rW  LigComponent)r  r   )r  r   r  rV  r  rR  r  r   r   rZ  r\  r~  r  r^  r   rC  _xmlWriteLigatures)r   r   r   r   rH   r   gklassrh  ri  rj  transr   r  r  r  r0   r0   r1   r     sL   










zSTXHeader.xmlWritec                 C   sf   t |dsd S |d |  tt|dD ]\}}|jd||d |  q|d |  d S )NrY  Ligature)r  r  )r   r  r   r   rC  r   r  )r   r   r   r   rH   r   r   r  r0   r0   r1   r    s   



zSTXHeader._xmlWriteLigaturesc                 C   s   t  }tt|D ]W\}}}|dkr!|d }|d }	t|	|j|< q|dkr3| |||}
|j|
 q|dkrF| j	|||}|j
| q|dkrS| ||||_q|dkr_| ||||_qt|j d |_|S )	Nr  r  r   r  rS  rW  rY  r   )r   r  rG  r   rR  _xmlReadStaterZ  r[   rU  r   r^  _xmlReadLigComponentsrW  _xmlReadLigaturesrY  rq  rW   rV  )r   r   r   r   rz  rJ  rK  r  r  r   ri  r  r0   r0   r1   r     s*   zSTXHeader.xmlReadc           
      C   sV   t  }tt|D ] \}}}|dkr(t|d }|  }	|	|||| |	|j|< q|S )Nr  r  )r   r  rG  r   rU   r  r\  )
r   r   r   r   ri  rJ  rK  r  rj  rl  r0   r0   r1   r    s   
zSTXHeader._xmlReadStatec                 C   s8   g }t t|D ]\}}}|dkr|t|d  q|S )Nr  r   )r  rG  r[   r   )r   r   r   r   ligComponentsrJ  rK  _eltContentr0   r0   r1   r  &  s   zSTXHeader._xmlReadLigComponentsc                 C   s4   g }t t|D ]\}}}|dkr||d  q|S )Nr  r  )r  rG  r[   )r   r   r   r   ligsrJ  rK  r  r0   r0   r1   r  -  s   zSTXHeader._xmlReadLigaturesr,   )rY   r   r   r   r   r[  rX  rt  r]  r   rx  ry  rz  r{  r   r  r   r  r  r  r0   r0   r0   r1   rQ    s$    /
	7(
rQ  c                   @   r  )CIDGlyphMapc                 C   s>   |  }i }t||D ]\}}|dkr||||< q|S Nr,  )r   r   r   r   )r   r   r   r   numCIDsr   cidr  r0   r0   r1   r   6  s   zCIDGlyphMap.readNc           	         X    fdd|  D }|rt|d nd}|| t|D ]}|||d qd S )Nc                    s   i | ]
\}}|  |qS r0   r  )r   r  r  r  r0   r1   r  ?  r	  z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   r,  r  rq  r   r   rV   )	r   r   r   r   r   r   r  r   r  r0   r  r1   r   >  s   
zCIDGlyphMap.writec                 C   s>   i }t t|D ]\}}}|dkr|d  |t|d < q|S )NCIDr  r  )r  rG  stripr   r   r   r   r   r   eNameeAttrs	_eContentr0   r0   r1   r   E  s   zCIDGlyphMap.xmlReadc                 C   h   | || |  t| D ]\}}|d ur(|dkr(|jd||d |  q|| |  d S )Nr,  r  )r  r  r  r   r  r  r   r  )r   r   r   r   rH   r   r  r  r0   r0   r1   r   L     
zCIDGlyphMap.xmlWriter,   r*  r0   r0   r0   r1   r  5  s
    
r  c                   @   r  )GlyphCIDMapc           
      C   s|   |  }| }||}|t|krtd|t|f  i }ttt|t|D ]}|| }	|	dkr;|	||| < q+|S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restr,  )r  r   r   rv  r/  r0  r   min)
r   r   r   r   
glyphOrderr   cidsr   r  r  r0   r0   r1   r   X  s    

zGlyphCIDMap.readNc           	         r  )Nc                    s,   i | ]\}}|d ur|dkr  ||qS r  r  )r   r  r  r  r0   r1   r  j  s
    
z%GlyphCIDMap.write.<locals>.<dictcomp>r   r   r,  r  )	r   r   r   r   r   r   r  r   r  r0   r  r1   r   i  s   

zGlyphCIDMap.writec                 C   s:   i }t t|D ]\}}}|dkrt|d ||d < q|S )Nr  r   r  )r  rG  r   r  r0   r0   r1   r   t  s   zGlyphCIDMap.xmlReadc                 C   r  )Nr,  r  r  r  )r   r   r   r   rH   r   r  r  r0   r0   r1   r   {  r  zGlyphCIDMap.xmlWriter,   r*  r0   r0   r0   r1   r  W  s
    
r  c                   @   r  )
DeltaValuec                 C   s   |d }|d }|d }|dv sJ d|| d }d|> }d|> }	d|> d }
d|d > }g }d\}}t |D ]$}|dkrE| d	}}|| }||? |
@ }||@ rW||	 }|| q8|S )
N	StartSizeEndSizeDeltaFormatr   r   r
  illegal DeltaFormatr   )r   r   r   rR  )r   r   r[   )r   r   r   r   r  r  r  nItemsnBitsminusOffsetmasksignMaskr  tmpshiftr   r   r0   r0   r1   r     s(   zDeltaValue.readNc                 C   s   |d }|d }|d }|}	|dv sJ d|| d }
d|> }t |	|
ks(J d|> d }d\}}|	D ]}|| }|||@ |> B }|dkrO|| d\}}q4|d	kr[|| d S d S )
Nr  r  r  r  r  r   )r   rR  r   rR  )rv  r   )r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r0   r0   r1   r     s(   
zDeltaValue.writec                 C   "   | ||d|fg  |  d S r   r   r   r   r0   r0   r1   r        zDeltaValue.xmlWritec                 C      t |d S r   r   r   r0   r0   r1   r     r?  zDeltaValue.xmlReadr,   rY   r   r   r   r   r   r   r0   r0   r0   r1   r    s
    
r  c                   @   r  )VarIdxMapValuec           	         s|   |d }|d }d|d@  }d|> d  d  d| d|d@ d?  }|j |j|j|jd	| } fd
d||D S )NEntryFormatro   r   r;  l    rR  0   r   r   r   r
  r   c                    s    g | ]}|@ > | @ B qS r0   r0   )r   raw	innerMask	outerMask
outerShiftr0   r1   r        z'VarIdxMapValue.read.<locals>.<listcomp>r  r   readUInt24Arrayr   )	r   r   r   r   fmtr  	innerBits	entrySizer   r0   r  r1   r     s"   zVarIdxMapValue.readNc                    s   |d }|}|d  t| d|d@  }d|> d  d| d|d@ d?  }	|j|j|j|jd|	 }
|
 fd	d
|D  d S )Nr  ro   r   r;  rR  r  r   r  c                    s    g | ]}|d @ ? | @ B qS )l      r0   )r   idxr  r  r0   r1   r    r  z(VarIdxMapValue.write.<locals>.<listcomp>)setValuerv  r  r   writeUInt24Arrayr   )r   r   r   r   r   r   r  r  r  r  r   r0   r  r1   r     s&   zVarIdxMapValue.writer,   r  r0   r0   r0   r1   r    s    r  c                   @   r  )VarDataValuec                 C   s   g }|d }|d }t |d@ }|d@ }|r|j|j}}	n|j|j}}	t||t||}
}|||
 ||	||
  ||krI||d = |S )Nrn   	NumShorts     )boolr   r   r   r  rq  extend)r   r   r   r   rW   regionCount	wordCount	longWordsreadBigArrayreadSmallArrayn1n2r0   r0   r1   r     s   
zVarDataValue.readNc                 C   s   |d }|d }t |d@ }|d@ }|j|jf|j|jfd| \}	}
t||t||}}|	|d |  |
|||  ||krN|dg||   d S d S )Nrn   r  r  r  r0  r   )r  r   r  r   r  rq  writeSmallArray)r   r   r   r   rW   r   r  r  r  writeBigArrayr  r  r  r0   r0   r1   r     s   

zVarDataValue.writec                 C   r  r   r  r   r0   r0   r1   r     r  zVarDataValue.xmlWritec                 C   r  r   r  r   r0   r0   r1   r     r?  zVarDataValue.xmlReadr,   r  r0   r0   r0   r1   r    s
    
r  c                   @   r  )TupleValuesc                 C   s   t d |d S r   )r   decompileDeltas_)r   rs  r   r0   r0   r1   r     r|  zTupleValues.readNc                 C   s   |j t }ttj|| dS )N)optimizeSize)cfgr   bytesr   compileDeltaValues_)r   r   r   r   rW   r   optimizeSpeedr0   r0   r1   r   "  s   
zTupleValues.writec                 C   r  r   r  r   r0   r0   r1   r   (  r?  zTupleValues.xmlReadc                 C   r  r   r  r   r0   r0   r1   r   +  r  zTupleValues.xmlWriter,   r*  r0   r0   r0   r1   r    s
    
r  c                   @   sD   e Zd Z	dddddddZdd Zddd	Zd
d Zdd ZdS )	CFF2IndexNrf   )	itemClassitemConverterClassrC   c                C   s:   t j| |||||d || _|d ur| | _d S d | _d S r2  )re   r   
_itemClass
_converter)r   rH   rS   rT   rU   r  r  rC   r0   r0   r1   r   1  s   zCFF2Index.__init__c                    s      dkr
g S  dd }jduo dk}|sq| d }g }|d}|d  |D ]6}	||	ks@J |	| }
jd ur[ }||
j |}
njd urgj	|
}
|
|
 |	}q8|S  fdd}| }t|g  }|S )	Nr   c                 S   s   | j | j| j| jd| S )Nr  r  )r   offSizer0   r0   r1   getReadArrayJ  s   z$CFF2Index.read.<locals>.getReadArrayFr   r   c                     sH     jd   d   	fdd} | S )Nr   c                    s    |    d}  |d   |d |d  }jd ur6 }||j |}|S jd urBj|}|S )Nr   r   r   )r   rq  r  ry  
localStater  r   )r   r  r!  obj)data_posr   r  
offset_posr   r   r   r0   r1   r   q  s   

z8CFF2Index.read.<locals>.get_read_item.<locals>.read_itemr   r   r   r   r  r  r   r   )r  r  r   r   r1   r   k  s   
z%CFF2Index.read.<locals>.get_read_item)r   r  r   poprq  r  ry  r  r  r   r[   r   )r   r   r   r   r   r   r  r  
lastOffsetr  r!  r   r   r   r   r0   r  r1   r   D  s8   




zCFF2Index.readc                    s   |} t| t|sd S jd ur fdd|D }njd ur1 fddt|D }dd |D }tt|dd}|d }|dk rJdn|d	k rPd
n|dk rVdnd}	|	 jj	j
jd|	 }
|
| |D ]}| qpd S )Nc                    s   g | ]}|  qS r0   r{  r   r!  r  r0   r1   r    r1  z#CFF2Index.write.<locals>.<listcomp>c              	      s$   g | ]\}}j  ||qS r0   )r  r   )r   r   r!  r   r   r   r   r0   r1   r    s    c                 S   s   g | ]}t |qS r0   )rv  r  r0   r0   r1   r    s    r   )initialr     i   r   i   r
  r   r  )r   rv  r  r  r   r  r'   r  r  r   r  r   rw  )r   r   r   r   rW   r   r  r  r  r  r   r!  r0   r  r1   r     s:   


zCFF2Index.writec                 C   sF   | j d ur|   }|d ||| |S | jd ur | j|||S t r,   )r  r  r  r   r   )r   r   r   r   r   r0   r0   r1   r     s   

zCFF2Index.xmlReadc              
   C   sz   | j d urt|D ]\}}|||d|fg| q	d S | jd ur:t|D ]\}}| j|||||d|fg  q$d S t )Nr  )r  r   r~  r  r   r   )r   r   r   r   rH   r   r   r!  r0   r0   r1   r     s   

zCFF2Index.xmlWriter,   )rY   r   r   r   r   r   r   r   r0   r0   r0   r1   r  0  s    
D%
r  c                   @   r  )
LookupFlagc                 C   s   | ||d|fg  g }|d@ r|d |d@ r|d |d@ r(|d |d@ r1|d	 |d
@ r:|d |d@ rG|d|d?   |rQ|d| |  d S )Nr   r   rightToLeftr   ignoreBaseGlyphsr   ignoreLigaturesr   ignoreMarksrR  useMarkFilteringSeti   zmarkAttachmentType[%i]r5  )r   r[   r  r6  r   r7  r0   r0   r1   r     s"   




zLookupFlag.xmlWriteNr  r0   r0   r0   r1   r
    r  r
  c                       s8   e Zd ZeZ fddZedd Zedd Z  Z	S )
_UInt8Enumc                    s   |  t |||S r,   )	enumClassrZ  r   r   r\  r0   r1   r     r"  z_UInt8Enum.readc                 C   s   t | j| S r,   )rC  r  upperrJ  r0   r0   r1   r        z_UInt8Enum.fromStringc                 C   s   |  |j S r,   )r  rH   lowerrJ  r0   r0   r1   r     r  z_UInt8Enum.toString)
rY   r   r   r   r  r   rO  r   r   r`  r0   r0   r\  r1   r    s    
r  c                   @   r   )r#   N)rY   r   r   _ExtendModer  r0   r0   r0   r1   r#     r   r#   c                   @   r   )r$   N)rY   r   r   _CompositeModer  r0   r0   r0   r1   r$     r   r$   c                   @   s8   e Zd ZdZdZdZdZdZedd Z	edd	 Z
d
S )MappingEntryFormatr   r   r   r   r  c                 C      | t j@ dkS )Nr3  r  CODE_POINT_BIAS_BITSr  r0   r0   r1   bias_present_u16     z#MappingEntryFormat.bias_present_u16c                 C   r  )Nr  r  r  r0   r0   r1   bias_present_u24  r  z#MappingEntryFormat.bias_present_u24N)rY   r   r   HAS_SUBSET_DEFHAS_CHILD_ENTRIESHAS_ENTRY_IDHAS_PATCH_FORMATr  propertyr  r  r0   r0   r0   r1   r    s    
r  c                   @   r  )MappingEntriesConverterc           !      C   s8  ddl m} ddlm} |d }g }d}t|D ] }	i }
t| }||
d< |tj@ rr| }g }t|D ]}	| }|	| q6||
d< |
 }g }t|D ]}	| }|| d}|| d}|	|||d	 qP||
d
< |tj@ r| }t|d@ }|d@ }||
d< g }t|D ]}	| }|	| q||
d< |tj@ rg }	 | }|d? }|d@ }|d | }|	| |}|snq||
d< n|d g|
d< |d }|tj@ r| |
d< |tj@ rd}|jr| }n|jr|
 }||
d< ||j|jd  |dd\}} ||  t||
d< |	|
 q|S )Nr   )r   )decoderz   r  formatFlagsfeatureTagsrR  tagstartenddesignSpaceSegmentsr5     childEntryConjunctivechildEntryIndicesTr   entryIdspatchFormatcodePointsBiasi )r[  maxValue
codePoints)fontTools.misc.fixedToolsr   fontTools.misc.iftSparseBitSetr$  r   r  r  r  r  r[   r   r   r  r  r  r   	readInt24r!  r  r  r  rs  r   r   r  )!r   r   r   r   rH  	sbsDecode
entryCountr  lastEntryIdr  entryr%  featureCountfeaturesr(  designSpaceCountr  segTagr)  r*  modeAndCountconjunctive
childCountchildIndicesr  ids
encodedValdeltahasMorecurrentEntryIdr[  
codepointsconsumedr0   r0   r1   r     s   








zMappingEntriesConverter.readNc                    s&  ddl m} ddlm} |}d}	|D ]}
|
dtd}||j |tj@ rk|
dg }|t	| |D ]}|
| q6|
dg }|t	| |D ]}|
|d  |||d	 d
 |||d d
 qM|tj@ r|
dg }|
dd}t	|d@ |rdndB }|| |D ]}|| q|tj@ r|
dg }t|D ]%\}}||	 d }|t	|d k rdnd}|d> |B }||d@  |}	qn|	d7 }	|tj@ r||
dd |tj@ r|
dd |jr|  n|jr|  |
dg }|| fdd|D  qd S )Nr   )encode)r   r  r%  r&  r+  r(  r)  rR  r*  r.  r-  Fr,  r5  r/  r   i r0  r1  r3  c                    s   g | ]
}| kr|  qS r0   r0   r   cr[  r0   r1   r    r	  z1MappingEntriesConverter.write.<locals>.<listcomp>)r5  rJ  r4  r   rV   r  r  r   r  rv  r  r   r   r  r  r   r   r!  r  r  r  rw  )r   r   r   r   r   r   	sbsEncoderL  r  lastIdr:  r%  r<  r(  r  segrB  r@  r?  r  rC  r   eidrE  has_moreencoded_valuerH  r0   rM  r1   r   V  s^   






zMappingEntriesConverter.writec                 C   s  |D ]}| dtd}|jd|jd |  d|v r.|d D ]}|jd|d |  q d|v rD|d D ]}	|jd	|	d |  q6d
|v rb|d
 D ]}
|jd|
d |
d |
d d |  qLd|v r|jdt| ddd |  |d D ]}|jd|d |  q{d|v r|jd|d d |  d|v r|jd| ddd |  ddd |d D }|jd|d |  |d |  qd S )Nr%  r   r:  )r%  r/  entryIdr   r&  r  r+  designSpaceSegmentr(  r)  r*  r'  r.  r-  F
childEntryr  r0  r3  r1  r5  c                 s   s    | ]}t |V  qd S r,   )strrK  r0   r0   r1   r     s    z3MappingEntriesConverter.xmlWrite.<locals>.<genexpr>)	rV   r  r  r   r   r   r   r6  r  )r   r   r   r   rH   r   r:  format_flagsrQ  r(  rP  r  codePointsStrr0   r0   r1   r     sX   





z MappingEntriesConverter.xmlWritec              	   C   s  g }|D ]}t |tsq|\}}}|dkrt|dd}dt|i}|D ]}	t |	ts-q%|	\}
}}|
dkrD|dg t|d  q%|
dkrT|dg |d  q%|
d	krp|d
g |d t|d t|d d q%|
dkrtt|d |d< q%|
dkr|dg t|d  q%|
dkrt|d |d< q%|
dkrt|d |d< q%|
dkrdd |d 	 D |d< q%|| q|S )Nr:  r%  0rT  r/  r   r  r&  rU  r+  r(  r)  r*  r'  r-  rV  r.  r  r0  r1  r3  c                 S   s   g | ]}|rt |qS r0   r   rK  r0   r0   r1   r    s
    z3MappingEntriesConverter.xmlRead.<locals>.<listcomp>)
r-   r.   r   rV   r  
setdefaultr[   r;  r  split)r   r   r   r   r  elemrH   format_flags_intr:  e_elemenameeattrsecontentr0   r0   r1   r     sV   










zMappingEntriesConverter.xmlReadr,   r  r0   r0   r0   r1   r#    s
    
R;-r#  int8int16int32r9   r5   uint24r:   char64rL  MappingEntriesOffsetLOffsetOffset24	TupleList)r  )r  c                 C      t t| dS N)rU   )r(   r  Cr0   r0   r1   r2   	      c                 C   rm  rn  )r(   r  ro  r0   r0   r1   r2   	  rq  c                 C   rm  rn  )r(   rQ  ro  r0   r0   r1   r2   	  rq  c                 C   rm  rn  )r(   rX   ro  r0   r0   r1   r2   	  rq  c                 C   rm  rn  )r(   r  ro  r0   r0   r1   r2   	  rq  c                 C   rm  rn  )r(   r  ro  r0   r0   r1   r2   	  rq  )VarCompositeGlyphListr  r  rD   rE   rF   r"   r  r  rQ  OffsetTo	LOffsetToLOffset24To)r4  r   rH  r   rL  r   rN  r   rM  r   rc  r   rd  %fontTools.ttLib.tables.TupleVariationr   fontTools.misc.roundToolsr	   r
   fontTools.misc.textToolsr   r   r   r   r   fontTools.misc.lazyToolsr   fontTools.ttLibr   r   r  r   r   r   r   r   otDataSchemar   otTablesr   r   r   r   r   r   r    r!   r"   r#   r  r$   r  r%   	itertoolsr&   r'   	functoolsr(   typesr)   r   rL  typingr*   loggingenumr+   	getLoggerrY   r/  rG  r  rd   objectre   r   r   r   r   r   r   r   r   r   r   r  r	  r  rL   rM   rN   r  r  r(  r*  r2  r9  r<  rA  rQ  rU  rW  ra  rb  rh  rQ   rO   rX   r  r  r=   r;   r<   r>   r4   r  r  r  r+  rQ  r  r  r  r  r  r  r  r
  r  r  r#  rP   r0   r0   r0   r1   <module>   sP    8
Fm


G"		 ;   5"/503  i	
 !"#
$