U
    i2ea                 ,   @   sD  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*m+Z+ d dl,m-Z- d d	l.m/Z/ d d
l0Z0d d
l1Z1d dl2m3Z3 d d
l4Z4e45e6Z7dd Z8dd Z9G dd de:Z;zd dl<m=Z= W n" e>k
r@   d dl=m=Z= Y nX G dd de=Z?G dd de@ZAG dd deAZBG dd deBZCG dd deBZDG dd deDZEG dd  d eDZFG d!d" d"eFZGG d#d$ d$eCeFZHG d%d& d&eDZIG d'd( d(eDZJG d)d* d*eDZKG d+d, d,eDZLG d-d. d.eDZMG d/d0 d0eDZNG d1d2 d2eNeLZOG d3d4 d4eNeJZPG d5d6 d6eNeFZQG d7d8 d8eBZRG d9d: d:eBZSG d;d< d<eSZTG d=d> d>eJZUG d?d@ d@eJZVG dAdB dBeBZWG dCdD dDeWZXG dEdF dFeWZYG dGdH dHeYZZG dIdJ dJeYZ[G dKdL dLe[Z\G dMdN dNe\Z]G dOdP dPeBZ^G dQdR dReBZ_G dSdT dTeAZ`G dUdV dVe`ZaG dWdX dXe`ZbG dYdZ dZebZcG d[d\ d\ebZdG d]d^ d^e`ZeG d_d` d`ebZfG dadb dbecefZgG dcdd ddebZhG dedf dfeDZiG dgdh dheiZjG didj djeAZkG dkdl dleAZlG dmdn dneAZmG dodp dpeAZnG dqdr dreAZoG dsdt dteAZpG dudv dveAZqG dwdx dxeAZrG dydz dzeAZsG d{d| d|eJZtG d}d~ d~eLZuG dd deuZ'G dd deuZ)eKeIeLeJeMeFe_eGeHe^eReSeTeUeXeZe[e\e]e`ebecedejeqeresete'e)eVeoepeaeaeaemdd dd dd dd dd dd d+Zvd
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NO_VARIATION_INDEX)zip_longest)partialN)Optionalc                 C   s
   t | tS N)
isinstancetuple)t r(   G/tmp/pip-unpacked-wheel-txsm8jh_/fontTools/ttLib/tables/otConverters.py<lambda>)       r*   c                 C   s  g }i }| D ]\}}}}}|}	| dr<|dks6tt}
n|dsN|dkr`tttd| }
nl|dkrnt}
n^|dkr|t}
nP|dkrt	}
nB|d	krt
}
n4|d
krt}
n&|tkrd|kr|}	t}
nt||t}
|
||||d}|jr|j}n|dkr||}n
||	}|js||_|dkr`|d |_|j D ]*}| D ]}t||||||j< q@q4|d	kr|d |_|d	 |_|j D ]}t||||||j< q|| ||kst||||< 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(description)	MortChainMortSubtable	MorxChain)r3   r4   r5   r   featureParamTypes)
startswithAssertionErrorr,   endswithComputedUInt8ComputedUShortComputedULongr3   r4   r5   r6   StructWithLengthconverterMappingStructeval
tableClassgetr   valuesTable__name__r=   defaultFeatureParamsappend)Z	tableSpecZtableNamespace
convertersZconvertersByNametpnamerepeatauxdescrZ	tableNameZconverterClassconvrH   r'   clsr(   r(   r)   buildConverters,   sd    








rW   c                   @   s   e Zd ZdZdS )_MissingItemr(   N)rL   
__module____qualname__	__slots__r(   r(   r(   r)   rX   l   s   rX   )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__w   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(   .0ra   r`   r(   r)   
<listcomp>}   s     z)_LazyList.__getitem__.<locals>.<listcomp>r   )r%   r_   rangeindiceslendatarX   readerseekpos
recordSizerU   readfont)r`   kri   itemr(   rf   r)   r^   z   s    



z_LazyList.__getitem__c                 C   s0   t |trt|}nt |tr ntS t| | S r$   )r%   r]   listNotImplementedr`   otherr(   r(   r)   __add__   s    


z_LazyList.__add__c                 C   s   t |tstS |t|  S r$   )r%   rt   ru   rv   r(   r(   r)   __radd__   s    
z_LazyList.__radd__N)rL   rY   rZ   rc   r^   rx   ry   r(   r(   r(   r)   r]   v   s   	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 r8   c                C   sT   || _ || _|| _|| _|dp(|dk| _|dp<|dk| _|dk| _|| _d S )Nr.   )DesignAxisRecordSizeValueRecordSizeZ
LookupTyper0   )Z
ClassCountZClass2CountZ
FeatureTagZSettingsCountVarRegionCountMappingCountZRegionAxisCountZDesignAxisCountr|   ZAxisValueCountr}   Z	AxisCountZBaseGlyphRecordCountZLayerRecordCount)	rQ   rR   rS   rH   r@   ZisCountZisLookupTypeisPropagatedr9   r`   rQ   rR   rS   rH   r9   r(   r(   r)   __init__   s    
zBaseConverter.__init__c           	      C   s   |j o|dk}|r(| |}|tk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$   )rX   rd   r(   r(   r)   	<genexpr>   s     z*BaseConverter.readArray.<locals>.<genexpr>N)lazygetRecordSizeru   rh   rN   rp   r]   copyrl   rn   rq   rU   ro   extendZadvance)	r`   rl   rq   	tableDictcountr   ro   lra   r(   r(   r)   	readArray   s&    


zBaseConverter.readArrayc                 C   s   t | dr| jS tS )N
staticSize)hasattrr   ru   r`   rl   r(   r(   r)   r      s    
zBaseConverter.getRecordSizec                 C   s   t | dS )zRead a value from the reader.NNotImplementedErrorr`   rl   rq   r   r(   r(   r)   rp      s    zBaseConverter.readc              
   C   s`   z(t |D ]\}}| ||||| q
