B
    ¶ôJd}è  ã            ,   @   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;y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'   úU/var/www/html/venv/lib/python3.7/site-packages/fontTools/ttLib/tables/otConverters.pyÚ<lambda>   ó    r)   c             C   sæ  g }i }xÒ| D ]È\}}}}}|}	|  d¡r@|dks:t‚t}
n| d¡sR|dkrdtttdœ| }
nl|dkrrt}
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rn|d |_x<|j ¡ D ].}x&| ¡ D ]}t||||ƒ||j< qJW q<W |d	kr¶|d |_|d	 |_x(|j ¡ D ]}t||||ƒ||j< q˜W | |¡ ||ksÒt|ƒ‚|||< qW ||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)r2   r3   r4   r   ÚfeatureParamTypes)Ú
startswithÚAssertionErrorr+   ÚendswithÚComputedUInt8ÚComputedUShortÚComputedULongr2   r3   r4   r5   ÚStructWithLengthÚconverterMappingÚStructÚevalÚ
tableClassÚgetr   ÚvaluesÚTableÚ__name__r;   ÚdefaultFeatureParamsÚappend)Z	tableSpecZtableNamespaceÚ
convertersZconvertersByNameÚtpÚnameÚrepeatÚauxÚdescrZ	tableNameZconverterClassÚconvrF   r&   Úclsr'   r'   r(   ÚbuildConverters    s`    




 



rU   c               @   s   e Zd ZdZdS )Ú_MissingItemr'   N)rJ   Ú
__module__Ú__qualname__Ú	__slots__r'   r'   r'   r(   rV   `   s   rV   )Ú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 )N)Ú__getitem__Úslice)ÚselfÚiÚjr'   r'   r(   Ú__getslice__l   s    z_LazyList.__getslice__c                s€   t |tƒr.t| tˆ ƒ¡Ž }‡ fdd„|D ƒS ˆ j| }t |tƒr|ˆ j ˆ j	|d ˆ j
  ¡ ˆ j ˆ jˆ ji ¡}|ˆ j|< |S )Nc                s   g | ]}ˆ | ‘qS r'   r'   )Ú.0r_   )r^   r'   r(   ú
<listcomp>r   s    z)_LazyList.__getitem__.<locals>.<listcomp>r   )r$   r]   ÚrangeÚindicesÚlenÚdatarV   ÚreaderÚseekÚposÚ
recordSizerS   ÚreadÚfont)r^   Úkre   Úitemr'   )r^   r(   r\   o   s    



z_LazyList.__getitem__c             C   s0   t |tƒrt|ƒ}nt |tƒr ntS t| ƒ| S )N)r$   r[   ÚlistÚNotImplemented)r^   Úotherr'   r'   r(   Ú__add__z   s    


z_LazyList.__add__c             C   s   t |tƒstS |t| ƒ S )N)r$   rp   rq   )r^   rr   r'   r'   r(   Ú__radd__ƒ   s    
z_LazyList.__radd__N)rJ   rW   rX   ra   r\   rs   rt   r'   r'   r'   r(   r[   j   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 )ÚBaseConverterzYBase class for converter objects. Apart from the constructor, this
	is an abstract class.NÚ )r7   c            C   sT   || _ || _|| _|| _| d¡p(|dk| _| d¡p<|dk| _|dk| _|| _d S )Nr-   )ÚDesignAxisRecordSizeÚValueRecordSizeZ
LookupTyper/   )Z
ClassCountZClass2CountZ
FeatureTagZSettingsCountÚVarRegionCountÚMappingCountZRegionAxisCountZDesignAxisCountrw   ZAxisValueCountrx   Z	AxisCountZBaseGlyphRecordCountZLayerRecordCount)	rO   rP   rQ   rF   r>   ZisCountZisLookupTypeÚisPropagatedr7   )r^   rO   rP   rQ   rF   r7   r'   r'   r(   Ú__init__Ž   s    
zBaseConverter.__init__c       	      C   s´   |j o|dk}|r(|  |¡}|tkr(d}|sZg }x$t|ƒD ]}| |  |||¡¡ q:W |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 )N)rV   )rb   r_   r'   r'   r(   ú	<genexpr>º   s    z*BaseConverter.readArray.<locals>.<genexpr>N)ÚlazyÚgetRecordSizerq   rd   rL   rl   r[   Úcopyrh   rj   rm   rS   rk   ÚextendÚadvance)	r^   rh   rm   Ú	tableDictÚcountr   rk   Úlr_   r'   r'   r(   Ú	readArray§   s&    


zBaseConverter.readArrayc             C   s   t | dƒr| jS tS )NÚ
staticSize)Úhasattrrˆ   rq   )r^   rh   r'   r'   r(   r€   ¾   s    
 zBaseConverter.getRecordSizec             C   s   t | ƒ‚dS )zRead a value from the reader.N)ÚNotImplementedError)r^   rh   rm   r„   r'   r'   r(   rl   Â   s    zBaseConverter.readc          
   C   sd   y,x&t |ƒD ]\}}|  |||||¡ qW W n2 tk
r^ } z|j|f |_‚ W d d }~X Y nX d S )N)Ú	enumerateÚwriteÚ	ExceptionÚargs)r^   Úwriterrm   r„   rH   r_   ÚvalueÚer'   r'   r(   Ú
writeArrayÆ   s    zBaseConverter.writeArrayc             C   s   t | ƒ‚dS )zWrite a value to the writer.N)rŠ   )r^   r   rm   r„   r   ÚrepeatIndexr'   r'   r(   rŒ   Î   s    zBaseConverter.writec             C   s   t | ƒ‚dS )zRead a value from XML.N)rŠ   )r^   ÚattrsÚcontentrm   r'   r'   r(   ÚxmlReadÒ   s    zBaseConverter.xmlReadc             C   s   t | ƒ‚dS )zWrite a value to XML.N)rŠ   )r^   Ú	xmlWriterrm   r   rO   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Úsearchr7   ÚintÚgroup)r^   Úmr'   r'   r(   ÚgetVarIndexOffsetÜ   s    zBaseConverter.getVarIndexOffset)N)N)rJ   rW   rX   Ú__doc__r|   r‡   r€   rl   r’   rŒ   r–   r˜   ÚreÚcompilerš   r#   rœ   rŸ   r'   r'   r'   r(   ru   ‰   s   

ru   c               @   s4   e Zd Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zd	S )
ÚSimpleValuec             C   s   | S )Nr'   )r   r'   r'   r(   ÚtoStringå   s    zSimpleValue.toStringc             C   s   | S )Nr'   )r   r'   r'   r(   Ú
fromStringè   s    zSimpleValue.fromStringc             C   s(   |  ||d|  |¡fg ¡ | ¡  d S )Nr   )Ú	simpletagr¤   Únewline)r^   r—   rm   r   rO   r”   r'   r'   r(   r˜   ë   s    zSimpleValue.xmlWritec             C   s   |   |d ¡S )Nr   )r¥   )r^   r”   r•   rm   r'   r'   r(   r–   î   s    zSimpleValue.xmlReadN)rJ   rW   rX   Ú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 )Nr   )ÚDEFAULTrL   r¤   r¦   r§   )r^   r—   rm   r   rO   r”   r'   r'   r(   r˜   ó   s    
zOptionalValue.xmlWritec             C   s   d|kr|   |d ¡S | jS )Nr   )r¥   rª   )r^   r”   r•   rm   r'   r'   r(   r–   ø   s    zOptionalValue.xmlRead)rJ   rW   rX   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)rJ   rW   rX   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 )N)ÚreadLong)r^   rh   rm   r„   r'   r'   r(   rl     s    z	Long.readc             C   s
   |  |¡S )N)ÚreadLongArray)r^   rh   rm   r„   r…   r'   r'   r(   r‡     s    zLong.readArrayNc             C   s   |  |¡ d S )N)Ú	writeLong)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ     s    z
