a
    ׶a5                  +   @   s  d dl mZmZmZmZm	Z
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 ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z(m)Z* d dl+m,Z, d d	l-m.Z. d d
l/Z/d d
l0Z0e01e2Z3dd Z4dd Z5G dd de6Z7zd dl8m9Z9 W n  e:y&   d dl9m9Z9 Y n0 G dd de9Z;G dd de<Z=G dd de=Z>G dd de>Z?G dd de>Z@G dd de@ZAG dd de@ZBG d d! d!eBZCG d"d# d#e?eBZDG d$d% d%e@ZEG d&d' d'e@ZFG d(d) d)e@ZGG d*d+ d+e@ZHG d,d- d-e@ZIG d.d/ d/e@ZJG d0d1 d1eJeHZKG d2d3 d3eJeFZLG d4d5 d5eJeBZMG d6d7 d7e>ZNG d8d9 d9e>ZOG d:d; d;eOZPG d<d= d=eFZQG d>d? d?eFZRG d@dA dAe>ZSG dBdC dCeSZTG dDdE dEeSZUG dFdG dGeSZVG dHdI dIeVZWG dJdK dKe>ZXG dLdM dMe>ZYG dNdO dOe=ZZG dPdQ dQeZZ[G dRdS dSeZZ\G dTdU dUe\Z]G dVdW dWe\Z^G dXdY dYeZZ_G dZd[ d[e\Z`G d\d] d]e]e`ZaG d^d_ d_e\ZbG d`da dae@ZcG dbdc dcecZdG ddde dee=ZeG dfdg dge=ZfG dhdi die=ZgG djdk dke=ZhG dldm dme=ZiG dndo doe=ZjG dpdq dqe=ZkG drds dse=ZlG dtdu due=ZmG dvdw dweFZnG dxdy dyeHZoG dzd{ d{eoZ'G d|d} d}eoZ)eGeEeHeFeIeBeYeCeDeXeNeOePeQeTeUeVeWeZe\e]e^edekelemene'e)eReieje[e[e[egd~d dd dd dd dd dd d*Zpd
S )    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)getSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)
lookupTypesAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeMode)zip_longest)partialNc                 C   s
   t | tS N)
isinstancetuple)t r&   s/Users/vegardjervell/Documents/master/model/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}
|
|||}|jr|j}n|dv r||}n
||	}|js||_|dv r\|d |_|j D ]*}| D ]}t||||||j< q<q0|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)uint8r+   uint32SubTableExtSubTable	SubStructFeatureParams)ZCIDGlyphMappingZGlyphCIDMapping()	MortChainMortSubtable	MorxChain)r1   r2   r3   r   featureParamTypes)
startswithr*   endswithComputedUInt8ComputedUShortComputedULongr1   r2   r3   r4   StructWithLengthconverterMappingStructeval
tableClassgetr   valuesTable__name__r9   defaultFeatureParamsappend)Z	tableSpecZtableNamespace
convertersZconvertersByNametpnamerepeatauxdescrZ	tableNameZconverterClassconvrC   r%   clsr&   r&   r'   buildConverters   sd    








rR   c                   @   s   e Zd ZdZdS )_MissingItemr&   N)rG   
__module____qualname__	__slots__r&   r&   r&   r'   rS   ]   s   rS   )UserListc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	_LazyListc                 C   s   |  t||S r"   )__getitem__slice)selfijr&   r&   r'   __getslice__i   s    z_LazyList.__getslice__c                    s   t |tr.t|t  } fdd|D S  j| }t |tr| j j	|d  j
    j j ji }| j|< |S )Nc                    s   g | ]} | qS r&   r&   .0r\   r[   r&   r'   
<listcomp>o   r)   z)_LazyList.__getitem__.<locals>.<listcomp>r   )r#   rZ   rangeindiceslendatarS   readerseekpos
recordSizerP   readfont)r[   krd   itemr&   ra   r'   rY   l   s    



z_LazyList.__getitem__c                 C   s0   t |trt|}nt |tr ntS t| | S r"   )r#   rX   listNotImplementedr[   otherr&   r&   r'   __add__w   s    


z_LazyList.__add__c                 C   s   t |tstS |t|  S r"   )r#   ro   rp   rq   r&   r&   r'   __radd__   s    
z_LazyList.__radd__N)rG   rT   rU   r^   rY   rs   rt   r&   r&   r&   r'   rX   g   s   	rX   c                   @   sT   e Zd ZdZ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dS )BaseConverterzYBase class for converter objects. Apart from the constructor, this
	is an abstract class.Nc                 C   sN   || _ || _|| _|| _|dp(|dv | _|dp<|dk| _|dv | _d S )Nr,   )DesignAxisRecordSizeValueRecordSizeZ