W n2 tk
rZ } z|j|f |_ W 5 d }~X Y nX d S r$   )	enumeratewrite	Exceptionargs)r`   writerrq   r   rJ   ra   valueer(   r(   r)   
writeArray   s    zBaseConverter.writeArrayc                 C   s   t | dS )zWrite a value to the writer.Nr   r`   r   rq   r   r   repeatIndexr(   r(   r)   r      s    zBaseConverter.writec                 C   s   t | dS )zRead a value from XML.Nr   r`   attrscontentrq   r(   r(   r)   xmlRead   s    zBaseConverter.xmlReadc                 C   s   t | dS )zWrite a value to XML.Nr   r`   	xmlWriterrq   r   rQ   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searchr9   intgroup)r`   mr(   r(   r)   getVarIndexOffset   s    zBaseConverter.getVarIndexOffset)N)N)rL   rY   rZ   __doc__r   r   r   rp   r   r   r   r   recompiler   r#   r   r   r(   r(   r(   r)   rz      s   

rz   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)rL   rY   rZ   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   )DEFAULTrN   r   r   r   r   r(   r(   r)   r     s    
zOptionalValue.xmlWritec                 C   s   d|kr|  |d S | jS r   )r   r   r   r(   r(   r)   r     s    zOptionalValue.xmlRead)rL   rY   rZ   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rL   rY   rZ   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)   rp     s    z	Long.readc                 C   s
   | |S r$   )readLongArrayr`   rl   rq   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   rq   r   rJ   r(   r(   r)   r   %  s    zLong.writeArray)NrL   rY   rZ   r   rp   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)   rp   ,  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   2  s    zULong.writec                 C   s   | | d S r$   )writeULongArrayr   r(   r(   r)   r   5  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)rL   rY   rZ   r   r   r(   r(   r(   r)   r   9  s   r   c                   @   s   e Zd ZeZdS )VarIndexN)rL   rY   rZ   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)   rp   F  s    z
Short.readc                 C   s
   | |S r$   )readShortArrayr   r(   r(   r)   r   I  s    zShort.readArrayNc                 C   s   | | d S r$   )
