U
    »mœd\ ã                ,   @   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
l4Z4e4 5e6¡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€„ d€euƒZ'G dd‚„ d‚euƒZ)eKeIeLeJeMeFe_eGeHe^eReSeTeUeXeZe[e\e]e`ebecedejeqeresete'e)eVeoepeaeaeaemdƒd„ d„d„ d…d„ d†d„ d‡d„ dˆd„ 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(   ú\/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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rŠt	}
nB|d	kr˜t
}
n4|d
kr¦t}
n&|tkrÀd|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sÀt|ƒ‚|||< q||fS )zÔGiven 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   ÚextendÚ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 )	ÚChar64z›An 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ƒ }|r¸d}| ¡ D ]^}|jrXd}t|dƒsvi |_|j}	|j	|	ks”t
|j	|	fƒ‚t||j	d ƒ t|j|j	ƒ|	|j	< qX|D ]*}
t|
tƒr¼|
\}}}| ||||¡ q¼q¼|jt|dd ƒd |r8|r8| ¡ D ]&}|jr|j}	|	|j	= |	s|`q|S )Nr4  ÚFormatZpostReadFTÚ_propagator)Ú
propagator)r   rH   rI   r¨   r6  r   ÚgetConvertersr€   r7  rQ   r?   Úsetattrr   Ú__dict__r%   r&   ÚfromXMLZpopulateDefaultsr  )r`   rŸ   r    rq   r3  r6  Z
noPostReadZcleanPropagationrU   r8  Ú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   r2  rm   r/   )r`   rl   rq   rŠ   rn   r3  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s°t‚| ¡ |j|< d S )Nr/   r   éÞ   i­Þ  ì   ï>[= )r   rÐ   r½   ó   Þ­¾ï)r”   r9  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º   )rK  rH   ÚgetSubReaderr…   rl   rq   r2  )r`   rl   rq   rŠ   Úoffsetr3  r(   r(   r)   rp   Ü  s    

z
Table.readNc                 C   sR   |d kr|   |¡ n:|j| jd}| j|_|d k	r8||_| |¡ | ||¡ d S )N©Z
offsetSize)rM  rE  rŽ   rQ   r   ÚwriteSubTabler®   )r`   r˜   rq   rŠ   r™   r   Ú	subWriterr(   r(   r)   r•   é  s    
zTable.write)N)rL   rY   rZ   rŽ   rK  rM  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)   rK  ù  s    zLTable.readOffsetc                 C   s   |  d¡ d S rº   rÊ   rL  r(   r(   r)   rM  ü  s    zLTable.writeNullOffsetN©rL   rY   rZ   rŽ   rK  rM  r(   r(   r(   r)   rS  õ  s   rS  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)   rK    s    zTable24.readOffsetc                 C   s   |  d¡ d S rº   ræ   rL  r(   r(   r)   rM    s    zTable24.writeNullOffsetNrT  r(   r(   r(   r)   rU    s   rU  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   rX  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$   rV  rW  r(   r(   r)   rX    s    zSubTable.getConverterc                    s   t t| ƒ |||d |¡ d S r$   )r  r3   r¤   r¢   r  r(   r)   r¤     s    zSubTable.xmlWriterY  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)   rX  (  s    zFeatureParams.getConverterN)rL   rY   rZ   rX  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‚   0  s         ÿzValueFormat.__init__c                 C   s   |  ¡ }t|ƒ|| j< |S r$   )r×   r   r^  ©r`   rl   rq   rŠ   Úformatr(   r(   r)   rp   6  s    zValueFormat.readc                 C   s   |  |¡ t|ƒ|| j< d S r$   )rÚ   r   r^  )r`   r˜   rq   rŠ   r`  r   r(   r(   r)   r•   ;  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†   A  s    zValueRecord.getRecordSizec                 C   s   || j   ||¡S r$   )r^  ZreadValueRecordr“   r(   r(   r)   rp   D  s    zValueRecord.readNc                 C   s   || j   |||¡ d S r$   )r^  ZwriteValueRecordrœ   r(   r(   r)   r•   G  s    zValueRecord.writec                 C   s    |d kr
n|  ||| j|¡ d S r$   )r5  rQ   r¢   r(   r(   r)   r¤   J  s    zValueRecord.xmlWritec                 C   s&   ddl m} |ƒ }| d |||¡ |S )Nr   )ra  )ÚotBasera  r<  )r`   rŸ   r    rq   ra  r™   r(   r(   r)   r¡   P  s    zValueRecord.xmlRead)N)rL   rY   rZ   r†   rp   r•   r¤   r¡   r(   r(   r(   r)   ra  @  s
   
ra  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‚   [  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   f  s    zAATLookup.readNc                    s¦   t t‡ fdd„| ¡ D ƒƒƒ}t ttd |  |ˆ |¡|  |ˆ |¡|  |ˆ |¡|  |ˆ |¡gƒƒƒ}|d \}}	}
| ¡ }|
ƒ  | ¡ | }||ks¢t	d|	||f ƒ‚d S )Nc                    s   g | ]\}}ˆ   |¡|f‘qS r(   ©rò   )re   ÚglyphÚval©rq   r(   r)   rg   w  s     z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)
rt   ÚsortedrC  ÚfilterÚbuildFormat0ÚbuildFormat2ÚbuildFormat6ÚbuildFormat8rD  r?   )r`   r˜   rq   rŠ   r™   r   rJ   ÚformatsZdataSizeZlookupFormatZwriteMethodrn   Z
actualSizer(   rq  r)   r•   u  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   ÚgetGlyphOrderrg  rŽ   )r`   r˜   rq   rJ   Ú	numGlyphsÚ	valueSizer(   r~  r)   rt     s    
ýzAATLookup.buildFormat0c                 C   s2   |  d¡ |D ]\}}| jj||d |d d qd S )Nr   ©rŠ   r™   r   )rÚ   rg  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   rg  rŽ   rj   ÚBIN_SEARCH_HEADER_SIZE)r`   r˜   rq   rJ   ZsegStartZsegValueZsegEndÚglyphIDZcurValuer  rz  r{  r(   r„  r)   ru  ²  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Ú   rg  rŽ   rj   r|  r•   r1  )
r`   r˜   rq   r…  r  rz  r{  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   rh  c                      s   ˆ  ˆˆ ˆ¡S r$   )ÚwriteFormat6r(   r~  r(   r)   r*   Û  r+   z(AATLookup.buildFormat6.<locals>.<lambda>)rg  rŽ   rj   r†  )r`   r˜   rq   rJ   r  rz  r{  r(   r~  r)   rv  Õ  s    ýzAATLookup.buildFormat6c           	      C   s|   |  d¡ | jj}t|ƒ|d  }}|  |||¡ |D ](\}}|  |¡ | jj||d |d d q6|  d¡ | d| ¡ d S )Nrh  rÐ   r‚  rˆ  r(  r‰  )	r`   r˜   rq   rJ   r  rz  r{  r‡  r™   r(   r(   r)   rŠ  Þ  s    

    ÿ
zAATLookup.writeFormat6c                    s^   ˆd d ˆd d  }}t ˆƒ|| d kr2d S ˆjj}dt ˆƒ|  d‡ ‡‡‡fdd„fS )Nr   r[  r   rh  rƒ   c                      s   ˆ  ˆˆ ˆ¡S r$   )ÚwriteFormat8r(   r~  r(   r)   r*   ó  r+   z(AATLookup.buildFormat8.<locals>.<lambda>)rj   rg  rŽ   )r`   r˜   rq   rJ   Z
minGlyphIDZ
maxGlyphIDr  r(   r~  r)   rw  ë  s    ýzAATLookup.buildFormat8c                 C   sV   |d d }|  d¡ |  |¡ |  t|ƒ¡ |D ]\}}| jj||d |d d q2d S )Nr   rƒ   r‚  )rÚ   rj   rg  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™   rq  r(   r)   Ú
<dictcomp>  s      z)AATLookup.readFormat0.<locals>.<dictcomp>)rj   r  rg  r   r”   )r`   rl   rq   r€  rk   r(   rq  r)   ri     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 ]}|
|| |¡< q’q@|S )NrÐ   r½   é   ©rŠ   rˆ  r   ©	rn   r×   rg  rŽ   r?   rh   rm   rp   rñ   )r`   rl   rq   Úmappingrn   r{  rz  ra   ÚlastÚfirstr™   rr   r(   r(   r)   rj    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 ]\}}||| 	|| ¡< q¨q2|S )NrÐ   rh  r‘  rˆ  r   r   r  )
rn   r×   r?   rh   rm   rN  rg  r   r”   rñ   )r`   rl   rq   r”  rn   r{  ra   r•  r–  rO  Ú
dataReaderrk   rr   r$  r(   r(   r)   rk    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   r{  ra   r‡  r™   r(   r(   r)   rl  (  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  9  s      z)AATLookup.readFormat8.<locals>.<dictcomp>)r×   rg  r   r”   )r`   rl   rq   r‹   rk   r(   r˜  r)   rm  5  s    zAATLookup.readFormat8c           	      C   sF   i }|D ]8}t |tƒr|\}}}|dkr| j |||¡||d < q|S )NÚLookupro  )r%   r&   rg  r¡   )	r`   rŸ   r    rq   r™   r=  rQ   ÚaÚ
eltContentr(   r(   r)   r¡   ;  s    

zAATLookup.xmlReadc                 C   s\   |  ||¡ | ¡  t| ¡ ƒD ]$\}}| jj|||dd|fgd q | |¡ | ¡  d S )Nr™  ro  )r™   rQ   rŸ   )Úbegintagrµ   rr  rC  rg  r¤   Úendtag)r`   r£   rq   r™   rQ   rŸ   ro  r(   r(   r)   r¤   D  s        ÿ
zAATLookup.xmlWrite)N)rL   rY   rZ   r†  r‚   rp   r•   r¶   r|  rt  r}  ru  rƒ  rv  rŠ  rw  r‹  ri  rj  rk  rl  rm  r¡   r¤   r(   r(   r(   r)   rd  X  s*   
 

	
	rd  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È   rN  rd  rÕ   rp   rC  rH   r2  )r`   rl   rq   rŠ   ZlookupOffsetZ
dataOffsetÚlookupReaderÚlookupÚoffsetsÚresultro  rO  r—  rs   r(   r(   r)   rp   W  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 ]}| |¡ qÔd S )Nr   )Úkeyr½   rP  r   )rr  rò   r   r®   rF  rI   rj   rN   rE  rd  rÕ   r•   rQ  r1  )r`   r˜   rq   rŠ   r™   r   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDataro  rR  rk   rO  ÚlookupWriterr¢  Z
dataWriterÚdr(   r(   r)   r•   e  s*    




zAATLookupWithDataOffset.writec                 C   s   t dd d | jƒ}| |||¡S rŸ  )rd  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Ÿ  )rd  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ž  V  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¥  rp  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r¬ds¬td|j
 ƒ‚|j | }	|j|j |j |j |	 … }