LookupTyper.   )Z
ClassCountZClass2CountZ
FeatureTagZSettingsCountVarRegionCountMappingCountZRegionAxisCountZDesignAxisCountrv   ZAxisValueCountrw   Z	AxisCountZBaseGlyphRecordCountZLayerRecordCount)rL   rM   rN   rC   r;   ZisCountZisLookupTypeisPropagatedr[   rL   rM   rN   rC   r&   r&   r'   __init__   s    zBaseConverter.__init__c           	      C   s   |j o|dk}|r(| |}|tu r(d}|sVg }t|D ]}|| ||| q8|S t }| |_|jj	|_	||_
| |_||_|dd t|D  |||  |S dS )z(Read an array of values from the reader.   Fc                 s   s   | ]}t |gV  qd S r"   )rS   r_   r&   r&   r'   	<genexpr>   r)   z*BaseConverter.readArray.<locals>.<genexpr>N)lazygetRecordSizerp   rc   rI   rk   rX   copyrg   ri   rl   rP   rj   extendZadvance)	r[   rg   rl   	tableDictcountr   rj   lr\   r&   r&   r'   	readArray   s&    


zBaseConverter.readArrayc                 C   s   t | dr| jS tS )N
staticSize)hasattrr   rp   r[   rg   r&   r&   r'   r      s    zBaseConverter.getRecordSizec                 C   s   t | dS )zRead a value from the reader.NNotImplementedErrorr[   rg   rl   r   r&   r&   r'   rk      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)r[   writerrl   r   rE   r\   valueer&   r&   r'   
writeArray   s    zBaseConverter.writeArrayc                 C   s   t | dS )zWrite a value to the writer.Nr   r[   r   rl   r   r   repeatIndexr&   r&   r'   r      s    zBaseConverter.writec                 C   s   t | dS )zRead a value from XML.Nr   r[   attrscontentrl   r&   r&   r'   xmlRead   s    zBaseConverter.xmlReadc                 C   s   t | dS )zWrite a value to XML.Nr   r[   	xmlWriterrl   r   rL   r   r&   r&   r'   xmlWrite   s    zBaseConverter.xmlWrite)N)N)rG   rT   rU   __doc__r|   r   r   rk   r   r   r   r   r&   r&   r&   r'   ru      s   

ru   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)rG   rT   rU   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   )DEFAULTrI   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)rG   rT   rU   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   )intr   r&   r&   r'   r      s    zIntValue.fromStringNrG   rT   rU   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'   rk      s    z	Long.readc                 C   s
   | |S r"   )readLongArrayr[   rg   rl   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r[   r   rl   r   rE   r&   r&   r'   r      s    zLong.writeArray)NrG   rT   rU   r   rk   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'   rk     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)rG   rT   rU   r   r   r&   r&   r&   r'   r     s   r   c                   @   s   e Zd ZdZdS )VarIndex    N)rG   rT   rU   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'   rk     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     s    zShort.writec                 C   s   | | d S r"   )writeShortArrayr   r&   r&   r'   r     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'   rk      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   $  s    zUShort.writec                 C   s   | | d S r"   )writeUShortArrayr   r&   r&   r'   r   &  s    zUShort.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 )Int8r   c                 C   s   |  S r"   )ZreadInt8r   r&   r&   r'   rk   +  s    z	Int8.readc                 C   s
   | |S r"   )readInt8Arrayr   r&   r&   r'   r   -  s    zInt8.readArrayNc                 C   s   | | d S r"   )Z	writeInt8r   r&   r&   r'   r   /  s    z
Int8.writec                 C   s   | | d S r"   )writeInt8Arrayr   r&   r&   r'   r   1  s    zInt8.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 )UInt8r   c                 C   s   |  S r"   )	readUInt8r   r&   r&   r'   rk   6  s    z
UInt8.readc                 C   s
   | |S r"   )readUInt8Arrayr   r&   r&   r'   r   8  s    zUInt8.readArrayNc                 C   s   | | d S r"   )Z
