U
    Q»{jÚ! ã                /   @   sT  d dl mZmZmZmZm	Z
mZ d dlmZ d dlmZmZ d dlmZmZmZmZmZ d dlmZ d dlmZ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/Z0m1Z1 d d
l2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9Z9d dl:Z:d dl;m<Z< d dl=Z=e= >e?¡Z@dd„ ZAdd„ ZBG dd„ deCƒZDG dd„ deDƒZEG dd„ deEƒZFG dd„ deEƒZGG dd„ deGƒZHG dd„ deGƒZIG dd „ d eIƒZJG d!d"„ d"eFeIƒZKG d#d$„ d$eGƒZLG d%d&„ d&eGƒZMG d'd(„ d(eGƒZNG d)d*„ d*eGƒZOG d+d,„ d,eGƒZPG d-d.„ d.eGƒZQG d/d0„ d0eQeOƒZRG d1d2„ d2eQeMƒZSG d3d4„ d4eQeIƒZTG d5d6„ d6eEƒZUG d7d8„ d8eEƒZVG d9d:„ d:eVƒZWG d;d<„ d<eMƒZXG d=d>„ d>eMƒZYG d?d@„ d@eEƒZZG dAdB„ dBeZƒZ[G dCdD„ dDeZƒZ\G dEdF„ dFe\ƒZ]G dGdH„ dHe\ƒZ^G dIdJ„ dJe^ƒZ_G dKdL„ dLe_ƒZ`G dMdN„ dNeEƒZaG dOdP„ dPeEƒZbG dQdR„ dReDƒZcG dSdT„ dTecƒZdG dUdV„ dVecƒZeG dWdX„ dXeeƒZfG dYdZ„ dZeeƒZgG d[d\„ d\ecƒZhG d]d^„ d^eeƒZiG d_d`„ d`efeiƒZjG dadb„ dbeeƒZkG dcdd„ ddeGƒZlG dedf„ dfelƒZmG dgdh„ dheDƒZnG didj„ djeDƒZoG dkdl„ dleDƒZpG dmdn„ dneDƒZqG dodp„ dpeDƒZrG dqdr„ dreDƒZsG dsdt„ dteDƒZtG dudv„ dveDƒZuG dwdx„ dxeDƒZvG dydz„ dzƒZwG d{d|„ d|eDƒZxG d}d~„ d~eMƒZyG dd€„ d€eOƒZzG d�d‚„ d‚ezƒZ-G dƒd„„ d„ezƒZ/eNeLeHeOeMePeIebeJeKeaeUeVeWeXe[e]e^e_e`eceeefegemeteueveye-e/eYe6exewd…�e6exe%d†�eresedededepd‡d„ dˆd„ d‰d„ dŠd„ d‹d„ dŒd„ d�œ.Z{dS )Žé    )ÚfixedToFloatÚfloatToFixedÚfloatToFixedToStrÚstrToFixedToFloatÚensureVersionIsLongÚversionToFixed)ÚTupleVariation)ÚnearestMultipleShortestReprÚotRound)Ú	bytesjoinÚtobytesÚtostrÚpadÚsafeEval)ÚLazyList)ÚOPTIMIZE_FONT_SPEEDÚgetSearchRangeé   )ÚCountReferenceÚFormatSwitchingBaseTableÚOTTableReaderÚOTTableWriterÚValueRecordFactory)ÚlookupTypesÚVarCompositeGlyphÚAATStateTableÚAATStateÚ	AATActionÚContextualMorphActionÚLigatureMorphActionÚInsertionMorphActionÚMorxSubtableÚ
ExtendModeÚCompositeModeÚNO_VARIATION_INDEX)Úzip_longestÚ
accumulate)Úpartial)ÚSimpleNamespaceN)ÚOptionalc                 C   s
   t | tƒS ©N)Ú
isinstanceÚtuple)Út© r.   úb/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fontTools/ttLib/tables/otConverters.pyÚ<lambda>-   ó    r0   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)Úuint8r3   Úuint32ÚSubTableÚExtSubTableÚ	SubStructÚFeatureParams)ZCIDGlyphMappingZGlyphCIDMappingú(©Údescription)Ú	MortChainÚMortSubtableÚ	MorxChain)r9   r:   r;   r   ÚfeatureParamTypes)Ú
startswithÚAssertionErrorr2   ÚendswithÚComputedUInt8ÚComputedUShortÚComputedULongr9   r:   r;   r<   ÚStructWithLengthÚconverterMappingÚStructÚevalÚ
tableClassÚgetr   ÚvaluesÚTableÚ__name__rC   ÚdefaultFeatureParamsÚappend)Z	tableSpecZtableNamespaceÚ
convertersZconvertersByNameÚtpÚnameÚrepeatÚauxÚdescrZ	tableNameZconverterClassÚconvrN   r-   Úclsr.   r.   r/   ÚbuildConverters0   sd    
ýü







r]   c                   @   sv   e Zd ZdZdddœdd„Zdd„ Zd	d
„ Zdd„ Zdd„ Zddd„Z	dd„ Z
dd„ Ze d¡Zee dœdd„ZdS )ÚBaseConverterz\Base class for converter objects. Apart from the constructor, this
    is an abstract class.NÚ r>   c                C   sp   || _ || _|| _| jr.| js.t| jddƒ| _|| _| d¡pD|dk| _| d¡pX|dk| _|dk| _|| _	d S )Nz<string>rM   r4   )ÚDesignAxisRecordSizeÚValueRecordSizeZ
