a
    èÝEb5ä  ã                +   @   s  d dl mZmZmZmZm	Z
mZ d dlmZmZ d dlmZmZmZmZmZ d dlmZ ddlmZmZmZmZmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z(m)Z* d dl+m,Z, d d	l-m.Z. d d
l/Z/d d
l0Z0e0 1e2¡Z3dd„ Z4dd„ Z5G dd„ de6ƒZ7zd dl8m9Z9 W n  e:�y&   d dl9m9Z9 Y n0 G dd„ de9ƒZ;G dd„ de<ƒZ=G dd„ de=ƒZ>G dd„ de>ƒZ?G dd„ de>ƒZ@G dd„ de@ƒZAG dd„ de@ƒZBG d d!„ d!eBƒZCG d"d#„ d#e?eBƒZDG d$d%„ d%e@ƒZEG d&d'„ d'e@ƒZFG d(d)„ d)e@ƒZGG d*d+„ d+e@ƒZHG d,d-„ d-e@ƒZIG d.d/„ d/e@ƒZJG d0d1„ d1eJeHƒZKG d2d3„ d3eJeFƒZLG d4d5„ d5eJeBƒZMG d6d7„ d7e>ƒZNG d8d9„ d9e>ƒZOG d:d;„ d;eOƒZPG d<d=„ d=eFƒZQG d>d?„ d?eFƒZRG d@dA„ dAe>ƒZSG dBdC„ dCeSƒZTG dDdE„ dEeSƒZUG dFdG„ dGeSƒZVG dHdI„ dIeVƒZWG dJdK„ dKe>ƒZXG dLdM„ dMe>ƒZYG dNdO„ dOe=ƒZZG dPdQ„ dQeZƒZ[G dRdS„ dSeZƒZ\G dTdU„ dUe\ƒZ]G dVdW„ dWe\ƒZ^G dXdY„ dYeZƒZ_G dZd[„ d[e\ƒZ`G d\d]„ d]e]e`ƒZaG d^d_„ d_e\ƒZbG d`da„ dae@ƒZcG dbdc„ dcecƒZdG ddde„ dee=ƒZeG dfdg„ dge=ƒZfG dhdi„ die=ƒZgG djdk„ dke=ƒZhG dldm„ dme=ƒZiG dndo„ doe=ƒZjG dpdq„ dqe=ƒZkG drds„ dse=ƒZlG dtdu„ due=ƒZmG dvdw„ dweFƒZnG dxdy„ dyeHƒZoG dzd{„ d{eoƒZ'G d|d}„ d}eoƒZ)eGeEeHeFeIeBeYeCeDeXeNeOePeQeTeUeVeWeZe\e]e^edekelemene'e)eReieje[e[e[egd~d„ dd„ d€d„ d�d„ d‚d„ dƒd„ d„œ*Zpd
S )…é    )ÚfixedToFloatÚfloatToFixedÚfloatToFixedToStrÚstrToFixedToFloatÚensureVersionIsLongÚversionToFixed)ÚnearestMultipleShortestReprÚotRound)Ú	bytesjoinÚtobytesÚtostrÚpadÚsafeEval)ÚgetSearchRangeé   )ÚCountReferenceÚFormatSwitchingBaseTableÚOTTableReaderÚOTTableWriterÚValueRecordFactory)
ÚlookupTypesÚAATStateTableÚAATStateÚ	AATActionÚContextualMorphActionÚLigatureMorphActionÚInsertionMorphActionÚMorxSubtableÚ
ExtendModeÚCompositeMode)Úzip_longest)ÚpartialNc                 C   s
   t | tƒS ©N)Ú
isinstanceÚtuple)Út© r&   úc/home/ja/django-apps/lartica_env/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ƒ}
|
|||ƒ}|jræ|j}n|dv rú| |¡}n
| |	¡}|j�s||_|dv �r\|d |_|j ¡ D ]*}| ¡ D ]}t||||ƒ||j< �q<�q0|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)Úuint8r+   Úuint32ÚSubTableÚExtSubTableÚ	SubStructÚFeatureParams)ZCIDGlyphMappingZGlyphCIDMappingú()Ú	MortChainÚMortSubtableÚ	MorxChain)r1   r2   r3   r   ÚfeatureParamTypes)Ú
startswithr*   ÚendswithÚComputedUInt8ÚComputedUShortÚComputedULongr1   r2   r3   r4   ÚStructWithLengthÚconverterMappingÚStructÚevalÚ
tableClassÚgetr   ÚvaluesÚTableÚ__name__r9   ÚdefaultFeatureParamsÚappend)Z	tableSpecZtableNamespaceÚ
convertersZconvertersByNameÚtpÚnameÚrepeatÚauxÚdescrZ	tableNameZconverterClassÚconvrC   r%   Úclsr&   r&   r'   ÚbuildConverters   sd    
ýü







rR   c                   @   s   e Zd ZdZdS )Ú_MissingItemr&   N)rG   Ú
__module__Ú__qualname__Ú	__slots__r&   r&   r&   r'   rS   ]   s   rS   )ÚUserListc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú	_LazyListc                 C   s   |   t||ƒ¡S r"   )Ú__getitem__Úslice)ÚselfÚiÚjr&   r&   r'   Ú__getslice__i   s    z_LazyList.__getslice__c                    s€   t |tƒr.t| tˆ ƒ¡Ž }‡ fdd„|D ƒS ˆ j| }t |tƒr|ˆ j ˆ j	|d ˆ j
  ¡ ˆ j ˆ jˆ ji ¡}|ˆ j|< |S )Nc                    s   g | ]}ˆ | ‘qS r&   r&   ©Ú.0r\   ©r[   r&   r'   Ú
<listcomp>o   r)   z)_LazyList.__getitem__.<locals>.<listcomp>r   )r#   rZ   ÚrangeÚindicesÚlenÚdatarS   ÚreaderÚseekÚposÚ
recordSizerP   ÚreadÚfont)r[   Úkrd   Úitemr&   ra   r'   rY   l   s    



z_LazyList.__getitem__c                 C   s0   t |tƒrt|ƒ}nt |tƒr ntS t| ƒ| S r"   )r#   rX   ÚlistÚNotImplemented©r[   Úotherr&   r&   r'   Ú__add__w   s    