Long.writec             C   s   |  |¡ d S )N)ÚwriteLongArray)r^   r   rm   r„   rH   r'   r'   r(   r’   
  s    zLong.writeArray)N)rJ   rW   rX   rˆ   rl   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 )N)Ú	readULong)r^   rh   rm   r„   r'   r'   r(   rl     s    z
ULong.readc             C   s
   |  |¡S )N)ÚreadULongArray)r^   rh   rm   r„   r…   r'   r'   r(   r‡     s    zULong.readArrayNc             C   s   |  |¡ d S )N)Ú
writeULong)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ     s    zULong.writec             C   s   |  |¡ d S )N)ÚwriteULongArray)r^   r   rm   r„   rH   r'   r'   r(   r’     s    zULong.writeArray)N)rJ   rW   rX   rˆ   rl   r‡   rŒ   r’   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)rJ   rW   rX   r¨   r¤   r'   r'   r'   r(   r·     s   r·   c               @   s   e Zd ZeZdS )ÚVarIndexN)rJ   rW   rX   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 )N)Ú	readShort)r^   rh   rm   r„   r'   r'   r(   rl   "  s    z
Short.readc             C   s
   |  |¡S )N)ÚreadShortArray)r^   rh   rm   r„   r…   r'   r'   r(   r‡   $  s    zShort.readArrayNc             C   s   |  |¡ d S )N)Ú
writeShort)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   &  s    zShort.writec             C   s   |  |¡ d S )N)ÚwriteShortArray)r^   r   rm   r„   rH   r'   r'   r(   r’   (  s    zShort.writeArray)N)rJ   rW   rX   rˆ   rl   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 )ÚUShortrº   c             C   s   |  ¡ S )N)Ú
readUShort)r^   rh   rm   r„   r'   r'   r(   rl   -  s    zUShort.readc             C   s
   |  |¡S )N)ÚreadUShortArray)r^   rh   rm   r„   r…   r'   r'   r(   r‡   /  s    zUShort.readArrayNc             C   s   |  |¡ d S )N)ÚwriteUShort)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   1  s    zUShort.writec             C   s   |  |¡ d S )N)ÚwriteUShortArray)r^   r   rm   r„   rH   r'   r'   r(   r’   3  s    zUShort.writeArray)N)rJ   rW   rX   rˆ   rl   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 )ÚInt8r   c             C   s   |  ¡ S )N)ZreadInt8)r^   rh   rm   r„   r'   r'   r(   rl   8  s    z	Int8.readc             C   s
   |  |¡S )N)ÚreadInt8Array)r^   rh   rm   r„   r…   r'   r'   r(   r‡   :  s    zInt8.readArrayNc             C   s   |  |¡ d S )N)Z	writeInt8)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   <  s    z
Int8.writec             C   s   |  |¡ d S )N)ÚwriteInt8Array)r^   r   rm   r„   rH   r'   r'   r(   r’   >  s    zInt8.writeArray)N)rJ   rW   rX   rˆ   rl   r‡   rŒ   r’   r'   r'   r'   r(   rÄ   6  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 )N)Ú	readUInt8)r^   rh   rm   r„   r'   r'   r(   rl   C  s    z
UInt8.readc             C   s
   |  |¡S )N)ÚreadUInt8Array)r^   rh   rm   r„   r…   r'   r'   r(   r‡   E  s    zUInt8.readArrayNc             C   s   |  |¡ d S )N)Z
writeUInt8)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   G  s    zUInt8.writec             C   s   |  |¡ d S )N)ÚwriteUInt8Array)r^   r   rm   r„   rH   r'   r'   r(   r’   I  s    zUInt8.writeArray)N)rJ   rW   rX   rˆ   rl   r‡   rŒ   r’   r'   r'   r'   r(   rÇ   A  s
   
rÇ   c               @   s"   e Zd ZdZdd„ Zddd„ZdS )ÚUInt24é   c             C   s   |  ¡ S )N)Ú
readUInt24)r^   rh   rm   r„   r'   r'   r(   rl   N  s    zUInt24.readNc             C   s   |  |¡ d S )N)ÚwriteUInt24)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   P  s    zUInt24.write)N)rJ   rW   rX   rˆ   rl   rŒ   r'   r'   r'   r(   rË   L  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—   rm   r   rO   r”   r'   r'   r(   r˜   T  s    zComputedInt.xmlWriteN)rJ   rW   rX   r˜   r'   r'   r'   r(   rÏ   S  s   rÏ   c               @   s   e Zd ZdS )r?   N)rJ   rW   rX   r'   r'   r'   r(   r?   Y  s   r?   c               @   s   e Zd ZdS )r@   N)rJ   rW   rX   r'   r'   r'   r(   r@   [  s   r@   c               @   s   e Zd ZdS )rA   N)rJ   rW   rX   r'   r'   r'   r(   rA   ]  s   rA   c               @   s"   e Zd ZdZdd„ Zddd„ZdS )ÚTagr­   c             C   s   |  ¡ S )N)ZreadTag)r^   rh   rm   r„   r'   r'   r(   rl   b  s    zTag.readNc             C   s   |  |¡ d S )N)ZwriteTag)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   d  s    z	Tag.write)N)rJ   rW   rX   rˆ   rl   rŒ   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 )N)ÚgetGlyphNameManyr‡   Útypecoderˆ   )r^   rh   rm   r„   r…   r'   r'   r(   r‡   j  s    zGlyphID.readArrayc             C   s   |  | | j| j¡¡S )N)ÚgetGlyphNameZ	readValuerÕ   rˆ   )r^   rh   rm   r„   r'   r'   r(   rl   l  s    zGlyphID.readc             C   s   |  | j| |¡¡ d S )N)r’   rÕ   ZgetGlyphIDMany)r^   r   rm   r„   rH   r'   r'   r(   r’   n  s    zGlyphID.writeArrayNc             C   s   |  | j| |¡¡ d S )N)Z
writeValuerÕ   Ú
getGlyphID)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   p  s    zGlyphID.write)N)	rJ   rW   rX   rˆ   rÕ   r‡   rl   r’   rŒ   r'   r'   r'   r(   rÒ   g  s   rÒ   c               @   s   e Zd ZdZdZdS )Ú	GlyphID32r­   ÚLN)rJ   rW   rX   rˆ   rÕ   r'   r'   r'   r(   rØ   t  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   rO   z  zmissing from name tablez"name id %d missing from name table)r¦   rG   ZgetDebugNamerŒ   rÐ   ÚlogÚwarningr§   )r^   r—   rm   r   rO   r”   Z	nameTabler'   r'   r(   r˜   z  s    



zNameID.xmlWriteN)rJ   rW   rX   r˜   r'   r'   r'   r(   rÚ   y  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ElidableAxisValueNamez  ú )r¦   rL   rŒ   rÐ   Újoinr§   )r^   r—   rm   r   rO   r”   Úflagsr'   r'   r(   r˜   ‰  s    