LookupTyper6   )Z
ClassCountZClass2CountZ
FeatureTagZSettingsCountÚVarRegionCountÚMappingCountZRegionAxisCountZDesignAxisCountr`   ZAxisValueCountra   Z	AxisCountZBaseGlyphRecordCountZLayerRecordCountZAxisIndicesList)
rW   rX   rY   ÚcompilerN   rF   ZisCountZisLookupTypeÚisPropagatedr?   ©ÚselfrW   rX   rY   rN   r?   r.   r.   r/   Ú__init__t   s    
zBaseConverter.__init__c           	         sž   ˆ j o|dk}|r(ˆ ˆ¡‰ˆtkr(d}|sVg }t|ƒD ]}| ˆ ˆˆ |¡¡ q8|S ‡ ‡‡‡fdd„}|ƒ ‰t‡fdd„t|ƒD ƒƒ}ˆ |ˆ ¡ |S dS )z(Read an array of values from the reader.é   Fc                     s&   ˆ  ¡ ‰ˆj‰ ‡‡ ‡‡‡fdd„} | S )Nc                    s    ˆ  ˆ| ˆ  ¡ ˆ ˆˆ i ¡S r*   )ÚseekÚread)Úi)ÚfontÚposÚreader_copyÚ
recordSizerg   r.   r/   Ú	read_item¥   s    zABaseConverter.readArray.<locals>.get_read_item.<locals>.read_item©Úcopyrn   ©rq   )rm   Úreaderrp   rg   )rn   ro   r/   Úget_read_item¡   s    z.BaseConverter.readArray.<locals>.get_read_itemc                 3   s   | ]
}ˆ V  qd S r*   r.   )Ú.0rl   rt   r.   r/   Ú	<genexpr>¬   s     z*BaseConverter.readArray.<locals>.<genexpr>N)ÚlazyÚgetRecordSizeÚNotImplementedÚrangerT   rk   r   Úadvance)	rg   ru   rm   Ú	tableDictÚcountry   Úlrl   rv   r.   )rm   rq   ru   rp   rg   r/   Ú	readArray“   s    

zBaseConverter.readArrayc                 C   s   t | dƒr| jS tS )NÚ
staticSize)Úhasattrr‚   r{   ©rg   ru   r.   r.   r/   rz   ±   s    
zBaseConverter.getRecordSizec                 C   s   t | ƒ‚dS )zRead a value from the reader.N©ÚNotImplementedError©rg   ru   rm   r~   r.   r.   r/   rk   ¶   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)rg   Úwriterrm   r~   rP   rl   ÚvalueÚer.   r.   r/   Ú
writeArrayº   s    zBaseConverter.writeArrayc                 C   s   t | ƒ‚dS )zWrite a value to the writer.Nr…   ©rg   rŒ   rm   r~   r�   ÚrepeatIndexr.   r.   r/   r‰   Â   s    zBaseConverter.writec                 C   s   t | ƒ‚dS )zRead a value from XML.Nr…   ©rg   ÚattrsÚcontentrm   r.   r.   r/   ÚxmlReadÆ   s    zBaseConverter.xmlReadc                 C   s   t | ƒ‚dS )zWrite a value to XML.Nr…   ©rg   Ú	xmlWriterrm   r�   rW   r“   r.   r.   r/   ÚxmlWriteÊ   s    zBaseConverter.xmlWritezVarIndexBase\s*\+\s*(\d+))Úreturnc                 C   s$   | j  | j¡}|sdS t| d¡ƒS )zJIf description has `VarIndexBase + {offset}`, return the offset else None.Nr   )ÚvarIndexBasePlusOffsetREÚsearchr?   ÚintÚgroup)rg   Úmr.   r.   r/   ÚgetVarIndexOffsetÐ   s    zBaseConverter.getVarIndexOffset)N)N)rR   Ú
__module__Ú__qualname__Ú__doc__rh   r�   rz   rk   r�   r‰   r•   r˜   Úrerd   rš   r)   rœ   rŸ   r.   r.   r.   r/   r^   p   s   

r^   c                   @   s4   e Zd Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zd	S )
ÚSimpleValuec                 C   s   | S r*   r.   ©r�   r.   r.   r/   ÚtoStringÙ   s    zSimpleValue.toStringc                 C   s   | S r*   r.   r¥   r.   r.   r/   Ú
fromStringÝ   s    zSimpleValue.fromStringc                 C   s(   |  ||d|  |¡fg ¡ | ¡  d S ©Nr�   )Ú	simpletagr¦   Únewliner–   r.   r.   r/   r˜   á   s    zSimpleValue.xmlWritec                 C   s   |   |d ¡S r¨   )r§   r’   r.   r.   r/   r•   å   s    zSimpleValue.xmlReadN)rR   r    r¡   Ústaticmethodr¦   r§   r˜   r•   r.   r.   r.   r/   r¤   Ø   s   

r¤   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚOptionalValueNc                 C   s6   || j kr| d|  |¡f¡ | ||¡ | ¡  d S r¨   )ÚDEFAULTrT   r¦   r©   rª   r–   r.   r.   r/   r˜   ì   s    
zOptionalValue.xmlWritec                 C   s   d|kr|   |d ¡S | jS r¨   )r§   r­   r’   r.   r.   r/   r•   ò   s    zOptionalValue.xmlRead)rR   r    r¡   r­   r˜   r•   r.   r.   r.   r/   r¬   é   s   r¬   c                   @   s   e Zd Zedd„ ƒZdS )ÚIntValuec                 C   s
   t | dƒS ©Nr   )rœ   r¥   r.   r.   r/   r§   ù   s    zIntValue.fromStringN©rR   r    r¡   r«   r§   r.   r.   r.   r/   r®   ø   s   r®   c                   @   s2   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ ZdS )ÚLongé   c                 C   s   |  ¡ S r*   ©ÚreadLongr‡   r.   r.   r/   rk     s    z	Long.readc                 C   s
   |  |¡S r*   )ÚreadLongArray©rg   ru   rm   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©rg   rŒ   rm   r~   rP   r.   r.   r/   r�   
  s    zLong.writeArray)N©rR   r    r¡   r‚   rk   r�   r‰   r�   r.   r.   r.   r/   r±   þ   s
   
r±   c                   @   s2   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ ZdS )ÚULongr²   c                 C   s   |  ¡ S r*   ©Ú	readULongr‡   r.   r.   r/   rk     s    z
ULong.readc                 C   s
   |  |¡S r*   )ÚreadULongArrayr¶   r.   r.   r/   r�     s    zULong.readArrayNc                 C   s   |  |¡ d S r*   ©Ú
writeULongr�   r.   r.   r/   r‰     s    zULong.writec                 C   s   |  |¡ d S r*   )ÚwriteULongArrayr¹   r.   r.   r/   r�     s    zULong.writeArray)Nrº   r.   r.   r.   r/   r»     s
   
r»   c                   @   s   e Zd Zedd„ ƒZdS )ÚFlags32c                 C   s   d|  S )Nz0x%08Xr.   r¥   r.   r.   r/   r¦     s    zFlags32.toStringN)rR   r    r¡   r«   r¦   r.   r.   r.   r/   rÂ     s   rÂ   c                   @   s   e Zd ZeZdS )ÚVarIndexN)rR   r    r¡   r$   r­   r.   r.   r.   r/   rÃ   $  s   rÃ   c                   @   s2   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ ZdS )ÚShorté   c                 C   s   |  ¡ S r*   )Ú	readShortr‡   r.   r.   r/   rk   +  s    z
Short.readc                 C   s
   |  |¡S r*   )ÚreadShortArrayr¶   r.   r.   r/   r�   .  s    zShort.readArrayNc                 C   s   |  |¡ d S r*   )Ú
writeShortr�   r.   r.   r/   r‰   1  s    zShort.writec                 C   s   |  |¡ d S r*   )ÚwriteShortArrayr¹   r.   r.   r/   r�   4  s    zShort.writeArray)Nrº   r.   r.   r.   r/   rÄ   (  s
   
rÄ   c                   @   s2   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ ZdS )ÚUShortrÅ   c                 C   s   |  ¡ S r*   ©Ú
readUShortr‡   r.   r.   r/   rk   ;  s    zUShort.readc                 C   s
   |  |¡S r*   )ÚreadUShortArrayr¶   r.   r.   r/   r�   >  s    zUShort.readArrayNc                 C   s   |  |¡ d S r*   ©ÚwriteUShortr�   r.   r.   r/   r‰   A  s    zUShort.writec                 C   s   |  |¡ d S r*   )ÚwriteUShortArrayr¹   r.   r.   r/   r�   D  s    zUShort.writeArray)Nrº   r.   r.   r.   r/   rÊ   8  s
   
rÊ   c                   @   s2   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ ZdS )ÚInt8r   c                 C   s   |  ¡ S r*   )ZreadInt8r‡   r.   r.   r/   rk   K  s    z	Int8.readc                 C   s
   |  |¡S r*   )ÚreadInt8Arrayr¶   r.   r.   r/   r�   N  s    zInt8.readArrayNc                 C   s   |  |¡ d S r*   )Z	writeInt8r�   r.   r.   r/   r‰   Q  s    z
Int8.writec                 C   s   |  |¡ d S r*   )ÚwriteInt8Arrayr¹   r.   r.   r/   r�   T  s    zInt8.writeArray)Nrº   r.   r.   r.   r/   rÑ   H  s
   
rÑ   c                   @   s2   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ ZdS )ÚUInt8r   c                 C   s   |  ¡ S r*   )Ú	readUInt8r‡   r.   r.   r/   rk   [  s    z
UInt8.readc                 C   s
   |  |¡S r*   )ÚreadUInt8Arrayr¶   r.   r.   r/   r�   ^  s    zUInt8.readArrayNc                 C   s   |  |¡ d S r*   )Ú
writeUInt8r�   r.   r.   r/   r‰   a  s    zUInt8.writec                 C   s   |  |¡ d S r*   )ÚwriteUInt8Arrayr¹   r.   r.   r/   r�   d  s    zUInt8.writeArray)Nrº   r.   r.   r.   r/   rÔ   X  s
   
rÔ   c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )ÚUInt24é   c                 C   s   |  ¡ S r*   ©Z
readUInt24r‡   r.   r.   r/   rk   k  s    zUInt24.readNc                 C   s   |  |¡ d S r*   ©ZwriteUInt24r�   r.   r.   r/   r‰   n  s    zUInt24.write)N©rR   r    r¡   r‚   rk   r‰   r.   r.   r.   r/   rÙ   h  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  s    zComputedInt.xmlWriteN©rR   r    r¡   r˜   r.   r.   r.   r/   rÞ   r  s   rÞ   c                   @   s   e Zd ZdS )rG   N©rR   r    r¡   r.   r.   r.   r/   rG   y  s   rG   c                   @   s   e Zd ZdS )rH   Nrá   r.   r.   r.   r/   rH   }  s   rH   c                   @   s   e Zd ZdS )rI   Nrá   r.   r.   r.   r/   rI   �  s   rI   c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )ÚTagr²   c                 C   s   |  ¡ S r*   )ZreadTagr‡   r.   r.   r/   rk   ˆ  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/   rk   ˜  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)	rR   r    r¡   r‚   ræ   r�   rk   r�   r‰   r.   r.   r.   r/   rã   �  s   rã   c                   @   s   e Zd ZdZdZdS )Ú	GlyphID32r²   ÚLN)rR   r    r¡   r‚   ræ   r.   r.   r.   r/   ré   ¢  s   ré   c                   @   s   e Zd Zdd„ ZdS )ÚNameIDc                 C   st   |  ||d|fg ¡ |rh|rh| d¡}|rh| |¡}| d¡ |rP| |¡ n| d¡ t d| ¡ | ¡  d S )Nr�   rW   ú  zmissing from name tablez"name id %d missing from name table)r©   rO   ZgetDebugNamer‰   rß   ÚlogÚwarningrª   )rg   r—   rm   r�   rW   r“   Z	nameTabler.   r.   r/   r˜   ¨  s    



zNameID.xmlWriteNrà   r.   r.   r.   r/   rë   §  s   rë   c                   @   s   e Zd Zdd„ ZdS )Ú	STATFlagsc                 C   sh   |  ||d|fg ¡ g }|d@ r,| d¡ |d@ r>| d¡ |r\| d¡ | d |¡¡ | ¡  d S )Nr�   r   ZOlderSiblingFontAttributerÅ   ZElidableAxisValueNamerì   ú )r©   rT   r‰   rß   Újoinrª   ©rg   r—   rm   r�   rW   r“   Úflagsr.   r.   r/   r˜   ¸  s    


zSTATFlags.xmlWriteNrà   r.   r.   r.   r/   rï   ·  s   rï   c                   @   s   e Zd Zedd„ ƒZdS )Ú
FloatValuec                 C   s   t | ƒS r*   )Úfloatr¥   r.   r.   r/   r§   Æ  s    zFloatValue.fromStringNr°   r.   r.   r.   r/   rô   Å  s   rô   c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )Ú
DeciPointsrÅ   c                 C   s   |  ¡ d S ©Né
   rË   r‡   r.   r.   r/   rk   Î  s    zDeciPoints.readNc                 C   s   |  t|d ƒ¡ d S r÷   )rÏ   Úroundr�   r.   r.   r/   r‰   Ñ  s    zDeciPoints.write)NrÝ   r.   r.   r.   r/   rö   Ë  s   rö   c                   @   s^   e Zd Z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/   rk   Û  s    zBaseFixedValue.readNc                 C   s   t || jƒ|  |¡ƒ d S r*   )rü   ÚwriterMethodÚtoIntr�   r.   r.   r/   r‰   Þ  s    zBaseFixedValue.writec                 C   s   t || jƒS r*   )Úfi2flÚprecisionBits©r\   r�   r.   r.   r/   rû   á  s    zBaseFixedValue.fromIntc                 C   s   t || jƒS r*   )Úfl2fir  r  r.   r.   r/   rÿ   å  s    zBaseFixedValue.toIntc                 C   s   t || jƒS r*   )Ústr2flr  r  r.   r.   r/   r§   é  s    zBaseFixedValue.fromStringc                 C   s   t || jƒS r*   )Úfl2strr  r  r.   r.   r/   r¦   í  s    zBaseFixedValue.toString)N)rR   r    r¡   r{   r‚   r  rý   rþ   rk   r‰   Úclassmethodrû   rÿ   r§   r¦   r.   r.   r.   r/   rú   Õ  s   



rú   c                   @   s   e Zd ZdZdZdZdZdS )ÚFixedr²   é   r´   r·   N©rR   r    r¡   r‚   r  rý   rþ   r.   r.   r.   r/   r  ò  s   r  c                   @   s   e Zd ZdZdZdZdZdS )ÚF2Dot14rÅ   é   rÆ   rÈ   Nr	  r.   r.   r.   r/   r
  ù  s   r
  c                       sP   e Zd ZdZdZe‡ fdd„ƒZe‡ fdd„ƒZedd„ ƒZed	d
„ ƒZ	‡  Z
S )ÚAngleg        g     €†?c                    s   t ƒ  |¡| j d S ©Né´   )Úsuperrû   Úbiasr  ©Ú	__class__r.   r/   rû     s    zAngle.fromIntc                    s   t ƒ  |d | j ¡S r  )r  rÿ   r  r  r  r.   r/   rÿ   
  s    zAngle.toIntc                 C   s   t t|ƒ| j ƒ| j S r*   )r
   rõ   Úfactorr  r.   r.   r/   r§     s    zAngle.fromStringc                 C   s   t || jƒS r*   )r	   r  r  r.   r.   r/   r¦     s    zAngle.toString)rR   r    r¡   r  r  r  rû   rÿ   r§   r¦   Ú__classcell__r.   r.   r  r/   r     s   
r  c                   @   s   e Zd ZdZdS )ÚBiasedAngleg      ð?N)rR   r    r¡   r  r.   r.   r.   r/   r    s   r  c                   @   sF   e Zd ZdZdd„ Zddd„Zedd„ ƒZed	d
„ ƒZedd„ ƒZ	dS )ÚVersionr²   c                 C   s   |  ¡ }|S r*   r³   )rg   ru   rm   r~   r�   r.   r.   r/   rk   !  s    zVersion.readNc                 C   s   t |ƒ}| |¡ d S r*   )Úfi2ver·   r�   r.   r.   r/   r‰   %  s    zVersion.writec                 C   s   t | ƒS r*   )Úve2fir¥   r.   r.   r/   r§   )  s    zVersion.fromStringc                 C   s   d|  S )Nú0x%08xr.   r¥   r.   r.   r/   r¦   -  s    zVersion.toStringc                 C   s
   t | dƒS )Nr  )r  )Úvr.   r.   r/   Ú	fromFloat1  s    zVersion.fromFloat)N)
rR   r    r¡   r‚   rk   r‰   r«   r§   r¦   r  r.   r.   r.   r/   r    s   


r  c                   @   s&   e Zd ZdZdZdd„ Zddd„ZdS )	Ú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")ÚreadDatar‚   Úfindr   rí   rî   )rg   ru   rm   r~   ÚdataZzeroPosÚsr.   r.   r/   rk   ?  s    
zChar64.readNc                 C   sv   t |ddd�}|t |ddd�kr.t d| ¡ t|ƒ| jkrPt d|| jf ¡ |d| j  d | j… }| |¡ d S )Nr  r   r!  r$  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr  )r   rí   rî   Úlenr‚   Ú	writeData)rg   rŒ   rm   r~   r�   r‘   r'  r.   r.   r/   r‰   I  s    ÿzChar64.write)N)rR   r    r¡   r¢   r‚   rk   r‰   r.   r.   r.   r/   r  6  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 )rL   c                 C   s   | j o| j  |¡S r*   )rN   rz   r„   r.   r.   r/   rz   V  s    zStruct.getRecordSizec                 C   s   |   ¡ }| ||¡ |S r*   )rN   Ú	decompile)rg   ru   rm   r~   Útabler.   r.   r/   rk   Y  s    zStruct.readNc                 C   s   |  ||¡ d S r*   ©rd   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   )rW   )r©   rª   ÚtoXMLr–   r.   r.   r/   r˜   a  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 )Nr.  ÚFormatZpostReadFTÚ_propagator)Ú
propagator)r   rN   rO   rœ   r0  rƒ   ÚgetConvertersre   r1  rW   rE   Úsetattrr   Ú__dict__r+   r,   ÚfromXMLZpopulateDefaultsrü   )rg   r“   r”   rm   r,  r0  Z
noPostReadZcleanPropagationr[   r2  ÚelementrW   r.   r.   r/   r•   n  sB    




zStruct.xmlReadc                 C   s   dt | jƒ S )Nz
Struct of )ÚreprrN   )rg   r.   r.   r/   Ú__repr__˜  s    zStruct.__repr__)N)	rR   r    r¡   rz   rk   r‰   r˜   r•   r9  r.   r.   r.   r/   rL   U  s   
*rL   c                   @   s   e Zd Zdd„ Zddd„ZdS )rJ   c                 C   s.   |j }|  ¡ }| ||¡ | ||j ¡ |S r*   )rn   rN   r+  rj   r5   )rg   ru   rm   r~   rn   r,  r.   r.   r/   rk   �  s
    zStructWithLength.readNc                 C   sÂ   t | ¡ ƒD ]\}}|jdkr q$qt|jƒ| }t|tƒrD|d7 }ddddœ|j }	| ¡ }
|	|_	| 
||¡ | ¡ |
 }| ¡ }| ||||¡ |j| dd |j… ks°t‚| ¡ |j|< d S )Nr5   r   éÞ   i­Þ  ì   ï>[= )r   rÅ   r²   ó   Þ­¾ï)rˆ   r3  rW   r)  Úitemsr+   r   r‚   ÚgetDataLengthr5   rd   ÚgetSubWriterr‰   rE   Ú
getAllData)rg   rŒ   rm   r~   r�   r‘   Z	convIndexr[   ÚlengthIndexZdeadbeefÚbeforeÚlengthZlengthWriterr.   r.   r/   r‰   ¤  s    

zStructWithLength.write)N©rR   r    r¡   rk   r‰   r.   r.   r.   r/   rJ   œ  s   rJ   c                   @   s2   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	d
„ZdS )rQ   rÅ   c                 C   s   |  ¡ S r*   rË   r„   r.   r.   r/   Ú
readOffsetº  s    zTable.readOffsetc                 C   s   |  d¡ d S r¯   rÎ   ©rg   rŒ   r.   r.   r/   ÚwriteNullOffset½  s    zTable.writeNullOffsetc                 C   sL   |   |¡}|dkrd S |  ¡ }| |¡}|jr<||_||_n| ||¡ |S r¯   )rE  rN   ÚgetSubReaderry   ru   rm   r+  )rg   ru   rm   r~   Úoffsetr,  r.   r.   r/   rk   À  s    

z
Table.readNc                 C   sR   |d kr|   |¡ n:| ¡ }| j|_|d k	r2||_|j|| jd� | ||¡ d S )N©Z
offsetSize)rG  r?  rW   r‘   ÚwriteSubTabler‚   rd   )rg   rŒ   rm   r~   r�   r‘   Ú	subWriterr.   r.   r/   r‰   Í  s    zTable.write)N)rR   r    r¡   r‚   rE  rG  rk   r‰   r.   r.   r.   r/   rQ   ·  s
   rQ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚLTabler²   c                 C   s   |  ¡ S r*   r¼   r„   r.   r.   r/   rE  Ü  s    zLTable.readOffsetc                 C   s   |  d¡ d S r¯   r¿   rF  r.   r.   r/   rG  ß  s    zLTable.writeNullOffsetN©rR   r    r¡   r‚   rE  rG  r.   r.   r.   r/   rM  Ù  s   rM  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/   rE  ç  s    zTable24.readOffsetc                 C   s   |  d¡ d S r¯   rÜ   rF  r.   r.   r/   rG  ê  s    zTable24.writeNullOffsetNrN  r.   r.   r.   r/   rO  ä  s   rO  c                       s$   e Zd Zdd„ Z‡ fdd„Z‡  ZS )r;   c                 C   s$   | j | | }|  | j| j| j|¡S r*   ©r   r  rW   rX   rY   ©rg   Z	tableTypeZ
lookupTyperN   r.   r.   r/   ÚgetConverterò  s    zSubStruct.getConverterc                    s   t t| ƒ |||d |¡ d S r*   )r  r;   r˜   r–   r  r.   r/   r˜   ö  s    zSubStruct.xmlWrite©rR   r    r¡   rR  r˜   r  r.   r.   r  r/   r;   ñ  s   r;   c                       s$   e Zd Zdd„ Z‡ fdd„Z‡  ZS )r9   c                 C   s$   | j | | }|  | j| j| j|¡S r*   rP  rQ  r.   r.   r/   rR  û  s    zSubTable.getConverterc                    s   t t| ƒ |||d |¡ d S r*   )r  r9   r˜   r–   r  r.   r/   r˜   ÿ  s    zSubTable.xmlWriterS  r.   r.   r  r/   r9   ú  s   r9   c                   @   s   e Zd Zddd„ZdS )r:   Nc                 C   s   d|_ t | |||||¡ d S )NT)Ú	ExtensionrQ   r‰   r�   r.   r.   r/   r‰     s    zExtSubTable.write)N)rR   r    r¡   r‰   r.   r.   r.   r/   r:     s   r:   c                   @   s   e Zd Zdd„ ZdS )r<   c                 C   s&   | j  || j¡}|  | j| j| j|¡S r*   )rC   rO   rS   r  rW   rX   rY   )rg   Z
featureTagrN   r.   r.   r/   rR  
  s    zFeatureParams.getConverterN)rR   r    r¡   rR  r.   r.   r.   r/   r<   	  s   r<   c                   @   s2   e Zd ZdZdddœdd„Zdd„ Zdd	d
„ZdS )r2   rÅ   Nr_   r>   c                C   s4   t j| |||||d� d|d dkr(dnd | _d S )Nr>   r2   éÿÿÿÿÚ2Ú1)r^   rh   Úwhichrf   r.   r.   r/   rh     s         ÿzValueFormat.__init__c                 C   s   |  ¡ }t|ƒ|| j< |S r*   )rÌ   r   rX  ©rg   ru   rm   r~   Úformatr.   r.   r/   rk     s    zValueFormat.readc                 C   s   |  |¡ t|ƒ|| j< d S r*   )rÏ   r   rX  )rg   rŒ   rm   r~   rZ  r‘   r.   r.   r/   r‰     s    
zValueFormat.write)N)N)rR   r    r¡   r‚   rh   rk   r‰   r.   r.   r.   r/   r2     s   r2   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Å   )r)  rX  r„   r.   r.   r/   rz   #  s    zValueRecord.getRecordSizec                 C   s   || j   ||¡S r*   )rX  ZreadValueRecordr‡   r.   r.   r/   rk   &  s    zValueRecord.readNc                 C   s   || j   |||¡ d S r*   )rX  ZwriteValueRecordr�   r.   r.   r/   r‰   )  s    zValueRecord.writec                 C   s    |d kr
n|  ||| j|¡ d S r*   )r/  rW   r–   r.   r.   r/   r˜   ,  s    zValueRecord.xmlWritec                 C   s&   ddl m} |ƒ }| d |||¡ |S )Nr   )r[  )ÚotBaser[  r6  )rg   r“   r”   rm   r[  r�   r.   r.   r/   r•   2  s    zValueRecord.xmlRead)N)rR   r    r¡   rz   rk   r‰   r˜   r•   r.   r.   r.   r/   r[  "  s
   
r[  c                   @   s´   e Zd ZdZddœdd„Zdd„ Zd+d	d
„Zedd„ ƒZdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ ZdS ),Ú	AATLookuprø   r_   r>   c                C   sN   t j| |||||d� t| jtƒr6| jdd d d�| _ntdd d | jd�| _d S )Nr>   ÚValue)rW   rX   rY   )rW   rX   rY   rN   )r^   rh   Ú
issubclassrN   r¤   Ú	converterrQ   rf   r.   r.   r/   rh   =  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²   é   ri   Fzunsupported lookup format: %d)rÌ   ÚreadFormat0ÚreadFormat2ÚreadFormat4ÚreadFormat6ÚreadFormat8rE   rY  r.   r.   r/   rk   H  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è   )rw   ÚglyphÚval©rm   r.   r/   Ú
<listcomp>Y  s     z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)
ÚlistÚsortedr=  ÚfilterÚbuildFormat0ÚbuildFormat2ÚbuildFormat6ÚbuildFormat8r>  rE   )rg   rŒ   rm   r~   r�   r‘   rP   ÚformatsZdataSizeZlookupFormatZwriteMethodrn   Z
actualSizer.   rk  r/   r‰   W  s6    ÿüþÿÿÿýþzAATLookup.writec                 C   sH   |   |¡ |   |¡ t||d�\}}}|   |¡ |   |¡ |   |¡ d S )N)ÚnZitemSize)rÏ   r   )rŒ   ÚnumUnitsÚunitSizeZsearchRangeZentrySelectorZ
rangeShiftr.   r.   r/   ÚwriteBinSearchHeaderw  s    

 ÿ

zAATLookup.writeBinSearchHeaderc                    sD   t ˆ  ¡ ƒ}t ˆƒ|krd S ˆjj}d||  d‡ ‡‡‡fdd„fS )NrÅ   r   c                      s   ˆ  ˆˆ ˆ¡S r*   )ÚwriteFormat0r.   ©rm   rg   rP   rŒ   r.   r/   r0   Š  r1   z(AATLookup.buildFormat0.<locals>.<lambda>)r)  ÚgetGlyphOrderra  r‚   )rg   rŒ   rm   rP   Ú	numGlyphsÚ	valueSizer.   rz  r/   rp  ‚  s    
ýzAATLookup.buildFormat0c                 C   s2   |  d¡ |D ]\}}| jj||d |d d� qd S )Nr   ©r~   r�   r‘   )rÏ   ra  r‰   )rg   rŒ   rm   rP   ZglyphID_r�   r.   r.   r/   ry  �  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.   ©rm   Úsegmentsrg   rŒ   r.   r/   r0   ¥  r1   z(AATLookup.buildFormat2.<locals>.<lambda>)rT   ra  r‚   r)  ÚBIN_SEARCH_HEADER_SIZE)rg   rŒ   rm   rP   ZsegStartZsegValueZsegEndÚglyphIDZcurValuer}  rv  rw  r.   r€  r/   rq  ”  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Ï   ra  r‚   r)  rx  r‰   r*  )
rg   rŒ   rm   r�  r}  rv  rw  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   rb  c                      s   ˆ  ˆˆ ˆ¡S r*   )ÚwriteFormat6r.   rz  r.   r/   r0   ½  r1   z(AATLookup.buildFormat6.<locals>.<lambda>)ra  r‚   r)  r‚  )rg   rŒ   rm   rP   r}  rv  rw  r.   rz  r/   rr  ·  s    ýzAATLookup.buildFormat6c           	      C   s|   |  d¡ | jj}t|ƒ|d  }}|  |||¡ |D ](\}}|  |¡ | jj||d |d d� q6|  d¡ | d| ¡ d S )Nrb  rÅ   r~  r„  r  r…  )	rg   rŒ   rm   rP   r}  rv  rw  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   rU  r   rb  ri   c                      s   ˆ  ˆˆ ˆ¡S r*   )ÚwriteFormat8r.   rz  r.   r/   r0   Õ  r1   z(AATLookup.buildFormat8.<locals>.<lambda>)r)  ra  r‚   )rg   rŒ   rm   rP   Z
minGlyphIDZ
maxGlyphIDr}  r.   rz  r/   rs  Í  s    ýzAATLookup.buildFormat8c                 C   sV   |d d }|  d¡ |  |¡ |  t|ƒ¡ |D ]\}}| jj||d |d d� q2d S )Nr   ri   r~  )rÏ   r)  ra  r‰   )rg   rŒ   rm   rP   ZfirstGlyphIDÚ_r�   r.   r.   r/   r‡  Ø  s    

    ÿzAATLookup.writeFormat8c                    s6   t ˆ  ¡ ƒ}| jj|ˆ d |d�}‡ fdd„t|ƒD ƒS )N©r~   r   c                    s   i | ]\}}ˆ   |¡|“qS r.   ©rç   ©rw   Úkr�   rk  r.   r/   Ú
<dictcomp>å  s      z)AATLookup.readFormat0.<locals>.<dictcomp>)r)  r{  ra  r�   rˆ   )rg   ru   rm   r|  r'  r.   rk  r/   rc  â  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Ì   ra  r‚   rE   r|   rj   rk   rç   )rg   ru   rm   Úmappingrn   rw  rv  rl   ÚlastÚfirstr�   rŒ  r.   r.   r/   rd  ç  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Å   rb  rŽ  r„  r   r   r‰  )
rn   rÌ   rE   r|   rj   rH  ra  r�   rˆ   rç   )rg   ru   rm   r‘  rn   rw  rl   r’  r“  rI  Ú
dataReaderr'  rŒ  r  r.   r.   r/   re  ö  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�  )	rg   ru   rm   r‘  rn   rw  rl   rƒ  r�   r.   r.   r/   rf  
  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“  rm   r.   r/   r�    s      z)AATLookup.readFormat8.<locals>.<dictcomp>)rÌ   ra  r�   rˆ   )rg   ru   rm   r   r'  r.   r•  r/   rg    s    zAATLookup.readFormat8c           	      C   sF   i }|D ]8}t |tƒr|\}}}|dkr| j |||¡||d < q|S )NÚLookupri  )r+   r,   ra  r•   )	rg   r“   r”   rm   r�   r7  rW   ÚaÚ
eltContentr.   r.   r/   r•     s    

zAATLookup.xmlReadc                 C   s\   |  ||¡ | ¡  t| ¡ ƒD ]$\}}| jj|||dd|fgd� q | |¡ | ¡  d S )Nr–  ri  )r�   rW   r“   )Úbegintagrª   rn  r=  ra  r˜   Úendtag)rg   r—   rm   r�   rW   r“   ri  r.   r.   r/   r˜   &  s        ÿ
zAATLookup.xmlWrite)N)rR   r    r¡   r‚  rh   rk   r‰   r«   rx  rp  ry  rq  r  rr  r†  rs  r‡  rc  rd  re  rf  rg  r•   r˜   r.   r.   r.   r/   r^  :  s*   
 

	
	r^  c                   @   s.   e Zd Zdd„ Zd
dd„Zdd„ Zdd	„ ZdS )ÚAATLookupWithDataOffsetc                 C   sz   |  ¡ }|  ¡ }| |¡}tdd d tƒ}| |||¡}i }	| ¡ D ]2\}
}| || ¡}|  ¡ }| ||¡ ||	|
< qB|	S ©NÚDataOffsets)r½   rH  r^  rÊ   rk   r=  rN   r+  )rg   ru   rm   r~   ZlookupOffsetZ
dataOffsetÚlookupReaderÚlookupÚoffsetsÚresultri  rI  r”  Úitemr.   r.   r/   rk   9  s    

zAATLookupWithDataOffset.readNc                 C   sè   i i d  }}}g }	t ||jd�D ]`}
tƒ }||
  ||¡ | ¡ }| |d ¡}|d krz|}|t|ƒ }|||< |	 |¡ |||