z_LazyList.__add__c                 C   s   t |tƒstS |t| ƒ S r"   )r#   ro   rp   rq   r&   r&   r'   Ú__radd__€   s    
z_LazyList.__radd__N)rG   rT   rU   r^   rY   rs   rt   r&   r&   r&   r'   rX   g   s   	rX   c                   @   sT   e Zd ZdZ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dS )ÚBaseConverterzYBase class for converter objects. Apart from the constructor, this
	is an abstract class.Nc                 C   sN   || _ || _|| _|| _| d¡p(|dv | _| d¡p<|dk| _|dv | _d S )Nr,   )ÚDesignAxisRecordSizeÚValueRecordSizeZ
LookupTyper.   )Z
ClassCountZClass2CountZ
FeatureTagZSettingsCountÚVarRegionCountÚMappingCountZRegionAxisCountZDesignAxisCountrv   ZAxisValueCountrw   Z	AxisCountZBaseGlyphRecordCountZLayerRecordCount)rL   rM   rN   rC   r;   ZisCountZisLookupTypeÚisPropagated©r[   rL   rM   rN   rC   r&   r&   r'   Ú__init__‹   s    zBaseConverter.__init__c           	      C   s°   |j o|dk}|r(|  |¡}|tu r(d}|sVg }t|ƒD ]}| |  |||¡¡ q8|S tƒ }| ¡ |_|jj	|_	||_
| |_||_| dd„ t|ƒD ƒ¡ | || ¡ |S dS )z(Read an array of values from the reader.é   Fc                 s   s   | ]}t |gƒV  qd S r"   )rS   r_   r&   r&   r'   Ú	<genexpr>¶   r)   z*BaseConverter.readArray.<locals>.<genexpr>N)ÚlazyÚgetRecordSizerp   rc   rI   rk   rX   Úcopyrg   ri   rl   rP   rj   ÚextendÚadvance)	r[   rg   rl   Ú	tableDictÚcountr   rj   Úlr\   r&   r&   r'   Ú	readArray£   s&    


zBaseConverter.readArrayc                 C   s   t | dƒr| jS tS )NÚ
staticSize)Úhasattrrˆ   rp   ©r[   rg   r&   r&   r'   r€   º   s    zBaseConverter.getRecordSizec                 C   s   t | ƒ‚dS )zRead a value from the reader.N©ÚNotImplementedError©r[   rg   rl   r„   r&   r&   r'   rk   ¾   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)r[   Úwriterrl   r„   rE   r\   ÚvalueÚer&   r&   r'   Ú
writeArrayÂ   s    zBaseConverter.writeArrayc                 C   s   t | ƒ‚dS )zWrite a value to the writer.Nr‹   ©r[   r’   rl   r„   r“   ÚrepeatIndexr&   r&   r'   r�   Ê   s    zBaseConverter.writec                 C   s   t | ƒ‚dS )zRead a value from XML.Nr‹   ©r[   ÚattrsÚcontentrl   r&   r&   r'   ÚxmlReadÎ   s    zBaseConverter.xmlReadc                 C   s   t | ƒ‚dS )zWrite a value to XML.Nr‹   ©r[   Ú	xmlWriterrl   r“   rL   r™   r&   r&   r'   ÚxmlWriteÒ   s    zBaseConverter.xmlWrite)N)N)rG   rT   rU   Ú__doc__r|   r‡   r€   rk   r•   r�   r›   rž   r&   r&   r&   r'   ru   †   s   

ru   c                   @   s4   e Zd Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zd	S )
ÚSimpleValuec                 C   s   | S 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)rG   rT   rU   Ú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¤   )ÚDEFAULTrI   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)rG   rT   rU   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   )Úintr¡   r&   r&   r'   r£   ñ   s    zIntValue.fromStringN©rG   rT   rU   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©r[   rg   rl   r„   r…   r&   r&   r'   r‡   ù   s    zLong.readArrayNc                 C   s   |  |¡ d S r"   )Ú	writeLongr–   r&   r&   r'   r�   û   s    z
Long.writec                 C   s   |  |¡ d S r"   )ÚwriteLongArray©r[   r’   rl   r„   rE   r&   r&   r'   r•   ý   s    zLong.writeArray)N©rG   rT   rU   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)rG   rT   rU   r§   r¢   r&   r&   r&   r'   r¿     s   r¿   c                   @   s   e Zd ZdZdS )ÚVarIndexì   ÿÿ N)rG   rT   rU   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�     s    zShort.writec                 C   s   |  |¡ d S r"   )ÚwriteShortArrayr¶   r&   r&   r'   r•     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�   $  s    zUShort.writec                 C   s   |  |¡ d S r"   )ÚwriteUShortArrayr¶   r&   r&   r'   r•   &  s    zUShort.writeArray)Nr·   r&   r&   r&   r'   rÈ     s
   
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   +  s    z	Int8.readc                 C   s
   |  |¡S r"   )ÚreadInt8Arrayr³   r&   r&   r'   r‡   -  s    zInt8.readArrayNc                 C   s   |  |¡ d S r"   )Z	writeInt8r–   r&   r&   r'   r�   /  s    z
Int8.writec                 C   s   |  |¡ d S r"   )ÚwriteInt8Arrayr¶   r&   r&   r'   r•   1  s    zInt8.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 )ÚUInt8r   c                 C   s   |  ¡ S r"   )Ú	readUInt8r�   r&   r&   r'   rk   6  s    z
UInt8.readc                 C   s
   |  |¡S r"   )ÚreadUInt8Arrayr³   r&   r&   r'   r‡   8  s    zUInt8.readArrayNc                 C   s   |  |¡ d S r"   )Z
writeUInt8r–   r&   r&   r'   r�   :  s    zUInt8.writec                 C   s   |  |¡ d S r"   )ÚwriteUInt8Arrayr¶   r&   r&   r'   r•   <  s    zUInt8.writeArray)Nr·   r&   r&   r&   r'   rÒ   4  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   A  s    zUInt24.readNc                 C   s   |  |¡ d S r"   ©ZwriteUInt24r–   r&   r&   r'   r�   C  s    zUInt24.write)N©rG   rT   rU   rˆ   rk   r�   r&   r&   r&   r'   rÖ   ?  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ž   G  s    zComputedInt.xmlWriteN©rG   rT   rU   rž   r&   r&   r&   r'   rÛ   F  s   rÛ   c                   @   s   e Zd ZdS )r<   N©rG   rT   rU   r&   r&   r&   r'   r<   L  s   r<   c                   @   s   e Zd ZdS )r=   NrÞ   r&   r&   r&   r'   r=   N  s   r=   c                   @   s   e Zd ZdS )r>   NrÞ   r&   r&   r&   r'   r>   P  s   r>   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   U  s    zTag.readNc                 C   s   |  |¡ d S r"   )ZwriteTagr–   r&   r&   r'   r�   W  s    z	Tag.write)NrÚ   r&   r&   r&   r'   rß   S  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•   a  s    zGlyphID.writeArrayNc                 C   s   |  | j| |¡¡ d S r"   )Z
writeValuerã   Ú
getGlyphIDr–   r&   r&   r'   r�   c  s    zGlyphID.write)N)	rG   rT   rU   rˆ   rã   r‡   rk   r•   r�   r&   r&   r&   r'   rà   Z  s   rà   c                   @   s   e Zd ZdZdZdS )Ú	GlyphID32r¯   ÚLN)rG   rT   rU   rˆ   rã   r&   r&   r&   r'   ræ   g  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“   rL   ú  zmissing from name tablez"name id %d missing from name table)r¥   rD   ZgetDebugNamer�   rÜ   ÚlogÚwarningr¦   )r[   r�   rl   r“   rL   r™   Z	nameTabler&   r&   r'   rž   m  s    