writeUInt8r   r&   r&   r'   r   :  s    zUInt8.writec                 C   s   | | d S r"   )writeUInt8Arrayr   r&   r&   r'   r   <  s    zUInt8.writeArray)Nr   r&   r&   r&   r'   r   4  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"   Z
readUInt24r   r&   r&   r'   rk   A  s    zUInt24.readNc                 C   s   | | d S r"   ZwriteUInt24r   r&   r&   r'   r   C  s    zUInt24.write)NrG   rT   rU   r   rk   r   r&   r&   r&   r'   r   ?  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   G  s    zComputedInt.xmlWriteNrG   rT   rU   r   r&   r&   r&   r'   r   F  s   r   c                   @   s   e Zd ZdS )r<   NrG   rT   rU   r&   r&   r&   r'   r<   L  s   r<   c                   @   s   e Zd ZdS )r=   Nr   r&   r&   r&   r'   r=   N  s   r=   c                   @   s   e Zd ZdS )r>   Nr   r&   r&   r&   r'   r>   P  s   r>   c                   @   s"   e Zd ZdZdd ZdddZdS )Tagr   c                 C   s   |  S r"   )ZreadTagr   r&   r&   r'   rk   U  s    zTag.readNc                 C   s   | | d S r"   )ZwriteTagr   r&   r&   r'   r   W  s    z	Tag.write)Nr   r&   r&   r&   r'   r   S  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"   )getGlyphNameZ	readValuer   r   r   r&   r&   r'   rk   _  s    zGlyphID.readc                 C   s   | | j|| d S r"   )r   r   ZgetGlyphIDManyr   r&   r&   r'   r   a  s    zGlyphID.writeArrayNc                 C   s   | | j|| d S r"   )Z
writeValuer   
getGlyphIDr   r&   r&   r'   r   c  s    zGlyphID.write)N)	rG   rT   rU   r   r   r   rk   r   r   r&   r&   r&   r'   r   Z  s   r   c                   @   s   e Zd ZdZdZdS )	GlyphID32r   LN)rG   rT   rU   r   r   r&   r&   r&   r'   r   g  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   rL     zmissing from name tablez"name id %d missing from name table)r   rD   ZgetDebugNamer   r   logwarningr   )r[   r   rl   r   rL   r   Z	nameTabler&   r&   r'   r   m  s    



zNameID.xmlWriteNr   r&   r&   r&   r'   r   l  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   rI   r   r   joinr   r[   r   rl   r   rL   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'   rk     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dZdd ZdddZedd Zed	d
 ZdS )Fixedr   c                 C   s   t | dS N   )fi2flr   r   r&   r&   r'   rk     s    z
Fixed.readNc                 C   s   | t|d d S r   )r   fl2fir   r&   r&   r'   r     s    zFixed.writec                 C   s
   t | dS r   str2flr   r&   r&   r'   r     s    zFixed.fromStringc                 C   s
   t | dS r   fl2strr   r&   r&   r'   r     s    zFixed.toString)N	rG   rT   rU   r   rk   r   r   r   r   r&   r&   r&   r'   r     s   

r   c                   @   s:   e Zd ZdZdd ZdddZedd Zed	d
 ZdS )F2Dot14r   c                 C   s   t | dS N   )r   r   r   r&   r&   r'   rk     s    zF2Dot14.readNc                 C   s   | t|d d S r  )r   r   r   r&   r&   r'   r     s    zF2Dot14.writec                 C   s
   t | dS r  r   r   r&   r&   r'   r     s    zF2Dot14.fromStringc                 C   s
   t | dS r  r   r   r&   r&   r'   r     s    zF2Dot14.toString)Nr   r&   r&   r&   r'   r     s   

r   c                       sF   e Zd ZdZ fddZd fdd	Zedd Zed	d
 Z  Z	S )Angleg     ?c                    s   t  |||d S )N   )superrk   r   	__class__r&   r'   rk     s    z
Angle.readNc                    s   t  j||||d |d d S )Nr  r   )r  r   r   r  r&   r'   r     s    zAngle.writec                 C   s   t t|| j | j S r"   )r	   r   factorrQ   r   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)N)
rG   rT   rU   r	  rk   r   classmethodr   r   __classcell__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$   |  }|d? dks J d| |S Nr   r   zUnsupported version 0x%08xr   )r[   rg   rl   r   r   r&   r&   r'   rk     s    zVersion.readNc                 C   s.   t |}|d? dks J d| || 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 r   )r   )vr&   r&   r'   	fromFloat  s    zVersion.fromFloat)N)
rG   rT   rU   r   rk   r   r   r   r   r  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")ZreadDatar   findr   r   r   )r[   rg   rl   r   rf   ZzeroPossr&   r&   r'   rk     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 )Nr  r  r  r  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr  )r   r   r   re   r   	writeData)r[   r   rl   r   r   r   rf   r&   r&   r'   r     s    zChar64.write)N)rG   rT   rU   r   r   rk   r   r&   r&   r&   r'   r    s   r  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 )rA   c                 C   s   | j o| j |S r"   )rC   r   r   r&   r&   r'   r     s    zStruct.getRecordSizec                 C   s   |   }||| |S r"   )rC   	decompile)r[   rg   rl   r   tabler&   r&   r'   rk     s    zStruct.readNc                 C   s   | || d S r"   )compiler   r&   r&   r'   r     s    zStruct.writec                 C   s@   |d u r*|r<| ||dg  |  q<n|j||||d d S )N)emptyr   )rL   )r   r   toXMLr   r&   r&   r'   r      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 )Nr#  FormatZpostReadFT_propagator)
propagator)r   rC   rD   r   r%  r   getConvertersrz   r&  rL   setattrr   __dict__r#   r$   fromXMLZpopulateDefaultsgetattr)r[   r   r   rl   r!  r%  Z
noPostReadZcleanPropagationrP   r'  elementrL   r&   r&   r'   r     sB    




