a
    ¥Q•hY! ã                /   @   sP  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 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/m0Z0 d d
l1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8Z8d dl9Z9d dl:m;Z; d dl<Z<e< =e>¡Z?dd„ Z@dd„ ZAG dd„ deBƒZCG dd„ deCƒZDG dd„ deDƒZEG dd„ deDƒZFG dd„ deFƒZGG dd„ deFƒZHG dd „ d eHƒZIG d!d"„ d"eEeHƒZJG d#d$„ d$eFƒZKG d%d&„ d&eFƒZLG d'd(„ d(eFƒZMG d)d*„ d*eFƒZNG d+d,„ d,eFƒZOG d-d.„ d.eFƒZPG d/d0„ d0ePeNƒZQG d1d2„ d2ePeLƒZRG d3d4„ d4ePeHƒZSG d5d6„ d6eDƒZTG d7d8„ d8eDƒZUG d9d:„ d:eUƒZVG d;d<„ d<eLƒZWG d=d>„ d>eLƒZXG d?d@„ d@eDƒZYG dAdB„ dBeYƒZZG dCdD„ dDeYƒZ[G dEdF„ dFe[ƒZ\G dGdH„ dHe[ƒZ]G dIdJ„ dJe]ƒZ^G dKdL„ dLe^ƒZ_G dMdN„ dNeDƒZ`G dOdP„ dPeDƒZaG dQdR„ dReCƒZbG dSdT„ dTebƒZcG dUdV„ dVebƒZdG dWdX„ dXedƒZeG dYdZ„ dZedƒZfG d[d\„ d\ebƒZgG d]d^„ d^edƒZhG d_d`„ d`eeehƒZiG dadb„ dbedƒZjG dcdd„ ddeFƒZkG dedf„ dfekƒZlG dgdh„ dheCƒZmG didj„ djeCƒZnG dkdl„ dleCƒZoG dmdn„ dneCƒZpG dodp„ dpeCƒZqG dqdr„ dreCƒZrG dsdt„ dteCƒZsG dudv„ dveCƒZtG dwdx„ dxeCƒZuG dydz„ dzƒZvG d{d|„ d|eCƒZwG d}d~„ d~eLƒZxG dd€„ d€eNƒZyG d�d‚„ d‚eyƒZ,G dƒd„„ d„eyƒZ.eMeKeGeNeLeOeHeaeIeJe`eTeUeVeWeZe\e]e^e_ebedeeefeleseteuexe,e.eXe5ewevd…�e5ewe$d†�eqerecececeod‡d„ dˆd„ d‰d„ dŠd„ d‹d„ dŒd„ d�œ.ZzdS )Žé    )ÚfixedToFloatÚfloatToFixedÚfloatToFixedToStrÚstrToFixedToFloatÚensureVersionIsLongÚversionToFixed)ÚTupleVariation)ÚnearestMultipleShortestReprÚotRound)Ú	bytesjoinÚtobytesÚtostrÚpadÚsafeEval)ÚLazyList)Ú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-   ú\/var/www/sistema_ama/venv/lib/python3.9/site-packages/fontTools/ttLib/tables/otConverters.pyÚ<lambda>-   ó    r/   c                 C   sÒ  g }i }| D �]º\}}}}}|}	|  d¡r<|dks6J ‚t}
n�| d¡sN|dv r`tttdœ| }
nl|dkrnt}
n^|dkr|t}
nP|dkrŠt}
nB|d	kr˜t	}
n4|d
v r¦t
}
n&|tvrÀd|vrÀ|}	t}
nt||tƒ}
|
||||d�}|jrê|j}n|dv rþ| |¡}n
| |	¡}|j�s||_|dv �r`|d |_|j ¡ D ]*}| ¡ D ]}t||||ƒ||j< �q@�q4|d	k�r¤|d |_|d	 |_|j ¡ D ]}t||||ƒ||j< �qˆ| |¡ ||v�sÀJ |ƒ‚|||< 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)Úuint8r2   Úuint32ÚSubTableÚExtSubTableÚ	SubStructÚFeatureParams)ÚCIDGlyphMappingÚGlyphCIDMappingú(©Údescription)Ú	MortChainÚMortSubtableÚ	MorxChain)r8   r9   r:   r   ÚfeatureParamTypes)Ú
startswithr1   ÚendswithÚComputedUInt8ÚComputedUShortÚComputedULongr8   r9   r:   r;   ÚStructWithLengthÚconverterMappingÚStructÚevalÚ
tableClassÚgetr   ÚvaluesÚTableÚ__name__rD   ÚdefaultFeatureParamsÚappend)Z	tableSpecZtableNamespaceÚ
convertersÚconvertersByNameÚtpÚnameÚrepeatÚauxÚdescrÚ	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v | _| d¡pX|dk| _|dv | _|| _	d S )Nz<string>rM   r3   )ÚDesignAxisRecordSizeÚValueRecordSizeÚ
LookupTyper5   )Ú
ClassCountÚClass2CountÚ
FeatureTagÚSettingsCountÚVarRegionCountÚMappingCountÚRegionAxisCountÚDesignAxisCountrb   ÚAxisValueCountrc   Ú	AxisCountÚBaseGlyphRecordCountÚLayerRecordCountÚAxisIndicesList)
rX   rY   rZ   ÚcompilerN   rF   ÚisCountÚisLookupTypeÚisPropagatedr@   ©ÚselfrX   rY   rZ   rN   r@   r-   r-   r.   Ú__init__t   s    
zBaseConverter.__init__c           	         sž   ˆ j o|dk}|r(ˆ ˆ¡‰ˆtu 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Ú
recordSizerw   r-   r.   Ú	read_item¥   s    zABaseConverter.readArray.<locals>.get_read_item.<locals>.read_item©Úcopyr~   ©r�   )r}   Úreaderr€   rw   )r~   r   r.   Úget_read_item¡   s    z.BaseConverter.readArray.<locals>.get_read_itemc                 3   s   | ]
}ˆ V  qd S r)   r-   )Ú.0r|   r„   r-   r.   Ú	<genexpr>¬   r0   z*BaseConverter.readArray.<locals>.<genexpr>N)ÚlazyÚgetRecordSizeÚNotImplementedÚrangerT   r{   r   Úadvance)	rw   r…   r}   Ú	tableDictÚcountr‰   Úlr|   r†   r-   )r}   r�   r…   r€   rw   r.   Ú	readArray“   s    