zSTATFlags.xmlWriteN)rJ   rW   rX   r˜   r'   r'   r'   r(   rÝ   ˆ  s   rÝ   c               @   s   e Zd Zedd„ ƒZdS )Ú
FloatValuec             C   s   t | ƒS )N)Úfloat)r   r'   r'   r(   r¥   –  s    zFloatValue.fromStringN)rJ   rW   rX   r¨   r¥   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^   rh   rm   r„   r'   r'   r(   rl   œ  s    zDeciPoints.readNc             C   s   |  t|d ƒ¡ d S )Nrä   )rÂ   Úround)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   Ÿ  s    zDeciPoints.write)N)rJ   rW   rX   rˆ   rl   rŒ   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 )N)ÚfromIntÚgetattrÚreaderMethod)r^   rh   rm   r„   r'   r'   r(   rl   §  s    zBaseFixedValue.readNc             C   s   t || jƒ|  |¡ƒ d S )N)rè   ÚwriterMethodÚtoInt)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   ©  s    zBaseFixedValue.writec             C   s   t || jƒS )N)Úfi2flÚprecisionBits)rT   r   r'   r'   r(   rç   «  s    zBaseFixedValue.fromIntc             C   s   t || jƒS )N)Úfl2firí   )rT   r   r'   r'   r(   rë   ®  s    zBaseFixedValue.toIntc             C   s   t || jƒS )N)Ústr2flrí   )rT   r   r'   r'   r(   r¥   ±  s    zBaseFixedValue.fromStringc             C   s   t || jƒS )N)Úfl2strrí   )rT   r   r'   r'   r(   r¤   ´  s    zBaseFixedValue.toString)N)rJ   rW   rX   rq   rˆ   rí   ré   rê   rl   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)rJ   rW   rX   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½   N)rJ   rW   rX   rˆ   rí   ré   rê   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ç   Úbias)rT   r   )Ú	__class__r'   r(   rç   É  s    zAngle.fromIntc                s   t ƒ  |d | j ¡S )Nr÷   )rø   rë   rù   )rT   r   )rú   r'   r(   rë   Ì  s    zAngle.toIntc             C   s   t t|ƒ| j ƒ| j S )N)r	   râ   Úfactor)rT   r   r'   r'   r(   r¥   Ï  s    zAngle.fromStringc             C   s   t || jƒS )N)r   rû   )rT   r   r'   r'   r(   r¤   Ó  s    zAngle.toString)rJ   rW   rX   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)rJ   rW   rX   rù   r'   r'   r'   r(   rý   ×  s   rý   c               @   sF   e Zd ZdZdd„ Zddd„Zedd„ ƒZed	d
„ ƒZedd„ ƒZ	dS )ÚVersionr­   c             C   s$   |  ¡ }|d? dks td| ƒ‚|S )Nró   r   zUnsupported version 0x%08x)r®   r=   )r^   rh   rm   r„   r   r'   r'   r(   rl   Þ  s    zVersion.readNc             C   s.   t |ƒ}|d? dks td| ƒ‚| |¡ d S )Nró   r   zUnsupported version 0x%08x)Úfi2ver=   r°   )r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   â  s    zVersion.writec             C   s   t | ƒS )N)Úve2fi)r   r'   r'   r(   r¥   æ  s    zVersion.fromStringc             C   s   d|  S )Nz0x%08xr'   )r   r'   r'   r(   r¤   é  s    zVersion.toStringc             C   s
   t | dƒS )Nró   )rî   )Úvr'   r'   r(   Ú	fromFloatì  s    zVersion.fromFloat)N)
rJ   rW   rX   rˆ   rl   rŒ   r¨   r¥   r¤   r  r'   r'   r'   r(   rþ   Ü  s   
rþ   c               @   s&   e Zd ZdZdZdd„ Zddd„ZdS )	Ú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^   rh   rm   r„   rg   ZzeroPosÚsr'   r'   r(   rl   ù  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	  r
  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr  )r   rÛ   rÜ   rf   rˆ   Ú	writeData)r^   r   rm   r„   r   r“   rg   r'   r'   r(   rŒ     s    zChar64.write)N)rJ   rW   rX   r    rˆ   rl   rŒ   r'   r'   r'   r(   r  ñ  s   r  c               @   s>   e Zd Zdd„ Zdd„ Zddd„Zdd	„ Zd
d„ Zdd„ ZdS )rD   c             C   s   | j o| j  |¡S )N)rF   r€   )r^   rh   r'   r'   r(   r€     s    zStruct.getRecordSizec             C   s   |   ¡ }| ||¡ |S )N)rF   Ú	decompile)r^   rh   rm   r„   Útabler'   r'   r(   rl     s    zStruct.readNc             C   s   |  ||¡ d S )N)r¢   )r^   r   rm   r„   r   r“   r'   r'   r(   rŒ     s    zStruct.writec             C   s@   |d kr*|r<|  ||dg ¡ | ¡  q<n|j||||d d S )N)Úemptyr   )rO   )r¦   r§   ÚtoXML)r^   r—   rm   r   rO   r”   r'   r'   r(   r˜     s    
zStruct.xmlWritec             C   sH  d|krt |d ƒrd S |  ¡ }| d¡}|d k	r<t|ƒ|_t|dƒ }|r¼d}xj| ¡ D ]^}|jrZd}t|dƒsxi |_|j}	|j	|	ks–t
|j	|	fƒ‚t||j	d ƒ t|j|j	ƒ|	|j	< qZW x2|D ]*}
t|
tƒrÂ|
\}}}| ||||¡ qÂqÂW |jt|dd ƒd |rD|rDx2| ¡ D ]&}|jr|j}	|	|j	= |	s|`qW |S )Nr  ÚFormatZpostReadFTÚ_propagator)Ú
propagator)r   rF   rG   rœ   r  r‰   ÚgetConvertersr{   r  rO   r=   Úsetattrr   Ú__dict__r$   r%   ÚfromXMLZpopulateDefaultsrè   )r^   r”   r•   rm   r  r  Z
noPostReadZcleanPropagationrS   r  ÚelementrO   r'   r'   r(   r–   *  sB    






zStruct.xmlReadc             C   s   dt | jƒ S )Nz
Struct of )ÚreprrF   )r^   r'   r'   r(   Ú__repr__T  s    zStruct.__repr__)N)	rJ   rW   rX   r€   rl   rŒ   r˜   r–   r  r'   r'   r'   r(   rD     s   
*rD   c               @   s   e Zd Zdd„ Zddd„ZdS )rB   c             C   s.   |j }|  ¡ }| ||¡ | ||j ¡ |S )N)rj   rF   r  ri   r.   )r^   rh   rm   r„   rj   r  r'   r'   r(   rl   Y  s
    zStructWithLength.readNc             C   sÄ   x$t | ¡ ƒD ]\}}|jdkrP qW t|jƒ| }t|tƒrF|d7 }ddddœ|j }	| ¡ }
|	|_	| 
||¡ | ¡ |
 }| ¡ }| ||||¡ |j| dd |j… ks²t‚| ¡ |j|< d S )Nr.   r   éÞ   i­Þ  l   ï>[= )r   rº   r­   s   Þ­¾ï)r‹   r  rO   rf   Úitemsr$   r   rˆ   ÚgetDataLengthr.   r¢   ÚgetSubWriterrŒ   r=   Ú
getAllData)r^   r   rm   r„   r   r“   Z	convIndexrS   ÚlengthIndexZdeadbeefÚbeforeÚlengthZlengthWriterr'   r'   r(   rŒ   `  s     

zStructWithLength.write)N)rJ   rW   rX   rl   rŒ   r'   r'   r'   r(   rB   X  s   rB   c               @   s2   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	d
„ZdS )rI   rº   c             C   s   |  ¡ S )N)rÀ   )r^   rh   r'   r'   r(   Ú
readOffsetx  s    zTable.readOffsetc             C   s   |  d¡ d S )Nr   )rÂ   )r^   r   r'   r'   r(   ÚwriteNullOffset{  s    zTable.writeNullOffsetc             C   sL   |   |¡}|dkrd S |  ¡ }| |¡}|jr<||_||_n| ||¡ |S )Nr   )r$  rF   ÚgetSubReaderr   rh   rm   r  )r^   rh   rm   r„   Úoffsetr  r'   r'   r(   rl   ~  s    

z
Table.readNc             C   sR   |d kr|   |¡ n:|j| jd}| j|_|d k	r8||_| |¡ | ||¡ d S )N)Ú
offsetSize)r%  r  rˆ   rO   r“   ÚwriteSubTabler¢   )r^   r   rm   r„   r   r“   Ú	subWriterr'   r'   r(   rŒ   ‹  s    
zTable.write)N)rJ   rW   rX   rˆ   r$  r%  rl   rŒ   r'   r'   r'   r(   rI   t  s
   rI   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚLTabler­   c             C   s   |  ¡ S )N)r³   )r^   rh   r'   r'   r(   r$  š  s    zLTable.readOffsetc             C   s   |  d¡ d S )Nr   )rµ   )r^   r   r'   r'   r(   r%    s    zLTable.writeNullOffsetN)rJ   rW   rX   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 )ÚTable24rÌ   c             C   s   |  ¡ S )N)rÍ   )r^   rh   r'   r'   r(   r$  ¦  s    zTable24.readOffsetc             C   s   |  d¡ d S )Nr   )rÎ   )r^   r   r'   r'   r(   r%  ©  s    zTable24.writeNullOffsetN)rJ   rW   rX   rˆ   r$  r%  r'   r'   r'   r(   r,  ¢  s   r,  c                   s$   e Zd Zdd„ Z‡ fdd„Z‡  ZS )r4   c             C   s$   | j | | }|  | j| j| j|¡S )N)r   rú   rO   rP   rQ   )r^   Ú	tableTypeÚ
