a
    QhY!                 /   @   sP  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 ddlmZmZmZm Z m!Z! dd	l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z-m.Z/m0Z0 d d
l1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8Z8d dl9Z9d dl:m;Z; d dl<Z<e<=e>Z?dd Z@dd ZAG dd deBZCG dd deCZDG dd deDZEG dd deDZFG dd deFZGG dd deFZHG dd  d eHZIG d!d" d"eEeHZJG d#d$ d$eFZKG d%d& d&eFZLG d'd( d(eFZMG d)d* d*eFZNG d+d, d,eFZOG d-d. d.eFZPG d/d0 d0ePeNZQG d1d2 d2ePeLZRG d3d4 d4ePeHZSG d5d6 d6eDZTG d7d8 d8eDZUG d9d: d:eUZVG d;d< d<eLZWG d=d> d>eLZXG d?d@ d@eDZYG dAdB dBeYZZG dCdD dDeYZ[G dEdF dFe[Z\G dGdH dHe[Z]G dIdJ dJe]Z^G dKdL dLe^Z_G dMdN dNeDZ`G dOdP dPeDZaG dQdR dReCZbG dSdT dTebZcG dUdV dVebZdG dWdX dXedZeG dYdZ dZedZfG d[d\ d\ebZgG d]d^ d^edZhG d_d` d`eeehZiG dadb dbedZjG dcdd ddeFZkG dedf dfekZlG dgdh dheCZmG didj djeCZnG dkdl dleCZoG dmdn dneCZpG dodp dpeCZqG dqdr dreCZrG dsdt dteCZsG dudv dveCZtG dwdx dxeCZuG dydz dzZvG d{d| d|eCZwG d}d~ d~eLZxG dd deNZyG dd deyZ,G dd deyZ.eMeKeGeNeLeOeHeaeIeJe`eTeUeVeWeZe\e]e^e_ebedeeefeleseteuexe,e.eXe5ewevde5ewe$deqerecececeodd dd dd dd dd dd d.ZzdS )    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)TupleVariation)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)LazyList)getSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)lookupTypesVarCompositeGlyphAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeModeNO_VARIATION_INDEX)zip_longest
accumulate)partial)SimpleNamespaceN)Optionalc                 C   s
   t | tS N)
isinstancetuple)t r-   \/var/www/sistema_ama/venv/lib/python3.9/site-packages/fontTools/ttLib/tables/otConverters.py<lambda>-       r/   c                 C   s  g }i }| D ]\}}}}}|}	| dr<|dks6J t}
n|dsN|dv r`tttd| }
nl|dkrnt}
n^|dkr|t}
nP|dkrt}
nB|d	krt	}
n4|d
v rt
}
n&|tvrd|vr|}	t}
nt||t}
|
||||d}|jr|j}n|dv r||}n
||	}|js||_|dv r`|d |_|j D ]*}| D ]}t||||||j< q@q4|d	kr|d |_|d	 |_|j D ]}t||||||j< q|| ||vsJ ||||< 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)uint8r2   uint32SubTableExtSubTable	SubStructFeatureParams)CIDGlyphMappingGlyphCIDMapping(description)	MortChainMortSubtable	MorxChain)r8   r9   r:   r   featureParamTypes)
startswithr1   endswithComputedUInt8ComputedUShortComputedULongr8   r9   r:   r;   StructWithLengthconverterMappingStructeval
tableClassgetr   valuesTable__name__rD   defaultFeatureParamsappend)Z	tableSpecZtableNamespace
convertersconvertersByNametpnamerepeatauxdescr	tableNameZconverterClassconvrN   r,   clsr-   r-   r.   buildConverters0   sd    








r_   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ee dddZdS )BaseConverterz\Base class for converter objects. Apart from the constructor, this
    is an abstract class.N r?   c                C   sp   || _ || _|| _| jr.| js.t| jdd| _|| _|dpD|dv | _|dpX|dk| _|dv | _|| _	d S )Nz<string>rM   r3   )DesignAxisRecordSizeValueRecordSize
LookupTyper5   )
ClassCountClass2Count
FeatureTagSettingsCountVarRegionCountMappingCountRegionAxisCountDesignAxisCountrb   AxisValueCountrc   	AxisCountBaseGlyphRecordCountLayerRecordCountAxisIndicesList)
rX   rY   rZ   compilerN   rF   isCountisLookupTypeisPropagatedr@   selfrX   rY   rZ   rN   r@   r-   r-   r.   __init__t   s    
zBaseConverter.__init__c           	         s    j o|dk}|r(tu r(d}|sVg }t|D ]}| | q8|S  fdd}| tfddt|D }|  |S 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
recordSizerw   r-   r.   	read_item   s    zABaseConverter.readArray.<locals>.get_read_item.<locals>.read_itemcopyr~   r   )r}   readerr   rw   )r~   r   r.   get_read_item   s    z.BaseConverter.readArray.<locals>.get_read_itemc                 3   s   | ]
} V  qd S r)   r-   ).0r|   r   r-   r.   	<genexpr>   r0   z*BaseConverter.readArray.<locals>.<genexpr>N)lazygetRecordSizeNotImplementedrangerT   r{   r   advance)	rw   r   r}   	tableDictcountr   lr|   r   r-   )r}   r   r   r   rw   r.   	readArray   s    

zBaseConverter.readArrayc                 C   s   t | dr| jS tS )N
staticSize)hasattrr   r   rw   r   r-   r-   r.   r      s    
zBaseConverter.getRecordSizec                 C   s   t | dS )zRead a value from the reader.NNotImplementedErrorrw   r   r}   r   r-   r-   r.   r{      s    zBaseConverter.readc              
   C   sb   z(t |D ]\}}| ||||| q
W n4 ty\ } z|j|f |_ W Y d }~n
d }~0 0 d S r)   )	enumeratewrite	Exceptionargs)rw   writerr}   r   rP   r|   valueer-   r-   r.   
writeArray   s    zBaseConverter.writeArrayc                 C   s   t | dS )zWrite a value to the writer.Nr   rw   r   r}   r   r   repeatIndexr-   r-   r.   r      s    zBaseConverter.writec                 C   s   t | dS )zRead a value from XML.Nr   rw   attrscontentr}   r-   r-   r.   xmlRead   s    zBaseConverter.xmlReadc                 C   s   t | dS )zWrite a value to XML.Nr   rw   	xmlWriterr}   r   rX   r   r-   r-   r.   xmlWrite   s    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searchr@   intgroup)rw   mr-   r-   r.   getVarIndexOffset   s    zBaseConverter.getVarIndexOffset)N)N)rR   
__module____qualname____doc__rx   r   r   r{   r   r   r   r   rerr   r   r(   r   r   r-   r-   r-   r.   r`   p   s   

r`   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   | S r)   r-   r   r-   r-   r.   toString   s    zSimpleValue.toStringc                 C   s   | S r)   r-   r   r-   r-   r.   
fromString   s    zSimpleValue.fromStringc                 C   s(   | ||d| |fg  |  d S Nr   )	simpletagr   newliner   r-   r-   r.   r      s    zSimpleValue.xmlWritec                 C   s   |  |d S r   )r   r   r-   r-   r.   r      s    zSimpleValue.xmlReadN)rR   r   r   staticmethodr   r   r   r   r-   r-   r-   r.   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   )DEFAULTrT   r   r   r   r   r-   r-   r.   r      s    
zOptionalValue.xmlWritec                 C   s   d|v r|  |d S | jS r   )r   r   r   r-   r-   r.   r      s    zOptionalValue.xmlRead)rR   r   r   r   r   r   r-   r-   r-   r.   r      s   r   c                   @   s   e Zd Zedd ZdS )IntValuec                 C   s
   t | dS Nr   )r   r   r-   r-   r.   r      s    zIntValue.fromStringNrR   r   r   r   r   r-   r-   r-   r.   r      s   r   c                   @   s2   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   |  S r)   readLongr   r-   r-   r.   r{     s    z	Long.readc                 C   s
   | |S r)   )readLongArrayrw   r   r}   r   r   r-   r-   r.   r     s    zLong.readArrayNc                 C   s   | | d S r)   )	writeLongr   r-   r-   r.   r     s    z