zBaseConverter.readArrayc                 C   s   t | dƒr| jS tS )NÚ
staticSize)Úhasattrr’   r‹   ©rw   r…   r-   r-   r.   rŠ   ±   s    
zBaseConverter.getRecordSizec                 C   s   t | ƒ‚dS )zRead a value from the reader.N©ÚNotImplementedError©rw   r…   r}   rŽ   r-   r-   r.   r{   ¶   s    zBaseConverter.readc              
   C   sb   z(t |ƒD ]\}}|  |||||¡ q
W n4 ty\ } z|j|f |_‚ W Y d }~n
d }~0 0 d S r)   )Ú	enumerateÚwriteÚ	ExceptionÚargs)rw   Úwriterr}   rŽ   rP   r|   ÚvalueÚer-   r-   r.   Ú
writeArrayº   s    zBaseConverter.writeArrayc                 C   s   t | ƒ‚dS )zWrite a value to the writer.Nr•   ©rw   rœ   r}   rŽ   r�   ÚrepeatIndexr-   r-   r.   r™   Â   s    zBaseConverter.writec                 C   s   t | ƒ‚dS )zRead a value from XML.Nr•   ©rw   ÚattrsÚcontentr}   r-   r-   r.   ÚxmlReadÆ   s    zBaseConverter.xmlReadc                 C   s   t | ƒ‚dS )zWrite a value to XML.Nr•   ©rw   Ú	xmlWriterr}   r�   rX   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)rw   Úmr-   r-   r.   ÚgetVarIndexOffsetÐ   s    zBaseConverter.getVarIndexOffset)N)N)rR   Ú
__module__Ú__qualname__Ú__doc__rx   r‘   rŠ   r{   rŸ   r™   r¥   r¨   Úrerr   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|v 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.   r{     s    z	Long.readc                 C   s
   |  |¡S r)   )ÚreadLongArray©rw   r…   r}   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©rw   rœ   r}   rŽ   rP   r-   r-   r.   rŸ   
  s    zLong.writeArray)N©rR   r°   r±   r’   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 )ÚULongrÂ   c                 C   s   |  ¡ S r)   ©Ú	readULongr—   r-   r-   r.   r{     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.   r{   +  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.   r{   ;  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)   )ÚreadInt8r—   r-   r-   r.   r{   K  s    z	Int8.readc                 C   s
   |  |¡S r)   )ÚreadInt8ArrayrÆ   r-   r-   r.   r‘   N  s    zInt8.readArrayNc                 C   s   |  |¡ d S r)   )Ú	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.   r{   [  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)   ©Ú
readUInt24r—   r-   r-   r.   r{   k  s    zUInt24.readNc                 C   s   |  |¡ d S r)   ©ÚwriteUInt24r    r-   r-   r.   r™   n  s    zUInt24.write)N©rR   r°   r±   r’   r{   r™   r-   r-   r-   r.   rë   h  s   rë   c                   @   s   e Zd Zdd„ ZdS )ÚComputedIntc                 C   s&   |d ur"|  d||f ¡ | ¡  d S )Nz%s=%s)Úcommentrº   r¦   r-   r-   r.   r¨   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)   )ÚreadTagr—   r-   r-   r.   r{   ˆ  s    zTag.readNc                 C   s   |  |¡ d S r)   )Ú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)   )ÚgetGlyphNameÚ	readValuerü   r’   r—   r-   r-   r.   r{   ˜  s    zGlyphID.readc                 C   s   |  | j| |¡¡ d S r)   )rŸ   rü   ÚgetGlyphIDManyrÉ   r-   r-   r.   rŸ   ›  s    zGlyphID.writeArrayNc                 C   s   |  | j| |¡¡ d S r)   )Ú
writeValuerü   Ú
getGlyphIDr    r-   r-   r.   r™   ž  s    zGlyphID.write)N)	rR   r°   r±   r’   rü   r‘   r{   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�   rX   ú  zmissing from name tablez"name id %d missing from name table)r¹   rO   ZgetDebugNamer™   ró   ÚlogÚwarningrº   )rw   r§   r}   r�   rX   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º   ©rw   r§   r}   r�   rX   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.   r{   Î  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.   r{   Û  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  r{   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Ã   )rw   r…   r}   rŽ   r�   r-   r-   r.   r{   !  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’   r{   r™   r»   r·   r¶   r4  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  )rw   r…   r}   rŽ   ÚdataZzeroPosÚsr-   r-   r.   r{   ?  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 )Nr8  r9  r:  r=  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr7  )r   r  r  Úlenr’   Ú	writeData)rw   rœ   r}   rŽ   r�   r¡   r@  r-   r-   r.   r™   I  s    ÿzChar64.write)N)rR   r°   r±   r²   r’   r{   r™   r-   r-   r-   r.   r5  6  s   
r5  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   rŠ   r”   r-   r-   r.   rŠ   V  s    zStruct.getRecordSizec                 C   s   |   ¡ }| ||¡ |S r)   )rN   Ú	decompile)rw   r…   r}   rŽ   Útabler-   r-   r.   r{   Y  s    zStruct.readNc                 C   s   |  ||¡ d S r)   ©rr   r    r-   r-   r.   r™   ^  s    zStruct.writec                 C   s@   |d u r*|r<|  ||dg ¡ | ¡  q<n|j||||d� d S )N)Úemptyr   )rX   )r¹   rº   ÚtoXMLr¦   r-   r-   r.   r¨   a  s    
zStruct.xmlWritec                 C   s<  d|v rt |d ƒrd S |  ¡ }| d¡}|d ur<t|ƒ|_t|dƒ }|r¸d}| ¡ D ]^}|jrXd}t|dƒsvi |_|j}	|j	|	vs”J |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 )NrG  ÚFormatÚpostReadFTÚ_propagator)Ú
propagator)r   rN   rO   r¬   rI  r“   ÚgetConvertersru   rK  rX   Úsetattrr   Ú__dict__r*   r+   ÚfromXMLÚpopulateDefaultsr  )rw   r£   r¤   r}   rE  rI  Z
noPostReadZcleanPropagationr]   rL  ÚelementrX   r-   r-   r.   r¥   n  sB    




zStruct.xmlReadc                 C   s   dt | jƒ S )Nz
Struct of )ÚreprrN   )rw   r-   r-   r.   Ú__repr__˜  s    zStruct.__repr__)N)	rR   r°   r±   rŠ   r{   r™   r¨   r¥   rT  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)   )r~   rN   rD  rz   r4   )rw   r…   r}   rŽ   r~   rE  r-   r-   r.   r{   �  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°J ‚| ¡ |j|< d S )Nr4   r   éÞ   i­Þ  ì   ï>[= )r   rÕ   rÂ   ó   Þ­¾ï)r˜   rM  rX   rB  Úitemsr*   r   r’   ÚgetDataLengthr4   rr   ÚgetSubWriterr™   Ú
getAllData)rw   rœ   r}   rŽ   r�   r¡   Z	convIndexr]   ÚlengthIndexZdeadbeefÚbeforeÚlengthZlengthWriterr-   r-   r.   r™   ¤  s    