zStruct.xmlReadc                 C   s   dt | j S )Nz
Struct of )reprrC   ra   r&   r&   r'   __repr__7  s    zStruct.__repr__)N)	rG   rT   rU   r   rk   r   r   r   r/  r&   r&   r&   r'   rA     s   
*rA   c                   @   s   e Zd Zdd ZdddZdS )r?   c                 C   s.   |j }|  }||| |||j  |S r"   )ri   rC   r   rh   r-   )r[   rg   rl   r   ri   r!  r&   r&   r'   rk   <  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 )Nr-   r      i     >[= )r   r   r      ޭ)r   r(  rL   re   itemsr#   r   r   getDataLengthr-   r"  getSubWriterr   
getAllData)r[   r   rl   r   r   r   Z	convIndexrP   lengthIndexZdeadbeefbeforelengthZlengthWriterr&   r&   r'   r   C  s"    

zStructWithLength.write)NrG   rT   rU   rk   r   r&   r&   r&   r'   r?   ;  s   r?   c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )rF   r   c                 C   s   |  S r"   r   r   r&   r&   r'   
readOffset[  s    zTable.readOffsetc                 C   s   | d d S r   r   r[   r   r&   r&   r'   writeNullOffset^  s    zTable.writeNullOffsetc                 C   sL   |  |}|dkrd S |  }||}|jr<||_||_n||| |S r   )r;  rC   getSubReaderr   rg   rl   r   )r[   rg   rl   r   offsetr!  r&   r&   r'   rk   a  s    

z
Table.readNc                 C   sR   |d u r|  | n:|j| jd}| j|_|d ur8||_|| ||| d S )NZ
offsetSize)r=  r5  r   rL   r   writeSubTabler"  )r[   r   rl   r   r   r   	subWriterr&   r&   r'   r   n  s    
zTable.write)N)rG   rT   rU   r   r;  r=  rk   r   r&   r&   r&   r'   rF   W  s
   rF   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   r<  r&   r&   r'   r=    s    zLTable.writeNullOffsetNrG   rT   rU   r   r;  r=  r&   r&   r&   r'   rC  y  s   rC  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   r<  r&   r&   r'   r=    s    zTable24.writeNullOffsetNrD  r&   r&   r&   r'   rE    s   rE  c                       s$   e Zd Zdd Z fddZ  ZS )r3   c                 C   s$   | j | | }| | j| j| j|S r"   r   r  rL   rM   rN   r[   Z	tableTypeZ
lookupTyperC   r&   r&   r'   getConverter  s    zSubStruct.getConverterc                    s   t t| |||d | d S r"   )r  r3   r   r   r  r&   r'   r     s    zSubStruct.xmlWriterG   rT   rU   rH  r   r  r&   r&   r  r'   r3     s   r3   c                       s$   e Zd Zdd Z fddZ  ZS )r1   c                 C   s$   | j | | }| | j| j| j|S r"   rF  rG  r&   r&   r'   rH    s    zSubTable.getConverterc                    s   t t| |||d | d S r"   )r  r1   r   r   r  r&   r'   r     s    zSubTable.xmlWriterI  r&   r&   r  r'   r1     s   r1   c                   @   s   e Zd ZdddZdS )r2   Nc                 C   s   d|_ t| ||||| d S )NT)	ExtensionrF   r   r   r&   r&   r'   r     s    zExtSubTable.write)N)rG   rT   rU   r   r&   r&   r&   r'   r2     s   r2   c                   @   s   e Zd Zdd ZdS )r4   c                 C   s&   | j || j}| | j| j| j|S r"   )r9   rD   rH   r  rL   rM   rN   )r[   Z
featureTagrC   r&   r&   r'   rH    s    zFeatureParams.getConverterN)rG   rT   rU   rH  r&   r&   r&   r'   r4     s   r4   c                   @   s,   e Zd ZdZd	ddZdd Zd
ddZdS )r*   r   Nc                 C   s0   t | |||| d|d dkr$dnd | _d S )Nr*   21)ru   r|   whichr{   r&   r&   r'   r|     s    zValueFormat.__init__c                 C   s   |  }t||| j< |S r"   )r   r   rN  r[   rg   rl   r   formatr&   r&   r'   rk     s    zValueFormat.readc                 C   s   | | t||| j< d S r"   )r   r   rN  )r[   r   rl   r   rP  r   r&   r&   r'   r     s    
zValueFormat.write)N)N)rG   rT   rU   r   r|   rk   r   r&   r&   r&   r'   r*     s   
r*   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   )re   rN  r   r&   r&   r'   r     s    zValueRecord.getRecordSizec                 C   s   || j  ||S r"   )rN  ZreadValueRecordr   r&   r&   r'   rk     s    zValueRecord.readNc                 C   s   || j  ||| d S r"   )rN  ZwriteValueRecordr   r&   r&   r'   r     s    zValueRecord.writec                 C   s    |d u r
n| ||| j| d S r"   )r$  rL   r   r&   r&   r'   r     s    zValueRecord.xmlWritec                 C   s&   ddl m} | }|d ||| |S )Nr   )rQ  )otBaserQ  r+  )r[   r   r   rl   rQ  r   r&   r&   r'   r     s    zValueRecord.xmlRead)N)rG   rT   rU   r   rk   r   r   r   r&   r&   r&   r'   rQ    s
   