lookupTyperF   r'   r'   r(   ÚgetConverter°  s    zSubStruct.getConverterc                s   t t| ƒ |||d |¡ d S )N)rø   r4   r˜   )r^   r—   rm   r   rO   r”   )rú   r'   r(   r˜   ´  s    zSubStruct.xmlWrite)rJ   rW   rX   r/  r˜   rü   r'   r'   )rú   r(   r4   ¯  s   r4   c                   s$   e Zd Zdd„ Z‡ fdd„Z‡  ZS )r2   c             C   s$   | j | | }|  | j| j| j|¡S )N)r   rú   rO   rP   rQ   )r^   r-  r.  rF   r'   r'   r(   r/  ¸  s    zSubTable.getConverterc                s   t t| ƒ |||d |¡ d S )N)rø   r2   r˜   )r^   r—   rm   r   rO   r”   )rú   r'   r(   r˜   ¼  s    zSubTable.xmlWrite)rJ   rW   rX   r/  r˜   rü   r'   r'   )rú   r(   r2   ·  s   r2   c               @   s   e Zd Zddd„ZdS )r3   Nc             C   s   d|_ t | |||||¡ d S )NT)Ú	ExtensionrI   rŒ   )r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   Á  s    zExtSubTable.write)N)rJ   rW   rX   rŒ   r'   r'   r'   r(   r3   ¿  s   r3   c               @   s   e Zd Zdd„ ZdS )r5   c             C   s&   | j  || j¡}|  | j| j| j|¡S )N)r;   rG   rK   rú   rO   rP   rQ   )r^   Z
featureTagrF   r'   r'   r(   r/  Ç  s    zFeatureParams.getConverterN)rJ   rW   rX   r/  r'   r'   r'   r(   r5   Æ  s   r5   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º   Nrv   )r7   c            C   s4   t j| |||||d d|d dkr(dnd | _d S )N)r7   r+   éÿÿÿÿÚ2Ú1)ru   r|   Úwhich)r^   rO   rP   rQ   rF   r7   r'   r'   r(   r|   Î  s    zValueFormat.__init__c             C   s   |  ¡ }t|ƒ|| j< |S )N)rÀ   r   r4  )r^   rh   rm   r„   Úformatr'   r'   r(   rl   Ó  s    zValueFormat.readc             C   s   |  |¡ t|ƒ|| j< d S )N)rÂ   r   r4  )r^   r   rm   r„   r5  r“   r'   r'   r(   rŒ   ×  s    
zValueFormat.write)N)N)rJ   rW   rX   rˆ   r|   rl   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º   )rf   r4  )r^   rh   r'   r'   r(   r€   Ý  s    zValueRecord.getRecordSizec             C   s   || j   ||¡S )N)r4  ZreadValueRecord)r^   rh   rm   r„   r'   r'   r(   rl   ß  s    zValueRecord.readNc             C   s   || j   |||¡ d S )N)r4  ZwriteValueRecord)r^   r   rm   r„   r   r“   r'   r'   r(   rŒ   á  s    zValueRecord.writec             C   s    |d kr
n|  ||| j|¡ d S )N)r  rO   )r^   r—   rm   r   rO   r”   r'   r'   r(   r˜   ã  s    zValueRecord.xmlWritec             C   s&   ddl m} |ƒ }| d |||¡ |S )Nr   )r6  )ÚotBaser6  r  )r^   r”   r•   rm   r6  r   r'   r'   r(   r–   è  s    zValueRecord.xmlRead)N)rJ   rW   rX   r€   rl   rŒ   r˜   r–   r'   r'   r'   r(   r6  Ü  s
   
r6  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ä   rv   )r7   c            C   sN   t j| |||||d t| jtƒr6| jdd d d| _ntdd d | jd| _d S )N)r7   ÚValue)rO   rP   rQ   )rO   rP   rQ   rF   )ru   r|   Ú
issubclassrF   r£   Ú	converterrI   )r^   rO   rP   rQ   rF   r7   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^   rh   rm   r„   r5  r'   r'   r(   rl   û  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×   )rb   ÚglyphÚval)rm   r'   r(   rc     s   z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)
rp   Úsortedr  ÚfilterÚbuildFormat0ÚbuildFormat2ÚbuildFormat6ÚbuildFormat8r  r=   )r^   r   rm   r„   r   r“   rH   ÚformatsZdataSizeZlookupFormatZwriteMethodrj   Z
actualSizer'   )rm   r(   rŒ   
  s    
zAATLookup.writec             C   sH   |   |¡ |   |¡ t||d\}}}|   |¡ |   |¡ |   |¡ d S )N)ÚnZitemSize)rÂ   r   )r   ÚnumUnitsÚunitSizeZsearchRangeZentrySelectorZ
rangeShiftr'   r'   r(   ÚwriteBinSearchHeader  s    



zAATLookup.writeBinSearchHeaderc                sD   t ˆ  ¡ ƒ}t ˆƒ|krd S ˆjj}d||  d‡ ‡‡‡fdd„fS )Nrº   r   c                  s   ˆ  ˆˆ ˆ¡S )N)ÚwriteFormat0r'   )rm   r^   rH   r   r'   r(   r)   .  r*   z(AATLookup.buildFormat0.<locals>.<lambda>)rf   ÚgetGlyphOrderr;  rˆ   )r^   r   rm   rH   Ú	numGlyphsÚ	valueSizer'   )rm   r^   rH   r   r(   rF  (  s    zAATLookup.buildFormat0c             C   s6   |  d¡ x&|D ]\}}| jj||d |d d qW d S )Nr   )r„   r   r“   )rÂ   r;  rŒ   )r^   r   rm   rH   ZglyphID_r   r'   r'   r(   rO  0  s
    
zAATLookup.writeFormat0c                s¸   |d \}}|}g ‰xN|dd … D ]>\}}||d ks>||kr\ˆ  |||f¡ | }}|}q"|}q"W ˆ  |||f¡ ˆjj}	tˆƒd |	d  }
}dˆj |
|  d‡ ‡‡‡fdd„fS )Nr   r   r­   rº   c                  s   ˆ  ˆˆ ˆ¡S )N)ÚwriteFormat2r'   )rm   Úsegmentsr^   r   r'   r(   r)   F  r*   z(AATLookup.buildFormat2.<locals>.<lambda>)rL   r;  rˆ   rf   ÚBIN_SEARCH_HEADER_SIZE)r^   r   rm   rH   ZsegStartZsegValueZsegEndÚglyphIDZcurValuerR  rL  rM  r'   )rm   rT  r^   r   r(   rG  7  s    zAATLookup.buildFormat2c       
      C   s–   |  d¡ | jj}t|ƒ|d  }}|  |||¡ x<|D ]4\}}}	|  |¡ |  |¡ | jj||d |	d d q8W |  d¡ |  d¡ | d| ¡ d S )Nrº   r­   )r„   r   r“   iÿÿ  r  )rÂ   r;  rˆ   rf   rN  rŒ   r  )