Long.writec                 C   s   | | d S r)   )writeLongArrayrw   r   r}   r   rP   r-   r-   r.   r   
  s    zLong.writeArray)NrR   r   r   r   r{   r   r   r   r-   r-   r-   r.   r      s
   
r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )ULongr   c                 C   s   |  S r)   	readULongr   r-   r-   r.   r{     s    z
ULong.readc                 C   s
   | |S r)   )readULongArrayr   r-   r-   r.   r     s    zULong.readArrayNc                 C   s   | | d S r)   
writeULongr   r-   r-   r.   r     s    zULong.writec                 C   s   | | d S r)   )writeULongArrayr   r-   r-   r.   r     s    zULong.writeArray)Nr   r-   r-   r-   r.   r     s
   
r   c                   @   s   e Zd Zedd ZdS )Flags32c                 C   s   d|  S )Nz0x%08Xr-   r   r-   r-   r.   r     s    zFlags32.toStringN)rR   r   r   r   r   r-   r-   r-   r.   r     s   r   c                   @   s   e Zd ZeZdS )VarIndexN)rR   r   r   r#   r   r-   r-   r-   r.   r   $  s   r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )Short   c                 C   s   |  S r)   )	readShortr   r-   r-   r.   r{   +  s    z
Short.readc                 C   s
   | |S r)   )readShortArrayr   r-   r-   r.   r   .  s    zShort.readArrayNc                 C   s   | | d S r)   )
writeShortr   r-   r-   r.   r   1  s    zShort.writec                 C   s   | | d S r)   )writeShortArrayr   r-   r-   r.   r   4  s    zShort.writeArray)Nr   r-   r-   r-   r.   r   (  s
   
r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )UShortr   c                 C   s   |  S r)   
readUShortr   r-   r-   r.   r{   ;  s    zUShort.readc                 C   s
   | |S r)   )readUShortArrayr   r-   r-   r.   r   >  s    zUShort.readArrayNc                 C   s   | | d S r)   writeUShortr   r-   r-   r.   r   A  s    zUShort.writec                 C   s   | | d S r)   )writeUShortArrayr   r-   r-   r.   r   D  s    zUShort.writeArray)Nr   r-   r-   r-   r.   r   8  s
   
r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )Int8r   c                 C   s   |  S r)   )readInt8r   r-   r-   r.   r{   K  s    z	Int8.readc                 C   s
   | |S r)   )readInt8Arrayr   r-   r-   r.   r   N  s    zInt8.readArrayNc                 C   s   | | d S r)   )	writeInt8r   r-   r-   r.   r   Q  s    z
Int8.writec                 C   s   | | d S r)   )writeInt8Arrayr   r-   r-   r.   r   T  s    zInt8.writeArray)Nr   r-   r-   r-   r.   r   H  s
   
r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )UInt8r   c                 C   s   |  S r)   )	readUInt8r   r-   r-   r.   r{   [  s    z
UInt8.readc                 C   s
   | |S r)   )readUInt8Arrayr   r-   r-   r.   r   ^  s    zUInt8.readArrayNc                 C   s   | | d S r)   )
writeUInt8r   r-   r-   r.   r   a  s    zUInt8.writec                 C   s   | | d S r)   )writeUInt8Arrayr   r-   r-   r.   r   d  s    zUInt8.writeArray)Nr   r-   r-   r-   r.   r   X  s
   
r   c                   @   s"   e Zd ZdZdd ZdddZdS )UInt24   c                 C   s   |  S r)   
readUInt24r   r-   r-   r.   r{   k  s    zUInt24.readNc                 C   s   | | d S r)   writeUInt24r   r-   r-   r.   r   n  s    zUInt24.write)NrR   r   r   r   r{   r   r-   r-   r-   r.   r   h  s   r   c                   @   s   e Zd Zdd ZdS )ComputedIntc                 C   s&   |d ur"| d||f  |  d S )Nz%s=%s)commentr   r   r-   r-   r.   r   s  s    zComputedInt.xmlWriteNrR   r   r   r   r-   r-   r-   r.   r   r  s   r   c                   @   s   e Zd ZdS )rG   NrR   r   r   r-   r-   r-   r.   rG   y  s   rG   c                   @   s   e Zd ZdS )rH   Nr   r-   r-   r-   r.   rH   }  s   rH   c                   @   s   e Zd ZdS )rI   Nr   r-   r-   r-   r.   rI     s   rI   c                   @   s"   e Zd ZdZdd ZdddZdS )Tagr   c                 C   s   |  S r)   )readTagr   r-   r-   r.   r{     s    zTag.readNc                 C   s   | | d S r)   )writeTagr   r-   r-   r.   r     s    z	Tag.write)Nr   r-   r-   r-   r.   r     s   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   r-   r-   r.   r     s    zGlyphID.readArrayc                 C   s   | || j| jS r)   )getGlyphName	readValuer   r   r   r-   r-   r.   r{     s    zGlyphID.readc                 C   s   | | j|| d S r)   )r   r   getGlyphIDManyr   r-   r-   r.   r     s    zGlyphID.writeArrayNc                 C   s   | | j|| d S r)   )
writeValuer   
getGlyphIDr   r-   r-   r.   r     s    zGlyphID.write)N)	rR   r   r   r   r   r   r{   r   r   r-   r-   r-   r.   r     s   r   c                   @   s   e Zd ZdZdZdS )	GlyphID32r   LN)rR   r   r   r   r   r-   r-   r-   r.   r    s   r  c                   @   s   e Zd Zdd ZdS )NameIDc                 C   st   | ||d|fg  |rh|rh|d}|rh||}|d |rP|| n|d td|  |  d S )Nr   rX     zmissing from name tablez"name id %d missing from name table)r   rO   ZgetDebugNamer   r   logwarningr   )rw   r   r}   r   rX   r   Z	nameTabler-   r-   r.   r     s    



zNameID.xmlWriteNr   r-   r-   r-   r.   r    s   r  c                   @   s   e Zd Zdd ZdS )	STATFlagsc                 C   sh   | ||d|fg  g }|d@ r,|d |d@ r>|d |r\|d |d| |  d S )Nr   r   ZOlderSiblingFontAttributer   ZElidableAxisValueNamer   )r   rT   r   r   joinr   rw   r   r}   r   rX   r   flagsr-   r-   r.   r     s    