zStructWithLength.write)N©rR   r°   r±   r{   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Þ   ©rw   rœ   r-   r-   r.   ÚwriteNullOffset½  s    zTable.writeNullOffsetc                 C   sL   |   |¡}|dkrd S |  ¡ }| |¡}|jr<||_||_n| ||¡ |S r¿   )r`  rN   ÚgetSubReaderr‰   r…   r}   rD  )rw   r…   r}   rŽ   ÚoffsetrE  r-   r-   r.   r{   À  s    

z
Table.readNc                 C   sR   |d u r|   |¡ n:| ¡ }| j|_|d ur2||_|j|| jd� | ||¡ d S )N©Ú
offsetSize)rb  rZ  rX   r¡   ÚwriteSubTabler’   rr   )rw   rœ   r}   rŽ   r�   r¡   Ú	subWriterr-   r-   r.   r™   Í  s    zTable.write)N)rR   r°   r±   r’   r`  rb  r{   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.   r`  Ü  s    zLTable.readOffsetc                 C   s   |  d¡ d S r¿   rÏ   ra  r-   r-   r.   rb  ß  s    zLTable.writeNullOffsetN©rR   r°   r±   r’   r`  rb  r-   r-   r-   r.   ri  Ù  s   ri  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTable24rì   c                 C   s   |  ¡ S r)   rí   r”   r-   r-   r.   r`  ç  s    zTable24.readOffsetc                 C   s   |  d¡ d S r¿   rï   ra  r-   r-   r.   rb  ê  s    zTable24.writeNullOffsetNrj  r-   r-   r-   r.   rk  ä  s   rk  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+  rX   rY   rZ   ©rw   Ú	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±   ro  r¨   r-  r-   r-   r*  r.   r:   ñ  s   r:   c                       s$   e Zd Zdd„ Z‡ fdd„Z‡  ZS )r8   c                 C   s$   | j | | }|  | j| j| j|¡S r)   rl  rm  r-   r-   r.   ro  û  s    zSubTable.getConverterc                    s   t t| ƒ |||d |¡ d S r)   )r(  r8   r¨   r¦   r*  r-   r.   r¨   ÿ  s    zSubTable.xmlWriterp  r-   r-   r*  r.   r8   ú  s   r8   c                   @   s   e Zd Zddd„ZdS )r9   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.   r9     s   r9   c                   @   s   e Zd Zdd„ ZdS )r;   c                 C   s&   | j  || j¡}|  | j| j| j|¡S r)   )rD   rO   rS   r+  rX   rY   rZ   )rw   Z
featureTagrN   r-   r-   r.   ro  
  s    zFeatureParams.getConverterN)rR   r°   r±   ro  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 )r1   rÕ   Nra   r?   c                C   s4   t j| |||||d� d|d dkr(dnd | _d S )Nr?   r1   éÿÿÿÿÚ2Ú1)r`   rx   Úwhichrv   r-   r-   r.   rx     s    ÿzValueFormat.__init__c                 C   s   |  ¡ }t|ƒ|| j< |S r)   )rÜ   r   ru  ©rw   r…   r}   rŽ   Úformatr-   r-   r.   r{     s    zValueFormat.readc                 C   s   |  |¡ t|ƒ|| j< d S r)   )rß   r   ru  )rw   rœ   r}   rŽ   rw  r¡   r-   r-   r.   r™     s    