< q"| ¡ }t	dd d t
ƒ}| ||||d ¡ | ¡ }|j|dd� |j|dd� |	D ]}| |¡ qÔd S )Nr   )Úkeyr�  r²   rJ  )rn  rè   r   rd   r@  rO   r)  rT   r?  r^  rÊ   r‰   rK  r*  )rg   rŒ   rm   r~   r�   r‘   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDatari  rL  r'  rI  ÚlookupWriterrŸ  Z
dataWriterÚdr.   r.   r/   r‰   G  s*    


zAATLookupWithDataOffset.writec                 C   s   t dd d | jƒ}| |||¡S rœ  )r^  rN   r•   )rg   r“   r”   rm   rŸ  r.   r.   r/   r•   j  s    zAATLookupWithDataOffset.xmlReadc                 C   s&   t dd d | jƒ}| |||||¡ d S rœ  )r^  rN   r˜   )rg   r—   rm   r�   rW   r“   rŸ  r.   r.   r/   r˜   n  s    z AATLookupWithDataOffset.xmlWrite)N©rR   r    r¡   rk   r‰   r•   r˜   r.   r.   r.   r/   r›  8  s   
#r›  c                   @   sf   e Zd ZdddddœZdd„ e ¡ D ƒZdd	d
œdd„Zdd„ Zdd„ Zdd„ Z	dd„ Z
ddd„ZdS )ÚMorxSubtableConverterZLayoutOrderZReversedLayoutOrderZLogicalOrderZReversedLogicalOrder))FF)TF©FT)TTc                 C   s   i | ]\}}||“qS r.   r.   )rw   r£  rj  r.   r.   r/   r�  |  s      z MorxSubtableConverter.<dictcomp>Nr_   r>   c                C   s   t j| |||||d� d S ©Nr>   )r^   rh   rf   r.   r.   r/   rh   ~  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)rg   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)r'  ÚtableTag)rn   r!   r½   r5   rÕ   Ú_PROCESSING_ORDERSÚProcessingOrderr°  rÌ   ÚReservedr6   ÚSubFeatureFlagsr   rO   rE   r'  r)  r   r²  r;   r+  rj   )rg   ru   rm   r~   rn   rž   ró   ÚorderKeyrN   ZheaderLengthr'  Z	subReaderr.   r.   r/   rk   ‹  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ß   r5   r©   r¯  r´  rµ  r6   r¶  r;   r/  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µ  ro  Úistupler   r³  r´  r°  Ú_PROCESSING_ORDERS_REVERSEDrE   r¯  r¶  rF   r6  )
rg   r“   r”   rm   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ª  r;  r„  r<  z>L)rµ  rº  r´  r¯  r¸  r)  r=  r>  r5   rd   rE   ÚstructÚpack)rg   rŒ   rm   r~   r�   r‘   r»  ZreverseOrderZlogicalOrderrA  rB  ZorigReservedrC  r.   r.   r/   r‰   Ú  s&    ÿ
zMorxSubtableConverter.write)N)N)rR   r    r¡   r³  r=  rº  rh   r°  rk   r˜   r•   r‰   r.   r.   r.   r/   r§  s  s   û r§  c                   @   sœ   e Zd Zddœdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zd&dd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ ZdS )'Ú	STXHeaderr_   r>   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 )Nr>   ÚGlyphClassesÚPerGlyphLookup)r^   rh   r`  rN   r   rE   r^  rÊ   ÚclassLookupr   rã   ÚperGlyphLookuprf   r.   r.   r/   rh   õ  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   rH  r½   ÚGlyphClassCountrj   rÄ  r`  rN   r   rE   rÍ   ÚLigComponentsÚ_readLigaturesÚ	Ligaturesr    rÃ  rk   rÁ  rœ   r|   r   ÚStatesrT   rÌ   Ú_readTransitionÚTransitionsÚ_readPerGlyphLookupsÚPerGlyphLookups)rg   ru   rm   r~   r,  rn   ZclassTableReaderZstateArrayReaderZentryTableReaderÚactionReaderZligaturesReaderZperGlyphTableReaderZligComponentReaderZnumLigComponentsZ	numStatesÚ
stateIndexÚstateÚ
glyphClassÚ
entryIndexr.   r.   r/   rk      sd    