writeShortr   r(   r(   r)   r   L  s    zShort.writec                 C   s   | | d S r$   )writeShortArrayr   r(   r(   r)   r   O  s    zShort.writeArray)Nr   r(   r(   r(   r)   r   C  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)   rp   V  s    zUShort.readc                 C   s
   | |S r$   )readUShortArrayr   r(   r(   r)   r   Y  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  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)   rp   f  s    z	Int8.readc                 C   s
   | |S r$   )readInt8Arrayr   r(   r(   r)   r   i  s    zInt8.readArrayNc                 C   s   | | d S r$   )Z	writeInt8r   r(   r(   r)   r   l  s    z
Int8.writec                 C   s   | | d S r$   )writeInt8Arrayr   r(   r(   r)   r   o  s    zInt8.writeArray)Nr   r(   r(   r(   r)   r   c  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)   rp   v  s    z
UInt8.readc                 C   s
   | |S r$   )readUInt8Arrayr   r(   r(   r)   r   y  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   s  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)   rp     s    zUInt24.readNc                 C   s   | | d S r$   ZwriteUInt24r   r(   r(   r)   r     s    zUInt24.write)NrL   rY   rZ   r   rp   r   r(   r(   r(   r)   r     s   r   c                   @   s   e Zd Zdd ZdS )ComputedIntc                 C   s&   |d k	r"| d||f  |  d S )Nz%s=%s)commentr   r   r(   r(   r)   r     s    zComputedInt.xmlWriteNrL   rY   rZ   r   r(   r(   r(   r)   r     s   r   c                   @   s   e Zd ZdS )rA   NrL   rY   rZ   r(   r(   r(   r)   rA     s   rA   c                   @   s   e Zd ZdS )rB   Nr   r(   r(   r(   r)   rB     s   rB   c                   @   s   e Zd ZdS )rC   Nr   r(   r(   r(   r)   rC     s   rC   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)   rp     s    zTag.readNc                 C   s   | | d S r$   )Z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$   )getGlyphNameZ	readValuer   r   r   r(   r(   r)   rp     s    zGlyphID.readc                 C   s   | | j|| d S r$   )r   r   ZgetGlyphIDManyr   r(   r(   r)   r     s    zGlyphID.writeArrayNc                 C   s   | | j|| d S r$   )Z
writeValuer   
getGlyphIDr   r(   r(   r)   r     s    zGlyphID.write)N)	rL   rY   rZ   r   r   r   rp   r   r   r(   r(   r(   r)   r     s   r   c                   @   s   e Zd ZdZdZdS )	GlyphID32r   LN)rL   rY   rZ   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   rQ     zmissing from name tablez"name id %d missing from name table)r   rI   ZgetDebugNamer   r   logwarningr   )r`   r   rq   r   rQ   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   rN   r   r   joinr   r`   r   rq   r   rQ   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)   rp     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)   rp     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rV   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)rL   rY   rZ   ru   r   r
  r  r  rp   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rL   rY   rZ   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)rL   rY   rZ   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)rL   rY   rZ   r  r(   r(   r(   r)   r  3  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   )r`   rl   rq   r   r   r(   r(   r)   rp   <  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   D  s    zVersion.fromStringc                 C   s   d|  S )N0x%08xr(   r   r(   r(   r)   r   H  s    zVersion.toStringc                 C   s
   t | dS )Nr  )r  )vr(   r(   r)   	fromFloatL  s    zVersion.fromFloat)N)
rL   rY   rZ   r   rp   r   r   r   r   r$  r(   r(   r(   r)   r  9  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`   rl   rq   r   rk   ZzeroPossr(   r(   r)   rp   Z  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   rj   r   	writeData)r`   r   rq   r   r   r   rk   r(   r(   r)   r   d  s    zChar64.write)N)rL   rY   rZ   r   r   rp   r   r(   r(   r(   r)   r%  Q  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 )rF   c                 C   s   | j o| j |S r$   )rH   r   r   r(   r(   r)   r   q  s    zStruct.getRecordSizec                 C   s   |   }||| |S r$   )rH   	decompile)r`   rl   rq   r   tabler(   r(   r)   rp   t  s    zStruct.readNc                 C   s   | || d S r$   )r   r   r(   r(   r)   r   y  s    zStruct.writec                 C   s@   |d kr*|r<| ||dg  |  q<n|j||||d d S )N)emptyr   )rQ   )r   r   toXMLr   r(   r(   r)   r   |  s    
zStruct.xmlWritec                 C   s<  d|krt |d rd S |  }|d}|d k	r<t||_t|d }|rd}| D ]^}|jrXd}t|dsvi |_|j}	|j	|	kst
|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 )Nr3  FormatZpostReadFT_propagator)
propagator)r   rH   rI   r   r5  r   getConvertersr   r6  rQ   r?   setattrr   __dict__r%   r&   fromXMLZpopulateDefaultsr  )r`   r   r   rq   r2  r5  Z
noPostReadZcleanPropagationrU   r7  elementrQ   r(   r(   r)   r     sB    




zStruct.xmlReadc                 C   s   dt | j S )Nz
Struct of )reprrH   rf   r(   r(   r)   __repr__  s    zStruct.__repr__)N)	rL   rY   rZ   r   rp   r   r   r   r>  r(   r(   r(   r)   rF   p  s   
*rF   c                   @   s   e Zd Zdd ZdddZdS )rD   c                 C   s.   |j }|  }||| |||j  |S r$   )rn   rH   r1  rm   r/   )r`   rl   rq   r   rn   r2  r(   r(   r)   rp     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st| |j|< d S )Nr/   r      i     >[= )r   r   r      ޭ)r   r8  rQ   rj   itemsr%   r   r   getDataLengthr/   r   getSubWriterr   r?   
getAllData)r`   r   rq   r   r   r   Z	convIndexrU   lengthIndexZdeadbeefbeforelengthZlengthWriterr(   r(   r)   r     s    

zStructWithLength.write)NrL   rY   rZ   rp   r   r(   r(   r(   r)   rD     s   rD   c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )rK   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   )rJ  rH   getSubReaderr   rl   rq   r1  )r`   rl   rq   r   offsetr2  r(   r(   r)   rp     s    

z
Table.readNc                 C   sR   |d kr|  | n:| }| j|_|d k	r2||_|j|| jd ||| d S )NZ
offsetSize)rL  rD  rQ   r   writeSubTabler   r   )r`   r   rq   r   r   r   	subWriterr(   r(   r)   r     s    zTable.write)N)rL   rY   rZ   r   rJ  rL  rp   r   r(   r(   r(   r)   rK     s
   rK   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)   rJ    s    zLTable.readOffsetc                 C   s   | d d S r   r   rK  r(   r(   r)   rL    s    zLTable.writeNullOffsetNrL   rY   rZ   r   rJ  rL  r(   r(   r(   r)   rR    s   rR  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)   rJ    s    zTable24.readOffsetc                 C   s   | d d S r   r   rK  r(   r(   r)   rL    s    zTable24.writeNullOffsetNrS  r(   r(   r(   r)   rT    s   rT  c                       s$   e Zd Zdd Z fddZ  ZS )r5   c                 C   s$   | j | | }| | j| j| j|S r$   r   r  rQ   rR   rS   r`   Z	tableTypeZ