zValueFormat.write)N)N)rR   r°   r±   r’   rx   r{   r™   r-   r-   r-   r.   r1     s   r1   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Õ   )rB  ru  r”   r-   r-   r.   rŠ   #  s    zValueRecord.getRecordSizec                 C   s   || j   ||¡S r)   )ru  ÚreadValueRecordr—   r-   r-   r.   r{   &  s    zValueRecord.readNc                 C   s   || j   |||¡ d S r)   )ru  ÚwriteValueRecordr    r-   r-   r.   r™   )  s    zValueRecord.writec                 C   s    |d u r
n|  ||| j|¡ d S r)   )rH  rX   r¦   r-   r-   r.   r¨   ,  s    zValueRecord.xmlWritec                 C   s&   ddl m} |ƒ }| d |||¡ |S )Nr   )rx  )ÚotBaserx  rP  )rw   r£   r¤   r}   rx  r�   r-   r-   r.   r¥   2  s    zValueRecord.xmlRead)N)rR   r°   r±   rŠ   r{   r™   r¨   r¥   r-   r-   r-   r.   rx  "  s
   
rx  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  ra   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)rX   rY   rZ   )rX   rY   rZ   rN   )r`   rx   Ú
issubclassrN   r´   Ú	converterrQ   rv   r-   r-   r.   rx   =  s    ÿ
ÿzAATLookup.__init__c                 C   s€   |  ¡ }|dkr|  ||¡S |dkr0|  ||¡S |dkrD|  ||¡S |dkrX|  ||¡S |dkrl|  ||¡S ds|J d| ƒ‚d S )Nr   rÕ   rÂ   é   ry   Fzunsupported lookup format: %d)rÜ   ÚreadFormat0ÚreadFormat2ÚreadFormat4ÚreadFormat6ÚreadFormat8rv  r-   r-   r.   r{   H  s    zAATLookup.readNc                    s¦   t t‡ fdd„| ¡ D ƒƒƒ}t ttd |  |ˆ |¡|  |ˆ |¡|  |ˆ |¡|  |ˆ |¡gƒƒƒ}|d \}}	}
| ¡ }|
ƒ  | ¡ | }||ks¢J d|	||f ƒ‚d S )Nc                    s   g | ]\}}ˆ   |¡|f‘qS r-   ©r  )r‡   ÚglyphÚval©r}   r-   r.   Ú
<listcomp>Y  r0   z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	ÚlistÚsortedrX  ÚfilterÚbuildFormat0ÚbuildFormat2ÚbuildFormat6ÚbuildFormat8rY  )rw   rœ   r}   rŽ   r�   r¡   rP   ÚformatsÚdataSizeZlookupFormatZwriteMethodr~   Z
actualSizer-   rŠ  r.   r™   W  s6    ÿüþÿÿÿýþzAATLookup.writec                 C   sH   |   |¡ |   |¡ t||d�\}}}|   |¡ |   |¡ |   |¡ d S )N)ÚnÚitemSize)rß   r   )rœ   ÚnumUnitsÚunitSizeÚsearchRangeÚentrySelectorÚ
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-   ©r}   rw   rP   rœ   r-   r.   r/   Š  r0   z(AATLookup.buildFormat0.<locals>.<lambda>)rB  ÚgetGlyphOrderr€  r’   )rw   rœ   r}   rP   Ú	numGlyphsÚ	valueSizer-   rž  r.   r�  ‚  s    
ýzAATLookup.buildFormat0c                 C   s2   |  d¡ |D ]\}}| jj||d |d d� qd S )Nr   ©rŽ   r�   r¡   )rß   r€  r™   )rw   rœ   r}   rP   ZglyphID_r�   r-   r-   r.   r�  �  s
    

ÿzAATLookup.writeFormat0c                    s´   |d \}}|}g ‰|dd … D ]>\}}||d ks<||krZˆ  |||f¡ | }}|}q |}q ˆ  |||f¡ ˆjj}	tˆƒd |	d  }
}dˆj |
|  d‡ ‡‡‡fdd„fS )Nr   r   rÂ   rÕ   c                      s   ˆ  ˆˆ ˆ¡S r)   )ÚwriteFormat2r-   ©r}   Úsegmentsrw   rœ   r-   r.   r/   ¥  r0   z(AATLookup.buildFormat2.<locals>.<lambda>)rT   r€  r’   rB  ÚBIN_SEARCH_HEADER_SIZE)rw   rœ   r}   rP   ZsegStartZsegValueZsegEndÚglyphIDÚcurValuer¡  r—  r˜  r-   r¤  r.   r�  ”  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¢  éÿÿ  r7  ©rß   r€  r’   rB  rœ  r™   rC  )
rw   rœ   r}   r¥  r¡  r—  r˜  Ú
firstGlyphÚ	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   r�  c                      s   ˆ  ˆˆ ˆ¡S r)   )ÚwriteFormat6r-   rž  r-   r.   r/   ½  r0   z(AATLookup.buildFormat6.<locals>.<lambda>)r€  r’   rB  r¦  )rw   rœ   r}   rP   r¡  r—  r˜  r-   rž  r.   r‘  ·  s    ýzAATLookup.buildFormat6c           	      C   s|   |  d¡ | jj}t|ƒ|d  }}|  |||¡ |D ](\}}|  |¡ | jj||d |d d� q6|  d¡ | d| ¡ d S )Nr�  rÕ   r¢  r©  r7  rª  )	rw   rœ   r}   rP   r¡  r—  r˜  r§  r�   r-   r-   r.   r­  À  s    


ÿ
zAATLookup.writeFormat6c                    s^   ˆd d ˆd d  }}t ˆƒ|| d kr2d S ˆjj}dt ˆƒ|  d‡ ‡‡‡fdd„fS )Nr   rr  r   r�  ry   c                      s   ˆ  ˆˆ ˆ¡S r)   )ÚwriteFormat8r-   rž  r-   r.   r/   Õ  r0   z(AATLookup.buildFormat8.<locals>.<lambda>)rB  r€  r’   )rw   rœ   r}   rP   Z
minGlyphIDZ
maxGlyphIDr¡  r-   rž  r.   r’  Í  s    ýzAATLookup.buildFormat8c                 C   sV   |d d }|  d¡ |  |¡ |  t|ƒ¡ |D ]\}}| jj||d |d d� q2d S )Nr   ry   r¢  )rß   rB  r€  r™   )rw   rœ   r}   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ý   ©r‡   Úkr�   rŠ  r-   r.   Ú
<dictcomp>å  r0   z)AATLookup.readFormat0.<locals>.<dictcomp>)rB  rŸ  r€  r‘   r˜   )rw   r…   r}   r   r@  r-   rŠ  r.   r‚  â  s    zAATLookup.readFormat0c                 C   s¬   i }|j d }| ¡ | ¡  }}|d| jj ks8J |ƒ‚t|ƒD ]f}| |||  d ¡ | ¡ }| ¡ }	| jj||d d�}
|dkr@t|	|d ƒD ]}|
|| |¡< q’q@|S )NrÕ   rÂ   é   ©rŽ   r©  r   ©r~   rÜ   r€  r’   rŒ   rz   r{   rý   )rw   r…   r}   Úmappingr~   r˜  r—  r|   ÚlastÚfirstr�   r³  r-   r-   r.   rƒ  ç  s    
zAATLookup.readFormat2c                 C   sÊ   i }|j d }| ¡ }|dks&J |ƒ‚t| ¡ ƒD ]’}| |||  d ¡ | ¡ }| ¡ }| ¡ }	|dkr2| d¡}
|
 ||	 ¡ | jj|
|d || d d�}t|ƒD ]\}}||| || ¡< q¨q2|S )NrÕ   r�  rµ  r©  r   r   r°  )	r~   rÜ   rŒ   rz   rc  r€  r‘   r˜   rý   )rw   r…   r}   r¸  r~   r˜  r|   r¹  rº  rd  Ú
dataReaderr@  r³  r3  r-   r-   r.   r„  ö  s$    

ÿzAATLookup.readFormat4c           	      C   sŠ   i }|j d }| ¡ }|d| jj ks.J |ƒ‚t| ¡ ƒD ]J}| |||  d ¡ | ¡ }| jj||d d�}|dkr:||| |¡< q:|S )NrÕ   rµ  r¶  r©  r·  )	rw   r…   r}   r¸  r~   r˜  r|   r§  r�   r-   r-   r.   r…  
  s    
zAATLookup.readFormat6c                    s<   |  ¡ ‰ |  ¡ }| jj|ˆd |d�}‡ ‡fdd„t|ƒD ƒS )Nr°  c                    s    i | ]\}}ˆ  ˆ | ¡|“qS r-   r±  r²  ©rº  r}   r-   r.   r´    r0   z)AATLookup.readFormat8.<locals>.<dictcomp>)rÜ   r€  r‘   r˜   )rw   r…   r}   r�   r@  r-   r¼  r.   r†    s    zAATLookup.readFormat8c           	      C   sF   i }|D ]8}t |tƒr|\}}}|dkr| j |||¡||d < q|S )NÚLookuprˆ  )r*   r+   r€  r¥   )	rw   r£   r¤   r}   r�   rR  rX   ÚaÚ
eltContentr-   r-   r.   r¥     s    

zAATLookup.xmlReadc                 C   s\   |  ||¡ | ¡  t| ¡ ƒD ]$\}}| jj|||dd|fgd� q | |¡ | ¡  d S )Nr½  rˆ  )r�   rX   r£   )Úbegintagrº   r�  rX  r€  r¨   Úendtag)rw   r§   r}   r�   rX   r£   rˆ  r-   r-   r.   r¨   &  s    ÿ
zAATLookup.xmlWrite)N)rR   r°   r±   r¦  rx   r{   r™   r»   rœ  r�  r�  r�  r£  r‘  r­  r’  r®  r‚  rƒ  r„  r…  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 )ÚAATLookupWithDataOffsetc                 C   sz   |  ¡ }|  ¡ }| |¡}tdd d tƒ}| |||¡}i }	| ¡ D ]2\}
}| || ¡}|  ¡ }| ||¡ ||	|
< qB|	S ©NÚDataOffsets)rÍ   rc  r}  rÚ   r{   rX  rN   rD  )rw   r…   r}   rŽ   ZlookupOffsetZ
dataOffsetÚlookupReaderÚlookupÚoffsetsÚresultrˆ  rd  r»  Úitemr-   r-   r.   r{   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Â   re  )r�  r  r   rr   r[  rO   rB  rT   rZ  r}  rÚ   r™   rg  rC  )rw   rœ   r}   rŽ   r�   r¡   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDatarˆ  rh  r@  rd  ÚlookupWriterrÆ  Z
dataWriterÚdr-   r-   r.   r™   G  s*    


zAATLookupWithDataOffset.writec                 C   s   t dd d | jƒ}| |||¡S rÃ  )r}  rN   r¥   )rw   r£   r¤   r}   rÆ  r-   r-   r.   r¥   j  s    zAATLookupWithDataOffset.xmlReadc                 C   s&   t dd d | jƒ}| |||||¡ d S rÃ  )r}  rN   r¨   )rw   r§   r}   r�   rX   r£   rÆ  r-   r-   r.   r¨   n  s    z AATLookupWithDataOffset.xmlWrite)N©rR   r°   r±   r{   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-   )r‡   rÊ  r‰  r-   r-   r.   r´  |  r0   z MorxSubtableConverter.<dictcomp>Nra   r?   c                C   s   t j| |||||d� d S ©Nr?   )r`   rx   rv   r-   r-   r.   rx   ~  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)rw   r  Úsubtabler-   r-   r.   Ú"_setTextDirectionFromCoverageFlagsƒ  s
    z8MorxSubtableConverter._setTextDirectionFromCoverageFlagsc                 C   s   |j }tƒ }| ¡ |_| ¡ }|d@ dk|d@ dkf}| j| |_|  ||¡ | ¡ |_	| j	|d@ d> O  _	| ¡ |_