ÿ   ÿ  ÿzSTXHeader.readc                 C   s0   |   ¡ }| |j||j  ¡}| |||¡ |S r*   )rN   rH  rn   r‚   r+  )rg   ru   rÒ  rm   rÎ  Ú
transitionZentryReaderr.   r.   r/   rÊ  /  s    ÿzSTXHeader._readTransitionc                 C   s(   t |jƒ}||j d }| | |¡¡S r\  )r)  r'  rn   rå   rÍ   )rg   ru   rm   ÚlimitZnumLigatureGlyphsr.   r.   r/   rÇ  7  s    
zSTXHeader._readLigaturesc                 C   sb   d}|j D ]R}|j ¡ D ]B}t|tƒr|jdkr@t||jd ƒ}|jdkrt||jd ƒ}qq
|S )Nr   r„  r   )rÉ  rË  rP   r+   r   Z	MarkIndexÚmaxZCurrentIndex)rg   r,  Ú
numLookupsrÐ  r-   r.   r.   r/   Ú_countPerGlyphLookups<  s    



zSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t|  |¡ƒD ]6}| d¡}| || ¡  ¡ | | j ||i ¡¡ q|S r¯   )	rn   r|   r×  rH  rj   r½   rT   rÄ  rk   )rg   r,  ru   rm   rn   Úlookupsrˆ  rž  r.   r.   r/   rÌ  K  s    
zSTXHeader._readPerGlyphLookupsNc                 C   s  t ƒ }| jj||||jd d� t| ¡ dƒ}t|j ¡ ƒd }d}	| jd 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Õ  rP   rÄ  rN   ZactionHeaderSizeZcompileActionsrÉ  Ú_compileStatesr)  Ú_compilePerGlyphLookupsÚ_compileLigComponentsÚ_compileLigaturesrE   rÀ   r*  )rg   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‰   T  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   r|   rË  rd   r@  r)  r‚   rE   r8  rO   rT   rÏ   r   r   )rg   rm   ZstatesrÝ  rÞ  ZstateArrayWriterÚentriesZentryIDsrÐ  rÑ  rÓ  ZentryWriterZ	entryDatarÒ  rß  rà  r.   r.   r/   rÙ  ‹  s2    