zNameID.xmlWriteNrÝ   r&   r&   r&   r'   rè   l  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¥   rI   r�   rÜ   Újoinr¦   ©r[   r�   rl   r“   rL   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dZdd„ Zddd„Zedd„ ƒZed	d
„ ƒZdS )ÚFixedr¯   c                 C   s   t | ¡ dƒS ©Né   )Úfi2flr±   r�   r&   r&   r'   rk   —  s    z
Fixed.readNc                 C   s   |  t|dƒ¡ d S rø   )r´   Úfl2fir–   r&   r&   r'   r�   ™  s    zFixed.writec                 C   s
   t | dƒS rø   ©Ústr2flr¡   r&   r&   r'   r£   ›  s    zFixed.fromStringc                 C   s
   t | dƒS rø   ©Úfl2strr¡   r&   r&   r'   r¢   ž  s    zFixed.toString)N©	rG   rT   rU   rˆ   rk   r�   r§   r£   r¢   r&   r&   r&   r'   r÷   •  s   

r÷   c                   @   s:   e Zd ZdZdd„ Zddd„Zedd„ ƒZed	d
„ ƒZdS )ÚF2Dot14rÃ   c                 C   s   t | ¡ dƒS ©Né   )rú   rÄ   r�   r&   r&   r'   rk   ¤  s    zF2Dot14.readNc                 C   s   |  t|dƒ¡ d S r  )rÆ   rû   r–   r&   r&   r'   r�   ¦  s    zF2Dot14.writec                 C   s
   t | dƒS r  rü   r¡   r&   r&   r'   r£   ¨  s    zF2Dot14.fromStringc                 C   s
   t | dƒS r  rþ   r¡   r&   r&   r'   r¢   «  s    zF2Dot14.toString)Nr   r&   r&   r&   r'   r  ¢  s   

r  c                       sF   e Zd ZdZ‡ fdd„Zd‡ fdd„	Zedd„ ƒZed	d
„ ƒZ‡  Z	S )ÚAngleg     €†?c                    s   t ƒ  |||¡d S )Né´   )Úsuperrk   r�   ©Ú	__class__r&   r'   rk   ³  s    z
Angle.readNc                    s   t ƒ j||||d |d� d S )Nr  ©r—   )r  r�   r–   r  r&   r'   r�   µ  s    zAngle.writec                 C   s   t t|ƒ| j ƒ| j S r"   )r	   rò   Úfactor©rQ   r“   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)N)
rG   rT   rU   r
  rk   r�   Úclassmethodr£   r¢   Ú__classcell__r&   r&   r  r'   r  ¯  s   
r  c                   @   sF   e Zd ZdZdd„ Zddd„Zedd„ ƒZed	d
„ ƒZedd„ ƒZ	dS )ÚVersionr¯   c                 C   s$   |  ¡ }|d? dks J d| ƒ‚|S ©Nrù   r   zUnsupported version 0x%08xr°   )r[   rg   rl   r„   r“   r&   r&   r'   rk   Á  s    zVersion.readNc                 C   s.   t |ƒ}|d? dks J d| ƒ‚| |¡ 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 rø   )rû   )Úvr&   r&   r'   Ú	fromFloatÏ  s    zVersion.fromFloat)N)
rG   rT   rU   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")ZreadDatarˆ   Úfindr   rê   rë   )r[   rg   rl   r„   rf   Z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ë   re   rˆ   Ú	writeData)r[   r’   rl   r„   r“   r—   rf   r&   r&   r'   r�   ç  s    ÿÿzChar64.write)N)rG   rT   rU   rŸ   rˆ   rk   r�   r&   r&   r&   r'   r  Ô  s   r  c                   @   s>   e Zd Zdd„ Zdd„ Zddd„Zdd	„ Zd
d„ Zdd„ ZdS )rA   c                 C   s   | j o| j  |¡S r"   )rC   r€   rŠ   r&   r&   r'   r€   õ  s    zStruct.getRecordSizec                 C   s   |   ¡ }| ||¡ |S r"   )rC   Ú	decompile)r[   rg   rl   r„   Útabler&   r&   r'   rk   ø  s    zStruct.readNc                 C   s   |  ||¡ d S r"   )Úcompiler–   r&   r&   r'   r�   ý  s    zStruct.writec                 C   s@   |d u r*|r<|  ||dg ¡ | ¡  q<n|j||||d� d S )N)Úemptyr   )rL   )r¥   r¦   ÚtoXMLrœ   r&   r&   r'   rž      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 )Nr$  ÚFormatZpostReadFTÚ_propagator)Ú
propagator)r   rC   rD   r¬   r&  r‰   ÚgetConvertersrz   r'  rL   Úsetattrr   Ú__dict__r#   r$   ÚfromXMLZpopulateDefaultsÚgetattr)r[   r™   rš   rl   r"  r&  Z
noPostReadZcleanPropagationrP   r(  ÚelementrL   r&   r&   r'   r›     sB    




zStruct.xmlReadc                 C   s   dt | jƒ S )Nz
Struct of )ÚreprrC   ra   r&   r&   r'   Ú__repr__7  s    zStruct.__repr__)N)	rG   rT   rU   r€   rk   r�   rž   r›   r0  r&   r&   r&   r'   rA   ó  s   
*rA   c                   @   s   e Zd Zdd„ Zddd„ZdS )r?   c                 C   s.   |j }|  ¡ }| ||¡ | ||j ¡ |S r"   )ri   rC   r!  rh   r-   )r[   rg   rl   r„   ri   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°J ‚| ¡ |j|< d S )Nr-   r   éÞ   i­Þ  ì   ï>[= )r   rÃ   r¯   ó   Þ­¾ï)rŽ   r)  rL   re   Úitemsr#   r   rˆ   ÚgetDataLengthr-   r#  ÚgetSubWriterr�   Ú
getAllData)r[   r’   rl   r„   r“   r—   Z	convIndexrP   ÚlengthIndexZdeadbeefÚbeforeÚlengthZlengthWriterr&   r&   r'   r�   C  s"    

ÿzStructWithLength.write)N©rG   rT   rU   rk   r�   r&   r&   r&   r'   r?   ;  s   r?   c                   @   s2   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	d
„ZdS )rF   rÃ   c                 C   s   |  ¡ S r"   rÉ   rŠ   r&   r&   r'   Ú
readOffset[  s    zTable.readOffsetc                 C   s   |  d¡ d S r«   rÌ   ©r[   r’   r&   r&   r'   ÚwriteNullOffset^  s    zTable.writeNullOffsetc                 C   sL   |   |¡}|dkrd S |  ¡ }| |¡}|jr<||_||_n| ||¡ |S r«   )r<  rC   ÚgetSubReaderr   rg   rl   r!  )r[   rg   rl   r„   Úoffsetr"  r&   r&   r'   rk   a  s    

z
Table.readNc                 C   sR   |d u r|   |¡ n:|j| jd�}| j|_|d ur8||_| |¡ | ||¡ d S )N©Z
offsetSize)r>  r6  rˆ   rL   r—   ÚwriteSubTabler#  )r[   r’   rl   r„   r“   r—   Ú	subWriterr&   r&   r'   r�   n  s    
zTable.write)N)rG   rT   rU   rˆ   r<  r>  rk   r�   r&   r&   r&   r'   rF   W  s
   rF   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¼   r=  r&   r&   r'   r>  €  s    zLTable.writeNullOffsetN©rG   rT   rU   rˆ   r<  r>  r&   r&   r&   r'   rD  y  s   rD  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Ù   r=  r&   r&   r'   r>  Œ  s    zTable24.writeNullOffsetNrE  r&   r&   r&   r'   rF  …  s   rF  c                       s$   e Zd Zdd„ Z‡ fdd„Z‡  ZS )r3   c                 C   s$   | j | | }|  | j| j| j|¡S r"   ©r   r  rL   rM   rN   ©r[   Z	tableTypeZ