zSTATFlags.xmlWriteNr   r-   r-   r-   r.   r    s   r  c                   @   s   e Zd Zedd ZdS )
FloatValuec                 C   s   t | S r)   )floatr   r-   r-   r.   r     s    zFloatValue.fromStringNr   r-   r-   r-   r.   r    s   r  c                   @   s"   e Zd ZdZdd ZdddZdS )
DeciPointsr   c                 C   s   |  d S N
   r   r   r-   r-   r.   r{     s    zDeciPoints.readNc                 C   s   | t|d  d S r  )r   roundr   r-   r-   r.   r     s    zDeciPoints.write)Nr   r-   r-   r-   r.   r    s   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   r-   r-   r.   r{     s    zBaseFixedValue.readNc                 C   s   t || j| | d S r)   )r  writerMethodtoIntr   r-   r-   r.   r     s    zBaseFixedValue.writec                 C   s   t || jS r)   )fi2flprecisionBitsr^   r   r-   r-   r.   r    s    zBaseFixedValue.fromIntc                 C   s   t || jS r)   )fl2fir  r  r-   r-   r.   r    s    zBaseFixedValue.toIntc                 C   s   t || jS r)   )str2flr  r  r-   r-   r.   r     s    zBaseFixedValue.fromStringc                 C   s   t || jS r)   )fl2strr  r  r-   r-   r.   r     s    zBaseFixedValue.toString)N)rR   r   r   r   r   r  r  r  r{   r   classmethodr  r  r   r   r-   r-   r-   r.   r    s   



r  c                   @   s   e Zd ZdZdZdZdZdS )Fixedr      r   r   NrR   r   r   r   r  r  r  r-   r-   r-   r.   r     s   r   c                   @   s   e Zd ZdZdZdZdZdS )F2Dot14r      r   r   Nr"  r-   r-   r-   r.   r#    s   r#  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   )superr  biasr  	__class__r-   r.   r    s    zAngle.fromIntc                    s   t  |d | j S r&  )r(  r  r)  r  r*  r-   r.   r  
  s    zAngle.toIntc                 C   s   t t|| j | j S r)   )r
   r  factorr  r-   r-   r.   r     s    zAngle.fromStringc                 C   s   t || jS r)   )r	   r,  r  r-   r-   r.   r     s    zAngle.toString)rR   r   r   r)  r,  r  r  r  r   r   __classcell__r-   r-   r*  r.   r%     s   
r%  c                   @   s   e Zd ZdZdS )BiasedAngleg      ?N)rR   r   r   r)  r-   r-   r-   r.   r.    s   r.  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   )rw   r   r}   r   r   r-   r-   r.   r{   !  s    zVersion.readNc                 C   s   t |}|| d S r)   )fi2ver   r   r-   r-   r.   r   %  s    zVersion.writec                 C   s   t | S r)   )ve2fir   r-   r-   r.   r   )  s    zVersion.fromStringc                 C   s   d|  S )N0x%08xr-   r   r-   r-   r.   r   -  s    zVersion.toStringc                 C   s
   t | dS )Nr!  )r  )vr-   r-   r.   	fromFloat1  s    zVersion.fromFloat)N)
rR   r   r   r   r{   r   r   r   r   r4  r-   r-   r-   r.   r/    s   


r/  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rXtd|  |S )N    r   asciireplaceencodingerrorsignorez%replaced non-ASCII characters in "%s")readDatar   findr   r  r  )rw   r   r}   r   dataZzeroPossr-   r-   r.   r{   ?  s    
zChar64.readNc                 C   sv   t |ddd}|t |dddkr.td|  t|| jkrPtd|| jf  |d| j  d | j }|| d S )Nr8  r9  r:  r=  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr7  )r   r  r  lenr   	writeData)rw   r   r}   r   r   r   r@  r-   r-   r.   r   I  s    zChar64.write)N)rR   r   r   r   r   r{   r   r-   r-   r-   r.   r5  6  s   
r5  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 )rL   c                 C   s   | j o| j |S r)   )rN   r   r   r-   r-   r.   r   V  s    zStruct.getRecordSizec                 C   s   |   }||| |S r)   )rN   	decompile)rw   r   r}   r   tabler-   r-   r.   r{   Y  s    zStruct.readNc                 C   s   | || d S r)   rr   r   r-   r-   r.   r   ^  s    zStruct.writec                 C   s@   |d u r*|r<| ||dg  |  q<n|j||||d d S )N)emptyr   )rX   )r   r   toXMLr   r-   r-   r.   r   a  s    
zStruct.xmlWritec                 C   s<  d|v rt |d rd S |  }|d}|d ur<t||_t|d }|rd}| D ]^}|jrXd}t|dsvi |_|j}	|j	|	vsJ |j	|	ft
||j	d  t|j|j	|	|j	< qX|D ]*}
t|
tr|
\}}}||||| qq|jt|dd d |r8|r8| D ]&}|jr|j}	|	|j	= |	s|`q|S )NrG  FormatpostReadFT_propagator)
propagator)r   rN   rO   r   rI  r   getConvertersru   rK  rX   setattrr   __dict__r*   r+   fromXMLpopulateDefaultsr  )rw   r   r   r}   rE  rI  Z
noPostReadZcleanPropagationr]   rL  elementrX   r-   r-   r.   r   n  sB    




zStruct.xmlReadc                 C   s   dt | j S )Nz
Struct of )reprrN   )rw   r-   r-   r.   __repr__  s    zStruct.__repr__)N)	rR   r   r   r   r{   r   r   r   rT  r-   r-   r-   r.   rL   U  s   
*rL   c                   @   s   e Zd Zdd ZdddZdS )rJ   c                 C   s.   |j }|  }||| |||j  |S r)   )r~   rN   rD  rz   r4   )rw   r   r}   r   r~   rE  r-   r-   r.   r{     s
    zStructWithLength.readNc                 C   s   t | D ]\}}|jdkr q$qt|j| }t|trD|d7 }dddd|j }	| }
|	|_	|
|| | |
 }| }||||| |j| dd |j ksJ | |j|< d S )Nr4   r      i     >[= )r   r   r      ޭ)r   rM  rX   rB  itemsr*   r   r   getDataLengthr4   rr   getSubWriterr   
getAllData)rw   r   r}   r   r   r   Z	convIndexr]   lengthIndexZdeadbeefbeforelengthZlengthWriterr-   r-   r.   r     s    

zStructWithLength.write)NrR   r   r   r{   r   r-   r-   r-   r.   rJ     s   rJ   c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )rQ   r   c                 C   s   |  S r)   r   r   r-   r-   r.   
readOffset  s    zTable.readOffsetc                 C   s   | d d S r   r   rw   r   r-   r-   r.   writeNullOffset  s    zTable.writeNullOffsetc                 C   sL   |  |}|dkrd S |  }||}|jr<||_||_n||| |S r   )r`  rN   getSubReaderr   r   r}   rD  )rw   r   r}   r   offsetrE  r-   r-   r.   r{     s    

z
Table.readNc                 C   sR   |d u r|  | n:| }| j|_|d ur2||_|j|| jd ||| d S )N
offsetSize)rb  rZ  rX   r   writeSubTabler   rr   )rw   r   r}   r   r   r   	subWriterr-   r-   r.   r     s    zTable.write)N)rR   r   r   r   r`  rb  r{   r   r-   r-   r-   r.   rQ     s
   rQ   c                   @   s    e Zd ZdZdd Zdd ZdS )LTabler   c                 C   s   |  S r)   r   r   r-   r-   r.   r`    s    zLTable.readOffsetc                 C   s   | d d S r   r   ra  r-   r-   r.   rb    s    zLTable.writeNullOffsetNrR   r   r   r   r`  rb  r-   r-   r-   r.   ri    s   ri  c                   @   s    e Zd ZdZdd Zdd ZdS )Table24r   c                 C   s   |  S r)   r   r   r-   r-   r.   r`    s    zTable24.readOffsetc                 C   s   | d d S r   r   ra  r-   r-   r.   rb    s    zTable24.writeNullOffsetNrj  r-   r-   r-   r.   rk    s   rk  c                       s$   e Zd Zdd Z fddZ  ZS )r:   c                 C   s$   | j | | }| | j| j| j|S r)   r   r+  rX   rY   rZ   rw   	tableTypeZ