ÿýþ

zSTXHeader._compileStatesc                 C   s€   | j d krdS |  |¡}t|jƒ|ks<tdt|jƒ|f ƒ‚tƒ }|jD ].}| ¡ }| j  ||i |d ¡ |j|dd� qH| 	¡ S )Nr1   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr²   rJ  )
rÄ  r×  r)  rÍ  rE   r   r?  r‰   rK  r@  )rg   r,  rm   rÖ  rŒ   rŸ  r¤  r.   r.   r/   rÚ  ¥  s    

þÿ
z!STXHeader._compilePerGlyphLookupsc                 C   s2   t |dƒsd S tƒ }|jD ]}| |¡ q| ¡ S )NrÆ  )rƒ   r   rÆ  rÏ   r@  )rg   r,  rm   rŒ   Ú	componentr.   r.   r/   rÛ  µ  s    

zSTXHeader._compileLigComponentsc                 C   s8   t |dƒsd S tƒ }|jD ]}| | |¡¡ q| ¡ S )NrÈ  )rƒ   r   rÈ  rÏ   rè   r@  )rg   r,  rm   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©ri  r�   ÚState)ÚindexÚonGlyphClassÚ
Transition)rm   r“   rW   rÂ  r–  rÆ  ÚLigComponent)ræ  r�   )r™  rª   rß   rÅ  rn  rÁ  r=  r©   rˆ   rÉ  rË  r/  rš  rÍ  rƒ   rü   Ú_xmlWriteLigatures)rg   r—   rm   r�   rW   r“   ÚgÚklassrÏ  rÐ  rÑ  Ztransrl   rŸ  ri  rj  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æ  ri  )rƒ   r™  rª   rˆ   rü   r©   rš  )rg   r—   rm   r�   rW   r“   rl   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ã  ri  r�   rå  rÂ  rÆ  rÈ  r   )r   ro  r¹  r   rÁ  Ú_xmlReadStaterÉ  rT   rÄ  r•   rÍ  Ú_xmlReadLigComponentsrÆ  Ú_xmlReadLigaturesrÈ  rÕ  rP   rÅ  )rg   r“   r”   rm   r,  r¼  r½  r˜  ri  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   ro  r¹  r   rN   r6  rË  )
rg   r“   r”   rm   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�   )ro  r¹  rT   r   )rg   r“   r”   rm   ZligComponentsr¼  r½  Ú_eltContentr.   r.   r/   rï    s
    zSTXHeader._xmlReadLigComponentsc                 C   s4   g }t t|ƒD ] \}}}|dkr| |d ¡ q|S )Nrí  ri  )ro  r¹  rT   )rg   r“   r”   rm   Zligsr¼  r½  rñ  r.   r.   r/   rð    s
    zSTXHeader._xmlReadLigatures)N)rR   r    r¡   rh   rk   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ç   )rg   ru   rm   r~   ZnumCIDsr¡  Úcidrƒ  r.   r.   r/   rk   (  s    zCIDGlyphMap.readNc           	         sX   ‡ fdd„|  ¡ D ƒ}|r&t|ƒd nd}| |¡ t|ƒD ]}| | |d¡¡ q<d S )Nc                    s   i | ]\}}|ˆ   |¡“qS r.   rh  )rw   rô  ri  rk  r.   r/   r�  1  s      z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   r„  ©r=  rÕ  rÏ   r|   rO   )	rg   rŒ   rm   r~   r�   r‘   r=  r   rô  r.   rk  r/   r‰   0  s
    