rQ  c                   @   s   e Zd ZdZ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   c                 C   sJ   t | |||| t| jtr2| jdd d d| _ntdd d | jd| _d S )NValue)rL   rM   rN   )rL   rM   rN   rC   )ru   r|   
issubclassrC   r   	converterrF   r{   r&   r&   r'   r|     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      r}   Fzunsupported lookup format: %d)r   readFormat0readFormat2readFormat4readFormat6readFormat8rO  r&   r&   r'   rk     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rl   r&   r'   rb     s   z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	ro   sortedr3  filterbuildFormat0buildFormat2buildFormat6buildFormat8r4  )r[   r   rl   r   r   r   rE   formatsZdataSizeZlookupFormatZwriteMethodri   Z
actualSizer&   ra  r'   r     s$    


zAATLookup.writec                 C   sH   |  | |  | t||d\}}}|  | |  | |  | d S )N)nZitemSize)r   r   )r   numUnitsunitSizeZsearchRangeZentrySelectorZ
rangeShiftr&   r&   r'   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     S r"   )writeFormat0r&   rl   r[   rE   r   r&   r'   r(     r)   z(AATLookup.buildFormat0.<locals>.<lambda>)re   getGlyphOrderrW  r   )r[   r   rl   rE   	numGlyphs	valueSizer&   rn  r'   rd    s    zAATLookup.buildFormat0c                 C   s2   | d |D ]\}}| jj||d |d d qd S )Nr   r   r   r   )r   rW  r   )r[   r   rl   rE   ZglyphID_r   r&   r&   r'   rm    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&   rl   segmentsr[   r   r&   r'   r(   %  r)   z(AATLookup.buildFormat2.<locals>.<lambda>)rI   rW  r   re   BIN_SEARCH_HEADER_SIZE)r[   r   rl   rE   ZsegStartZsegValueZsegEndglyphIDZcurValuerq  rj  rk  r&   rt  r'   re    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   rr    r  r   rW  r   re   rl  r   r  )
r[   r   rl   ru  rq  rj  rk  Z
firstGlyphZ	lastGlyphr   r&   r&   r'   rs  '  s    




zAATLookup.writeFormat2c                    sD   j j}t|d  }}dj |d |  d fddfS )Nr   r   rX  c                      s     S r"   )writeFormat6r&   rn  r&   r'   r(   :  r)   z(AATLookup.buildFormat6.<locals>.<lambda>)rW  r   re   rv  )r[   r   rl   rE   rq  rj  rk  r&   rn  r'   rf  6  s
    zAATLookup.buildFormat6c           	      C   s|   | d | jj}t||d  }}| ||| |D ](\}}| | | jj||d |d d q6| d |d|  d S )NrX  r   rr  rx  r  ry  )	r[   r   rl   rE   rq  rj  rk  rw  r   r&   r&   r'   rz  <  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   rK  r   rX  r}   c                      s     S r"   )writeFormat8r&   rn  r&   r'   r(   O  r)   z(AATLookup.buildFormat8.<locals>.<lambda>)re   rW  r   )r[   r   rl   rE   Z
minGlyphIDZ
maxGlyphIDrq  r&   rn  r'   rg  I  s    zAATLookup.buildFormat8c                 C   sV   |d d }| d | | | t| |D ]\}}| jj||d |d d q2d S )Nr   r}   rr  )r   re   rW  r   )r[   r   rl   rE   ZfirstGlyphID_r   r&   r&   r'   r{  Q  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`   rm   r   ra  r&   r'   
<dictcomp>_  s   z)AATLookup.readFormat0.<locals>.<dictcomp>)re   ro  rW  r   r   )r[   rg   rl   rp  rf   r&   ra  r'   rY  [  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   rx  r   ri   r   rW  r   rc   rh   rk   r   )r[   rg   rl   mappingri   rk  rj  r\   lastfirstr   rm   r&   r&   r'   rZ  b  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   rX  r  rx  r   r   r}  )	ri   r   rc   rh   r>  rW  r   r   r   )r[   rg   rl   r  ri   rk  r\   r  r  r?  
dataReaderrf   rm   r  r&   r&   r'   r[  q  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  rx  r  )	r[   rg   rl   r  ri   rk  r\   rw  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  rl   r&   r'   r    s   z)AATLookup.readFormat8.<locals>.<dictcomp>)r   rW  r   r   )r[   rg   rl   r   rf   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$   rW  r   )	r[   r   r   rl   r   r-  rL   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   rL   r   )begintagr   rb  r3  rW  r   endtag)r[   r   rl   r   rL   r   r_  r&   r&   r'   r     s    

zAATLookup.xmlWrite)N)rG   rT   rU   rv  r|   rk   r   r   rl  rd  rm  re  rs  rf  rz  rg  r{  rY  rZ  r[  r\  r]  r   r   r&   r&   r&   r'   rT    s*   

	
	rT  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   r>  rT  r   rk   r3  rC   r   )r[   rg   rl   r   ZlookupOffsetZ
dataOffsetlookupReaderlookupoffsetsresultr_  r?  r  rn   r&   r&   r'   rk     s    

zAATLookupWithDataOffset.readNc                 C   s   i i d  }}}g }	t ||jdD ]`}
t }||
 || | }||d }|d krz|}|t| }|||< |	| |||