r^   r   rm   rT  rR  rL  rM  Z
firstGlyphZ	lastGlyphr   r'   r'   r(   rS  H  s    




zAATLookup.writeFormat2c                sD   ˆj j}tˆƒ|d  }}dˆj |d |  d‡ ‡‡‡fdd„fS )Nrº   r   r<  c                  s   ˆ  ˆˆ ˆ¡S )N)ÚwriteFormat6r'   )rm   r^   rH   r   r'   r(   r)   [  r*   z(AATLookup.buildFormat6.<locals>.<lambda>)r;  rˆ   rf   rU  )r^   r   rm   rH   rR  rL  rM  r'   )rm   r^   rH   r   r(   rH  W  s    zAATLookup.buildFormat6c       	      C   s€   |  d¡ | jj}t|ƒ|d  }}|  |||¡ x0|D ](\}}|  |¡ | jj||d |d d q8W |  d¡ | d| ¡ d S )Nr<  rº   )r„   r   r“   iÿÿ  r  )rÂ   r;  rˆ   rf   rN  rŒ   r  )	r^   r   rm   rH   rR  rL  rM  rV  r   r'   r'   r(   rW  ]  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   r1  r   r<  r}   c                  s   ˆ  ˆˆ ˆ¡S )N)ÚwriteFormat8r'   )rm   r^   rH   r   r'   r(   r)   p  r*   z(AATLookup.buildFormat8.<locals>.<lambda>)rf   r;  rˆ   )r^   r   rm   rH   Z
minGlyphIDZ
maxGlyphIDrR  r'   )rm   r^   rH   r   r(   rI  j  s    zAATLookup.buildFormat8c             C   sZ   |d d }|  d¡ |  |¡ |  t|ƒ¡ x&|D ]\}}| jj||d |d d q4W d S )Nr   r}   )r„   r   r“   )rÂ   rf   r;  rŒ   )r^   r   rm   rH   ZfirstGlyphIDÚ_r   r'   r'   r(   rX  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Ö   )rb   rn   r   )rm   r'   r(   ú
<dictcomp>€  s   z)AATLookup.readFormat0.<locals>.<dictcomp>)rf   rP  r;  r‡   r‹   )r^   rh   rm   rQ  rg   r'   )rm   r(   r=  |  s
    
zAATLookup.readFormat0c             C   s´   i }|j d }| ¡ | ¡  }}|d| jj ks8t|ƒ‚xvt|ƒD ]j}| |||  d ¡ | ¡ }| ¡ }	| jj||d d}
|dkrBx$t|	|d ƒD ]}|
|| |¡< q–W qBW |S )Nrº   r­   é   )r„   iÿÿ  r   )	rj   rÀ   r;  rˆ   r=   rd   ri   rl   rÖ   )r^   rh   rm   Úmappingrj   rM  rL  r_   ÚlastÚfirstr   rn   r'   r'   r(   r>  ƒ  s    
zAATLookup.readFormat2c             C   sÒ   i }|j d }| ¡ }|dks&t|ƒ‚x¦t| ¡ ƒD ]–}| |||  d ¡ | ¡ }| ¡ }| ¡ }	|dkr4| d¡}
|
 ||	 ¡ | jj|
|d || d d}x&t|ƒD ]\}}||| 	|| ¡< q¬W q4W |S )Nrº   r<  r[  iÿÿ  r   r   )r„   r…   )
rj   rÀ   r=   rd   ri   r&  r;  r‡   r‹   rÖ   )r^   rh   rm   r\  rj   rM  r_   r]  r^  r'  Ú
dataReaderrg   rn   r  r'   r'   r(   r?  ’  s$    

zAATLookup.readFormat4c       	      C   sŽ   i }|j d }| ¡ }|d| jj ks.t|ƒ‚xZt| ¡ ƒD ]J}| |||  d ¡ | ¡ }| jj||d d}|dkr<||| |¡< q<W |S )Nrº   r[  )r„   iÿÿ  )	rj   rÀ   r;  rˆ   r=   rd   ri   rl   rÖ   )	r^   rh   rm   r\  rj   rM  r_   rV  r   r'   r'   r(   r@  ¦  s    
zAATLookup.readFormat6c                s<   |  ¡ ‰ |  ¡ }| jj|ˆd |d}‡ ‡fdd„t|ƒD ƒS )N)r„   r…   c                s    i | ]\}}|ˆ  ˆ | ¡“qS r'   )rÖ   )rb   rn   r   )r^  rm   r'   r(   rZ  ¹  s   z)AATLookup.readFormat8.<locals>.<dictcomp>)rÀ   r;  r‡   r‹   )r^   rh   rm   r…   rg   r'   )r^  rm   r(   rA  ´  s    zAATLookup.readFormat8c       	      C   sJ   i }x@|D ]8}t |tƒr
|\}}}|dkr
| j |||¡||d < q
W |S )NÚLookuprB  )r$   r%   r;  r–   )	r^   r”   r•   rm   r   r  rO   ÚaÚ
eltContentr'   r'   r(   r–   ¼  s    


zAATLookup.xmlReadc             C   s`   |  ||¡ | ¡  x4t| ¡ ƒD ]$\}}| jj|||dd|fgd q"W | |¡ | ¡  d S )Nr`  rB  )r   rO   r”   )Úbegintagr§   rD  r  r;  r˜   Úendtag)r^   r—   rm   r   rO   r”   rB  r'   r'   r(   r˜   Å  s    
zAATLookup.xmlWrite)N)rJ   rW   rX   rU  r|   rl   rŒ   r¨   rN  rF  rO  rG  rS  rH  rW  rI  rX  r=  r>  r?  r@  rA  r–   r˜   r'   r'   r'   r(   r8  ï  s(   	


	r8  c               @   s.   e Zd Zdd„ Zd