zCIDGlyphMap.writec                 C   s>   i }t t|ƒD ]*\}}}|dkr|d  ¡ |t|d ƒ< q|S )NÚCIDri  rô  )ro  r¹  Ústripr   ©rg   r“   r”   rm   r¡  ZeNameZeAttrsZ	_eContentr.   r.   r/   r•   7  s
    zCIDGlyphMap.xmlReadc                 C   sh   |  ||¡ | ¡  t| ¡ ƒD ]0\}}|d k	r |dkr |jd||d� | ¡  q | |¡ | ¡  d S )Nr„  rö  )rô  ri  ©r™  rª   rn  r=  r©   rš  )rg   r—   rm   r�   rW   r“   rô  ri  r.   r.   r/   r˜   >  s    

zCIDGlyphMap.xmlWrite)Nr¦  r.   r.   r.   r/   rò  '  s   
rò  c                   @   s.   e Zd Zdd„ Zd
dd„Zdd„ Zdd	„ ZdS )ÚGlyphCIDMapc           
      C   s|   |  ¡ }| ¡ }| |¡}|t|ƒkr<t d|t|ƒf ¡ i }ttt|ƒt|ƒƒƒD ] }|| }	|	dkrV|	||| < qV|S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restr„  )r{  rÌ   rÍ   r)  rí   rî   r|   Úmin)