lookupTyperH   r(   r(   r)   getConverter  s    zSubStruct.getConverterc                    s   t t| |||d | d S r$   )r  r5   r   r   r  r(   r)   r     s    zSubStruct.xmlWriterL   rY   rZ   rW  r   r  r(   r(   r  r)   r5     s   r5   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$   rU  rV  r(   r(   r)   rW    s    zSubTable.getConverterc                    s   t t| |||d | d S r$   )r  r3   r   r   r  r(   r)   r     s    zSubTable.xmlWriterX  r(   r(   r  r)   r3     s   r3   c                   @   s   e Zd ZdddZdS )r4   Nc                 C   s   d|_ t| ||||| d S )NT)	ExtensionrK   r   r   r(   r(   r)   r     s    zExtSubTable.write)N)rL   rY   rZ   r   r(   r(   r(   r)   r4     s   r4   c                   @   s   e Zd Zdd ZdS )r6   c                 C   s&   | j || j}| | j| j| j|S r$   )r=   rI   rM   r  rQ   rR   rS   )r`   Z
featureTagrH   r(   r(   r)   rW  %  s    zFeatureParams.getConverterN)rL   rY   rZ   rW  r(   r(   r(   r)   r6   $  s   r6   c                   @   s2   e Zd ZdZdddddZdd Zdd	d
ZdS )r,   r   Nr{   r8   c                C   s4   t j| |||||d d|d dkr(dnd | _d S )Nr8   r,   21)rz   r   whichr   r(   r(   r)   r   -  s         zValueFormat.__init__c                 C   s   |  }t||| j< |S r$   )r   r   r]  r`   rl   rq   r   formatr(   r(   r)   rp   3  s    zValueFormat.readc                 C   s   | | t||| j< d S r$   )r   r   r]  )r`   r   rq   r   r_  r   r(   r(   r)   r   8  s    
zValueFormat.write)N)N)rL   rY   rZ   r   r   rp   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   )rj   r]  r   r(   r(   r)   r   >  s    zValueRecord.getRecordSizec                 C   s   || j  ||S r$   )r]  ZreadValueRecordr   r(   r(   r)   rp   A  s    zValueRecord.readNc                 C   s   || j  ||| d S r$   )r]  ZwriteValueRecordr   r(   r(   r)   r   D  s    zValueRecord.writec                 C   s    |d kr
n| ||| j| d S r$   )r4  rQ   r   r(   r(   r)   r   G  s    zValueRecord.xmlWritec                 C   s&   ddl m} | }|d ||| |S )Nr   )r`  )otBaser`  r;  )r`   r   r   rq   r`  r   r(   r(   r)   r   M  s    zValueRecord.xmlRead)N)rL   rY   rZ   r   rp   r   r   r   r(   r(   r(   r)   r`  =  s
   