| ¡ |_td  |j
¡}|d u r¬ds¬J d|j
 ƒ‚|j | }	|j|j |j |j |	 … }
t|
ƒ|j|	 ksèJ ‚t|
|jd�}|ƒ |_|j ||¡ | ||j ¡ |S )	Nr6  r   r!  é   ÚmorxFz!unsupported 'morx' lookup type %s)r@  ÚtableTag)r~   r    rÍ   r4   rç   Ú_PROCESSING_ORDERSÚProcessingOrderrØ  rÜ   ÚReservedr5   ÚSubFeatureFlagsr   rO   r@  rB  r   rÛ  r:   rD  rz   )rw   r…   r}   rŽ   r~   r®   r  ÚorderKeyrN   ZheaderLengthr@  Ú	subReaderr-   r-   r.   r{   ‹  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ß  r2  )rÀ  rº   ró   r4   r¹   rÖ  rÝ  rÞ  r5   rß  r:   rH  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v s˜J d|j ƒ‚q|dkrÆ|d |_	|j	d	v sÄJ d
|j	 ƒ‚q|dkrÞt|d ƒ|_q|dkröt|d ƒ|_
q| d¡�r| ||||¡ qdsJ |ƒ‚q|d@ d> |jB |_|S )Nr   ÚCoverageFlagsr�   r6  r!  rÝ  zunknown ProcessingOrder: %srÖ  >   rÒ  rÕ  rÔ  zunknown TextDirection %srÞ  rß  ZMorphFrÙ  )r    rÞ  rŽ  Úistupler   rÜ  rÝ  rØ  Ú_PROCESSING_ORDERS_REVERSEDrÖ  rß  rF   rP  )
rw   r£   r¤   r}   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¾J ‚| ¡ |
 }t
 d|¡|j|	< d S )Ni   r!  rÔ  rÓ  r   r6  rÒ  rÑ  rV  r©  rW  z>L)rÞ  rä  rÝ  rÖ  râ  rB  rX  rY  r4   rr   ÚstructÚpack)rw   rœ   r}   rŽ   r�   r¡   rå  ZreverseOrderZlogicalOrderr\  r]  ZorigReservedr^  r-   r-   r.   r™   Ú  s&    ÿ