< q"|jdd}t	dd d t
}|||||d  |jdd}|| || |	D ]}|| qd S )Nr   )keyr   r@  r  )rb  r   r   r"  r6  rD   re   rI   r5  rT  r   r   rA  r  )r[   r   rl   r   r   r   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDatar_  rB  rf   r?  lookupWriterr  Z
dataWriterdr&   r&   r'   r     s*    




zAATLookupWithDataOffset.writec                 C   s   t dd d | j}||||S r  )rT  rC   r   )r[   r   r   rl   r  r&   r&   r'   r     s    zAATLookupWithDataOffset.xmlReadc                 C   s&   t dd d | j}|||||| d S r  )rT  rC   r   )r[   r   rl   r   rL   r   r  r&   r&   r'   r     s    z AATLookupWithDataOffset.xmlWrite)NrG   rT   rU   rk   r   r   r   r&   r&   r&   r'   r    s   
#r  c                   @   s^   e Zd ZdddddZdd e D Z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    s   z MorxSubtableConverter.<dictcomp>c                 C   s   t | ||| d S r"   )ru   r|   )r[   rL   rM   rN   r&   r&   r'   r|     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)r[   r   Z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 )	Nr  r   r      ZmorxFz!unsupported 'morx' lookup type %s)rf   tableTag)ri   r   r   r-   r   _PROCESSING_ORDERSProcessingOrderr  r   Reservedr.   SubFeatureFlagsr   rD   rf   re   r   r  r3   r   rh   )r[   rg   rl   r   ri   mr   orderKeyrC   ZheaderLengthrf   Z	subReaderr&   r&   r'   rk   	  s8    




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  r  )r  r   r   r-   r   r  r  r  r.   r  r3   r$  r  r   r&   r&   r'   r   '  s0    

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   r  r   r  zunknown ProcessingOrder: %sr  >   r  r  r  zunknown TextDirection %sr  r  ZMorphFr  )r   r  rc  istupler   r  r  r  _PROCESSING_ORDERS_REVERSEDr  r  r;   r+  )
r[   r   r   rl   r  covFlagseltNameeltAttrsr  r  r&   r&   r'   r   >  s<    



zMorxSubtableConverter.xmlReadNc                 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   r  r  r  r1  rx  r2  z>L)r  r  r  r  r  re   r3  r4  r-   r"  structpack)r[   r   rl   r   r   r   r  ZreverseOrderZlogicalOrderr7  r8  ZorigReservedr9  r&   r&   r'   r   ]  s&    
zMorxSubtableConverter.write)N)rG   rT   rU   r  r3  r  r|   r  rk   r   r   r   r&   r&   r&   r'   r    s   r  c                   @   s   e Zd Z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 )%	STXHeaderc                 C   sZ   t | |||| t| jts"J tdd d t| _t| jtrPtdd d t	| _
nd | _
d S )NGlyphClassesPerGlyphLookup)ru   r|   rV  rC   r   rT  r   classLookupr   r   perGlyphLookupr{   r&   r&   r'   r|   w  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   ri   r>  r   GlyphClassCountrh   r  rV  rC   r   r   LigComponents_readLigatures	Ligaturesr   r  rk   r  r   rc   r   StatesrI   r   _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)r[   rg   rl   r   r!  ri   ZclassTableReaderZstateArrayReaderZentryTableReaderactionReaderZligaturesReaderZperGlyphTableReaderZligComponentReaderZnumLigComponentsZ	numStates
stateIndexstate
glyphClass
entryIndexr&   r&   r'   rk     sl    









zSTXHeader.readc                 C   s0   |   }||j||j  }|||| |S r"   )rC   r>  ri   r   r   )r[   rg   r  rl   r  
transitionZentryReaderr&   r&   r'   r    s    zSTXHeader._readTransitionc                 C   s(   t |j}||j d }|||S rR  )re   rf   ri   r   r   )r[   rg   rl   limitZnumLigatureGlyphsr&   r&   r'   r    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   rx  r   )r  r  rE   r#   r   Z	MarkIndexmaxZCurrentIndex)r[   r!  
numLookupsr  r%   r&   r&   r'   _countPerGlyphLookups  s    



zSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t| |D ]6}|d}|||   || j||i  q|S r   )	ri   rc   r  r>  rh   r   rI   r  rk   )r[   r!  rg   rl   ri   lookupsr|  r  r&   r&   r'   r    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 )Nr  r   r   r   r   )NNr   )r   r  r   r  r   r6  r  rE   r  rC   ZactionHeaderSizeZcompileActionsr  _compileStatesre   _compilePerGlyphLookups_compileLigComponents_compileLigaturesr   r  )r[   r   rl   r   r   r   ZglyphClassWriterZglyphClassDataglyphClassCountZglyphClassTableOffsetZ
actionDataactionIndexstateArrayDataentryTableDataZstateArrayOffsetZentryTableOffsetZperGlyphOffsetZperGlyphDataZactionOffsetZligaturesOffsetZligComponentsOffsetZligComponentsDataZligaturesDatar&   r&   r'   r     sf    





















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   rc   r  r"  r6  re   r   r.  rD   rI   r   r   r
   )r[   rl   Zstatesr  r  ZstateArrayWriterentriesZentryIDsr  r  r  ZentryWriterZ	entryDatar  r  r  r&   r&   r'   r    s6    



zSTXHeader._compileStatesc                 C   s   | j d u rdS | |}t|j|ks<J dt|j|f t }|jD ].}|jdd}| j ||i |d  || qH| S )Nr)   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   r@  )	r  r  re   r  r   r5  r   rA  r6  )r[   r!  rl   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   r6  )r[   r!  rl   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   r6  )r[   r!  rl   r   Z	glyphNamer&   r&   r'   r  D  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)rl   r   rL   r  r  r  LigComponent)r  r   )r  r   r   r  rb  r  r3  r   r   r  r  r$  r  r  r   r,  _xmlWriteLigatures)r[   r   rl   r   rL   r   gklassr  r  r  Ztransr\   r  r_  r`  r&   r&   r'   r   L  sP    








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  )r[   r   rl   r   rL   r   r\   r  r&   r&   r'   r  s  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   rc  r  r   r  _xmlReadStater  rI   r  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r  rE   r  )r[   r   r   rl   r!  r  r  r  r_  r   r  r  r&   r&   r'   r   ~  s4    zSTXHeader.xmlReadc           
      C   sV   t  }tt|D ]@\}}}|dkrt|d }|  }	|	|||| |	|j|< q|S )Nr  r  )r   rc  r  r   rC   r+  r  )
r[   r   r   rl   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   )rc  r  rI   r   )r[   r   r   rl   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_  )rc  r  rI   )r[   r   r   rl   Zligsr  r  r  r&   r&   r'   r    s
    zSTXHeader._xmlReadLigatures)N)rG   rT   rU   r|   rk   r  r  r  r  r   r  r  r  r  r   r  r   r  r  r  r&   r&   r&   r'   r  v  s"   