r`  c                   @   s   e Zd ZdZddddZdd Zd+d	d
Zedd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* ZdS ),	AATLookupr  r{   r8   c                C   sN   t j| |||||d t| jtr6| jdd d d| _ntdd d | jd| _d S )Nr8   Value)rQ   rR   rS   )rQ   rR   rS   rH   )rz   r   
issubclassrH   r   	converterrK   r   r(   r(   r)   r   X  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|td| d S )Nr   r   r      r   Fzunsupported lookup format: %d)r   readFormat0readFormat2readFormat4readFormat6readFormat8r?   r^  r(   r(   r)   rp   c  s    zAATLookup.readNc                    s   t t fdd| D }t ttd | | || | || | || | |g}|d \}}	}
| }|
  | | }||kst	d|	||f d S )Nc                    s   g | ]\}}  ||fqS r(   r   )re   glyphvalrq   r(   r)   rg   t  s     z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)
rt   sortedrB  filterbuildFormat0buildFormat2buildFormat6buildFormat8rC  r?   )r`   r   rq   r   r   r   rJ   formatsZdataSizeZlookupFormatZwriteMethodrn   Z
actualSizer(   rp  r)   r   r  s6    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(   rq   r`   rJ   r   r(   r)   r*     r+   z(AATLookup.buildFormat0.<locals>.<lambda>)rj   getGlyphOrderrf  r   )r`   r   rq   rJ   	numGlyphs	valueSizer(   r}  r)   rs    s    
zAATLookup.buildFormat0c                 C   s2   | d |D ]\}}| jj||d |d d qd S )Nr   r   r   r   )r   rf  r   )r`   r   rq   rJ   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(   rq   segmentsr`   r   r(   r)   r*     r+   z(AATLookup.buildFormat2.<locals>.<lambda>)rN   rf  r   rj   BIN_SEARCH_HEADER_SIZE)r`   r   rq   rJ   ZsegStartZsegValueZsegEndglyphIDZcurValuer  ry  rz  r(   r  r)   rt    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    r'  r   rf  r   rj   r{  r   r0  )
r`   r   rq   r  r  ry  rz  Z
firstGlyphZ	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   rg  c                      s     S r$   )writeFormat6r(   r}  r(   r)   r*     r+   z(AATLookup.buildFormat6.<locals>.<lambda>)rf  r   rj   r  )r`   r   rq   rJ   r  ry  rz  r(   r}  r)   ru    s    zAATLookup.buildFormat6c           	      C   s|   | d | jj}t||d  }}| ||| |D ](\}}| | | jj||d |d d q6| d |d|  d S )Nrg  r   r  r  r'  r  )	r`   r   rq   rJ   r  ry  rz  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   rZ  r   rg  r   c                      s     S r$   )writeFormat8r(   r}  r(   r)   r*     r+   z(AATLookup.buildFormat8.<locals>.<lambda>)rj   rf  r   )r`   r   rq   rJ   Z
minGlyphIDZ
maxGlyphIDr  r(   r}  r)   rv    s    zAATLookup.buildFormat8c                 C   sV   |d d }| d | | | t| |D ]\}}| jj||d |d d q2d S )Nr   r   r  )r   rj   rf  r   )r`   r   rq   rJ   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   re   rr   r   rp  r(   r)   
<dictcomp>   s      z)AATLookup.readFormat0.<locals>.<dictcomp>)rj   r~  rf  r   r   )r`   rl   rq   r  rk   r(   rp  r)   rh    s    zAATLookup.readFormat0c                 C   s   i }|j d }| |  }}|d| jj ks8t|t|D ]f}||||  d  | }| }	| jj||d d}
|dkr@t|	|d D ]}|
|||< qq@|S )Nr   r      r   r  r   	rn   r   rf  r   r?   rh   rm   rp   r   )r`   rl   rq   mappingrn   rz  ry  ra   lastfirstr   rr   r(   r(   r)   ri    s    
zAATLookup.readFormat2c                 C   s   i }|j d }| }|dks&t|t| D ]}||||  d  | }| }| }	|dkr2|d}
|
||	  | jj|
|d || d d}t|D ]\}}|||	|| < qq2|S )Nr   rg  r  r  r   r   r  )
rn   r   r?   rh   rm   rM  rf  r   r   r   )r`   rl   rq   r  rn   rz  ra   r  r  rN  
dataReaderrk   rr   r#  r(   r(   r)   rj    s*    

   
zAATLookup.readFormat4c           	      C   s   i }|j d }| }|d| jj ks.t|t| D ]J}||||  d  | }| jj||d d}|dkr:||||< q:|S )Nr   r  r  r  r  )	r`   rl   rq   r  rn   rz  ra   r  r   r(   r(   r)   rk  %  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  rq   r(   r)   r  6  s      z)AATLookup.readFormat8.<locals>.<dictcomp>)r   rf  r   r   )r`   rl   rq   r   rk   r(   r  r)   rl  2  s    zAATLookup.readFormat8c           	      C   sF   i }|D ]8}t |tr|\}}}|dkr| j|||||d < q|S )NLookuprn  )r%   r&   rf  r   )	r`   r   r   rq   r   r<  rQ   a
eltContentr(   r(   r)   r   8  s    

zAATLookup.xmlReadc                 C   s\   | || |  t| D ]$\}}| jj|||dd|fgd q || |  d S )Nr  rn  )r   rQ   r   )begintagr   rq  rB  rf  r   endtag)r`   r   rq   r   rQ   r   rn  r(   r(   r)   r   A  s        
zAATLookup.xmlWrite)N)rL   rY   rZ   r  r   rp   r   r   r{  rs  r|  rt  r  ru  r  rv  r  rh  ri  rj  rk  rl  r   r   r(   r(   r(   r)   rc  U  s*   
 

	
	rc  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   rM  rc  r   rp   rB  rH   r1  )r`   rl   rq   r   ZlookupOffsetZ