lookupTyperN   r-   r-   r.   getConverter  s    zSubStruct.getConverterc                    s   t t| |||d | d S r)   )r(  r:   r   r   r*  r-   r.   r     s    zSubStruct.xmlWriterR   r   r   ro  r   r-  r-   r-   r*  r.   r:     s   r:   c                       s$   e Zd Zdd Z fddZ  ZS )r8   c                 C   s$   | j | | }| | j| j| j|S r)   rl  rm  r-   r-   r.   ro    s    zSubTable.getConverterc                    s   t t| |||d | d S r)   )r(  r8   r   r   r*  r-   r.   r     s    zSubTable.xmlWriterp  r-   r-   r*  r.   r8     s   r8   c                   @   s   e Zd ZdddZdS )r9   Nc                 C   s   d|_ t| ||||| d S )NT)	ExtensionrQ   r   r   r-   r-   r.   r     s    zExtSubTable.write)N)rR   r   r   r   r-   r-   r-   r.   r9     s   r9   c                   @   s   e Zd Zdd ZdS )r;   c                 C   s&   | j || j}| | j| j| j|S r)   )rD   rO   rS   r+  rX   rY   rZ   )rw   Z
featureTagrN   r-   r-   r.   ro  
  s    zFeatureParams.getConverterN)rR   r   r   ro  r-   r-   r-   r.   r;   	  s   r;   c                   @   s2   e Zd ZdZdddddZdd Zdd	d
ZdS )r1   r   Nra   r?   c                C   s4   t j| |||||d d|d dkr(dnd | _d S )Nr?   r1   21)r`   rx   whichrv   r-   r-   r.   rx     s    zValueFormat.__init__c                 C   s   |  }t||| j< |S r)   )r   r   ru  rw   r   r}   r   formatr-   r-   r.   r{     s    zValueFormat.readc                 C   s   | | t||| j< d S r)   )r   r   ru  )rw   r   r}   r   rw  r   r-   r-   r.   r     s    
zValueFormat.write)N)N)rR   r   r   r   rx   r{   r   r-   r-   r-   r.   r1     s   r1   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   )rB  ru  r   r-   r-   r.   r   #  s    zValueRecord.getRecordSizec                 C   s   || j  ||S r)   )ru  readValueRecordr   r-   r-   r.   r{   &  s    zValueRecord.readNc                 C   s   || j  ||| d S r)   )ru  writeValueRecordr   r-   r-   r.   r   )  s    zValueRecord.writec                 C   s    |d u r
n| ||| j| d S r)   )rH  rX   r   r-   r-   r.   r   ,  s    zValueRecord.xmlWritec                 C   s&   ddl m} | }|d ||| |S )Nr   )rx  )otBaserx  rP  )rw   r   r   r}   rx  r   r-   r-   r.   r   2  s    zValueRecord.xmlRead)N)rR   r   r   r   r{   r   r   r   r-   r-   r-   r.   rx  "  s
   
rx  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  ra   r?   c                C   sN   t j| |||||d t| jtr6| jdd d d| _ntdd d | jd| _d S )Nr?   Value)rX   rY   rZ   )rX   rY   rZ   rN   )r`   rx   
issubclassrN   r   	converterrQ   rv   r-   r-   r.   rx   =  s    
zAATLookup.__init__c                 C   s   |  }|dkr| ||S |dkr0| ||S |dkrD| ||S |dkrX| ||S |dkrl| ||S ds|J d| d S )Nr   r   r      ry   Fzunsupported lookup format: %d)r   readFormat0readFormat2readFormat4readFormat6readFormat8rv  r-   r-   r.   r{   H  s    zAATLookup.readNc                    s   t t fdd| D }t ttd | | || | || | || | |g}|d \}}	}
| }|
  | | }||ksJ d|	||f d S )Nc                    s   g | ]\}}  ||fqS r-   r  )r   glyphvalr}   r-   r.   
<listcomp>Y  r0   z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	listsortedrX  filterbuildFormat0buildFormat2buildFormat6buildFormat8rY  )rw   r   r}   r   r   r   rP   formatsdataSizeZlookupFormatZwriteMethodr~   Z
actualSizer-   r  r.   r   W  s6    zAATLookup.writec                 C   sH   |  | |  | t||d\}}}|  | |  | |  | d S )N)nitemSize)r   r   )r   numUnitsunitSizesearchRangeentrySelector
rangeShiftr-   r-   r.   writeBinSearchHeaderw  s    



zAATLookup.writeBinSearchHeaderc                    sD   t   }t |krd S jj}d||  d fddfS )Nr   r   c                      s     S r)   )writeFormat0r-   r}   rw   rP   r   r-   r.   r/     r0   z(AATLookup.buildFormat0.<locals>.<lambda>)rB  getGlyphOrderr  r   )rw   r   r}   rP   	numGlyphs	valueSizer-   r  r.   r    s    
zAATLookup.buildFormat0c                 C   s2   | d |D ]\}}| jj||d |d d qd S )Nr   r   r   r   )r   r  r   )rw   r   r}   rP   ZglyphID_r   r-   r-   r.   r    s
    

zAATLookup.writeFormat0c                    s   |d \}}|}g |dd  D ]>\}}||d ks<||krZ |||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)   )writeFormat2r-   r}   segmentsrw   r   r-   r.   r/     r0   z(AATLookup.buildFormat2.<locals>.<lambda>)rT   r  r   rB  BIN_SEARCH_HEADER_SIZE)rw   r   r}   rP   ZsegStartZsegValueZsegEndglyphIDcurValuer  r  r  r-   r  r.   r    s     zAATLookup.buildFormat2c           
      C   s   | d | jj}t||d  }}| ||| |D ]4\}}}	| | | | | jj||d |	d d q6| d | d |d|  d S )Nr   r   r    r7  r   r  r   rB  r  r   rC  )
rw   r   r}   r  r  r  r  
firstGlyph	lastGlyphr   r-   r-   r.   r    s    