lookupTyperC   r&   r&   r'   ÚgetConverter“  s    zSubStruct.getConverterc                    s   t t| ƒ |||d |¡ d S r"   )r  r3   rž   rœ   r  r&   r'   rž   —  s    zSubStruct.xmlWrite©rG   rT   rU   rI  rž   r  r&   r&   r  r'   r3   ’  s   r3   c                       s$   e Zd Zdd„ Z‡ fdd„Z‡  ZS )r1   c                 C   s$   | j | | }|  | j| j| j|¡S r"   rG  rH  r&   r&   r'   rI  ›  s    zSubTable.getConverterc                    s   t t| ƒ |||d |¡ d S r"   )r  r1   rž   rœ   r  r&   r'   rž   Ÿ  s    zSubTable.xmlWriterJ  r&   r&   r  r'   r1   š  s   r1   c                   @   s   e Zd Zddd„ZdS )r2   Nc                 C   s   d|_ t | |||||¡ d S )NT)Ú	ExtensionrF   r�   r–   r&   r&   r'   r�   ¤  s    zExtSubTable.write)N)rG   rT   rU   r�   r&   r&   r&   r'   r2   ¢  s   r2   c                   @   s   e Zd Zdd„ ZdS )r4   c                 C   s&   | j  || j¡}|  | j| j| j|¡S r"   )r9   rD   rH   r  rL   rM   rN   )r[   Z
featureTagrC   r&   r&   r'   rI  ª  s    zFeatureParams.getConverterN)rG   rT   rU   rI  r&   r&   r&   r'   r4   ©  s   r4   c                   @   s,   e Zd ZdZd	dd„Zdd„ Zd
dd„ZdS )r*   rÃ   Nc                 C   s0   t  | ||||¡ d|d dkr$dnd | _d S )Nr*   éÿÿÿÿÚ2Ú1)ru   r|   Úwhichr{   r&   r&   r'   r|   ±  s    zValueFormat.__init__c                 C   s   |  ¡ }t|ƒ|| j< |S r"   )rÊ   r   rO  ©r[   rg   rl   r„   Úformatr&   r&   r'   rk   ´  s    zValueFormat.readc                 C   s   |  |¡ t|ƒ|| j< d S r"   )rÍ   r   rO  )r[   r’   rl   r„   rQ  r—   r&   r&   r'   r�   ¸  s    
zValueFormat.write)N)N)rG   rT   rU   rˆ   r|   rk   r�   r&   r&   r&   r'   r*   ¯  s   
r*   c                   @   s6   e Zd Zdd„ Zdd„ Zddd„Zdd	„ Zd
d„ ZdS )ÚValueRecordc                 C   s   dt || j ƒ S ©NrÃ   )re   rO  rŠ   r&   r&   r'   r€   ¾  s    zValueRecord.getRecordSizec                 C   s   || j   ||¡S r"   )rO  ZreadValueRecordr�   r&   r&   r'   rk   À  s    zValueRecord.readNc                 C   s   || j   |||¡ d S r"   )rO  ZwriteValueRecordr–   r&   r&   r'   r�   Â  s    zValueRecord.writec                 C   s    |d u r
n|  ||| j|¡ d S r"   )r%  rL   rœ   r&   r&   r'   rž   Ä  s    zValueRecord.xmlWritec                 C   s&   ddl m} |ƒ }| d |||¡ |S )Nr   )rR  )ÚotBaserR  r,  )r[   r™   rš   rl   rR  r“   r&   r&   r'   r›   É  s    zValueRecord.xmlRead)N)rG   rT   rU   r€   rk   r�   rž   r›   r&   r&   r&   r'   rR  ½  s
   