dataOffsetlookupReaderlookupoffsetsresultrn  rN  r  rs   r(   r(   r)   rp   T  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   rO  )rq  r   r   r   rE  rI   rj   rN   rD  rc  r   r   rP  r0  )r`   r   rq   r   r   r   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDatarn  rQ  rk   rN  lookupWriterr  Z
dataWriterdr(   r(   r)   r   b  s*    


zAATLookupWithDataOffset.writec                 C   s   t dd d | j}||||S r  )rc  rH   r   )r`   r   r   rq   r  r(   r(   r)   r     s    zAATLookupWithDataOffset.xmlReadc                 C   s&   t dd d | j}|||||| d S r  )rc  rH   r   )r`   r   rq   r   rQ   r   r  r(   r(   r)   r     s    z AATLookupWithDataOffset.xmlWrite)NrL   rY   rZ   rp   r   r   r   r(   r(   r(   r)   r  S  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(   )re   r  ro  r(   r(   r)   r    s      z MorxSubtableConverter.<dictcomp>Nr{   r8   c                C   s   t j| |||||d d S )Nr8   )rz   r   r   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 krdstd|j
 |j | }	|j|j |j |j |	  }
t|
|j|	 kstt|
|jd}| |_|j|| |||j  |S )	Nr&  r   r     ZmorxFz!unsupported 'morx' lookup type %s)rk   tableTag)rn   r   r   r/   r   _PROCESSING_ORDERSProcessingOrderr  r   Reservedr0   SubFeatureFlagsr   rI   r?   rk   rj   r   r  r5   r1  rm   )r`   rl   rq   r   rn   r   r   orderKeyrH   ZheaderLengthrk   Z	subReaderr(   r(   r)   rp     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  r"  )r  r   r   r/   r   r  r  r  r0   r  r5   r4  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kst	d|j q|dkr|d |_
|j
d	kst	d
|j
 q|dkrt|d |_q|dkrt|d |_q|dr||||| qdst	|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  rr  istupler   r  r  r  _PROCESSING_ORDERS_REVERSEDr?   r  r  r@   r;  )
r`   r   r   rq   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st
| |
 }td||j|	< d S )Ni   r  r  r  r   r&  r  r  r@  r  rA  z>L)r  r  r  r  r  rj   rB  rC  r/   r   r?   structpack)r`   r   rq   r   r   r   r  ZreverseOrderZlogicalOrderrF  rG  ZorigReservedrH  r(   r(   r)   r     s&    
zMorxSubtableConverter.write)N)N)rL   rY   rZ   r  rB  r  r   r  rp   r   r   r   r(   r(   r(   r)   r    s    r  c                   @   s   e Zd ZddddZdd Zdd Zd	d
 Zdd Zdd Zd&ddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% ZdS )'	STXHeaderr{   r8   c                C   s^   t j| |||||d t| jts&ttdd d t| _t| jt	rTtdd d t
| _nd | _d S )Nr8   GlyphClassesPerGlyphLookup)rz   r   re  rH   r   r?   rc  r   classLookupr   r   perGlyphLookupr   r(   r(   r)   r     s         zSTXHeader.__init__c                 C   s  t  }|j}|d}|d}|d}d }	d }
| |_|||   |||   |||   | jd k	r|d}|||   t| jt	r4|d}	|	||   |d}|||   |d}
|
||   |
j|j d }|dkst
|||_| |
||_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 k	r| ||||_|S )Nr   r   )r   rn   rM  r   GlyphClassCountrm   r  re  rH   r   r?   r   LigComponents_readLigatures	Ligaturesr   r  rp   r  r   rh   r   StatesrN   r   _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)r`   rl   rq   r   r2  rn   ZclassTableReaderZstateArrayReaderZentryTableReaderactionReaderZligaturesReaderZperGlyphTableReaderZligComponentReaderZnumLigComponentsZ	numStates
stateIndexstate
glyphClass
entryIndexr(   r(   r)   rp     sd    









     zSTXHeader.readc                 C   s0   |   }||j||j  }|||| |S r$   )rH   rM  rn   r   r1  )r`   rl   r  rq   r  
transitionZentryReaderr(   r(   r)   r  J  s    zSTXHeader._readTransitionc                 C   s(   t |j}||j d }|||S ra  )rj   rk   rn   r   r   )r`   rl   rq   limitZnumLigatureGlyphsr(   r(   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   r  r   )r  r  rJ   r%   r   Z	MarkIndexmaxZCurrentIndex)r`   r2  
numLookupsr  r'   r(   r(   r)   _countPerGlyphLookupsW  s    



zSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t| |D ]6}|d}|||   || j||i  q|S r   )	rn   rh   r  rM  rm   r   rN   r  rp   )r`   r2  rl   rq   rn   Zlookupsr  r  r(   r(   r)   r  f  s    
zSTXHeader._readPerGlyphLookupsNc                 C   s  t  }| jj||||jd d t| d}t|j d }d}	| jd k	rT|	d7 }	|	| j	j
7 }	| j	||j\}
}| ||j||\}}|	t| }|t| }|t| }t| ||d}|
d k	r|t| }nd }d\}}| ||}| ||}|d k	r.t|dkst|t|
 }|t| }|| ||	 || || | jd k	rl|| |d k	r|| |d k	r|| || || || || || |
d k	r||
 |d k	r|| |d k	r|| d S )N)r   r   r   r  r   )NNr   )r   r  r   r  r   rE  r  rJ   r  rH   ZactionHeaderSizeZcompileActionsr  _compileStatesrj   _compilePerGlyphLookups_compileLigComponents_compileLigaturesr?   r   r0  )r`   r   rq   r   r   r   ZglyphClassWriterZglyphClassDataglyphClassCountZglyphClassTableOffsetZ
actionDataactionIndexstateArrayDataentryTableDataZstateArrayOffsetZentryTableOffsetZperGlyphOffsetZperGlyphDataZactionOffsetZligaturesOffsetZligComponentsOffsetZligComponentsDataZligaturesDatar(   r(   r)   r   o  sp        
   



















zSTXHeader.writec                 C   s   t  }g i  }}|D ]}t|D ]}	|j|	 }
t  }|
||| | }t||
jksttdt|
|
jt|f |	|}|d krt|}|||< |
| || q qt| d}tt|d}||fS )Nz1%s has staticSize %d, but actually wrote %d bytesr   )r   rh   r  r   rE  rj   r   r?   r=  rI   rN   r   r   r
   )r`   rq   Z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 krdS | |}t|j|ks<tdt|j|f t }|jD ].}| }| j ||i |d  |j|dd qH|	 S )Nr+   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   rO  )
r  r  rj   r  r?   r   rD  r   rP  rE  )r`   r2  rq   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   rE  )r`   r2  rq   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   rE  )r`   r2  rq   r   Z	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rn  r   State)indexonGlyphClass
Transition)rq   r   rQ   r  r  r  LigComponent)r  r   )r  r   r   r  rq  r  rB  r   r   r  r  r4  r  r  r   r  _xmlWriteLigatures)r`   r   rq   r   rQ   r   gklassr  r  r  Ztransra   r  rn  ro  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  rn  )r   r  r   r   r  r   r  )r`   r   rq   r   rQ   r   ra   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  rn  r   r  r  r  r  r   )r   rr  r  r   r  _xmlReadStater  rN   r  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r  rJ   r  )r`   r   r   rq   r2  r  r  r  rn  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   rr  r  r   rH   r;  r  )
r`   r   r   rq   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   )rr  r  rN   r   )r`   r   r   rq   ZligComponentsr  r  _eltContentr(   r(   r)   r  3  s
    zSTXHeader._xmlReadLigComponentsc                 C   s4   g }t t|D ] \}}}|dkr||d  q|S )Nr  rn  )rr  r  rN   )r`   r   r   rq   Zligsr  r  r  r(   r(   r)   r  :  s
    zSTXHeader._xmlReadLigatures)N)rL   rY   rZ   r   rp   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   )r`   rl   rq   r   ZnumCIDsr  cidr  r(   r(   r)   rp   C  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(   rm  )re   r  rn  rp  r(   r)   r  L  s      z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   r  rB  r  r   rh   rI   )	r`   r   rq   r   r   r   rB  r   r  r(   rp  r)   r   K  s
    