zMorxSubtableConverter.write)N)N)rR   r°   r±   rÜ  rX  rä  rx   rØ  r{   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 )'Ú	STXHeaderra   r?   c                C   s^   t j| |||||d� t| jtƒs&J ‚tdd d tƒ| _t| jtƒrTtdd d t	ƒ| _
nd | _
d S )Nr?   ÚGlyphClassesÚPerGlyphLookup)r`   rx   r  rN   r   r}  rÚ   ÚclassLookupr   rù   ÚperGlyphLookuprv   r-   r-   r.   rx   õ  s    ÿzSTXHeader.__init__c                 C   sü  t ƒ }|j}| d¡}| d¡}| d¡}d }	d }
| ¡ |_| || ¡  ¡ | || ¡  ¡ | || ¡  ¡ | jd ur˜| d¡}| || ¡  ¡ t| jt	ƒ�r4| d¡}	|	 || ¡  ¡ | d¡}| || ¡  ¡ | d¡}
|
 || ¡  ¡ |
j|j d }|dk�sJ ‚| 
|¡|_|  |
|¡|_n*t| jtƒ�r^| d¡}	|	 || ¡  ¡ | j |||¡|_t|j|j |jd  ƒ}t|ƒD ]H}tƒ }|j |¡ t|jƒD ]$}| ¡ }|  ||||	¡|j|< �q²�q’| jd u�rø|  |||¡|_|S )Nr   rÕ   )r   r~   rc  rÍ   ÚGlyphClassCountrz   rî  r  rN   r   rÝ   ÚLigComponentsÚ_readLigaturesÚ	Ligaturesr   rí  r{   rë  r¬   rŒ   r   ÚStatesrT   rÜ   Ú_readTransitionÚTransitionsÚ_readPerGlyphLookupsÚPerGlyphLookups)rw   r…   r}   rŽ   rE  r~   ZclassTableReaderZstateArrayReaderZentryTableReaderÚactionReaderZligaturesReaderZperGlyphTableReaderZligComponentReaderZnumLigComponentsZ	numStatesÚ
stateIndexÚstateÚ
glyphClassÚ
entryIndexr-   r-   r.   r{      sZ    









ÿÿÿzSTXHeader.readc                 C   s0   |   ¡ }| |j||j  ¡}| |||¡ |S r)   )rN   rc  r~   r’   rD  )rw   r…   rü  r}   rø  Ú
transitionZentryReaderr-   r-   r.   rô  /  s    ÿzSTXHeader._readTransitionc                 C   s(   t |jƒ}||j d }| | |¡¡S ry  )rB  r@  r~   rû   rÝ   )rw   r…   r}   Ú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   Ú	MarkIndexÚmaxÚCurrentIndex)rw   rE  Ú
numLookupsrú  r,   r-   r-   r.   Ú_countPerGlyphLookups<  s    



zSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t|  |¡ƒD ]6}| d¡}| || ¡  ¡ | | j ||i ¡¡ q|S r¿   )	r~   rŒ   r  rc  rz   rÍ   rT   rî  r{   )rw   rE  r…   r}   r~   Ú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 urT|	d7 }	|	| j	j
7 }	| j	 ||j¡\}
}|  ||j||¡\}}|	t|ƒ }|t|ƒ }|t|ƒ }t|  ||¡dƒ}|
d urÖ|t|ƒ }nd }d\}}|  ||¡}|  ||¡}|d u�r.t|ƒdk�sJ ‚|t|
ƒ }|t|ƒ }| |¡ | |	¡ | |¡ | |¡ | jd u�rl| |¡ |d u�r€| |¡ |d u�rž| |¡ | |¡ | |¡ | |¡ | |¡ | |¡ |
d u�rÚ| |
¡ |d u�rî| |¡ |d u�r| |¡ d S )N)r¡   rÕ   r   r!  rÂ   )NNr   )r   rí  r™   rë  r   r[  r   rP   rî  rN   ÚactionHeaderSizeÚcompileActionsró  Ú_compileStatesrB  Ú_compilePerGlyphLookupsÚ_compileLigComponentsÚ_compileLigaturesrÐ   rC  )rw   rœ   r}   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  sb    ÿ

ÿ



















zSTXHeader.writec                 C   sÒ   t ƒ }g i  }}|D ]˜}t|ƒD ]Š}	|j|	 }
t ƒ }|
 |||¡ | ¡ }t|ƒ|
jkstJ dt|
ƒ|
jt|ƒf ƒ‚| |¡}|d u r t|ƒ}|||< | 	|¡ | 
|¡ q qt| ¡ dƒ}tt|ƒdƒ}||fS )Nz1%s has staticSize %d, but actually wrote %d bytesrÂ   )r   rŒ   rõ  rr   r[  rB  r’   rS  rO   rT   rß   r   r   )rw   r}   Ú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 u rdS |  |¡}t|jƒ|ks<J dt|jƒ|f ƒ‚tƒ }|jD ].}| ¡ }| j  ||i |d ¡ |j|dd� qH| ¡ S )Nr0   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %drÂ   re  )	rî  r  rB  r÷  r   rZ  r™   rg  r[  )rw   rE  r}   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[  )rw   rE  r}   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[  )rw   rE  r}   rœ   Ú	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©rˆ  r�   ÚState)ÚindexÚonGlyphClassÚ
Transition)r}   r£   rX   rì  r½  rð  ÚLigComponent)r  r�   )rÀ  rº   ró   rï  r�  rë  rX  r¹   r˜   ró  rõ  rH  rÁ  r÷  r“   r  Ú_xmlWriteLigatures)rw   r§   r}   r�   rX   r£   ÚgÚklassrù  rú  rû  Útransr|   rÆ  rˆ  r‰  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  rˆ  )r“   rÀ  rº   r˜   r  r¹   rÁ  )rw   r§   r}   r�   rX   r£   r|   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  rˆ  r�   r  rì  rð  rò  r   )r   rŽ  rã  r   rë  Ú_xmlReadStateró  rT   rî  r¥   r÷  Ú_xmlReadLigComponentsrð  Ú_xmlReadLigaturesrò  r   rP   rï  )rw   r£   r¤   r}   rE  ræ  rç  r¿  rˆ  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   rŽ  rã  r   rN   rP  rõ  )
rw   r£   r¤   r}   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�   )rŽ  rã  rT   r   )rw   r£   r¤   r}   ZligComponentsræ  rç  Ú_eltContentr-   r-   r.   r     s
    zSTXHeader._xmlReadLigComponentsc                 C   s4   g }t t|ƒD ] \}}}|dkr| |d ¡ q|S )Nr  rˆ  )rŽ  rã  rT   )rw   r£   r¤   r}   Úligsræ  rç  r"  r-   r-   r.   r!    s
    zSTXHeader._xmlReadLigatures)N)rR   r°   r±   rx   r{   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ý   )rw   r…   r}   rŽ   ZnumCIDsrÈ  Úcidr§  r-   r-   r.   r{   (  s    zCIDGlyphMap.readNc           	         sX   ‡ fdd„|  ¡ D ƒ}|r&t|ƒd nd}| |¡ t|ƒD ]}| | |d¡¡ q<d S )Nc                    s   i | ]\}}|ˆ   |¡“qS r-   r‡  )r‡   r&  rˆ  rŠ  r-   r.   r´  1  r0   z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   r©  ©rX  r   rß   rŒ   rO   )	rw   rœ   r}   rŽ   r�   r¡   rX  r�   r&  r-   rŠ  r.   r™   0  s
    
zCIDGlyphMap.writec                 C   s>   i }t t|ƒD ]*\}}}|dkr|d  ¡ |t|d ƒ< q|S )NÚCIDrˆ  r&  )rŽ  rã  Ústripr   ©rw   r£   r¤   r}   rÈ  ZeNameZeAttrsZ	_eContentr-   r-   r.   r¥   7  s
    zCIDGlyphMap.xmlReadc                 C   sh   |  ||¡ | ¡  t| ¡ ƒD ]0\}}|d ur |dkr |jd||d� | ¡  q | |¡ | ¡  d S )Nr©  r(  )r&  rˆ  ©rÀ  rº   r�  rX  r¹   rÁ  )rw   r§   r}   r�   rX   r£   r&  rˆ  r-   r-   r.   r¨   >  s    

zCIDGlyphMap.xmlWrite)NrÍ  r-   r-   r-   r.   r$  '  s   
r$  c                   @   s.   e Zd Zdd„ Zd
dd„Zdd„ Zdd	„ ZdS )ÚGlyphCIDMapc           
      C   s|   |  ¡ }| ¡ }| |¡}|t|ƒkr<t d|t|ƒf ¡ i }ttt|ƒt|ƒƒƒD ] }|| }	|	dkrV|	||| < qV|S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restr©  )rŸ  rÜ   rÝ   rB  r  r  rŒ   Úmin)
rw   r…   r}   rŽ   Ú
glyphOrderr�   ÚcidsrÈ  r§  r&  r-   r-   r.   r{   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 ur|dkrˆ   |¡|“qS r%  r‡  )r‡   r  r&  rŠ  r-   r.   r´  \  s   þz%GlyphCIDMap.write.<locals>.<dictcomp>r   r   r©  r'  )	rw   rœ   r}   rŽ   r�   r¡   rX  r�   r§  r-   rŠ  r.   r™   [  s    
þ
zGlyphCIDMap.writec                 C   s:   i }t t|ƒD ]&\}}}|dkrt|d ƒ||d < q|S )Nr(  r�   rˆ  )rŽ  rã  r   r*  r-   r-   r.   r¥   f  s
    zGlyphCIDMap.xmlReadc                 C   sh   |  ||¡ | ¡  t| ¡ ƒD ]0\}}|d ur |dkr |jd||d� | ¡  q | |¡ | ¡  d S )Nr©  r(  r  r+  )rw   r§   r}   r�   rX   r£   rˆ  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v s(J dƒ‚|| d }d|> }d|> }	d|> d }
d|d > }g }d\}}t |ƒD ]H}|dkrŠ| ¡ d	 }}|| }||? |
@ }||@ r®||	 }| |¡ qp|S )
NÚ	StartSizeÚEndSizeÚDeltaFormat©r   rÕ   rì   úillegal DeltaFormatr   )r   r   r   r!  )rŒ   rÜ   rT   )rw   r…   r}   rŽ   r1  r2  r3  ÚnItemsÚnBitsZminusOffsetÚmaskZsignMaskr0  ÚtmpÚshiftr|   r�   r-   r-   r.   r{   y  s(    zDeltaValue.readNc                 C   s¶   |d }|d }|d }|}	|dv s,J dƒ‚|| d }
d|> }t |	ƒ|
ksPJ ‚d|> d }d\}}|	D ]6}|| }|||@ |> B }|dkrh| |¡ d\}}qh|d	kr²| |¡ d S )
Nr1  r2  r3  r4  r5  r   )r   r!  r   r!  )rB  rß   )rw   rœ   r}   rŽ   r�   r¡   r1  r2  r3  r0  r6  r7  r8  r9  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±   r{   r™   r¨   r¥   r-   r-   r-   r.   r0  x  s   
r0  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ÚEntryFormatrj   r   rÙ  l   ÿÿ r!  é0   rÂ   ©r   rÕ   rì   rÂ   c                    s    g | ]}|ˆ@ ˆ> |ˆ @ B ‘qS r-   r-   )r‡   Úraw©Ú	innerMaskZ	outerMaskÚ
outerShiftr-   r.   r‹  ¿  s   ÿz'VarIdxMapValue.read.<locals>.<listcomp>©rè   rÝ   ÚreadUInt24ArrayrÎ   )	rw   r…   r}   rŽ   Úfmtr6  Ú	innerBitsÚ	entrySizer‘   r-   rC  r.   r{   ®  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?  rj   r   rÙ  r!  r@  rÂ   rA  c                    s    g | ]}|d @ ˆ? |ˆ @ B ‘qS )l     þ r-   )r‡   Úidx©rD  rE  r-   r.   r‹  Ö  s   ÿz(VarIdxMapValue.write.<locals>.<listcomp>)ÚsetValuerB  rê   rà   ÚwriteUInt24ArrayrÑ   )rw   rœ   r}   rŽ   r�   r¡   rH  r¸  rI  rJ  rŸ   r-   rL  r.   r™   Ä  s&    üûþÿzVarIdxMapValue.write)Nr_  r-   r-   r-   r.   r>  ­  s   r>  c                   @   s.   e Zd Zdd„ Zd
dd„Zdd„ Zdd	„ ZdS )ÚVarDataValuec                 C   s–   g }|d }|d }t |d@ ƒ}|d@ }|r<|j|j }}	n|j|j }}	t||ƒt||ƒ }
}| ||
ƒ¡ | |	||
 ƒ¡ ||kr’||d …= |S )Nri   Ú	NumShortsé €  éÿ  )ÚboolrÅ   r×   rã   r-  r   Úextend)rw   r…   r}   rŽ   rP   ÚregionCountÚ	wordCountÚ	longWordsZreadBigArrayZreadSmallArrayÚn1Ún2r-   r-   r.   r{   Þ  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 )Nri   rP  rQ  rR  rÏ  r   )rS  rÙ   rå   rÈ   r-  r   ÚwriteSmallArray)rw   rœ   r}   rŽ   rP   r¡   rU  rV  rW  ZwriteBigArrayrZ  rX  rY  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.   rO  Ý  s   
rO  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   ÚdecompileDeltas_)rw   r@  r}   r-   r-   r.   r{     s    zTupleValues.readNc                 C   s   t t |¡ƒS r)   )Úbytesr   ÚcompileDeltaValues_)rw   rœ   r}   rŽ   rP   r¡   r-   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 )Ú	CFF2IndexNra   )Ú	itemClassÚitemConverterClassr@   c                C   s4   t j| |||||d� || _|d ur*|ƒ nd | _d S rÐ  )r`   rx   Ú
_itemClassÚ
_converter)rw   rX   rY   rZ   rN   r`  ra  r@   r-   r-   r.   rx      s    ÿÿzCFF2Index.__init__c                    s  ˆ  ¡ ‰ ˆ dkrg S ˆ ¡ ‰dd„ ‰ˆˆˆƒ}ˆjduo>ˆ dk}|sâ|ˆ d ƒ}g }| d¡}ˆ |d ¡ |D ]l}	||	ks€J ‚ˆ |	| ¡}
ˆjd ur¶ˆ ¡ }| |
ˆˆj¡ |}
nˆjd urÎˆj 	|
ˆ¡}
| 
|
¡ |	}qp|S ‡ ‡‡‡‡‡fdd„}|ƒ }t|gˆ  ƒ}|S d S )	Nr   c                 S   s   | j | j| j| jdœ| S )NrA  rF  )r…   ÚoffSizer-   r-   r.   ÚgetReadArray9  s    üûz$CFF2Index.read.<locals>.getReadArrayFry   r   c                     sH   ˆ  ¡ ‰ˆj‰ˆˆd ˆ  d ‰ ˆˆˆƒ‰‡ ‡‡‡‡‡‡	fdd„} | S )Nr   c                    s†   ˆ  ˆ| ˆ  ¡ ˆdƒ}ˆ  ˆ |d  ¡ ˆ |d |d  ¡}ˆjd urjˆ ¡ }| |ˆˆj¡ |}nˆjd ur‚ˆj |ˆ¡}|S )NrÕ   r   r   )rz   r>  rb  rD  Ú
localStaterc  r{   )r|   rÇ  rÉ  Úobj)Údata_posr}   rd  Ú
offset_posr‘   r   rw   r-   r.   r�   `  s    