rR  c                   @   s®   e Zd ZdZ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õ   c                 C   sJ   t  | ||||¡ t| jtƒr2| jdd d d�| _ntdd d | jd�| _d S )NÚValue)rL   rM   rN   )rL   rM   rN   rC   )ru   r|   Ú
issubclassrC   r    Ú	converterrF   r{   r&   r&   r'   r|   Ó  s    zAATLookup.__init__c                 C   s€   |  ¡ }|dkr|  ||¡S |dkr0|  ||¡S |dkrD|  ||¡S |dkrX|  ||¡S |dkrl|  ||¡S ds|J d| ƒ‚d S )Nr   rÃ   r¯   é   r}   Fzunsupported lookup format: %d)rÊ   ÚreadFormat0ÚreadFormat2ÚreadFormat4ÚreadFormat6ÚreadFormat8rP  r&   r&   r'   rk   Ú  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©rl   r&   r'   rb   ê  s   ÿz#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	ro   Úsortedr4  ÚfilterÚbuildFormat0ÚbuildFormat2ÚbuildFormat6ÚbuildFormat8r5  )r[   r’   rl   r„   r“   r—   rE   ÚformatsZdataSizeZlookupFormatZwriteMethodri   Z
actualSizer&   rb  r'   r�   é  s$    ÿ
ü

ÿÿzAATLookup.writec                 C   sH   |   |¡ |   |¡ t||d�\}}}|   |¡ |   |¡ |   |¡ d S )N)ÚnZitemSize)rÍ   r   )r’   ÚnumUnitsÚunitSizeZsearchRangeZentrySelectorZ
rangeShiftr&   r&   r'   ÚwriteBinSearchHeaderý  s    


ÿ

zAATLookup.writeBinSearchHeaderc                    sD   t ˆ  ¡ ƒ}t ˆƒ|krd S ˆjj}d||  d‡ ‡‡‡fdd„fS )NrÃ   r   c                      s   ˆ  ˆˆ ˆ¡S r"   )ÚwriteFormat0r&   ©rl   r[   rE   r’   r&   r'   r(     r)   z(AATLookup.buildFormat0.<locals>.<lambda>)re   ÚgetGlyphOrderrX  rˆ   )r[   r’   rl   rE   Ú	numGlyphsÚ	valueSizer&   ro  r'   re    s    ÿzAATLookup.buildFormat0c                 C   s2   |  d¡ |D ]\}}| jj||d |d d� qd S )Nr   ©r„   r“   r—   )rÍ   rX  r�   )r[   r’   rl   rE   ZglyphID_r“   r&   r&   r'   rn    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&   ©rl   Úsegmentsr[   r’   r&   r'   r(   %  r)   z(AATLookup.buildFormat2.<locals>.<lambda>)rI   rX  rˆ   re   ÚBIN_SEARCH_HEADER_SIZE)r[   r’   rl   rE   ZsegStartZsegValueZsegEndÚglyphIDZcurValuerr  rk  rl  r&   ru  r'   rf    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¯   rs  éÿÿ  r  ©rÍ   rX  rˆ   re   rm  r�   r   )
r[   r’   rl   rv  rr  rk  rl  Z
firstGlyphZ	lastGlyphr“   r&   r&   r'   rt  '  s    


þ

zAATLookup.writeFormat2c                    sD   ˆj j}tˆƒ|d  }}dˆj |d |  d‡ ‡‡‡fdd„fS )NrÃ   r   rY  c                      s   ˆ  ˆˆ ˆ¡S r"   )ÚwriteFormat6r&   ro  r&   r'   r(   :  r)   z(AATLookup.buildFormat6.<locals>.<lambda>)rX  rˆ   re   rw  )r[   r’   rl   rE   rr  rk  rl  r&   ro  r'   rg  6  s
    ÿzAATLookup.buildFormat6c           	      C   s|   |  d¡ | jj}t|ƒ|d  }}|  |||¡ |D ](\}}|  |¡ | jj||d |d d� q6|  d¡ | d| ¡ d S )NrY  rÃ   rs  ry  r  rz  )	r[   r’   rl   rE   rr  rk  rl  rx  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   rL  r   rY  r}   c                      s   ˆ  ˆˆ ˆ¡S r"   )ÚwriteFormat8r&   ro  r&   r'   r(   O  r)   z(AATLookup.buildFormat8.<locals>.<lambda>)re   rX  rˆ   )r[   r’   rl   rE   Z
minGlyphIDZ
maxGlyphIDrr  r&   ro  r'   rh  I  s    ÿzAATLookup.buildFormat8c                 C   sV   |d d }|  d¡ |  |¡ |  t|ƒ¡ |D ]\}}| jj||d |d d� q2d S )Nr   r}   rs  )rÍ   re   rX  r�   )r[   r’   rl   rE   ZfirstGlyphIDÚ_r“   r&   r&   r'   r|  Q  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`   rm   r“   rb  r&   r'   Ú
<dictcomp>_  s   ÿz)AATLookup.readFormat0.<locals>.<dictcomp>)re   rp  rX  r‡   rŽ   )r[   rg   rl   rq  rf   r&   rb  r'   rZ  [  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„   ry  r   ©ri   rÊ   rX  rˆ   rc   rh   rk   rä   )r[   rg   rl   Úmappingri   rl  rk  r\   ÚlastÚfirstr“   rm   r&   r&   r'   r[  b  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Ã   rY  r‚  ry  r   r   r~  )	ri   rÊ   rc   rh   r?  rX  r‡   rŽ   rä   )r[   rg   rl   r…  ri   rl  r\   r†  r‡  r@  Ú
dataReaderrf   rm   r  r&   r&   r'   r\  q  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ƒ  ry  r„  )	r[   rg   rl   r…  ri   rl  r\   rx  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‡  rl   r&   r'   r�  ˜  s   ÿz)AATLookup.readFormat8.<locals>.<dictcomp>)rÊ   rX  r‡   rŽ   )r[   rg   rl   r…   rf   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$   rX  r›   )	r[   r™   rš   rl   r“   r.  rL   Ú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“   rL   r™   )Úbegintagr¦   rc  r4  rX  rž   Úendtag)r[   r�   rl   r“   rL   r™   r`  r&   r&   r'   rž   ¤  s    
þ
zAATLookup.xmlWrite)N)rG   rT   rU   rw  r|   rk   r�   r§   rm  re  rn  rf  rt  rg  r{  rh  r|  rZ  r[  r\  r]  r^  r›   rž   r&   r&   r&   r'   rU  Ð  s*   

	
	rU  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º   r?  rU  rÈ   rk   r4  rC   r!  )r[   rg   rl   r„   ZlookupOffsetZ
dataOffsetÚlookupReaderÚlookupÚoffsetsÚresultr`  r@  rˆ  rn   r&   r&   r'   rk   ·  s    

zAATLookupWithDataOffset.readNc                 C   sè   i i d  }}}g }	t ||jd�D ]`}
tƒ }||
  ||¡ | ¡ }| |d ¡}|d krz|}|t|ƒ }|||< |	 |¡ |||