dd„Zdd„ Zdd	„ ZdS )ÚAATLookupWithDataOffsetc             C   s~   |  ¡ }|  ¡ }| |¡}tdd d tƒ}| |||¡}i }	x>| ¡ D ]2\}
}| || ¡}|  ¡ }| ||¡ ||	|
< qDW |	S )NÚDataOffsets)r³   r&  r8  r¿   rl   r  rF   r  )r^   rh   rm   r„   ZlookupOffsetZ
dataOffsetÚlookupReaderÚlookupÚoffsetsÚresultrB  r'  r_  ro   r'   r'   r(   rl   Ø  s    
zAATLookupWithDataOffset.readNc             C   sð   i i d  }}}g }	xrt ||jdD ]`}
tƒ }||
  ||¡ | ¡ }| |d ¡}|d kr||}|t|ƒ }|||< |	 |¡ |||
< q$W |jdd}t	dd d t
ƒ}| ||||d ¡ |jdd}| |¡ | |¡ x|	D ]}| |¡ qÚW d S )Nr   )Úkeyr­   )r(  rf  )rD  r×   r   r¢   r   rG   rf   rL   r  r8  r¿   rŒ   r)  r  )r^   r   rm   r„   r   r“   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDatarB  r*  rg   r'  ÚlookupWriterrh  Z
dataWriterÚdr'   r'   r(   rŒ   æ  s*    




zAATLookupWithDataOffset.writec             C   s   t dd d | jƒ}| |||¡S )Nrf  )r8  rF   r–   )r^   r”   r•   rm   rh  r'   r'   r(   r–   	  s    zAATLookupWithDataOffset.xmlReadc             C   s&   t dd d | jƒ}| |||||¡ d S )Nrf  )r8  rF   r˜   )r^   r—   rm   r   rO   r”   rh  r'   r'   r(   r˜     s    z AATLookupWithDataOffset.xmlWrite)N)rJ   rW   rX   rl   rŒ   r–   r˜   r'   r'   r'   r(   re  ×  s   
#re  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'   )rb   rk  rC  r'   r'   r(   rZ    s   z MorxSubtableConverter.<dictcomp>Nrv   )r7   c            C   s   t j| |||||d d S )N)r7   )ru   r|   )r^   rO   rP   rQ   rF   r7   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)rg   ÚtableTag)rj   r   r³   r.   rÈ   Ú_PROCESSING_ORDERSÚProcessingOrderru  rÀ   ÚReservedr/   ÚSubFeatureFlagsr   rG   r=   rg   rf   r   rw  r4   r  ri   )r^   rh   rm   r„   rj   rž   rà   ÚorderKeyrF   ZheaderLengthrg   Z	subReaderr'   r'   r(   rl   ,  s2    





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=%drt  )r   ry  r   rz  z0x%04xzMorphType=%dr{  z0x%08x)rc  r§   rÐ   r.   r¦   rt  ry  rz  r/   r{  r4   r  rd  )r^   r—   rm   r   rO   r”   r'   r'   r(   r˜   J  s*    


zMorxSubtableConverter.xmlWritec       
      C   s@  t ƒ }d}d|_xtt|ƒD ]\}}}|dkrpt|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W |d@ d> |jB |_|S )Nr   ÚCoverageFlagsr   r  ró   ry  zunknown ProcessingOrder: %srt  >   rs  rp  rr  zunknown TextDirection %srz  r{  ZMorphFrv  )r   rz  rE  Úistupler   rx  ry  ru  Ú_PROCESSING_ORDERS_REVERSEDr=   rt  r{  r>   r  )
r^   r”   r•   rm   rž   ÚcovFlagsÚeltNameÚeltAttrsrb  r|  r'   r'   r(   r–   a  s6    



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ó   rr  rq  r   r  rp  ro  l   ï>[= iÿÿ  s   Þ­¾ïz>L)rz  r  ry  rt  r}  rf   r  r  r.   r¢   r=   ÚstructÚpack)r^   r   rm   r„   r   r“   r€  ZreverseOrderZlogicalOrderr!  r"  ZorigReservedr#  r'   r'   r(   rŒ   €  s$    
zMorxSubtableConverter.write)N)N)rJ   rW   rX   rx  r  r  r|   ru  rl   r˜   r–   rŒ   r'   r'   r'   r(   rn    s   rn  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 )'Ú	STXHeaderrv   )r7   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 )N)r7   ÚGlyphClassesÚPerGlyphLookup)ru   r|   r:  rF   r   r=   r8  r¿   ÚclassLookupr   rÒ   ÚperGlyphLookup)r^   rO   rP   rQ   rF   r7   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  ƒ}xXt|ƒD ]L}tƒ }|j |¡ x2t|jƒD ]$}| ¡ }|  ||||	¡|j|< q¶W q”W | jd k	r |  |||¡|_|S )Nr   rº   )r   rj   r&  r³   ÚGlyphClassCountri   r‰  r:  rF   r   r=   rÁ   ÚLigComponentsÚ_readLigaturesÚ	Ligaturesr   rˆ  rl   r†  rœ   rd   r   ÚStatesrL   rÀ   Ú_readTransitionÚTransitionsÚ_readPerGlyphLookupsÚPerGlyphLookups)r^   rh   rm   r„   r  rj   ZclassTableReaderZstateArrayReaderZentryTableReaderÚactionReaderZligaturesReaderZperGlyphTableReaderZligComponentReaderZnumLigComponentsZ	numStatesÚ
stateIndexÚstateÚ
glyphClassÚ
entryIndexr'   r'   r(   rl   ¦  sZ    










zSTXHeader.readc             C   s0   |   ¡ }| |j||j  ¡}| |||¡ |S )N)rF   r&  rj   rˆ   r  )r^   rh   r—  rm   r“  Ú
transitionZentryReaderr'   r'   r(   r  ×  s
    zSTXHeader._readTransitionc             C   s(   t |jƒ}||j d }| | |¡¡S )Nrº   )rf   rg   rj   rÔ   rÁ   )r^   rh   rm   ÚlimitZnumLigatureGlyphsr'   r'   r(   rŒ  Þ  s    
zSTXHeader._readLigaturesc             C   sj   d}x`|j D ]V}xP|j ¡ D ]B}t|tƒr|jdkrDt||jd ƒ}|jdkrt||jd ƒ}qW qW |S )Nr   iÿÿ  r   )rŽ  r  rH   r$   r   Z	MarkIndexÚmaxZCurrentIndex)r^   r  Ú
numLookupsr•  r&   r'   r'   r(   Ú_countPerGlyphLookupsã  s    


zSTXHeader._countPerGlyphLookupsc             C   sX   |j }g }xHt|  |¡ƒD ]6}| d¡}| || ¡  ¡ | | j ||i ¡¡ qW |S )Nr   )	rj   rd   rœ  r&  ri   r³   rL   r‰  rl   )r^   r  rh   rm   rj   ÚlookupsrY  rg  r'   r'   r(   r‘  ö  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   r   rš  rH   r‰  rF   ZactionHeaderSizeZcompileActionsrŽ  Ú_compileStatesrf   Ú_compilePerGlyphLookupsÚ_compileLigComponentsÚ_compileLigaturesr=   rµ   r  )r^   r   rm   r„   r   r“   ZglyphClassWriterZglyphClassDataÚglyphClassCountZglyphClassTableOffsetZ
actionDataÚactionIndexÚstateArrayDataÚentryTableDataZstateArrayOffsetZentryTableOffsetZperGlyphOffsetZperGlyphDataZactionOffsetZligaturesOffsetZligComponentsOffsetZligComponentsDataZligaturesDatar'   r'   r(   rŒ      s^    




















zSTXHeader.writec             C   sÚ   t ƒ }g i  }}x¤|D ]œ}x–t|ƒD ]Š}	|j|	 }
t ƒ }|
 |||¡ | ¡ }t|ƒ|