zAATLookup.writeFormat2c                    sD   j j}t|d  }}dj |d |  d fddfS )Nr   r   r  c                      s     S r)   )writeFormat6r-   r  r-   r.   r/     r0   z(AATLookup.buildFormat6.<locals>.<lambda>)r  r   rB  r  )rw   r   r}   rP   r  r  r  r-   r  r.   r    s    zAATLookup.buildFormat6c           	      C   s|   | d | jj}t||d  }}| ||| |D ](\}}| | | jj||d |d d q6| d |d|  d S )Nr  r   r  r  r7  r  )	rw   r   r}   rP   r  r  r  r  r   r-   r-   r.   r    s    



zAATLookup.writeFormat6c                    s^   d d d d  }}t || d kr2d S jj}dt |  d fddfS )Nr   rr  r   r  ry   c                      s     S r)   )writeFormat8r-   r  r-   r.   r/     r0   z(AATLookup.buildFormat8.<locals>.<lambda>)rB  r  r   )rw   r   r}   rP   Z
minGlyphIDZ
maxGlyphIDr  r-   r  r.   r    s    zAATLookup.buildFormat8c                 C   sV   |d d }| d | | | t| |D ]\}}| jj||d |d d q2d S )Nr   ry   r  )r   rB  r  r   )rw   r   r}   rP   ZfirstGlyphID_r   r-   r-   r.   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 r-   r   r   kr   r  r-   r.   
<dictcomp>  r0   z)AATLookup.readFormat0.<locals>.<dictcomp>)rB  r  r  r   r   )rw   r   r}   r  r@  r-   r  r.   r    s    zAATLookup.readFormat0c                 C   s   i }|j d }| |  }}|d| jj ks8J |t|D ]f}||||  d  | }| }	| jj||d d}
|dkr@t|	|d D ]}|
|||< qq@|S )Nr   r      r   r  r   r~   r   r  r   r   rz   r{   r   )rw   r   r}   mappingr~   r  r  r|   lastfirstr   r  r-   r-   r.   r    s    
zAATLookup.readFormat2c                 C   s   i }|j d }| }|dks&J |t| D ]}||||  d  | }| }| }	|dkr2|d}
|
||	  | jj|
|d || d d}t|D ]\}}||||| < qq2|S )Nr   r  r  r  r   r   r  )	r~   r   r   rz   rc  r  r   r   r   )rw   r   r}   r  r~   r  r|   r  r  rd  
dataReaderr@  r  r3  r-   r-   r.   r    s$    

zAATLookup.readFormat4c           	      C   s   i }|j d }| }|d| jj ks.J |t| D ]J}||||  d  | }| jj||d d}|dkr:||||< q:|S )Nr   r  r  r  r  )	rw   r   r}   r  r~   r  r|   r  r   r-   r-   r.   r  
  s    
zAATLookup.readFormat6c                    s<   |   |  }| jj|d |d} fddt|D S )Nr  c                    s    i | ]\}}  | |qS r-   r  r  r  r}   r-   r.   r    r0   z)AATLookup.readFormat8.<locals>.<dictcomp>)r   r  r   r   )rw   r   r}   r   r@  r-   r  r.   r    s    zAATLookup.readFormat8c           	      C   sF   i }|D ]8}t |tr|\}}}|dkr| j|||||d < q|S )NLookupr  )r*   r+   r  r   )	rw   r   r   r}   r   rR  rX   a
eltContentr-   r-   r.   r     s    

zAATLookup.xmlReadc                 C   s\   | || |  t| D ]$\}}| jj|||dd|fgd q || |  d S )Nr  r  )r   rX   r   )begintagr   r  rX  r  r   endtag)rw   r   r}   r   rX   r   r  r-   r-   r.   r   &  s    
zAATLookup.xmlWrite)N)rR   r   r   r  rx   r{   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r-   r-   r-   r.   r}  :  s*   
 

	
	r}  c                   @   s.   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 ]2\}
}||| }|  }||| ||	|
< qB|	S NDataOffsets)r   rc  r}  r   r{   rX  rN   rD  )rw   r   r}   r   ZlookupOffsetZ
dataOffsetlookupReaderlookupoffsetsresultr  rd  r  itemr-   r-   r.   r{   9  s    

zAATLookupWithDataOffset.readNc                 C   s   i i d  }}}g }	t ||jdD ]`}
t }||
 || | }||d }|d krz|}|t| }|||< |	| |||
< q"| }t	dd d t
}|||||d  | }|j|dd |j|dd |	D ]}|| qd S )Nr   )keyr  r   re  )r  r  r   rr   r[  rO   rB  rT   rZ  r}  r   r   rg  rC  )rw   r   r}   r   r   r   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDatar  rh  r@  rd  lookupWriterr  Z
dataWriterdr-   r-   r.   r   G  s*    


zAATLookupWithDataOffset.writec                 C   s   t dd d | j}||||S r  )r}  rN   r   )rw   r   r   r}   r  r-   r-   r.   r   j  s    zAATLookupWithDataOffset.xmlReadc                 C   s&   t dd d | j}|||||| d S r  )r}  rN   r   )rw   r   r}   r   rX   r   r  r-   r-   r.   r   n  s    z AATLookupWithDataOffset.xmlWrite)NrR   r   r   r{   r   r   r   r-   r-   r-   r.   r  8  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 )MorxSubtableConverterZLayoutOrderZReversedLayoutOrderZLogicalOrderZReversedLogicalOrder))FF)TFFT)TTc                 C   s   i | ]\}}||qS r-   r-   )r   r  r  r-   r-   r.   r  |  r0   z MorxSubtableConverter.<dictcomp>Nra   r?   c                C   s   t j| |||||d d S Nr?   )r`   rx   rv   r-   r-   r.   rx   ~  s    zMorxSubtableConverter.__init__c                 C   s2   |d@ dkrd|_ n|d@ dkr(d|_ nd|_ d S )N    r   Any   Vertical
Horizontal)TextDirection)rw   r  subtabler-   r-   r.   "_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 rdsJ d|j
 |j | }	|j|j |j |j |	  }
t|
|j|	 ksJ t|
|jd}| |_|j|| |||j  |S )	Nr6  r   r!     morxFz!unsupported 'morx' lookup type %s)r@  tableTag)r~   r    r   r4   r   _PROCESSING_ORDERSProcessingOrderr  r   Reservedr5   SubFeatureFlagsr   rO   r@  rB  r   r  r:   rD  rz   )rw   r   r}   r   r~   r   r  orderKeyrN   ZheaderLengthr@  	subReaderr-   r-   r.   r{     s,    




zMorxSubtableConverter.readc                 C   s   | || |  |d|j  |  |jd|jd |  |jd|jd |  |jdkr|jdd|j d |  |d|j  |  |jd	d
|j	 d |  |j
|| || |  d S )NzStructLength=%dr  r   r  r   r  z0x%04xzMorphType=%dr  r2  )r  r   r   r4   r   r  r  r  r5   r  r:   rH  r  r   r-   r-   r.   r     s$    

zMorxSubtableConverter.xmlWritec           
      C   s:  t  }d}d|_tt|D ]\}}}|dkrlt|d }|d@ dk|d@ dkf}	| j|	 |_| || q|dkr|d |_|j| jv sJ d|j q|dkr|d |_	|j	d	v sJ d