< q"|jdd�}t	dd d t
ƒ}| ||||d ¡ |jdd�}| |¡ | |¡ |	D ]}| |¡ qÔd S )Nr   )Úkeyr¯   rA  r‘  )rc  rå   r   r#  r7  rD   re   rI   r6  rU  rÈ   r�   rB  r   )r[   r’   rl   r„   r“   r—   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDatar`  rC  rf   r@  ÚlookupWriterr“  Z
dataWriterÚdr&   r&   r'   r�   Å  s*    




zAATLookupWithDataOffset.writec                 C   s   t dd d | jƒ}| |||¡S r�  )rU  rC   r›   )r[   r™   rš   rl   r“  r&   r&   r'   r›   è  s    zAATLookupWithDataOffset.xmlReadc                 C   s&   t dd d | jƒ}| |||||¡ d S r�  )rU  rC   rž   )r[   r�   rl   r“   rL   r™   r“  r&   r&   r'   rž   ì  s    z AATLookupWithDataOffset.xmlWrite)N©rG   rT   rU   rk   r�   r›   rž   r&   r&   r&   r'   r�  ¶  s   
#r�  c                   @   s^   e Zd ZdddddœZdd„ e ¡ D ƒZ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–  ra  r&   r&   r'   r�  ú  s   z MorxSubtableConverter.<dictcomp>c                 C   s   t  | |||¡ d S r"   )ru   r|   )r[   rL   rM   rN   r&   r&   r'   r|   þ  s    zMorxSubtableConverter.__init__c                 C   s2   |d@ dkrd|_ n|d@ dkr(d|_ nd|_ d S )Né    r   ÚAnyé€   ÚVerticalÚ
Horizontal)ÚTextDirection)r[   rð   Zsubtabler&   r&   r'   Ú"_setTextDirectionFromCoverageFlags  s
    z8MorxSubtableConverter._setTextDirectionFromCoverageFlagsc                 C   s   |j }tƒ }| ¡ |_| ¡ }|d@ dk|d@ dkf}| j| |_|  ||¡ | ¡ |_	| j	|d@ d> O  _	| ¡ |_
| ¡ |_td  |j
¡}|d u r¬ds¬J d|j
 ƒ‚|j | }	|j|j |j |j |	 … }
t|
ƒ|j|	 ksèJ ‚t|
|jd�}|ƒ |_|j ||¡ | ||j ¡ |S )	Nr  r   rù   é   ZmorxFz!unsupported 'morx' lookup type %s)rf   ÚtableTag)ri   r   rº   r-   rÓ   Ú_PROCESSING_ORDERSÚProcessingOrderr¢  rÊ   ÚReservedr.   ÚSubFeatureFlagsr   rD   rf   re   r   r¤  r3   r!  rh   )r[   rg   rl   r„   ri   Úmrð   ÚorderKeyrC   ZheaderLengthrf   Z	subReaderr&   r&   r'   rk   	  s8    



ÿ
ÿÿzMorxSubtableConverter.readc                 C   sÚ   |  ||¡ | ¡  | d|j ¡ | ¡  |jd|jd� | ¡  |jd|jd� | ¡  |jdkr‚|jdd|j d� | ¡  | d|j ¡ | ¡  |jd	d
|j	 d� | ¡  |j
 ||¡ | |¡ | ¡  d S )NzStructLength=%dr¡  r¡   r¦  r   r§  z0x%04xzMorphType=%dr¨  r  )r�  r¦   rÜ   r-   r¥   r¡  r¦  r§  r.   r¨  r3   r%  rŽ  rœ   r&   r&   r'   rž   '  s0    ÿ
ÿÿ
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“   r  rù   r¦  zunknown ProcessingOrder: %sr¡  >   r�  r   rŸ  zunknown TextDirection %sr§  r¨  ZMorphFr£  )r   r§  rd  Úistupler   r¥  r¦  r¢  Ú_PROCESSING_ORDERS_REVERSEDr¡  r¨  r;   r,  )
r[   r™   rš   rl   r©  ÚcovFlagsÚeltNameÚeltAttrsrŒ  rª  r&   r&   r'   r›   >  s<    

ÿÿÿ

zMorxSubtableConverter.xmlReadNc                 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   r  r�  rœ  r2  ry  r3  z>L)r§  r­  r¦  r¡  r«  re   r4  r5  r-   r#  ÚstructÚpack)r[   r’   rl   r„   r“   r—   r®  ZreverseOrderZlogicalOrderr8  r9  ZorigReservedr:  r&   r&   r'   r�   ]  s&    ÿ
zMorxSubtableConverter.write)N)rG   rT   rU   r¥  r4  r­  r|   r¢  rk   rž   r›   r�   r&   r&   r&   r'   rš  ñ  s   ûÿrš  c                   @   s–   e Zd Z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 )%Ú	STXHeaderc                 C   sZ   t  | ||||¡ t| jtƒs"J ‚tdd d tƒ| _t| jtƒrPtdd d t	ƒ| _
nd | _
d S )NÚGlyphClassesÚPerGlyphLookup)ru   r|   rW  rC   r   rU  rÈ   ÚclassLookupr   rà   ÚperGlyphLookupr{   r&   r&   r'   r|   w  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   ri   r?  rº   ÚGlyphClassCountrh   r·  rW  rC   r   rË   ÚLigComponentsÚ_readLigaturesÚ	Ligaturesr   r¶  rk   r´  r¬   rc   r   ÚStatesrI   rÊ   Ú_readTransitionÚTransitionsÚ_readPerGlyphLookupsÚPerGlyphLookups)r[   rg   rl   r„   r"  ri   ZclassTableReaderZstateArrayReaderZentryTableReaderÚactionReaderZligaturesReaderZperGlyphTableReaderZligComponentReaderZnumLigComponentsZ	numStatesÚ
stateIndexÚstateÚ
glyphClassÚ
entryIndexr&   r&   r'   rk   �  sl    








ÿÿÿ
ÿÿþÿÿzSTXHeader.readc                 C   s0   |   ¡ }| |j||j  ¡}| |||¡ |S r"   )rC   r?  ri   rˆ   r!  )r[   rg   rÅ  rl   rÁ  Ú
transitionZentryReaderr&   r&   r'   r½  ²  s    ÿzSTXHeader._readTransitionc                 C   s(   t |jƒ}||j d }| | |¡¡S rS  )re   rf   ri   râ   rË   )r[   rg   rl   ÚlimitZnumLigatureGlyphsr&   r&   r'   rº  ¹  s    
zSTXHeader._readLigaturesc                 C   sb   d}|j D ]R}|j ¡ D ]B}t|tƒr|jdkr@t||jd ƒ}|jdkrt||jd ƒ}qq
|S )Nr   ry  r   )r¼  r¾  rE   r#   r   Z	MarkIndexÚmaxZCurrentIndex)r[   r"  Ú
numLookupsrÃ  r%   r&   r&   r'   Ú_countPerGlyphLookups¾  s    