jksxtdt|
ƒ|
jt|ƒf ƒ‚| 	|¡}|d kr¤t|ƒ}|||< | 
|¡ | |¡ q$W qW t| ¡ dƒ}tt|ƒdƒ}||fS )Nz1%s has staticSize %d, but actually wrote %d bytesr­   )r   rd   r  r¢   r   rf   rˆ   r=   r  rG   rL   rÂ   r   r
   )r^   rm   Zstatesr¢  r£  ZstateArrayWriterÚentriesZentryIDsr•  r–  r˜  ZentryWriterZ	entryDatar—  r¤  r¥  r'   r'   r(   rž  7  s.    




zSTXHeader._compileStatesc             C   s„   | j d krdS |  |¡}t|jƒ|ks<tdt|jƒ|f ƒ‚tƒ }x8|jD ].}|jdd}| j  ||i |d ¡ | |¡ qJW | 	¡ S )Nr*   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr­   )r(  )
r‰  rœ  rf   r’  r=   r   r  rŒ   r)  r   )r^   r  rm   r›  r   rh  rl  r'   r'   r(   rŸ  Q  s    



z!STXHeader._compilePerGlyphLookupsc             C   s6   t |dƒsd S tƒ }x|jD ]}| |¡ qW | ¡ S )Nr‹  )r‰   r   r‹  rÂ   r   )r^   r  rm   r   Ú	componentr'   r'   r(   r   a  s    
zSTXHeader._compileLigComponentsc             C   s<   t |dƒsd S tƒ }x|jD ]}| | |¡¡ qW | ¡ S )Nr  )r‰   r   r  rÂ   r×   r   )r^   r  rm   r   Z	glyphNamer'   r'   r(   r¡  i  s    
zSTXHeader._compileLigaturesc             C   sÔ  |  ||¡ | ¡  | d|j ¡ | ¡  x2t|j ¡ ƒD ] \}}|jd||d | ¡  q<W xpt|j	ƒD ]b\}}	|j d|d | ¡  x0t|	j
 ¡ ƒD ]\}
}|j||d|
idd qšW | d¡ | ¡  qlW xrt|jƒD ]d\}}|j d	|d | ¡  x2t| ¡ ƒD ]"\}}|jd
||d | ¡  q
W | d	¡ | ¡  qÞW t|dƒr¬|  d¡ | ¡  x4tt|dƒƒD ]"\}}|jd||d | ¡  qtW | d¡ | ¡  |  |||||¡ | |¡ | ¡  d S )NzGlyphClassCount=%sÚ
GlyphClass)rB  r   ÚState)ÚindexÚonGlyphClassÚ
Transition)rm   r”   rO   r‡  r`  r‹  ÚLigComponent)rª  r   )rc  r§   rÐ   rŠ  rD  r†  r  r¦   r‹   rŽ  r  r  rd  r’  r‰   rè   Ú_xmlWriteLigatures)r^   r—   rm   r   rO   r”   ÚgÚklassr”  r•  r–  Ztransr_   rh  rB  rC  r'   r'   r(   r˜   q  sJ    




zSTXHeader.xmlWritec             C   sj   t |dƒsd S | d¡ | ¡  x2tt|dƒƒD ] \}}|jd||d | ¡  q0W | d¡ | ¡  d S )Nr  ÚLigature)rª  rB  )r‰   rc  r§   r‹   rè   r¦   rd  )r^   r—   rm   r   rO   r”   r_   r¯  r'   r'   r(   r®  ˜  s    


zSTXHeader._xmlWriteLigaturesc             C   sÜ   t ƒ }x¼tt|ƒD ]®\}}}|dkrD|d }|d }	t|	ƒ|j|< q|dkrh|  |||¡}
|j |
¡ q|dkrŽ| j 	|||¡}|j
 |¡ q|dkr¨|  |||¡|_q|dkr|  |||¡|_qW t|j ¡ ƒd |_|S )	Nr¨  rB  r   r©  r‡  r‹  r  r   )r   rE  r~  r   r†  Ú_xmlReadStaterŽ  rL   r‰  r–   r’  Ú_xmlReadLigComponentsr‹  Ú_xmlReadLigaturesr  rš  rH   rŠ  )r^   r”   r•   rm   r  r  r‚  rb  rB  r   r•  rh  r'   r'   r(   r–   £  s*    
zSTXHeader.xmlReadc       
      C   sZ   t ƒ }xNtt|ƒD ]@\}}}|dkrt|d ƒ}|  ¡ }	|	 ||||¡ |	|j|< qW |S )Nr¬  r«  )r   rE  r~  r   rF   r  r  )
r^   r”   r•   rm   r•  r  r‚  rb  r–  r˜  r'   r'   r(   r²  ¼  s    zSTXHeader._xmlReadStatec             C   s<   g }x2t t|ƒD ]$\}}}|dkr| t|d ƒ¡ qW |S )Nr­  r   )rE  r~  rL   r   )r^   r”   r•   rm   ZligComponentsr  r‚  Ú_eltContentr'   r'   r(   r³  Ç  s    zSTXHeader._xmlReadLigComponentsc             C   s8   g }x.t t|ƒD ] \}}}|dkr| |d ¡ qW |S )Nr±  rB  )rE  r~  rL   )r^   r”   r•   rm   Zligsr  r‚  rµ  r'   r'   r(   r´  Ï  s
    zSTXHeader._xmlReadLigatures)N)rJ   rW   rX   r|   rl   r  rŒ  rœ  r‘  rŒ   rž  rŸ  r   r¡  r˜   r®  r–   r²  r³  r´  r'   r'   r'   r(   r…  ™  s"   1

7'r…  c               @   s.   e Zd Zdd„ Zd
dd„Zdd„ Zdd	„ ZdS )ÚCIDGlyphMapc             C   sB   |  ¡ }i }x0t| |¡ƒD ]\}}|dkr| |¡||< qW |S )Niÿÿ  )rÀ   r‹   rÁ   rÖ   )r^   rh   rm   r„   ZnumCIDsrj  ÚcidrV  r'   r'   r(   rl   Ø  s    zCIDGlyphMap.readNc       	         s\   ‡ fdd„|  ¡ D ƒ}|r&t|ƒd nd}| |¡ x"t|ƒD ]}| | |d¡¡ q>W d S )Nc                s   i | ]\}}ˆ   |¡|“qS r'   )r×   )rb   r·  rB  )rm   r'   r(   rZ  á  s   z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   iÿÿ  )r  rš  rÂ   rd   rG   )	r^   r   rm   r„   r   r“   r  r…   r·  r'   )rm   r(   rŒ   à  s    

zCIDGlyphMap.writec             C   sB   i }x8t t|ƒD ]*\}}}|dkr|d  ¡ |t|d ƒ< qW |S )NÚCIDrB  r·  )rE  r~  Ústripr   )r^   r”   r•   rm   rj  ÚeNameÚeAttrsÚ	_eContentr'   r'   r(   r–   è  s
    zCIDGlyphMap.xmlReadc             C   sl   |  ||¡ | ¡  x@t| ¡ ƒD ]0\}}|d k	r"|dkr"|jd||d | ¡  q"W | |¡ | ¡  d S )Niÿÿ  r¸  )r·  rB  )rc  r§   rD  r  r¦   rd  )r^   r—   rm   r   rO   r”   r·  rB  r'   r'   r(   r˜   ð  s    
zCIDGlyphMap.xmlWrite)N)rJ   rW   rX   rl   rŒ   r–   r˜   r'   r'   r'   r(   r¶  ×  s   
r¶  c               @   s.   e Zd Zdd„ Zd
dd„Zdd„ Zdd	„ ZdS )ÚGlyphCIDMapc       
      C   s€   |  ¡ }| ¡ }| |¡}|t|ƒkr<t d|t|ƒf ¡ i }x:ttt|ƒt|ƒƒƒD ] }|| }	|	dkrX|	||| < qXW |S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restiÿÿ  )rP  rÀ   rÁ   rf   rÛ   rÜ   rd   Úmin)
r^   rh   rm   r„   Z
glyphOrderr…   Zcidsrj  rV  r·  r'   r'   r(   rl   ý  s    
zGlyphCIDMap.readNc       	         s\   ‡ fdd„|  ¡ D ƒ}|r&t|ƒd nd}| |¡ x"t|ƒD ]}| | |d¡¡ q>W d S )Nc                s,   i | ]$\}}|d k	r|dkr|ˆ   |¡“qS )Niÿÿ  )r×   )rb   r¯  r·  )rm   r'   r(   rZ    s   z%GlyphCIDMap.write.<locals>.<dictcomp>r   r   iÿÿ  )r  rš  rÂ   rd   rG   )	r^   r   rm   r„   r   r“   r  r…   rV  r'   )rm   r(   rŒ     s    

zGlyphCIDMap.writec             C   s>   i }x4t t|ƒD ]&\}}}|dkrt|d ƒ||d < qW |S )Nr¸  r   rB  )rE  r~  r   )r^   r”   r•   rm   rj  rº  r»  r¼  r'   r'   r(   r–     s
    zGlyphCIDMap.xmlReadc             C   sl   |  ||¡ | ¡  x@t| ¡ ƒD ]0\}}|d k	r"|dkr"|jd||d | ¡  q"W | |¡ | ¡  d S )Niÿÿ  r¸  )rB  r   )rc  r§   rD  r  r¦   rd  )r^   r—   rm   r   rO   r”   rB  r·  r'   r'   r(   r˜     s    
zGlyphCIDMap.xmlWrite)N)rJ   rW   rX   rl   rŒ   r–   r˜   r'   r'   r'   r(   r½  ü  s   
	r½  c               @   s.   e Zd Zdd„ Zd
dd„Zdd„ Zdd	„ ZdS )Ú
DeltaValuec             C   sÂ   |d }|d }|d }|dks(t dƒ‚|| d }d|> }d|> }	d|> d }
d|d > }g }d\}}xTt|ƒD ]H}|dkrŒ| ¡ d	 }}|| }||? |
@ }||@ r°||	 }| |¡ qrW |S )
NÚ	StartSizeÚEndSizeÚDeltaFormat)r   rº   rÌ   zillegal DeltaFormatr   )r   r   r   ró   )r=   rd   rÀ   rL   )r^   rh   rm   r„   rÀ  rÁ  rÂ  ÚnItemsÚnBitsZminusOffsetÚmaskZsignMaskr¿  ÚtmpÚshiftr_   r   r'   r'   r(   rl   ,  s(    zDeltaValue.readNc             C   sº   |d }|d }|d }|}	|dks,t dƒ‚|| d }
d|> }t|	ƒ|
ksPt ‚d|> d }d\}}x>|	D ]6}|| }|||@ |> B }|dkrj| |¡ d\}}qjW |d	kr¶| |¡ d S )
NrÀ  rÁ  rÂ  )r   rº   rÌ   zillegal DeltaFormatr   )r   ró   r   ró   )r=   rf   rÂ   )r^   r   rm   r„   r   r“   rÀ  rÁ  rÂ  r¿  rÃ  rÄ  rÅ  rÆ  rÇ  r'   r'   r(   rŒ   C  s$    

zDeltaValue.writec             C   s"   |  ||d|fg ¡ | ¡  d S )Nr   )r¦   r§   )r^   r—   rm   r   rO   r”   r'   r'   r(   r˜   X  s    zDeltaValue.xmlWritec             C   s   t |d ƒS )Nr   )r   )r^   r”   r•   rm   r'   r'   r(   r–   \  s    zDeltaValue.xmlRead)N)rJ   rW   rX   rl   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ÚEntryFormatrz   r   rv  l   ÿÿ ró   é0   r­   )r   rº   rÌ   r­   c                s    g | ]}|ˆ@ ˆ> |ˆ @ B ‘qS r'   r'   )rb   Úraw)Ú	innerMaskÚ	outerMaskÚ
outerShiftr'   r(   rc   s  s   z'VarIdxMapValue.read.<locals>.<listcomp>)rÉ   rÁ   ZreadUInt24Arrayr´   )	r^   rh   rm   r„   ÚfmtrÃ  Ú	innerBitsÚ	entrySizer‡   r'   )rÌ  rÍ  rÎ  r(   rl   b  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É  rz   r   rv  ró   rÊ  r­   )r   rº   rÌ   r­   c                s    g | ]}|d @ ˆ? |ˆ @ B ‘qS )l     þ r'   )rb   Úidx)rÌ  rÎ  r'   r(   rc   ‡  s   z(VarIdxMapValue.write.<locals>.<listcomp>)ZsetValuerf   rÊ   rÃ   ZwriteUInt24Arrayr¶   )r^   r   rm   r„   r   r“   rÏ  r\  rÐ  rÑ  r’   r'   )rÌ  rÎ  r(   rŒ   v  s    zVarIdxMapValue.write)N)rJ   rW   rX   rl   rŒ   r'   r'   r'   r(   rÈ  `  s   rÈ  c               @   s.   e Zd Zdd„ Zd
dd„Zdd„ Zdd	„ ZdS )ÚVarDataValuec             C   s–   g }|d }|d }t |d@ ƒ}|d@ }|r<|j|j }}	n|j|j }}	t||ƒt||ƒ }
}| ||
ƒ¡ | |	||
 ƒ¡ ||kr’||d …= |S )Nry   Ú	NumShortsi €  iÿ  )Úboolr¯   r¼   rÅ   r¾  rš  r‚   )r^   rh   rm   r„   rH   ÚregionCountÚ	wordCountÚ	longWordsZreadBigArrayZreadSmallArrayÚn1Ún2r'   r'   r(   rl     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 )Nry   rÔ  i €  iÿ  )FTr   )rÕ  r¾   rÆ   r±   r¾  rš  ÚwriteSmallArray)r^   r   rm   r„   rH   r“   rÖ  r×  rØ  ZwriteBigArrayrÛ  rÙ  rÚ  r'   r'   r(   rŒ   ¤  s    

zVarDataValue.writec             C   s"   |  ||d|fg ¡ | ¡  d S )Nr   )r¦   r§   )r^   r—   rm   r   rO   r”   r'   r'   r(   r˜   ·  s    zVarDataValue.xmlWritec             C   s   t |d ƒS )Nr   )r   )r^   r”   r•   rm   r'   r'   r(   r–   »  s    zVarDataValue.xmlRead)N)rJ   rW   rX   rl   rŒ   r˜   r–   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¦   rL   rÐ   rß   r§   )r^   r—   rm   r   rO   r”   rà   r'   r'   r(   r˜   ¿  s"     
 
 
 
 
 zLookupFlag.xmlWriteN)rJ   rW   rX   r˜   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 )N)Ú	enumClassrø   rl   )r^   rh   rm   r„   )rú   r'   r(   rl   Ð  s    z_UInt8Enum.readc             C   s   t | j| ¡ ƒS )N)rè   rÞ  Úupper)rT   r   r'   r'   r(   r¥   Ò  s    z_UInt8Enum.fromStringc             C   s   |   |¡j ¡ S )N)rÞ  rO   Úlower)rT   r   r'   r'   r(   r¤   Õ  s    z_UInt8Enum.toString)