t|
ƒ|j|	 ksèt‚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   r2  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   r5  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s˜t	d|j ƒ‚q|dkrÆ|d |_
|j
d	ksÄt	d
|j
 ƒ‚q|dkrÞt|d ƒ|_q|dkröt|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¶  rs  Ú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s¾t
‚| ¡ |
 }t d|¡|j|	< d S )Ni   r  r®  r­  r   r'  r¬  r«  rA  rˆ  rB  z>L)r¶  r»  rµ  r°  r¹  rj   rC  rD  r/   r®   r?   ÚstructÚpack)r`   r˜   rq   rŠ   r™   r   r¼  ZreverseOrderZlogicalOrderrG  rH  ZorigReservedrI  r(   r(   r)   r•   ø  s&    ÿ
zMorxSubtableConverter.write)N)N)rL   rY   rZ   r´  rC  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‚   rf  rH   r   r?   rd  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   rN  rÈ   ÚGlyphClassCountrm   rÅ  rf  rH   r   r?   rØ   ÚLigComponentsÚ_readLigaturesÚ	Ligaturesr   rÄ  rp   rÂ  r¨   rh   r   ÚStatesrN   r×   Ú_readTransitionÚTransitionsÚ_readPerGlyphLookupsÚPerGlyphLookups)r`   rl   rq   rŠ   r3  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   rN  rn   rŽ   r2  )r`   rl   rÓ  rq   rÏ  Ú
transitionZentryReaderr(   r(   r)   rË  M  s    ÿzSTXHeader._readTransitionc                 C   s(   t |jƒ}||j d }| | |¡¡S rb  )rj   rk   rn   rï   rØ   )r`   rl   rq   ÚlimitZnumLigatureGlyphsr(   r(   r)   rÈ  U  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`   r3  Ú
numLookupsrÑ  r'   r(   r(   r)   Ú_countPerGlyphLookupsZ  s    



zSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t|  |¡ƒD ]6}| d¡}| || ¡  ¡ | | j ||i ¡¡ q|S rº   )	rn   rh   rØ  rN  rm   rÈ   rN   rÅ  rp   )r`   r3  rl   rq   rn   ÚlookupsrŒ  r¡  r(   r(   r)   rÍ  i  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   rF  rÖ  rJ   rÅ  rH   ZactionHeaderSizeZcompileActionsrÊ  Ú_compileStatesrj   Ú_compilePerGlyphLookupsÚ_compileLigComponentsÚ_compileLigaturesr?   rË   r1  )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•   r  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r t|ƒ}|||< | 
|¡ | |¡ q qt| ¡ dƒ}tt|ƒdƒ}||fS )Nz1%s has staticSize %d, but actually wrote %d bytesr½   )r   rh   rÌ  r®   rF  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dd}| j  ||i |d ¡ | |¡ qH| 	¡ S )Nr+   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr½   rP  )
rÅ  rØ  rj   rÎ  r?   r   rE  r•   rQ  rF  )r`   r3  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Ú   rF  )r`   r3  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ò   rF  )r`   r3  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	¡ | ¡  qÐt|dƒr’|  d¡ | ¡  tt|dƒƒD ]"\}}|jd||d | ¡  q\| d¡ | ¡  |  |||||¡ | |¡ | ¡  d S )NzGlyphClassCount=%sÚ
GlyphClass©ro  r™   ÚState)ÚindexÚonGlyphClassÚ
Transition)rq   rŸ   rQ   rÃ  r™  rÇ  ÚLigComponent)rç  r™   )rœ  rµ   ré   rÆ  rr  rÂ  rC  r´   r”   rÊ  rÌ  r5  r  rÎ  r   r  Ú_xmlWriteLigatures)r`   r£   rq   r™   rQ   rŸ   ÚgÚklassrÐ  rÑ  rÒ  Ztransra   r¢  ro  rp  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ç  ro  )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ä  ro  r™   ræ  rÃ  rÇ  rÉ  r   )r   rs  rº  r   rÂ  Ú_xmlReadStaterÊ  rN   rÅ  r¡   rÎ  Ú_xmlReadLigComponentsrÇ  Ú_xmlReadLigaturesrÉ  rÖ  rJ   rÆ  )r`   rŸ   r    rq   r3  r½  r¾  r›  ro  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   rs  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™   )rs  rº  rN   r   )r`   rŸ   r    rq   ZligComponentsr½  r¾  Ú_eltContentr(   r(   r)   rð  6  s
    zSTXHeader._xmlReadLigComponentsc                 C   s4   g }t t|ƒD ] \}}}|dkr| |d ¡ q|S )Nrî  ro  )rs  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   F  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(   rn  )re   rõ  ro  rq  r(   r)   r  O  s      z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   rˆ  ©rC  rÖ  rÚ   rh   rI   )	r`   r˜   rq   rŠ   r™   r   rC  r‹   rõ  r(   rq  r)   r•   N  s
    