rg   ru   rm   r~   Z
glyphOrderr   Zcidsr¡  rƒ  rô  r.   r.   r/   rk   J  s    

þÿzGlyphCIDMap.readNc           	         sX   ‡ fdd„|  ¡ D ƒ}|r&t|ƒd nd}| |¡ t|ƒD ]}| | |d¡¡ q<d S )Nc                    s,   i | ]$\}}|d k	r|dkrˆ   |¡|“qS ró  rh  )rw   rë  rô  rk  r.   r/   r�  \  s
    þ z%GlyphCIDMap.write.<locals>.<dictcomp>r   r   r„  rõ  )	rg   rŒ   rm   r~   r�   r‘   r=  r   rƒ  r.   rk  r/   r‰   [  s    
þ
zGlyphCIDMap.writec                 C   s:   i }t t|ƒD ]&\}}}|dkrt|d ƒ||d < q|S )Nrö  r�   ri  )ro  r¹  r   rø  r.   r.   r/   r•   f  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ù  )rg   r—   rm   r�   rW   r“   ri  rô  r.   r.   r/   r˜   m  s    

zGlyphCIDMap.xmlWrite)Nr¦  r.   r.   r.   r/   rú  I  s   
rú  c                   @   s.   e Zd Zdd„ Zd
dd„Zdd„ Zdd	„ ZdS )Ú
DeltaValuec                 C   s¾   |d }|d }|d }|d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  )rE   r|   rÌ   rT   )rg   ru   rm   r~   rý  rþ  rÿ  ÚnItemsÚnBitsZminusOffsetÚmaskZsignMaskrü  ÚtmpÚshiftrl   r�   r.   r.   r/   rk   y  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  )rE   r)  rÏ   )rg   rŒ   rm   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©rR   r    r¡   rk   r‰   r˜   r•   r.   r.   r.   r/   rü  x  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ÚEntryFormatrc   r   r±  l   ÿÿ r  é0   r²   ©r   rÅ   rÚ   r²   c                    s    g | ]}|ˆ@ ˆ> |ˆ @ B ‘qS r.   r.   )rw   Úraw©Ú	innerMaskZ	outerMaskÚ
outerShiftr.   r/   rl  ¿  s   ÿz'VarIdxMapValue.read.<locals>.<listcomp>©rÖ   rÍ   ZreadUInt24Arrayr¾   )	rg   ru   rm   r~   Úfmtr  Ú	innerBitsÚ	entrySizer�   r.   r  r/   rk   ®  s"    üûþzVarIdxMapValue.readNc                    s„   |d }|}|d   t|ƒ¡ d|d@  }d|> d ‰ d| ‰d|d@ d?  }	|j|j|j|jdœ|	 }
|
‡ ‡fd	d
„|D ƒƒ d S )Nr  rc   r   r±  r  r  r²   r  c                    s    g | ]}|d @ ˆ? |ˆ @ B ‘qS )l     þ r.   )rw   Úidx©r  r  r.   r/   rl  Ö  s   ÿz(VarIdxMapValue.write.<locals>.<listcomp>)ZsetValuer)  rØ   rÐ   ÚwriteUInt24ArrayrÁ   )rg   rŒ   rm   r~   r�   r‘   r  r‘  r  r  r�   r.   r  r/   r‰   Ä  s&    üûþÿzVarIdxMapValue.write)NrD  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 )Nrb   Ú	NumShortsé €  éÿ  )Úboolrµ   rÇ   rÒ   rû  rÕ  Úextend)rg   ru   rm   r~   rP   ÚregionCountÚ	wordCountÚ	longWordsZreadBigArrayZreadSmallArrayÚn1Ún2r.   r.   r/   rk   Þ  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 )Nrb   r  r  r  r¨  r   )r  rÉ   rÓ   r¸   rû  rÕ  ÚwriteSmallArray)rg   rŒ   rm   r~   rP   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
dd„Zdd„ Zdd	„ ZdS )ÚTupleValuesc                 C   s   t  d |¡d S r¯   )r   ZdecompileDeltas_)rg   r'  rm   r.   r.   r/   rk     s    zTupleValues.readNc                 C   s   |j t }ttj|| d�ƒS )N)ZoptimizeSize)Úcfgr   Úbytesr   ZcompileDeltaValues_)rg   rŒ   rm   r~   rP   r‘   ZoptimizeSpeedr.   r.   r/   r‰     s    
ÿzTupleValues.writec                 C   s   t |d ƒS r¨   r  r’   r.   r.   r/   r•     s    zTupleValues.xmlReadc                 C   s"   |  ||d|fg ¡ | ¡  d S r¨   r  r–   r.   r.   r/   r˜     s    zTupleValues.xmlWrite)Nr¦  r.   r.   r.   r/   r%    s   
r%  c                   @   sB   e Zd Zdddddœdd„Zdd„ Zddd	„Zd
d„ Zdd„ ZdS )Ú	CFF2IndexNr_   )Ú	itemClassÚitemConverterClassr?   c                C   s4   t j| |||||d� || _|d k	r*|ƒ nd | _d S r©  )r^   rh   Ú
_itemClassÚ
_converter)rg   rW   rX   rY   rN   r)  r*  r?   r.   r.   r/   rh   #  s         ÿÿzCFF2Index.__init__c                    s  ˆ  ¡ ‰ ˆ dkrg S ˆ ¡ ‰dd„ ‰ˆˆˆƒ}ˆjdk	o>ˆ dk}|sâ|ˆ d ƒ}g }| d¡}ˆ |d ¡ |D ]l}	||	ks€t‚ˆ |	| ¡}
ˆjd k	r¶ˆ ¡ }| |
ˆˆj¡ |}
nˆj	d k	rÎˆj	 
|
ˆ¡}
| |
¡ |	}qp|S ‡ ‡‡‡‡‡fdd„}|ƒ }t|gˆ  ƒ}|S d S )	Nr   c                 S   s   | j | j| j| jdœ| S )Nr  r  )ru   ÚoffSizer.   r.   r/   ÚgetReadArray<  s    üûz$CFF2Index.read.<locals>.getReadArrayFri   r   c                     sH   ˆ  ¡ ‰ˆj‰ˆˆd ˆ  d ‰ ˆˆˆƒ‰‡ ‡‡‡‡‡‡	fdd„} | S )Nr   c                    s†   ˆ  ˆ| ˆ  ¡ ˆdƒ}ˆ  ˆ |d  ¡ ˆ |d |d  ¡}ˆjd k	rjˆ ¡ }| |ˆˆj¡ |}nˆjd k	r‚ˆj |ˆ¡}|S )NrÅ   r   r   )rj   r%  r+  r+  Ú
localStater,  rk   )rl   r   r¢  Úobj)Údata_posrm   r-  Ú
offset_posr�   ro   rg   r.   r/   rq   c  s    