|j	 q|dkrt|d |_q|dkrt|d |_
q|dr||||| qdsJ |q|d@ d> |jB |_|S )Nr   CoverageFlagsr   r6  r!  r  zunknown ProcessingOrder: %sr  >   r  r  r  zunknown TextDirection %sr  r  ZMorphFr  )r    r  r  istupler   r  r  r  _PROCESSING_ORDERS_REVERSEDr  r  rF   rP  )
rw   r   r   r}   r   covFlagseltNameeltAttrsr  r  r-   r-   r.   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rTdndO }||rddndO }||_t|j}	| }
d	|_|j }|j d
@ |_ |	|| ||_ |j|	 dksJ | |
 }t
d||j|	< d S )Ni   r!  r  r  r   r6  r  r  rV  r  rW  z>L)r  r  r  r  r  rB  rX  rY  r4   rr   structpack)rw   r   r}   r   r   r   r  ZreverseOrderZlogicalOrderr\  r]  ZorigReservedr^  r-   r-   r.   r     s&    
zMorxSubtableConverter.write)N)N)rR   r   r   r  rX  r  rx   r  r{   r   r   r   r-   r-   r-   r.   r  s  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 )'	STXHeaderra   r?   c                C   s^   t j| |||||d t| jts&J tdd d t| _t| jtrTtdd d t	| _
nd | _
d S )Nr?   GlyphClassesPerGlyphLookup)r`   rx   r  rN   r   r}  r   classLookupr   r   perGlyphLookuprv   r-   r-   r.   rx     s    zSTXHeader.__init__c                 C   s  t  }|j}|d}|d}|d}d }	d }
| |_|||   |||   |||   | jd ur|d}|||   t| jt	r4|d}	|	||   |d}|||   |d}
|
||   |
j|j d }|dksJ |
||_| |
||_n*t| jtr^|d}	|	||   | j||||_t|j|j |jd  }t|D ]H}t }|j| t|jD ]$}| }| ||||	|j|< qq| jd ur| ||||_|S )Nr   r   )r   r~   rc  r   GlyphClassCountrz   r  r  rN   r   r   LigComponents_readLigatures	Ligaturesr   r  r{   r  r   r   r   StatesrT   r   _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)rw   r   r}   r   rE  r~   ZclassTableReaderZstateArrayReaderZentryTableReaderactionReaderZligaturesReaderZperGlyphTableReaderZligComponentReaderZnumLigComponentsZ	numStates
stateIndexstate
glyphClass
entryIndexr-   r-   r.   r{      sZ    









zSTXHeader.readc                 C   s0   |   }||j||j  }|||| |S r)   )rN   rc  r~   r   rD  )rw   r   r  r}   r  
transitionZentryReaderr-   r-   r.   r  /  s    zSTXHeader._readTransitionc                 C   s(   t |j}||j d }|||S ry  )rB  r@  r~   r   r   )rw   r   r}   limitZnumLigatureGlyphsr-   r-   r.   r  7  s    
zSTXHeader._readLigaturesc                 C   sb   d}|j D ]R}|j D ]B}t|tr|jdkr@t||jd }|jdkrt||jd }qq
|S )Nr   r  r   )r  r  rP   r*   r   	MarkIndexmaxCurrentIndex)rw   rE  
numLookupsr  r,   r-   r-   r.   _countPerGlyphLookups<  s    



zSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t| |D ]6}|d}|||   || j||i  q|S r   )	r~   r   r  rc  rz   r   rT   r  r{   )rw   rE  r   r}   r~   lookupsr  r  r-   r-   r.   r  K  s    
zSTXHeader._readPerGlyphLookupsNc                 C   s  t  }| jj||||jd d t| d}t|j d }d}	| jd urT|	d7 }	|	| j	j
7 }	| j	||j\}
}| ||j||\}}|	t| }|t| }|t| }t| ||d}|
d ur|t| }nd }d\}}| ||}| ||}|d ur.t|dksJ |t|
 }|t| }|| ||	 || || | jd url|| |d ur|| |d ur|| || || || || || |
d ur||
 |d ur|| |d ur|| d S )N)r   r   r   r!  r   )NNr   )r   r  r   r  r   r[  r   rP   r  rN   actionHeaderSizecompileActionsr  _compileStatesrB  _compilePerGlyphLookups_compileLigComponents_compileLigaturesr   rC  )rw   r   r}   r   r   r   ZglyphClassWriterZglyphClassDataglyphClassCountZglyphClassTableOffsetZ
actionDataactionIndexstateArrayDataentryTableDataZstateArrayOffsetZentryTableOffsetZperGlyphOffsetZperGlyphDataZactionOffsetZligaturesOffsetZligComponentsOffsetZligComponentsDataZligaturesDatar-   r-   r.   r   T  sb    





















zSTXHeader.writec                 C   s   t  }g i  }}|D ]}t|D ]}	|j|	 }
t  }|
||| | }t||
jkstJ dt|
|
jt|f ||}|d u rt|}|||< |	| |
| q qt| d}tt|d}||fS )Nz1%s has staticSize %d, but actually wrote %d bytesr   )r   r   r  rr   r[  rB  r   rS  rO   rT   r   r   r   )rw   r}   statesr  r  ZstateArrayWriterentriesZentryIDsr  r  r  ZentryWriterZ	entryDatar  r  r  r-   r-   r.   r    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 qH| S )Nr0   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   re  )	r  r  rB  r  r   rZ  r   rg  r[  )rw   rE  r}   r  r   r  r  r-   r-   r.   r    s    


z!STXHeader._compilePerGlyphLookupsc                 C   s2   t |dsd S t }|jD ]}|| q| S )Nr  )r   r   r  r   r[  )rw   rE  r}   r   	componentr-   r-   r.   r	    s    

zSTXHeader._compileLigComponentsc                 C   s8   t |dsd S t }|jD ]}||| q| S )Nr  )r   r   r  r   r  r[  )rw   rE  r}   r   	glyphNamer-   r-   r.   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 q|d |  qft|jD ]^\}}|j d	|d |  t| D ] \}}|jd
||d |  q|d	 |  qt|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   rX   r  r  r  LigComponent)r  r   )r  r   r   r  r  r  rX  r   r   r  r  rH  r  r  r   r  _xmlWriteLigatures)rw   r   r}   r   rX   r   gklassr  r  r  transr|   r  r  r  r-   r-   r.   r     sL    








zSTXHeader.xmlWritec                 C   sf   t |dsd S |d |  tt|dD ] \}}|jd||d |  q.|d |  d S )Nr  Ligature)r  r  )r   r  r   r   r  r   r  )rw   r   r}   r   rX   r   r|   r  r-   r-   r.   r    s    



zSTXHeader._xmlWriteLigaturesc                 C   s   t  }tt|D ]\}}}|dkrB|d }|d }	t|	|j|< q|dkrf| |||}
|j|
 q|dkr| j	|||}|j
| q|dkr| ||||_q|dkr| ||||_qt|j d |_|S )	Nr  r  r   r  r  r  r  r   )r   r  r  r   r  _xmlReadStater  rT   r  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r   rP   r  )rw   r   r   r}   rE  r  r  r  r  r   r  r  r-   r-   r.   r     s(    zSTXHeader.xmlReadc           
      C   sV   t  }tt|D ]@\}}}|dkrt|d }|  }	|	|||| |	|j|< q|S )Nr  r  )r   r  r  r   rN   rP  r  )
rw   r   r   r}   r  r  r  r  r  r  r-   r-   r.   r    s    zSTXHeader._xmlReadStatec                 C   s8   g }t t|D ]$\}}}|dkr|t|d  q|S )Nr  r   )r  r  rT   r   )rw   r   r   r}   ZligComponentsr  r  _eltContentr-   r-   r.   r     s
    zSTXHeader._xmlReadLigComponentsc                 C   s4   g }t t|D ] \}}}|dkr||d  q|S )Nr  r  )r  r  rT   )rw   r   r   r}   ligsr  r  r"  r-   r-   r.   r!    s
    zSTXHeader._xmlReadLigatures)N)rR   r   r   rx   r{   r  r  r  r  r   r  r  r	  r
  r   r  r   r  r   r!  r-   r-   r-   r.   r    s"   /	
7(
r  c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )CIDGlyphMapc                 C   s>   |  }i }t||D ]\}}|dkr||||< q|S Nr  )r   r   r   r   )rw   r   r}   r   ZnumCIDsr  cidr  r-   r-   r.   r{   (  s    zCIDGlyphMap.readNc           	         sX    fdd|  D }|r&t|d nd}|| t|D ]}|||d q<d S )Nc                    s   i | ]\}}|  |qS r-   r  )r   r&  r  r  r-   r.   r  1  r0   z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   r  rX  r   r   r   rO   )	rw   r   r}   r   r   r   rX  r   r&  r-   r  r.   r   0  s
    
zCIDGlyphMap.writec                 C   s>   i }t t|D ]*\}}}|dkr|d  |t|d < q|S )NCIDr  r&  )r  r  stripr   rw   r   r   r}   r  ZeNameZeAttrsZ	_eContentr-   r-   r.   r   7  s
    zCIDGlyphMap.xmlReadc                 C   sh   | || |  t| D ]0\}}|d ur |dkr |jd||d |  q || |  d S )Nr  r(  )r&  r  r  r   r  rX  r   r  )rw   r   r}   r   rX   r   r&  r  r-   r-   r.   r   >  s    

zCIDGlyphMap.xmlWrite)Nr  r-   r-   r-   r.   r$  '  s   
r$  c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )GlyphCIDMapc           
      C   s|   |  }| }||}|t|kr<td|t|f  i }ttt|t|D ] }|| }	|	dkrV|	||| < qV|S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restr  )r  r   r   rB  r  r  r   min)
rw   r   r}   r   
glyphOrderr   cidsr  r  r&  r-   r-   r.   r{   J  s    

zGlyphCIDMap.readNc           	         sX    fdd|  D }|r&t|d nd}|| t|D ]}|||d q<d S )Nc                    s,   i | ]$\}}|d ur|dkr  ||qS r%  r  )r   r  r&  r  r-   r.   r  \  s   z%GlyphCIDMap.write.<locals>.<dictcomp>r   r   r  r'  )	rw   r   r}   r   r   r   rX  r   r  r-   r  r.   r   [  s    

zGlyphCIDMap.writec                 C   s:   i }t t|D ]&\}}}|dkrt|d ||d < q|S )Nr(  r   r  )r  r  r   r*  r-   r-   r.   r   f  s
    zGlyphCIDMap.xmlReadc                 C   sh   | || |  t| D ]0\}}|d ur |dkr |jd||d |  q || |  d S )Nr  r(  r  r+  )rw   r   r}   r   rX   r   r  r&  r-   r-   r.   r   m  s    

zGlyphCIDMap.xmlWrite)Nr  r-   r-   r-   r.   r,  I  s   
r,  c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )
DeltaValuec                 C   s   |d }|d }|d }|dv s(J d|| d }d|> }d|> }	d|> d }
d|d > }g }d\}}t |D ]H}|dkr| d	 }}|| }||? |
@ }||@ r||	 }|| qp|S )
N	StartSizeEndSizeDeltaFormatr   r   r   illegal DeltaFormatr   )r   r   r   r!  )r   r   rT   )rw   r   r}   r   r1  r2  r3  nItemsnBitsZminusOffsetmaskZsignMaskr0  tmpshiftr|   r   r-   r-   r.   r{   y  s(    zDeltaValue.readNc                 C   s   |d }|d }|d }|}	|dv s,J d|| d }
d|> }t |	|
ksPJ d|> d }d\}}|	D ]6}|| }|||@ |> B }|dkrh|| d\}}qh|d	kr|| d S )
Nr1  r2  r3  r4  r5  r   )r   r!  r   r!  )rB  r   )rw   r   r}   r   r   r   r1  r2  r3  r0  r6  r7  r8  r9  r:  r-   r-   r.   r     s$    

zDeltaValue.writec                 C   s"   | ||d|fg  |  d S r   r   r   r   r-   r-   r.   r     s    zDeltaValue.xmlWritec                 C   s   t |d S r   r   r   r-   r-   r.   r     s    zDeltaValue.xmlRead)NrR   r   r   r{   r   r   r   r-   r-   r-   r.   r0  x  s   
r0  c                   @   s   e Zd Zdd ZdddZdS )VarIdxMapValuec           	         s|   |d }|d }d|d@  }d|> d  d  d| d|d@ d?  }|j |j|j|jd	| } fd
d||D S )NEntryFormatrj   r   r  l    r!  0   r   r   r   r   r   c                    s    g | ]}|@ > | @ B qS r-   r-   )r   raw	innerMaskZ	outerMask
outerShiftr-   r.   r    s   z'VarIdxMapValue.read.<locals>.<listcomp>r   r   readUInt24Arrayr   )	rw   r   r}   r   fmtr6  	innerBits	entrySizer   r-   rC  r.   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?  rj   r   r  r!  r@  r   rA  c                    s    g | ]}|d @ ? | @ B qS )l      r-   )r   idxrD  rE  r-   r.   r    s   z(VarIdxMapValue.write.<locals>.<listcomp>)setValuerB  r   r   writeUInt24Arrayr   )rw   r   r}   r   r   r   rH  r  rI  rJ  r   r-   rL  r.   r     s&    zVarIdxMapValue.write)Nr_  r-   r-   r-   r.   r>    s   r>  c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )VarDataValuec                 C   s   g }|d }|d }t |d@ }|d@ }|r<|j|j }}	n|j|j }}	t||t|| }
}|||
 ||	||
  ||kr||d = |S )Nri   	NumShorts     )boolr   r   r   r-  r   extend)rw   r   r}   r   rP   regionCount	wordCount	longWordsZreadBigArrayZreadSmallArrayn1n2r-   r-   r.   r{     s    
zVarDataValue.readNc                 C   s   |d }|d }t |d@ }|d@ }|j|jf|j|jfd| \}	}
t||t|| }}|	|d |  |
|||  ||kr|dg||   d S )Nri   rP  rQ  rR  r  r   )rS  r   r   r   r-  r   writeSmallArray)rw   r   r}   r   rP   r   rU  rV  rW  ZwriteBigArrayrZ  rX  rY  r-   r-   r.   r     s    

zVarDataValue.writec                 C   s"   | ||d|fg  |  d S r   r;  r   r-   r-   r.   r     s    zVarDataValue.xmlWritec                 C   s   t |d S r   r<  r   r-   r-   r.   r     s    zVarDataValue.xmlRead)Nr=  r-   r-   r-   r.   rO    s   
rO  c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )TupleValuesc                 C   s   t d |d S r   )r   decompileDeltas_)rw   r@  r}   r-   r-   r.   r{     s    zTupleValues.readNc                 C   s   t t|S r)   )bytesr   compileDeltaValues_)rw   r   r}   r   rP   r   r-   r-   r.   r     s    zTupleValues.writec                 C   s   t |d S r   r<  r   r-   r-   r.   r     s    zTupleValues.xmlReadc                 C   s"   | ||d|fg  |  d S r   r;  r   r-   r-   r.   r     s    zTupleValues.xmlWrite)Nr  r-   r-   r-   r.   r[    s   
r[  c                   @   sB   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 )	CFF2IndexNra   )	itemClassitemConverterClassr@   c                C   s4   t j| |||||d || _|d ur*| nd | _d S r  )r`   rx   
_itemClass
_converter)rw   rX   rY   rZ   rN   r`  ra  r@   r-   r-   r.   rx      s    zCFF2Index.__init__c                    s      dkrg S  dd }jduo> dk}|s| d }g }|d}|d  |D ]l}	||	ksJ |	| }
jd ur }||
j |}
njd urΈj	|
}
|
|
 |	}qp|S  fdd}| }t|g  }|S d S )	Nr   c                 S   s   | j | j| j| jd| S )NrA  rF  )r   offSizer-   r-   r.   getReadArray9  s    z$CFF2Index.read.<locals>.getReadArrayFry   r   c                     sH     jd   d   	fdd} | S )Nr   c                    s    |    d}  |d   |d |d  }jd urj }||j |}njd urj|}|S )Nr   r   r   )rz   r>  rb  rD  
localStaterc  r{   )r|   r  r  obj)data_posr}   rd  
offset_posr   r   rw   r-   r.   r   `  s    