þ
þzSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t|  |¡ƒD ]6}| d¡}| || ¡  ¡ | | j ||i ¡¡ q|S r«   )	ri   rc   rÊ  r?  rh   rº   rI   r·  rk   )r[   r"  rg   rl   ri   Úlookupsr}  r’  r&   r&   r'   r¿  Ñ  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 )Nr	  rÃ   r   rù   r¯   )NNr   )r   r¶  r�   r´  r   r7  rÈ  rE   r·  rC   ZactionHeaderSizeZcompileActionsr¼  Ú_compileStatesre   Ú_compilePerGlyphLookupsÚ_compileLigComponentsÚ_compileLigaturesr½   r   )r[   r’   rl   r„   r“   r—   ZglyphClassWriterZglyphClassDataÚglyphClassCountZglyphClassTableOffsetZ
actionDataÚactionIndexÚstateArrayDataÚentryTableDataZstateArrayOffsetZentryTableOffsetZperGlyphOffsetZperGlyphDataZactionOffsetZligaturesOffsetZligComponentsOffsetZligComponentsDataZligaturesDatar&   r&   r'   r�   Û  sf    ÿ
ÿ
ÿÿ



















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   rc   r¾  r#  r7  re   rˆ   r/  rD   rI   rÍ   r   r
   )r[   rl   ZstatesrÐ  rÑ  ZstateArrayWriterÚentriesZentryIDsrÃ  rÄ  rÆ  ZentryWriterZ	entryDatarÅ  rÒ  rÓ  r&   r&   r'   rÌ    s6    

ÿýÿÿ

zSTXHeader._compileStatesc                 C   s€   | j d u rdS |  |¡}t|jƒ|ks<J dt|jƒ|f ƒ‚tƒ }|jD ].}|jdd�}| j  ||i |d ¡ | |¡ qH| ¡ S )Nr)   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr¯   rA  )	r·  rÊ  re   rÀ  r   r6  r�   rB  r7  )r[   r"  rl   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Í   r7  )r[   r"  rl   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å   r7  )r[   r"  rl   r’   Z	glyphNamer&   r&   r'   rÏ  D  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)rl   r™   rL   rµ  rŠ  r¹  ÚLigComponent)rÙ  r“   )r�  r¦   rÜ   r¸  rc  r´  r4  r¥   rŽ   r¼  r¾  r%  rŽ  rÀ  r‰   r-  Ú_xmlWriteLigatures)r[   r�   rl   r“   rL   r™   ÚgÚklassrÂ  rÃ  rÄ  Ztransr\   r“  r`  ra  r&   r&   r'   rž   L  sP    
þ

ÿ



ÿ

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Ž  )r[   r�   rl   r“   rL   r™   r\   rÞ  r&   r&   r'   rÝ  s  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   rd  r¬  r   r´  Ú_xmlReadStater¼  rI   r·  r›   rÀ  Ú_xmlReadLigComponentsr¹  Ú_xmlReadLigaturesr»  rÈ  rE   r¸  )r[   r™   rš   rl   r"  r¯  r°  rŒ  r`  r“   rÃ  r“  r&   r&   r'   r›   ~  s4    ÿÿÿÿÿzSTXHeader.xmlReadc           
      C   sV   t ƒ }tt|ƒD ]@\}}}|dkrt|d ƒ}|  ¡ }	|	 ||||¡ |	|j|< q|S )NrÛ  rÚ  )r   rd  r¬  r   rC   r,  r¾  )