z8CFF2Index.read.<locals>.get_read_item.<locals>.read_itemr‚   r„   ©r�   r}   re  rd  r…   rw   )rh  ri  r‘   r   r.   r†   Z  s    
z%CFF2Index.read.<locals>.get_read_item)rÍ   rç   r‰   Úpopr>  rb  rD  rf  rc  r{   rT   r   )rw   r…   r}   rŽ   r‘   r‰   rÇ  rX  Ú
lastOffsetrd  rÉ  rg  r†   r�   r�   r-   rj  r.   r{   3  s8    




zCFF2Index.readc                    sô   |}ˆ  t|ƒ¡ t|ƒsd S ˆjd ur<‡ fdd„|D ƒ}n&ˆjd u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-   rF  ©r‡   rÉ  rŠ  r-   r.   r‹    r0   z#CFF2Index.write.<locals>.<listcomp>c              	      s$   g | ]\}}ˆj  ˆˆ ˆ||¡‘qS r-   )rc  r™   )r‡   r|   rÉ  ©r}   rw   rŽ   rœ   r-   r.   r‹  �  s   ÿc                 S   s   g | ]}t |ƒ‘qS r-   )rB  rm  r-   r-   r.   r‹  †  r0   r   )Úinitialrr  é   i   rÕ   i   rì   rÂ   rA  )rÐ   rB  rb  rc  r˜   rŒ  r%   ré   rê   rà   rN  rÑ   rC  )rw   rœ   r}   rŽ   rP   r¡   rX  rÇ  rl  rd  rŸ   rÉ  r-   rn  r.   r™   w  s8    