z8CFF2Index.read.<locals>.get_read_item.<locals>.read_itemr   r   r   r}   re  rd  r   rw   )rh  ri  r   r   r.   r   Z  s    
z%CFF2Index.read.<locals>.get_read_item)r   r   r   popr>  rb  rD  rf  rc  r{   rT   r   )rw   r   r}   r   r   r   r  rX  
lastOffsetrd  r  rg  r   r   r   r-   rj  r.   r{   3  s8    




zCFF2Index.readc                    s   |} t| t|sd S jd ur< fdd|D }n&jd urb fddt|D }dd |D }tt|dd}|d }|dk rdn|d	k rd
n|dk rdnd}	|	 jj	j
jd|	 }
|
| |D ]}| qd S )Nc                    s   g | ]}|  qS r-   rF  r   r  r  r-   r.   r    r0   z#CFF2Index.write.<locals>.<listcomp>c              	      s$   g | ]\}}j  ||qS r-   )rc  r   )r   r|   r  r}   rw   r   r   r-   r.   r    s   c                 S   s   g | ]}t |qS r-   )rB  rm  r-   r-   r.   r    r0   r   )initialrr     i   r   i   r   r   rA  )r   rB  rb  rc  r   r  r%   r   r   r   rN  r   rC  )rw   r   r}   r   rP   r   rX  r  rl  rd  r   r  r-   rn  r.   r   w  s8    