zCIDGlyphMap.writec                 C   s>   i }t t|D ]*\}}}|dkr|d  |t|d < q|S )NCIDrn  r  )rr  r  stripr   r`   r   r   rq   r  ZeNameZeAttrsZ	_eContentr(   r(   r)   r   R  s
    zCIDGlyphMap.xmlReadc                 C   sh   | || |  t| D ]0\}}|d k	r |dkr |jd||d |  q || |  d S )Nr  r  )r  rn  r  r   rq  rB  r   r  )r`   r   rq   r   rQ   r   r  rn  r(   r(   r)   r   Y  s    

zCIDGlyphMap.xmlWrite)Nr  r(   r(   r(   r)   r  B  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   rj   r   r   rh   min)
r`   rl   rq   r   Z
glyphOrderr   Zcidsr  r  r  r(   r(   r)   rp   e  s    

zGlyphCIDMap.readNc           	         sX    fdd|  D }|r&t|d nd}|| t|D ]}|||d q<d S )Nc                    s,   i | ]$\}}|d k	r|dkr  ||qS r  rm  )re   r  r  rp  r(   r)   r  w  s
     z%GlyphCIDMap.write.<locals>.<dictcomp>r   r   r  r  )	r`   r   rq   r   r   r   rB  r   r  r(   rp  r)   r   v  s    

zGlyphCIDMap.writec                 C   s:   i }t t|D ]&\}}}|dkrt|d ||d < q|S )Nr  r   rn  )rr  r  r   r  r(   r(   r)   r     s
    zGlyphCIDMap.xmlReadc                 C   sh   | || |  t| D ]0\}}|d k	r |dkr |jd||d |  q || |  d S )Nr  r  r  r  )r`   r   rq   r   rQ   r   rn  r  r(   r(   r)   r     s    

zGlyphCIDMap.xmlWrite)Nr  r(   r(   r(   r)   r  d  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ks(t 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?   rh   r   rN   )r`   rl   rq   r   r  r  r  nItemsnBitsZminusOffsetmaskZsignMaskr  tmpshiftra   r   r(   r(   r)   rp     s(    zDeltaValue.readNc                 C   s   |d }|d }|d }|}	|dks,t d|| d }
d|> }t|	|
ksPt 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  )r?   rj   r   )r`   r   rq   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     s    zDeltaValue.xmlWritec                 C   s   t |d S r   r   r   r(   r(   r)   r     s    zDeltaValue.xmlRead)NrL   rY   rZ   rp   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EntryFormatr   r   r  l    r  0   r   r   r   r   r   c                    s    g | ]}|@ > | @ B qS r(   r(   )re   raw	innerMaskZ	outerMask
outerShiftr(   r)   rg     s   z'VarIdxMapValue.read.<locals>.<listcomp>)r   r   ZreadUInt24Arrayr   )	r`   rl   rq   r   fmtr  	innerBits	entrySizer   r(   r  r)   rp     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
  r   r   r  r  r  r   r  c                    s    g | ]}|d @ ? | @ B qS )l      r(   )re   idxr  r  r(   r)   rg     s   z(VarIdxMapValue.write.<locals>.<listcomp>)ZsetValuerj   r   r   ZwriteUInt24Arrayr   )r`   r   rq   r   r   r   r  r  r  r  r   r(   r  r)   r     s&    zVarIdxMapValue.write)NrI  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 )Nr~   	NumShorts     )boolr   r   r   r  r  r   )r`   rl   rq   r   rJ   regionCount	wordCount	longWordsZreadBigArrayZreadSmallArrayn1n2r(   r(   r)   rp     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 )Nr~   r  r  r  r  r   )r  r   r   r   r  r  writeSmallArray)r`   r   rq   r   rJ   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    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   rN   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  rp   r   r  r(   r)   rp   C  s    z_UInt8Enum.readc                 C   s   t | j| S r$   )r  r#  upperr  r(   r(   r)   r   F  s    z_UInt8Enum.fromStringc                 C   s   |  |j S r$   )r#  rQ   lowerr  r(   r(   r)   r   J  s    z_UInt8Enum.toString)
rL   rY   rZ   ru   r#  rp   r  r   r   r  r(   r(   r  r)   r"  @  s   
r"  c                   @   s   e Zd ZeZdS )r   N)rL   rY   rZ   _ExtendModer#  r(   r(   r(   r)   r   O  s   r   c                   @   s   e Zd ZeZdS )r   N)rL   rY   rZ   _CompositeModer#  r(   r(   r(   r)   r   S  s   r   c                 C   s   t t| dS N)rH   )r"   rc  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"   rK   r)  r(   r(   r)   r*     r+   c                 C   s   t t| dS r(  )r"   rR  r)  r(   r(   r)   r*     r+   c                 C   s   t t| dS r(  )r"   rT  r)  r(   r(   r)   r*     r+   )+Zint8Zint16r1   r-   Zuint24r2   Zchar64r   r   r  r   r   r   r   r   r  r  r  r  r  ZOffsetZLOffsetZOffset24r`  r  r	  r  r!  r   r   r   r  r  r:   r;   r<   r   rc  r  r  ZOffsetToZ	LOffsetToZLOffset24To)wZ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   rb  r   r   r   r   r   ZotTablesr   r   r   r   r   r   r   r   r   r&  r   r'  r    	itertoolsr!   	functoolsr"   r   r  typingr#   logging	getLoggerrL   r   r  rW   r&   rX   collectionsr\   ImportErrorr]   objectrz   r   r   r   r   r   r   r   r   r   r   r   r   r   rA   rB   rC   r   r   r   r   r   r   r   r  r  r  r  r  r  r%  rF   rD   rK   rR  rT  r5   r3   r4   r6   r,   r`  rc  r  r  r  r  r  r  r	  r  r!  r"  rE   r(   r(   r(   r)   <module>   s    4
@_


G"		   ;   5"/503