1

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 Nrx  )r   r   r   r   )r[   rg   rl   r   ZnumCIDsr  cidrw  r&   r&   r'   rk     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_  ra  r&   r'   r    s   z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   rx  r3  r  r   rc   rD   )	r[   r   rl   r   r   r   r3  r   r  r&   ra  r'   r     s    

zCIDGlyphMap.writec                 C   s>   i }t t|D ]*\}}}|dkr|d  |t|d < q|S )NCIDr_  r  )rc  r  stripr   r[   r   r   rl   r  ZeNameZeAttrsZ	_eContentr&   r&   r'   r     s    
zCIDGlyphMap.xmlReadc                 C   sh   | || |  t| D ]0\}}|d ur |dkr |jd||d |  q || |  d S )Nrx  r  )r  r_  r  r   rb  r3  r   r  )r[   r   rl   r   rL   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 restrx  )ro  r   r   re   r   r   rc   min)
r[   rg   rl   r   Z
glyphOrderr   Zcidsr  rw  r  r&   r&   r'   rk     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  ra  r&   r'   r    s   z%GlyphCIDMap.write.<locals>.<dictcomp>r   r   rx  r  )	r[   r   rl   r   r   r   r3  r   rw  r&   ra  r'   r     s    

zGlyphCIDMap.writec                 C   s:   i }t t|D ]&\}}}|dkrt|d ||d < q|S )Nr  r   r_  )rc  r  r   r  r&   r&   r'   r     s    
zGlyphCIDMap.xmlReadc                 C   sh   | || |  t| D ]0\}}|d ur |dkr |jd||d |  q || |  d S )Nrx  r  r  r  )r[   r   rl   r   rL   r   r_  r  r&   r&   r'   r     s    

zGlyphCIDMap.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 )
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   )rc   r   rI   )r[   rg   rl   r   r  r  r  nItemsnBitsZminusOffsetmaskZsignMaskr  tmpshiftr\   r   r&   r&   r'   rk     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 )
Nr  r  r  r  r  r   )r   r   r   r   )re   r   )r[   r   rl   r   r   r   r  r  r  r  r  r  r  r  r  r&   r&   r'   r     s$    

zDeltaValue.writec                 C   s"   | ||d|fg  |  d S r   r   r   r   r&   r&   r'   r   3  s    zDeltaValue.xmlWritec                 C   s   t |d S r   r   r   r&   r&   r'   r   7  s    zDeltaValue.xmlRead)NrG   rT   rU   rk   r   r   r   r&   r&   r&   r'   r    s   
r  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EntryFormatry   r   r  r   r   0   r   r   r   r   r   c                    s    g | ]}|@ > | @ B qS r&   r&   )r`   raw	innerMaskZ	outerMask
outerShiftr&   r'   rb   N  s   z'VarIdxMapValue.read.<locals>.<listcomp>)r   r   ZreadUInt24Arrayr   )	r[   rg   rl   r   fmtr  	innerBits	entrySizer   r&   r  r'   rk   =  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  ry   r   r  r   r  r   r  c                    s    g | ]}|d @ ? | @ B qS )l      r&   )r`   idxr  r  r&   r'   rb   b  s   z(VarIdxMapValue.write.<locals>.<listcomp>)ZsetValuere   r   r   ZwriteUInt24Arrayr   )r[   r   rl   r   r   r   r  r  r  r  r   r&   r  r'   r   Q  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 )Nrx   	NumShorts     )boolr   r   r   r  r  r   )r[   rg   rl   r   rE   regionCount	wordCount	longWordsZreadBigArrayZreadSmallArrayn1n2r&   r&   r'   rk   h  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 )Nrx   r
  r  r  r  r   )r  r   r   r   r  r  writeSmallArray)r[   r   rl   r   rE   r   r  r  r  ZwriteBigArrayr  r  r  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'   r	  f  s   
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ignoreLigaturesr}   ZignoreMarksr   ZuseMarkFilteringSeti   zmarkAttachmentType[%i]r   )r   rI   r   r   r   r   r&   r&   r'   r     s    zLookupFlag.xmlWriteNr   r&   r&   r&   r'   r    s   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"   )	enumClassr  rk   r   r  r&   r'   rk     s    z_UInt8Enum.readc                 C   s   t | j| S r"   )r,  r  upperr
  r&   r&   r'   r     s    z_UInt8Enum.fromStringc                 C   s   |  |j S r"   )r  rL   lowerr
  r&   r&   r'   r     s    z_UInt8Enum.toString)
rG   rT   rU   rp   r  rk   r  r   r   r  r&   r&   r  r'   r    s   
r  c                   @   s   e Zd ZeZdS )r   N)rG   rT   rU   _ExtendModer  r&   r&   r&   r'   r     s   r   c                   @   s   e Zd ZeZdS )r   N)rG   rT   rU   _CompositeModer  r&   r&   r&   r'   r     s   r   c                 C   s   t t| dS N)rC   )r!   rT  Cr&   r&   r'   r(     r)   c                 C   s   t t| dS r  )r!   r  r  r&   r&   r'   r(     r)   c                 C   s   t t| dS r  )r!   r  r  r&   r&   r'   r(     r)   c                 C   s   t t| dS r  )r!   rF   r  r&   r&   r'   r(     r)   c                 C   s   t t| dS r  )r!   rC  r  r&   r&   r'   r(     r)   c                 C   s   t t| dS r  )r!   rE  r  r&   r&   r'   r(     r)   )*Zint8Zint16r/   r+   Zuint24r0   Zchar64r   r   r  r   r   r   r   r   r   r   r  r  ZOffsetZLOffsetZOffset24rQ  r  r  r	  r  r   r   r   r  r  r6   r7   r8   r   rT  r  r  ZOffsetToZ	LOffsetToZLOffset24To)qZfontTools.misc.fixedToolsr   r   r   r   r   r   r   r   r   r  r   r  ZfontTools.misc.roundToolsr   r	   ZfontTools.misc.textToolsr
   r   r   r   r   ZfontTools.ttLibr   rS  r   r   r   r   r   ZotTablesr   r   r   r   r   r   r   r   r   r  r   r  	itertoolsr    	functoolsr!   r  logging	getLoggerrG   r   r  rR   r$   rS   collectionsrW   ImportErrorrX   objectru   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   r  r  r  rA   r?   rF   rC  rE  r3   r1   r2   r4   r*   rQ  rT  r  r  r  r  r  r  r  r	  r  r  r@   r&   r&   r&   r'   <module>   s    0
@QH" g;   >%.6+3