zCFF2Index.writec                 C   sJ   | j d ur&|   }|d ||| |S | jd ur@| j|||S t d S r)   )rb  rP  rc  r   r   )rw   r   r   r}   rg  r-   r-   r.   r     s    

zCFF2Index.xmlReadc              
   C   sz   | j d ur4t|D ]\}}|||d|fg| qnB| jd urpt|D ]&\}}| j|||||d|fg  qFnt d S )Nr  )rb  r   rH  rc  r   r   )rw   r   r}   r   rX   r   r|   r  r-   r-   r.   r     s    

zCFF2Index.xmlWrite)N)N)rR   r   r   rx   r{   r   r   r   r-   r-   r-   r.   r_    s    D
%
r_  c                   @   s   e Zd Zdd ZdS )
LookupFlagc                 C   s   | ||d|fg  g }|d@ r,|d |d@ r>|d |d@ rP|d |d@ rb|d	 |d
@ rt|d |d@ r|d|d?   |r|d| |  d S )Nr   r   ZrightToLeftr   ZignoreBaseGlyphsr   ZignoreLigaturesry   ZignoreMarksr!  ZuseMarkFilteringSeti   zmarkAttachmentType[%i]r	  )r   rT   r   r
  r   r  r-   r-   r.   r     s"    




zLookupFlag.xmlWriteNr   r-   r-   r-   r.   rq    s   rq  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)   )	enumClassr(  r{   r   r*  r-   r.   r{     s    z_UInt8Enum.readc                 C   s   t | j| S r)   )r  rs  upperr  r-   r-   r.   r     s    z_UInt8Enum.fromStringc                 C   s   |  |j S r)   )rs  rX   lowerr  r-   r-   r.   r     s    z_UInt8Enum.toString)
rR   r   r   r   rs  r{   r  r   r   r-  r-   r-   r*  r.   rr    s   
rr  c                   @   s   e Zd ZeZdS )r!   N)rR   r   r   _ExtendModers  r-   r-   r-   r.   r!     s   r!   c                   @   s   e Zd ZeZdS )r"   N)rR   r   r   _CompositeModers  r-   r-   r-   r.   r"     s   r"   )ra  )r`  c                 C   s   t t| dS N)rN   )r&   r}  Cr-   r-   r.   r/     r0   c                 C   s   t t| dS rx  )r&   r  ry  r-   r-   r.   r/     r0   c                 C   s   t t| dS rx  )r&   r  ry  r-   r-   r.   r/     r0   c                 C   s   t t| dS rx  )r&   rQ   ry  r-   r-   r.   r/     r0   c                 C   s   t t| dS rx  )r&   ri  ry  r-   r-   r.   r/     r0   c                 C   s   t t| dS rx  )r&   rk  ry  r-   r-   r.   r/     r0   ).Zint8int16Zint32r6   r2   uint24r7   char64r   r   r/  r   r   r  r  r  r   r#  r%  r.  r  OffsetLOffsetOffset24rx  r0  r>  rO  rq  r!   r"   r  	TupleListVarCompositeGlyphListr$  r,  rA   rB   rC   r    r}  r  r  ZOffsetToZ	LOffsetToZLOffset24To){fontTools.misc.fixedToolsr   r  r   r  r   r  r   r  r   r0  r   r1  %fontTools.ttLib.tables.TupleVariationr   fontTools.misc.roundToolsr	   r
   fontTools.misc.textToolsr   r   r   r   r   ZfontTools.misc.lazyToolsr   fontTools.ttLibr   r|  r   r   r   r   r   otTablesr   r   r   r   r   r   r   r   r    r!   rv  r"   rw  r#   	itertoolsr$   r%   	functoolsr&   typesr'   r   r  typingr(   logging	getLoggerrR   r  r  r_   objectr`   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   rH   rI   r   r   r  r  r  r  r  r  r   r#  r%  r.  r/  r5  rL   rJ   rQ   ri  rk  r:   r8   r9   r;   r1   rx  r}  r  r  r  r$  r,  r0  r>  rO  r[  r_  rq  rr  rK   r-   r-   r-   r.   <module>   s    8
@h


G"		   ;   5"/503 