z8CFF2Index.read.<locals>.get_read_item.<locals>.read_itemrr   rt   ©r   rm   r.  r-  ru   rg   )r1  r2  r�   ro   r/   rv   ]  s    
z%CFF2Index.read.<locals>.get_read_item)r½   rÕ   ry   Úpopr%  rE   r+  r+  r/  r,  rk   rT   r   )rg   ru   rm   r~   r�   ry   r   r=  Ú
lastOffsetrI  r¢  r0  rv   rq   r€   r.   r3  r/   rk   6  s8    




zCFF2Index.readc                    sô   |}ˆ  t|ƒ¡ t|ƒsd S ˆjd k	r<‡ fdd„|D ƒ}n&ˆjd k	rb‡ ‡‡‡fdd„t|ƒD ƒ}dd„ |D ƒ}tt|dd�ƒ}|d }|dk r”dn|d	k r d
n|dk r¬dnd}	ˆ |	¡ ˆjˆj	ˆj
ˆjdœ|	 }
|
|ƒ |D ]}ˆ |¡ qàd S )Nc                    s   g | ]}|  ˆ ¡‘qS r.   r-  ©rw   r¢  rk  r.   r/   rl  ‚  s     z#CFF2Index.write.<locals>.<listcomp>c              	      s$   g | ]\}}ˆj  ˆˆ ˆ||¡‘qS r.   )r,  r‰   )rw   rl   r¢  ©rm   rg   r~   rŒ   r.   r/   rl  „  s   ÿc                 S   s   g | ]}t |ƒ‘qS r.   )r)  r6  r.   r.   r/   rl  ‰  s     r   )ÚinitialrU  é   i   rÅ   i   rÚ   r²   r  )rÀ   r)  r+  r,  rˆ   rm  r&   r×   rØ   rÐ   r  rÁ   r*  )rg   rŒ   rm   r~   rP   r‘   r=  r   r5  r-  r�   r¢  r.   r7  r/   r‰   z  s8    

þÿý
üûzCFF2Index.writec                 C   sJ   | j d k	r&|   ¡ }| d |||¡ |S | jd k	r@| j |||¡S tƒ ‚d S r*   )r+  r6  r,  r•   r†   )rg   r“   r”   rm   r0  r.   r.   r/   r•   Ÿ  s    

zCFF2Index.xmlReadc              
   C   sz   | j d k	r4t|ƒD ]\}}| ||d|fg|¡ qnB| jd k	rpt|ƒD ]&\}}| j |||||d|fg ¡ qFntƒ ‚d S )Nræ  )r+  rˆ   r/  r,  r˜   r†   )rg   r—   rm   r�   rW   r“   rl   r¢  r.   r.   r/   r˜   ©  s    

    ÿzCFF2Index.xmlWrite)N)N)rR   r    r¡   rh   rk   r‰   r•   r˜   r.   r.   r.   r/   r(  "  s    û÷D
%
r(  c                   @   s   e Zd Zdd„ ZdS )Ú
LookupFlagc                 C   s®   |  ||d|fg ¡ g }|d@ r,| d¡ |d@ r>| d¡ |d@ rP| d¡ |d@ rb| d	¡ |d
@ rt| d¡ |d@ rŽ| d|d?  ¡ |r¢| d |¡¡ | ¡  d S )Nr�   r   ZrightToLeftrÅ   ZignoreBaseGlyphsr²   ZignoreLigaturesri   ZignoreMarksr  ZuseMarkFilteringSeti ÿ  zmarkAttachmentType[%i]rð   )r©   rT   rß   rñ   rª   rò   r.   r.   r/   r˜   ·  s"    




zLookupFlag.xmlWriteNrà   r.   r.   r.   r/   r:  ¶  s   r:  c                       s8   e Zd ZeZ‡ fdd„Zedd„ ƒZedd„ ƒZ‡  Z	S )Ú
_UInt8Enumc                    s   |   tƒ  |||¡¡S r*   )Ú	enumClassr  rk   r‡   r  r.   r/   rk   Î  s    z_UInt8Enum.readc                 C   s   t | j| ¡ ƒS r*   )rü   r<  Úupperr  r.   r.   r/   r§   Ñ  s    z_UInt8Enum.fromStringc                 C   s   |   |¡j ¡ S r*   )r<  rW   Úlowerr  r.   r.   r/   r¦   Õ  s    z_UInt8Enum.toString)
rR   r    r¡   r{   r<  rk   r  r§   r¦   r  r.   r.   r  r/   r;  Ë  s   
r;  c                   @   s   e Zd ZeZdS )r"   N)rR   r    r¡   Ú_ExtendModer<  r.   r.   r.   r/   r"   Ú  s   r"   c                   @   s   e Zd ZeZdS )r#   N)rR   r    r¡   Ú_CompositeModer<  r.   r.   r.   r/   r#   Þ  s   r#   )r*  )r)  c                 C   s   t t| d�S ©N)rN   )r'   r^  ©ÚCr.   r.   r/   r0     r1   c                 C   s   t t| d�S rA  )r'   r›  rB  r.   r.   r/   r0     r1   c                 C   s   t t| d�S rA  )r'   rÀ  rB  r.   r.   r/   r0     r1   c                 C   s   t t| d�S rA  )r'   rQ   rB  r.   r.   r/   r0     r1   c                 C   s   t t| d�S rA  )r'   rM  rB  r.   r.   r/   r0     r1   c                 C   s   t t| d�S rA  )r'   rO  rB  r.   r.   r/   r0     r1   ).Zint8Zint16Zint32r7   r3   Zuint24r8   Zchar64rÂ   rÃ   r  râ   rã   ré   rë   rö   r  r
  r  r  r¾  ZOffsetZLOffsetZOffset24r[  rü  r
  r  r:  r"   r#   rï   Z	TupleListZVarCompositeGlyphListrò  rú  r@   rA   rB   r!   r^  r›  rÀ  ZOffsetToZ	LOffsetToZLOffset24To)|ZfontTools.misc.fixedToolsr   r   r   r  r   r  r   r  r   r  r   r  Z%fontTools.ttLib.tables.TupleVariationr   ZfontTools.misc.roundToolsr	   r
   ZfontTools.misc.textToolsr   r   r   r   r   ZfontTools.misc.lazyToolsr   ZfontTools.ttLibr   r   r]  r   r   r   r   r   ZotTablesr   r   r   r   r   r   r   r    r!   r"   r?  r#   r@  r$   Ú	itertoolsr%   r&   Ú	functoolsr'   Útypesr(   r£   r¾  Útypingr)   ÚloggingÚ	getLoggerrR   rí   r¹  r]   Úobjectr^   r¤   r¬   r®   r±   r»   rÂ   rÃ   rÄ   rÊ   rÑ   rÔ   rÙ   rÞ   rG   rH   rI   râ   rã   ré   rë   rï   rô   rö   rú   r  r
  r  r  r  r  rL   rJ   rQ   rM  rO  r;   r9   r:   r<   r2   r[  r^  r›  r§  rÀ  rò  rú  rü  r
  r  r%  r(  r:  r;  rK   r.   r.   r.   r/   Ú<module>   sþ    8
@h


G"		   ;   5"/503 

Ï