zCIDGlyphMap.writec                 C   s>   i }t t|ƒD ]*\}}}|dkr|d  ¡ |t|d ƒ< q|S )NÚCIDro  rõ  )rs  rº  Ústripr   ©r`   rŸ   r    rq   r¤  ZeNameZeAttrsZ	_eContentr(   r(   r)   r¡   U  s
    zCIDGlyphMap.xmlReadc                 C   sh   |  ||¡ | ¡  t| ¡ ƒD ]0\}}|d k	r |dkr |jd||d | ¡  q | |¡ | ¡  d S )Nrˆ  r÷  )rõ  ro  ©rœ  rµ   rr  rC  r´   r  )r`   r£   rq   r™   rQ   rŸ   rõ  ro  r(   r(   r)   r¤   \  s    

zCIDGlyphMap.xmlWrite)Nr¨  r(   r(   r(   r)   ró  E  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   h  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ô  rn  )re   rì  rõ  rq  r(   r)   r  z  s
    þ z%GlyphCIDMap.write.<locals>.<dictcomp>r   r   rˆ  rö  )	r`   r˜   rq   rŠ   r™   r   rC  r‹   r‡  r(   rq  r)   r•   y  s    
þ
zGlyphCIDMap.writec                 C   s:   i }t t|ƒD ]&\}}}|dkrt|d ƒ||d < q|S )Nr÷  r™   ro  )rs  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Ÿ   ro  rõ  r(   r(   r)   r¤   ‹  s    

zGlyphCIDMap.xmlWrite)Nr¨  r(   r(   r(   r)   rû  g  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)NrJ  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   F  s    z_UInt8Enum.readc                 C   s   t | j| ¡ ƒS r$   )r  r%  Úupperr  r(   r(   r)   r²   I  s    z_UInt8Enum.fromStringc                 C   s   |   |¡j ¡ S r$   )r%  rQ   Úlowerr  r(   r(   r)   r±   M  s    z_UInt8Enum.toString)
rL   rY   rZ   ru   r%  rp   r  r²   r±   r  r(   r(   r  r)   r$  C  s   
r$  c                   @   s   e Zd ZeZdS )r   N)rL   rY   rZ   Ú_ExtendModer%  r(   r(   r(   r)   r   R  s   r   c                   @   s   e Zd ZeZdS )r   N)rL   rY   rZ   Ú_CompositeModer%  r(   r(   r(   r)   r   V  s   r   c                 C   s   t t| dS ©N)rH   )r"   rd  ©Ú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"   rS  r+  r(   r(   r)   r*   ‡  r+   c                 C   s   t t| dS r*  )r"   rU  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Offset24ra  rý  r  r  r#  r   r   rù   ró  rû  r:   r;   r<   r   rd  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   rc  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   rS  rU  r5   r3   r4   r6   r,   ra  rd  rž  r©  rÁ  ró  rû  rý  r  r  r#  r$  rE   r(   r(   r(   r)   Ú<module>   sø    4
@_


G#		   ;   5"/503Ò