r[   r™   rš   rl   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“   )rd  r¬  rI   r   )r[   r™   rš   rl   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`  )rd  r¬  rI   )r[   r™   rš   rl   Zligsr¯  r°  rä  r&   r&   r'   rã  ª  s
    zSTXHeader._xmlReadLigatures)N)rG   rT   rU   r|   rk   r½  rº  rÊ  r¿  r�   rÌ  rÍ  rÎ  rÏ  rž   rÝ  r›   rá  râ  rã  r&   r&   r&   r'   r³  v  s"   
1

7'r³  c                   @   s.   e Zd Zdd„ Zd
dd„Zdd„ Zdd	„ ZdS )ÚCIDGlyphMapc                 C   s>   |  ¡ }i }t| |¡ƒD ]\}}|dkr| |¡||< q|S ©Nry  )rÊ   rŽ   rË   rä   )r[   rg   rl   r„   ZnumCIDsr•  Úcidrx  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&   r_  )r`   rç  r`  rb  r&   r'   r�  ¼  s   ÿz%CIDGlyphMap.write.<locals>.<dictcomp>r   r   ry  ©r4  rÈ  rÍ   rc   rD   )	r[   r’   rl   r„   r“   r—   r4  r…   rç  r&   rb  r'   r�   »  s    
ÿ
zCIDGlyphMap.writec                 C   s>   i }t t|ƒD ]*\}}}|dkr|d  ¡ |t|d ƒ< q|S )NÚCIDr`  rç  )rd  r¬  Ústripr   ©r[   r™   rš   rl   r•  ZeNameZeAttrsZ	_eContentr&   r&   r'   r›   Ã  s    
ÿzCIDGlyphMap.xmlReadc                 C   sh   |  ||¡ | ¡  t| ¡ ƒD ]0\}}|d ur |dkr |jd||d� | ¡  q | |¡ | ¡  d S )Nry  ré  )rç  r`  ©r�  r¦   rc  r4  r¥   rŽ  )r[   r�   rl   r“   rL   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 restry  )rp  rÊ   rË   re   rê   rë   rc   Úmin)
r[   rg   rl   r„   Z
glyphOrderr…   Zcidsr•  rx  rç  r&   r&   r'   rk   Ø  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ç  rb  r&   r'   r�  é  s   þz%GlyphCIDMap.write.<locals>.<dictcomp>r   r   ry  rè  )	r[   r’   rl   r„   r“   r—   r4  r…   rx  r&   rb  r'   r�   è  s    
ÿ
zGlyphCIDMap.writec                 C   s:   i }t t|ƒD ]&\}}}|dkrt|d ƒ||d < q|S )Nré  r“   r`  )rd  r¬  r   rë  r&   r&   r'   r›   ñ  s    
ÿzGlyphCIDMap.xmlReadc                 C   sh   |  ||¡ | ¡  t| ¡ ƒD ]0\}}|d ur |dkr |jd||d� | ¡  q | |¡ | ¡  d S )Nry  ré  r×  rì  )r[   r�   rl   r“   rL   r™   r`  rç  r&   r&   r'   rž   ù  s    ÿ

zGlyphCIDMap.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 )Ú
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ù   )rc   rÊ   rI   )r[   rg   rl   r„   rð  rñ  rò  ÚnItemsÚnBitsZminusOffsetÚmaskZsignMaskrï  ÚtmpÚshiftr\   r“   r&   r&   r'   rk     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 )
Nrð  rñ  rò  ró  rô  r   )r   rù   r   rù   )re   rÍ   )r[   r’   rl   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ž   3  s    zDeltaValue.xmlWritec                 C   s   t |d ƒS r¤   ©r   r˜   r&   r&   r'   r›   7  s    zDeltaValue.xmlRead)N©rG   rT   rU   rk   r�   rž   r›   r&   r&   r&   r'   rï    s   
rï  c                   @   s   e Zd Zdd„ Zddd„ZdS )ÚVarIdxMapValuec           	         s|   |d }|d }d|d@  }d|> d ‰ dˆ  ‰d| ‰d|d@ d?  }|j |j|j|jd	œ| }‡ ‡‡fd
d„||ƒD ƒS )NÚEntryFormatry   r   r£  rÁ   rù   é0   r¯   ©r   rÃ   r×   r¯   c                    s    g | ]}|ˆ@ ˆ> |ˆ @ B ‘qS r&   r&   )r`   Úraw©Ú	innerMaskZ	outerMaskÚ
outerShiftr&   r'   rb   N  s   ÿz'VarIdxMapValue.read.<locals>.<listcomp>)rÔ   rË   ZreadUInt24Arrayr»   )	r[   rg   rl   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þ  ry   r   r£  rù   rÿ  r¯   r   c                    s    g | ]}|d @ ˆ? |ˆ @ B ‘qS )l     þ r&   )r`   Úidx©r  r  r&   r'   rb   b  s   ÿz(VarIdxMapValue.write.<locals>.<listcomp>)ZsetValuere   rÕ   rÎ   ZwriteUInt24Arrayr¾   )r[   r’   rl   r„   r“   r—   r  r…  r  r  r•   r&   r	  r'   r�   Q  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 )Nrx   Ú	NumShortsé €  éÿ  )Úboolr²   rÅ   rÐ   rî  rÈ  r‚   )r[   rg   rl   r„   rE   ÚregionCountÚ	wordCountÚ	longWordsZreadBigArrayZreadSmallArrayÚn1Ún2r&   r&   r'   rk   h  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 )Nrx   r  r  r  r›  r   )r  rÇ   rÑ   rµ   rî  rÈ  ÚwriteSmallArray)r[   r’   rl   r„   rE   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
  f  s   
r
  c                   @   s   e Zd Zdd„ ZdS )Ú
LookupFlagc                 C   s®   |  ||d|fg ¡ g }|d@ r,| d¡ |d@ r>| d¡ |d@ rP| d¡ |d@ rb| d	¡ |d
@ rt| d¡ |d@ rŽ| d|d?  ¡ |r¢| d |¡¡ | ¡  d S )Nr“   r   ZrightToLeftrÃ   ZignoreBaseGlyphsr¯   ZignoreLigaturesr}   ZignoreMarksrù   ZuseMarkFilteringSeti ÿ  zmarkAttachmentType[%i]rí   )r¥   rI   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  rL   Úlowerr  r&   r&   r'   r¢   °  s    z_UInt8Enum.toString)
rG   rT   rU   rp   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)rG   rT   rU   Ú_ExtendModer  r&   r&   r&   r'   r   µ  s   r   c                   @   s   e Zd ZeZdS )r   N)rG   rT   rU   Ú_CompositeModer  r&   r&   r&   r'   r   ¹  s   r   c                 C   s   t t| d�S ©N)rC   )r!   rU  ©ÚCr&   r&   r'   r(   ç  r)   c                 C   s   t t| d�S r  )r!   r�  r  r&   r&   r'   r(   è  r)   c                 C   s   t t| d�S r  )r!   r³  r  r&   r&   r'   r(   é  r)   c                 C   s   t t| d�S r  )r!   rF   r  r&   r&   r'   r(   ê  r)   c                 C   s   t t| d�S r  )r!   rD  r  r&   r&   r'   r(   ë  r)   c                 C   s   t t| d�S r  )r!   rF  r  r&   r&   r'   r(   ì  r)   )*Zint8Zint16r/   r+   Zuint24r0   Zchar64r¿   rÀ   r  rß   rà   ræ   rè   ró   r÷   r  r  r±  ZOffsetZLOffsetZOffset24rR  rï  rý  r
  r  r   r   rì   rå  rí  r6   r7   r8   r   rU  r�  r³  ZOffsetToZ	LOffsetToZLOffset24To)qZfontTools.misc.fixedToolsr   rú   r   rû   r   rÿ   r   rý   r   r  r   r  ZfontTools.misc.roundToolsr   r	   ZfontTools.misc.textToolsr
   r   r   r   r   ZfontTools.ttLibr   rT  r   r   r   r   r   ZotTablesr   r   r   r   r   r   r   r   r   r  r   r  Ú	itertoolsr    Ú	functoolsr!   r±  ÚloggingÚ	getLoggerrG   rê   r¬  rR   r$   rS   ÚcollectionsrW   ÚImportErrorrX   Úobjectru   r    r¨   rª   r®   r¸   r¿   rÀ   rÂ   rÈ   rÏ   rÒ   rÖ   rÛ   r<   r=   r>   rß   rà   ræ   rè   rì   rñ   ró   r÷   r  r  r  r  rA   r?   rF   rD  rF  r3   r1   r2   r4   r*   rR  rU  r�  rš  r³  rå  rí  rï  rý  r
  r  r  r@   r&   r&   r&   r'   Ú<module>   sì    0
@QH" g;   >%.6+3Ñ