rJ   rW   rX   rq   rÞ  rl   rñ   r¥   r¤   rü   r'   r'   )rú   r(   rÝ  Í  s   rÝ  c               @   s   e Zd ZeZdS )r   N)rJ   rW   rX   Ú_ExtendModerÞ  r'   r'   r'   r(   r   Ú  s   r   c               @   s   e Zd ZeZdS )r   N)rJ   rW   rX   Ú_CompositeModerÞ  r'   r'   r'   r(   r   Þ  s   r   c             C   s   t t| dS )N)rF   )r"   r8  )ÚCr'   r'   r(   r)     r*   c             C   s   t t| dS )N)rF   )r"   re  )rã  r'   r'   r(   r)     r*   c             C   s   t t| dS )N)rF   )r"   r…  )rã  r'   r'   r(   r)     r*   c             C   s   t t| dS )N)rF   )r"   rI   )rã  r'   r'   r(   r)     r*   c             C   s   t t| dS )N)rF   )r"   r+  )rã  r'   r'   r(   r)     r*   c             C   s   t t| dS )N)rF   )r"   r,  )rã  r'   r'   r(   r)     r*   )+Zint8Zint16r0   r,   Zuint24r1   Zchar64r·   r¸   rþ   rÑ   rÒ   rØ   rÚ   rã   rò   rô   rö   rý   rƒ  ZOffsetZLOffsetZOffset24r6  r¿  rÈ  rÓ  rÜ  r   r   rÝ   r¶  r½  r8   r9   r:   r   r8  re  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   r7  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Ú	getLoggerrJ   rÛ   r~  rU   r%   rV   ÚcollectionsrZ   ÚImportErrorr[   Úobjectru   r£   r©   r«   r¬   r²   r·   r¸   r¹   r¿   rÄ   rÇ   rË   rÏ   r?   r@   rA   rÑ   rÒ   rØ   rÚ   rÝ   rá   rã   ræ   rò   rô   rö   rý   rþ   r  rD   rB   rI   r+  r,  r4   r2   r3   r5   r+   r6  r8  re  rn  r…  r¶  r½  r¿  rÈ  rÓ  rÜ  rÝ  rC   r'   r'   r'   r(   Ú<module>   sô    4
@[H" i;   @%.6+3