þÿý
üûzCFF2Index.writec                 C   sJ   | j d ur&|   ¡ }| d |||¡ |S | jd ur@| j |||¡S tƒ ‚d S r)   )rb  rP  rc  r¥   r–   )rw   r£   r¤   r}   rg  r-   r-   r.   r¥   œ  s    

zCFF2Index.xmlReadc              
   C   sz   | j d ur4t|ƒD ]\}}| ||d|fg|¡ qnB| jd urpt|ƒD ]&\}}| j |||||d|fg ¡ qFntƒ ‚d S )Nr  )rb  r˜   rH  rc  r¨   r–   )rw   r§   r}   r�   rX   r£   r|   rÉ  r-   r-   r.   r¨   ¦  s    

ÿzCFF2Index.xmlWrite)N)N)rR   r°   r±   rx   r{   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ignoreLigaturesry   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.   rq  ³  s   rq  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(  r{   r—   r*  r-   r.   r{   Ë  s    z_UInt8Enum.readc                 C   s   t | j| ¡ ƒS r)   )r  rs  Úupperr  r-   r-   r.   r·   Î  s    z_UInt8Enum.fromStringc                 C   s   |   |¡j ¡ S r)   )rs  rX   Úlowerr  r-   r-   r.   r¶   Ò  s    z_UInt8Enum.toString)
rR   r°   r±   r‹   rs  r{   r  r·   r¶   r-  r-   r-   r*  r.   rr  È  s   
rr  c                   @   s   e Zd ZeZdS )r!   N)rR   r°   r±   Ú_ExtendModers  r-   r-   r-   r.   r!   ×  s   r!   c                   @   s   e Zd ZeZdS )r"   N)rR   r°   r±   Ú_CompositeModers  r-   r-   r-   r.   r"   Û  s   r"   )ra  )r`  c                 C   s   t t| d�S ©N)rN   )r&   r}  ©ÚCr-   r-   r.   r/     r0   c                 C   s   t t| d�S rx  )r&   rÂ  ry  r-   r-   r.   r/     r0   c                 C   s   t t| d�S rx  )r&   rê  ry  r-   r-   r.   r/     r0   c                 C   s   t t| d�S rx  )r&   rQ   ry  r-   r-   r.   r/     r0   c                 C   s   t t| d�S rx  )r&   ri  ry  r-   r-   r.   r/     r0   c                 C   s   t t| d�S rx  )r&   rk  ry  r-   r-   r.   r/     r0   ).Zint8Úint16Zint32r6   r2   Úuint24r7   Úchar64rÒ   rÓ   r/  rö   rù   r  r  r  r   r#  r%  r.  rè  ÚOffsetÚLOffsetÚOffset24rx  r0  r>  rO  rq  r!   r"   r  Ú	TupleListÚVarCompositeGlyphListr$  r,  rA   rB   rC   r    r}  rÂ  rê  ZOffsetToZ	LOffsetToZLOffset24To){ÚfontTools.misc.fixedToolsr   r  r   r  r   r  r   r  r   r0  r   r1  Ú%fontTools.ttLib.tables.TupleVariationr   ÚfontTools.misc.roundToolsr	   r
   ÚfontTools.misc.textToolsr   r   r   r   r   ZfontTools.misc.lazyToolsr   ÚfontTools.ttLibr   r|  r   r   r   r   r   ÚotTablesr   r   r   r   r   r   r   r   r    r!   rv  r"   rw  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/  r5  rL   rJ   rQ   ri  rk  r:   r8   r9   r;   r1   rx  r}  rÂ  rÎ  rê  r$  r,  r0  r>  rO  r[  r_  rq  rr  rK   r-   r-   r-   r.   Ú<module>   sþ    8
@h


G"		   ;   5"/503 

Ï