o
    âiÚ! ã                   @   sä  d dl mZmZmZmZm	Z
mZ d dlmZ d dlmZmZ d dlmZmZmZmZmZ d dlmZ d dlmZmZ ddlmZmZm Z m!Z!m"Z" dd	l#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z.m/Z0m1Z1 d d
l2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9Z9d dl:Z:d dl;m<Z< d dl=Z=e= >e?¡Z@dd„ ZAdd„ ZBG dd„ deCƒZDG dd„ deDƒZEG dd„ deEƒZFG dd„ deEƒZGG dd„ deGƒZHG dd„ deGƒZIG dd „ d eIƒZJG d!d"„ d"eFeIƒZKG d#d$„ d$eGƒZLG d%d&„ d&eGƒZMG d'd(„ d(eGƒZNG d)d*„ d*eGƒZOG d+d,„ d,eGƒZPG d-d.„ d.eGƒZQG d/d0„ d0eQeOƒZRG d1d2„ d2eQeMƒZSG d3d4„ d4eQeIƒZTG d5d6„ d6eEƒZUG d7d8„ d8eEƒZVG d9d:„ d:eVƒZWG d;d<„ d<eMƒZXG d=d>„ d>eMƒZYG d?d@„ d@eEƒZZG dAdB„ dBeZƒZ[G dCdD„ dDeZƒZ\G dEdF„ dFe\ƒZ]G dGdH„ dHe\ƒZ^G dIdJ„ dJe^ƒZ_G dKdL„ dLe_ƒZ`G dMdN„ dNeEƒZaG dOdP„ dPeEƒZbG dQdR„ dReDƒZcG dSdT„ dTecƒZdG dUdV„ dVecƒZeG dWdX„ dXeeƒZfG dYdZ„ dZeeƒZgG d[d\„ d\ecƒZhG d]d^„ d^eeƒZiG d_d`„ d`efeiƒZjG dadb„ dbeeƒZkG dcdd„ ddeGƒZlG dedf„ dfelƒZmG dgdh„ dheDƒZnG didj„ djeDƒZoG dkdl„ dleDƒZpG dmdn„ dneDƒZqG dodp„ dpeDƒZrG dqdr„ dreDƒZsG dsdt„ dteDƒZtG dudv„ dveDƒZuG dwdx„ dxeDƒZvG dydz„ dzƒZwG d{d|„ d|eDƒZxG d}d~„ d~eMƒZyG dd€„ d€eOƒZzG dd‚„ d‚ezƒZ-G dƒd„„ d„ezƒZ/i d…eN“d†eL“d‡eH“dˆeO“d‰eM“dŠeP“d‹eI“dŒeb“d eJ“d"eK“dNea“d6eU“d8eV“d:eW“d<eX“dBe[“dFe]“i dHe^“dJe_“dLe`“dec“dŽee“def“deg“dfem“dtet“dveu“dxev“d~ey“d‚e-“d„e/“d>eY“d‘e6exewd’“d“e6exe%d”“¥eresedededepd•d„ d–d„ d—d„ d˜d„ d™d„ dšd„ d›œ¥Z{dS )œé    )ÚfixedToFloatÚfloatToFixedÚfloatToFixedToStrÚstrToFixedToFloatÚensureVersionIsLongÚversionToFixed)ÚTupleVariation)ÚnearestMultipleShortestReprÚotRound)Ú	bytesjoinÚtobytesÚtostrÚpadÚsafeEval)ÚLazyList)ÚOPTIMIZE_FONT_SPEEDÚgetSearchRangeé   )ÚCountReferenceÚFormatSwitchingBaseTableÚOTTableReaderÚOTTableWriterÚValueRecordFactory)ÚlookupTypesÚVarCompositeGlyphÚAATStateTableÚAATStateÚ	AATActionÚContextualMorphActionÚLigatureMorphActionÚInsertionMorphActionÚMorxSubtableÚ
ExtendModeÚCompositeModeÚNO_VARIATION_INDEX)Úzip_longestÚ
accumulate)Úpartial)ÚSimpleNamespaceN)ÚOptionalc                 C   s
   t | tƒS ©N)Ú
isinstanceÚtuple)Út© r.   úr/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/fontTools/ttLib/tables/otConverters.pyÚ<lambda>-   s   
 r0   c                 C   sÂ  g }i }| D ]Ö\}}}}}|}	|  d¡r|dksJ ‚t}
nH| d¡s&|dv r/tttdœ| }
n6|dkr6t}
n/|dkr=t}
n(|dkrDt}
n!|d	krKt	}
n|d
v rRt
}
n|tvr_d|vr_|}	t}
nt||tƒ}
|
||||d}|jrt|j}n|dv r~| |¡}n| |	¡}|js‰||_|dv r«|d |_|j ¡ D ]}| ¡ D ]}t||||ƒ||j< qq—|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)ZCIDGlyphMappingZ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__rB   ÚdefaultFeatureParamsÚappend)Z	tableSpecZtableNamespaceÚ
convertersZconvertersByNameÚtpÚnameÚrepeatÚauxÚdescrZ	tableNameZconverterClassÚconvrL   r-   Úclsr.   r.   r/   ÚbuildConverters0   sf   
ýü

ÿ



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dee f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¡p"|dv | _| d¡p,|dk| _|dv | _|| _	d S )Nz<string>rK   r3   )ÚDesignAxisRecordSizeÚValueRecordSizeZ
LookupTyper5   )Z
ClassCountZClass2CountZ
FeatureTagZSettingsCountÚVarRegionCountÚMappingCountZRegionAxisCountZDesignAxisCountr^   ZAxisValueCountr_   Z	AxisCountZBaseGlyphRecordCountZLayerRecordCountZAxisIndicesList)
rU   rV   rW   ÚcompilerL   rD   ZisCountZisLookupTypeÚisPropagatedr>   ©ÚselfrU   rV   rW   rL   r>   r.   r.   r/   Ú__init__t   s   

zBaseConverter.__init__c           	         sš   ˆ j o|dk}|rˆ ˆ¡‰ˆtu rd}|s+g }t|ƒD ]}| ˆ ˆˆ |¡¡ q|S ‡ ‡‡‡fdd„}|ƒ ‰t‡fdd„t|ƒ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Ú
recordSizere   r.   r/   Ú	read_item¥   s   zABaseConverter.readArray.<locals>.get_read_item.<locals>.read_item©Úcopyrl   ©ro   )rk   Úreaderrn   re   )rl   rm   r/   Úget_read_item¡   s   z.BaseConverter.readArray.<locals>.get_read_itemc                 3   s    | ]}ˆ V  qd S r*   r.   )Ú.0rj   rr   r.   r/   Ú	<genexpr>¬   s   € z*BaseConverter.readArray.<locals>.<genexpr>)ÚlazyÚgetRecordSizeÚNotImplementedÚrangerR   ri   r   Úadvance)	re   rs   rk   Ú	tableDictÚcountrw   Úlrj   rt   r.   )rk   ro   rs   rn   re   r/   Ú	readArray“   s   

zBaseConverter.readArrayc                 C   s   t | dƒr| jS tS )NÚ
staticSize)Úhasattrr€   ry   ©re   rs   r.   r.   r/   rx   ±   s   
zBaseConverter.getRecordSizec                 C   ó   t | ƒ‚)zRead a value from the reader.©ÚNotImplementedError©re   rs   rk   r|   r.   r.   r/   ri   ¶   ó   zBaseConverter.readc              
   C   sT   zt |ƒD ]\}}|  |||||¡ qW d S  ty) } z|j|f |_‚ d }~ww r*   )Ú	enumerateÚwriteÚ	ExceptionÚargs)re   Úwriterrk   r|   rN   rj   ÚvalueÚer.   r.   r/   Ú
writeArrayº   s   ÿ€þzBaseConverter.writeArrayc                 C   rƒ   )zWrite a value to the writer.r„   ©re   rŒ   rk   r|   r   ÚrepeatIndexr.   r.   r/   r‰   Â   r‡   zBaseConverter.writec                 C   rƒ   )zRead a value from XML.r„   ©re   ÚattrsÚcontentrk   r.   r.   r/   ÚxmlReadÆ   r‡   zBaseConverter.xmlReadc                 C   rƒ   )zWrite a value to XML.r„   ©re   Ú	xmlWriterrk   r   rU   r“   r.   r.   r/   ÚxmlWriteÊ   r‡   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)re   Úmr.   r.   r/   ÚgetVarIndexOffsetÐ   s   zBaseConverter.getVarIndexOffsetr*   )rP   Ú
__module__Ú__qualname__Ú__doc__rf   r   rx   ri   r   r‰   r•   r˜   Úrerb   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 r*   r.   ©r   r.   r.   r/   ÚtoStringÙ   ó   zSimpleValue.toStringc                 C   r¥   r*   r.   r¦   r.   r.   r/   Ú
fromStringÝ   r¨   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•   å   ó   zSimpleValue.xmlReadN)rP   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ª   )ÚDEFAULTrR   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)rP   r    r¡   r°   r˜   r•   r.   r.   r.   r/   r¯   é   s    r¯   c                   @   ó   e Zd Zedd„ ƒZdS )ÚIntValuec                 C   ó
   t | dƒS ©Nr   )rœ   r¦   r.   r.   r/   r©   ù   ó   
zIntValue.fromStringN©rP   r    r¡   r®   r©   r.   r.   r.   r/   r²   ø   ó    r²   c                   @   ó2   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 r*   ©ÚreadLongr†   r.   r.   r/   ri     ó   z	Long.readc                 C   ó
   |  |¡S r*   )ÚreadLongArray©re   rs   rk   r|   r}   r.   r.   r/   r     ó   
zLong.readArrayNc                 C   ó   |  |¡ d S r*   )Ú	writeLongr   r.   r.   r/   r‰     r­   z
Long.writec                 C   rÃ   r*   )ÚwriteLongArray©re   rŒ   rk   r|   rN   r.   r.   r/   r   
  r­   zLong.writeArrayr*   ©rP   r    r¡   r€   ri   r   r‰   r   r.   r.   r.   r/   r¹   þ   ó    
r¹   c                   @   r¸   )ÚULongrº   c                 C   r»   r*   ©Ú	readULongr†   r.   r.   r/   ri     r¾   z
ULong.readc                 C   r¿   r*   )ÚreadULongArrayrÁ   r.   r.   r/   r     rÂ   zULong.readArrayNc                 C   rÃ   r*   ©Ú
writeULongr   r.   r.   r/   r‰     r­   zULong.writec                 C   rÃ   r*   )ÚwriteULongArrayrÆ   r.   r.   r/   r     r­   zULong.writeArrayr*   rÇ   r.   r.   r.   r/   rÉ     rÈ   rÉ   c                   @   r±   )ÚFlags32c                 C   ó   d|  S )Nz0x%08Xr.   r¦   r.   r.   r/   r§     r‡   zFlags32.toStringN)rP   r    r¡   r®   r§   r.   r.   r.   r/   rÐ     r·   rÐ   c                   @   ó   e Zd ZeZdS )ÚVarIndexN)rP   r    r¡   r$   r°   r.   r.   r.   r/   rÓ   $  ó    rÓ   c                   @   r¸   )ÚShorté   c                 C   r»   r*   )Ú	readShortr†   r.   r.   r/   ri   +  r¾   z
Short.readc                 C   r¿   r*   )ÚreadShortArrayrÁ   r.   r.   r/   r   .  rÂ   zShort.readArrayNc                 C   rÃ   r*   )Ú
writeShortr   r.   r.   r/   r‰   1  r­   zShort.writec                 C   rÃ   r*   )ÚwriteShortArrayrÆ   r.   r.   r/   r   4  r­   zShort.writeArrayr*   rÇ   r.   r.   r.   r/   rÕ   (  rÈ   rÕ   c                   @   r¸   )ÚUShortrÖ   c                 C   r»   r*   ©Ú
readUShortr†   r.   r.   r/   ri   ;  r¾   zUShort.readc                 C   r¿   r*   )ÚreadUShortArrayrÁ   r.   r.   r/   r   >  rÂ   zUShort.readArrayNc                 C   rÃ   r*   ©ÚwriteUShortr   r.   r.   r/   r‰   A  r­   zUShort.writec                 C   rÃ   r*   )ÚwriteUShortArrayrÆ   r.   r.   r/   r   D  r­   zUShort.writeArrayr*   rÇ   r.   r.   r.   r/   rÛ   8  rÈ   rÛ   c                   @   r¸   )ÚInt8r   c                 C   r»   r*   )ZreadInt8r†   r.   r.   r/   ri   K  r¾   z	Int8.readc                 C   r¿   r*   )ÚreadInt8ArrayrÁ   r.   r.   r/   r   N  rÂ   zInt8.readArrayNc                 C   rÃ   r*   )Z	writeInt8r   r.   r.   r/   r‰   Q  r­   z
Int8.writec                 C   rÃ   r*   )ÚwriteInt8ArrayrÆ   r.   r.   r/   r   T  r­   zInt8.writeArrayr*   rÇ   r.   r.   r.   r/   râ   H  rÈ   râ   c                   @   r¸   )ÚUInt8r   c                 C   r»   r*   )Ú	readUInt8r†   r.   r.   r/   ri   [  r¾   z
UInt8.readc                 C   r¿   r*   )ÚreadUInt8ArrayrÁ   r.   r.   r/   r   ^  rÂ   zUInt8.readArrayNc                 C   rÃ   r*   )Ú
writeUInt8r   r.   r.   r/   r‰   a  r­   zUInt8.writec                 C   rÃ   r*   )ÚwriteUInt8ArrayrÆ   r.   r.   r/   r   d  r­   zUInt8.writeArrayr*   rÇ   r.   r.   r.   r/   rå   X  rÈ   rå   c                   @   ó"   e Zd ZdZdd„ Zddd„ZdS )ÚUInt24é   c                 C   r»   r*   ©Z
readUInt24r†   r.   r.   r/   ri   k  r¾   zUInt24.readNc                 C   rÃ   r*   ©ZwriteUInt24r   r.   r.   r/   r‰   n  r­   zUInt24.writer*   ©rP   r    r¡   r€   ri   r‰   r.   r.   r.   r/   rë   h  ó    rë   c                   @   ó   e Zd Zdd„ ZdS )ÚComputedIntc                 C   s*   |d ur|  d||f ¡ | ¡  d S d S )Nz%s=%s)Úcommentr¬   r–   r.   r.   r/   r˜   s  s   þzComputedInt.xmlWriteN©rP   r    r¡   r˜   r.   r.   r.   r/   rò   r  ó    rò   c                   @   ó   e Zd ZdS )rE   N©rP   r    r¡   r.   r.   r.   r/   rE   y  ó    rE   c                   @   rö   )rF   Nr÷   r.   r.   r.   r/   rF   }  rø   rF   c                   @   rö   )rG   Nr÷   r.   r.   r.   r/   rG     rø   rG   c                   @   rê   )ÚTagrº   c                 C   r»   r*   )ZreadTagr†   r.   r.   r/   ri   ˆ  r¾   zTag.readNc                 C   rÃ   r*   )ZwriteTagr   r.   r.   r/   r‰   ‹  r­   z	Tag.writer*   rï   r.   r.   r.   r/   rù   …  rð   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/   ri   ˜  ó   zGlyphID.readc                 C   ó   |  | j| |¡¡ d S r*   )r   rý   ZgetGlyphIDManyrÆ   r.   r.   r/   r   ›  ó   zGlyphID.writeArrayNc                 C   r   r*   )Z
writeValuerý   Ú
getGlyphIDr   r.   r.   r/   r‰   ž  r  zGlyphID.writer*   )	rP   r    r¡   r€   rý   r   ri   r   r‰   r.   r.   r.   r/   rú     s    rú   c                   @   s   e Zd ZdZdZdS )Ú	GlyphID32rº   ÚLN)rP   r    r¡   r€   rý   r.   r.   r.   r/   r  ¢  s    r  c                   @   rñ   )ÚNameIDc                 C   st   |  ||d|fg ¡ |r4|r4| d¡}|r4| |¡}| d¡ |r(| |¡ n| d¡ t d| ¡ | ¡  d S )Nr   rU   ú  zmissing from name tablez"name id %d missing from name table)r«   rM   ZgetDebugNamer‰   ró   ÚlogÚwarningr¬   )re   r—   rk   r   rU   r“   Z	nameTabler.   r.   r/   r˜   ¨  s   



zNameID.xmlWriteNrô   r.   r.   r.   r/   r  §  rõ   r  c                   @   rñ   )Ú	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«   rR   r‰   ró   Újoinr¬   ©re   r—   rk   r   rU   r“   Úflagsr.   r.   r/   r˜   ¸  s   


zSTATFlags.xmlWriteNrô   r.   r.   r.   r/   r	  ·  rõ   r	  c                   @   r±   )Ú
FloatValuec                 C   ó   t | ƒS r*   )Úfloatr¦   r.   r.   r/   r©   Æ  r‡   zFloatValue.fromStringNr¶   r.   r.   r.   r/   r  Å  r·   r  c                   @   rê   )Ú
DeciPointsrÖ   c                 C   s   |  ¡ d S ©Né
   rÜ   r†   r.   r.   r/   ri   Î  ó   zDeciPoints.readNc                 C   s   |  t|d ƒ¡ d S r  )rà   Úroundr   r.   r.   r/   r‰   Ñ  rÿ   zDeciPoints.writer*   rï   r.   r.   r.   r/   r  Ë  rð   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/   ri   Û  s   zBaseFixedValue.readNc                 C   s   t || jƒ|  |¡ƒ d S r*   )r  ÚwriterMethodÚtoIntr   r.   r.   r/   r‰   Þ  s   zBaseFixedValue.writec                 C   ó   t || jƒS r*   )Úfi2flÚprecisionBits©rZ   r   r.   r.   r/   r  á  ó   zBaseFixedValue.fromIntc                 C   r  r*   )Úfl2fir  r  r.   r.   r/   r  å  r   zBaseFixedValue.toIntc                 C   r  r*   )Ústr2flr  r  r.   r.   r/   r©   é  r   zBaseFixedValue.fromStringc                 C   r  r*   )Úfl2strr  r  r.   r.   r/   r§   í  r   zBaseFixedValue.toStringr*   )rP   r    r¡   ry   r€   r  r  r  ri   r‰   Úclassmethodr  r  r©   r§   r.   r.   r.   r/   r  Õ  s    



r  c                   @   ó   e Zd ZdZdZdZdZdS )ÚFixedrº   é   r½   rÄ   N©rP   r    r¡   r€   r  r  r  r.   r.   r.   r/   r&  ò  ó
    r&  c                   @   r%  )ÚF2Dot14rÖ   é   r×   rÙ   Nr(  r.   r.   r.   r/   r*  ù  r)  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    ó   zAngle.fromIntc                    s   t ƒ  |d | j ¡S r-  )r/  r  r0  r  r1  r.   r/   r  
  r3  zAngle.toIntc                 C   s   t t|ƒ| j ƒ| j S r*   )r
   r  Úfactorr  r.   r.   r/   r©     s   zAngle.fromStringc                 C   r  r*   )r	   r4  r  r.   r.   r/   r§     r   zAngle.toString)rP   r    r¡   r0  r4  r$  r  r  r©   r§   Ú__classcell__r.   r.   r1  r/   r,     s    
r,  c                   @   s   e Zd ZdZdS )ÚBiasedAngleg      ð?N)rP   r    r¡   r0  r.   r.   r.   r/   r6    s    r6  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¼   )re   rs   rk   r|   r   r.   r.   r/   ri   !  s   zVersion.readNc                 C   s   t |ƒ}| |¡ d S r*   )Úfi2verÄ   r   r.   r.   r/   r‰   %  s   zVersion.writec                 C   r  r*   )Úve2fir¦   r.   r.   r/   r©   )  r‡   zVersion.fromStringc                 C   rÑ   )Nú0x%08xr.   r¦   r.   r.   r/   r§   -  r‡   zVersion.toStringc                 C   r³   )Nr'  )r!  )Úvr.   r.   r/   Ú	fromFloat1  rµ   zVersion.fromFloatr*   )
rP   r    r¡   r€   ri   r‰   r®   r©   r§   r<  r.   r.   r.   r/   r7    s    


r7  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r,t d| ¡ |S )Nó    r   ÚasciiÚreplace©ÚencodingÚerrorsÚignorez%replaced non-ASCII characters in "%s")ÚreadDatar€   Úfindr   r  r  )re   rs   rk   r|   ÚdataZzeroPosÚsr.   r.   r/   ri   ?  s   
zChar64.readNc                 C   sv   t |ddd}|t |dddkrt d| ¡ t|ƒ| jkr(t d|| jf ¡ |d| j  d | j… }| |¡ d S )Nr@  rA  rB  rE  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr?  )r   r  r  Úlenr€   Ú	writeData)re   rŒ   rk   r|   r   r‘   rH  r.   r.   r/   r‰   I  s   ÿzChar64.writer*   )rP   r    r¡   r¢   r€   ri   r‰   r.   r.   r.   r/   r=  6  s
    
r=  c                   @   s>   e Zd Zdd„ Zdd„ Zddd„Zdd	„ Zd
d„ Zdd„ ZdS )rJ   c                 C   s   | j o| j  |¡S r*   )rL   rx   r‚   r.   r.   r/   rx   V  ó   zStruct.getRecordSizec                 C   s   |   ¡ }| ||¡ |S r*   )rL   Ú	decompile)re   rs   rk   r|   Útabler.   r.   r/   ri   Y  s   zStruct.readNc                 C   s   |  ||¡ d S r*   ©rb   r   r.   r.   r/   r‰   ^  ó   zStruct.writec                 C   sF   |d u r|r|  ||dg ¡ | ¡  d S 	 d S |j||||d d S )N)Úemptyr   )rU   )r«   r¬   ÚtoXMLr–   r.   r.   r/   r˜   a  s   zStruct.xmlWritec                 C   s4  d|v rt |d ƒrd S |  ¡ }| d¡}|d urt|ƒ|_t|dƒ }|r\d}| ¡ D ]/}|jr[d}t|dƒs;i |_|j}	|j	|	vsJJ |j	|	fƒ‚t
||j	d ƒ t|j|j	ƒ|	|j	< q,|D ]}
t|
tƒrs|
\}}}| ||||¡ q^	 q^|jt|dd ƒd |r˜|r˜| ¡ D ]}|jr—|j}	|	|j	= |	s—|`q‡|S )NrQ  ÚFormatZpostReadFTÚ_propagator)Ú
propagator)r   rL   rM   rœ   rS  r   ÚgetConvertersrc   rT  rU   Úsetattrr   Ú__dict__r+   r,   ÚfromXMLZpopulateDefaultsr  )re   r“   r”   rk   rN  rS  Z
noPostReadZcleanPropagationrY   rU  ÚelementrU   r.   r.   r/   r•   n  sF   


€

€zStruct.xmlReadc                 C   s   dt | jƒ S )Nz
Struct of )ÚreprrL   )re   r.   r.   r/   Ú__repr__˜  r­   zStruct.__repr__r*   )	rP   r    r¡   rx   ri   r‰   r˜   r•   r\  r.   r.   r.   r/   rJ   U  s    
*rJ   c                   @   ó   e Zd Zdd„ Zddd„ZdS )rH   c                 C   s.   |j }|  ¡ }| ||¡ | ||j ¡ |S r*   )rl   rL   rM  rh   r4   )re   rs   rk   r|   rl   rN  r.   r.   r/   ri     s
   zStructWithLength.readNc                 C   sÂ   t | ¡ ƒD ]\}}|jdkr nqt|jƒ| }t|tƒr"|d7 }ddddœ|j }	| ¡ }
|	|_	| 
||¡ | ¡ |
 }| ¡ }| ||||¡ |j| dd |j… ksXJ ‚| ¡ |j|< d S )Nr4   r   éÞ   i­Þ  ì   ï>[= )r   rÖ   rº   ó   Þ­¾ï)rˆ   rV  rU   rJ  Úitemsr+   r   r€   ÚgetDataLengthr4   rb   ÚgetSubWriterr‰   Ú
getAllData)re   rŒ   rk   r|   r   r‘   Z	convIndexrY   ÚlengthIndexZdeadbeefÚbeforeÚlengthZlengthWriterr.   r.   r/   r‰   ¤  s    
ÿ
zStructWithLength.writer*   ©rP   r    r¡   ri   r‰   r.   r.   r.   r/   rH   œ  s    rH   c                   @   s2   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	d
„ZdS )rO   rÖ   c                 C   r»   r*   rÜ   r‚   r.   r.   r/   Ú
readOffsetº  r¾   zTable.readOffsetc                 C   ó   |  d¡ d S r´   rß   ©re   rŒ   r.   r.   r/   ÚwriteNullOffset½  r­   zTable.writeNullOffsetc                 C   sN   |   |¡}|dkrd S |  ¡ }| |¡}|jr||_||_|S | ||¡ |S r´   )ri  rL   ÚgetSubReaderrw   rs   rk   rM  )re   rs   rk   r|   ÚoffsetrN  r.   r.   r/   ri   À  s   

ÿz
Table.readNc                 C   sT   |d u r|   |¡ d S | ¡ }| j|_|d ur||_|j|| jd | ||¡ d S )N©Z
offsetSize)rl  rc  rU   r‘   ÚwriteSubTabler€   rb   )re   rŒ   rk   r|   r   r‘   Ú	subWriterr.   r.   r/   r‰   Í  s   zTable.writer*   )rP   r    r¡   r€   ri  rl  ri   r‰   r.   r.   r.   r/   rO   ·  s    rO   c                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )ÚLTablerº   c                 C   r»   r*   rÊ   r‚   r.   r.   r/   ri  Ü  r¾   zLTable.readOffsetc                 C   rj  r´   rÍ   rk  r.   r.   r/   rl  ß  r­   zLTable.writeNullOffsetN©rP   r    r¡   r€   ri  rl  r.   r.   r.   r/   rs  Ù  ó    rs  c                   @   rr  )ÚTable24rì   c                 C   r»   r*   rí   r‚   r.   r.   r/   ri  ç  r¾   zTable24.readOffsetc                 C   rj  r´   rî   rk  r.   r.   r/   rl  ê  r­   zTable24.writeNullOffsetNrt  r.   r.   r.   r/   rv  ä  ru  rv  c                       ó$   e Zd Zdd„ Z‡ fdd„Z‡  ZS )r:   c                 C   ó$   | j | | }|  | j| j| j|¡S r*   ©r   r2  rU   rV   rW   ©re   Z	tableTypeZ
lookupTyperL   r.   r.   r/   ÚgetConverterò  ó   zSubStruct.getConverterc                    ó   t t| ƒ |||d |¡ d S r*   )r/  r:   r˜   r–   r1  r.   r/   r˜   ö  ó   zSubStruct.xmlWrite©rP   r    r¡   r{  r˜   r5  r.   r.   r1  r/   r:   ñ  ó    r:   c                       rw  )r8   c                 C   rx  r*   ry  rz  r.   r.   r/   r{  û  r|  zSubTable.getConverterc                    r}  r*   )r/  r8   r˜   r–   r1  r.   r/   r˜   ÿ  r~  zSubTable.xmlWriter  r.   r.   r1  r/   r8   ú  r€  r8   c                   @   s   e Zd Zddd„ZdS )r9   Nc                 C   s   d|_ t | |||||¡ d S )NT)Z	ExtensionrO   r‰   r   r.   r.   r/   r‰     s   zExtSubTable.writer*   )rP   r    r¡   r‰   r.   r.   r.   r/   r9     s    r9   c                   @   rñ   )r;   c                 C   s&   | j  || j¡}|  | j| j| j|¡S r*   )rB   rM   rQ   r2  rU   rV   rW   )re   Z
featureTagrL   r.   r.   r/   r{  
  ó   zFeatureParams.getConverterN)rP   r    r¡   r{  r.   r.   r.   r/   r;   	  rõ   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Ö   Nr]   r=   c                C   s4   t j| |||||d d|d dkrdnd | _d S )Nr=   r1   éÿÿÿÿÚ2Ú1)r\   rf   Úwhichrd   r.   r.   r/   rf     s   ÿzValueFormat.__init__c                 C   s   |  ¡ }t|ƒ|| j< |S r*   )rÝ   r   r…  ©re   rs   rk   r|   Úformatr.   r.   r/   ri     s   zValueFormat.readc                 C   s   |  |¡ t|ƒ|| j< d S r*   )rà   r   r…  )re   rŒ   rk   r|   r‡  r‘   r.   r.   r/   r‰     s   
zValueFormat.writer*   )rP   r    r¡   r€   rf   ri   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Ö   )rJ  r…  r‚   r.   r.   r/   rx   #  rL  zValueRecord.getRecordSizec                 C   s   || j   ||¡S r*   )r…  ZreadValueRecordr†   r.   r.   r/   ri   &  rL  zValueRecord.readNc                 C   s   || j   |||¡ d S r*   )r…  ZwriteValueRecordr   r.   r.   r/   r‰   )  r  zValueRecord.writec                 C   s"   |d u rd S |  ||| j|¡ d S r*   )rR  rU   r–   r.   r.   r/   r˜   ,  s   zValueRecord.xmlWritec                 C   s&   ddl m} |ƒ }| d |||¡ |S )Nr   )rˆ  )ÚotBaserˆ  rY  )re   r“   r”   rk   rˆ  r   r.   r.   r/   r•   2  s   zValueRecord.xmlReadr*   )rP   r    r¡   rx   ri   r‰   r˜   r•   r.   r.   r.   r/   rˆ  "  s    
rˆ  c                   @   s´   e Zd ZdZddœdd„Zdd„ Zd+d	d
„Zedd„ ƒZdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ ZdS ),Ú	AATLookupr  r]   r=   c                C   sP   t j| |||||d t| jtƒr| jdd d d| _d S tdd d | jd| _d S )Nr=   ÚValue)rU   rV   rW   )rU   rV   rW   rL   )r\   rf   Ú
issubclassrL   r¤   Ú	converterrO   rd   r.   r.   r/   rf   =  s   ÿ
ÿzAATLookup.__init__c                 C   sx   |  ¡ }|dkr|  ||¡S |dkr|  ||¡S |dkr"|  ||¡S |dkr,|  ||¡S |dkr6|  ||¡S J d| ƒ‚)Nr   rÖ   rº   é   rg   Fzunsupported lookup format: %d)rÝ   ÚreadFormat0ÚreadFormat2ÚreadFormat4ÚreadFormat6ÚreadFormat8r†  r.   r.   r/   ri   H  s   zAATLookup.readNc                    s¦   t t‡ fdd„| ¡ D ƒƒƒ}t ttd |  |ˆ |¡|  |ˆ |¡|  |ˆ |¡|  |ˆ |¡gƒƒƒ}|d \}}	}
| ¡ }|
ƒ  | ¡ | }||ksQJ d|	||f ƒ‚d S )Nc                    s   g | ]\}}ˆ   |¡|f‘qS r.   ©r  )ru   ÚglyphÚval©rk   r.   r/   Ú
<listcomp>Y  s    z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	ÚlistÚsortedra  ÚfilterÚbuildFormat0ÚbuildFormat2ÚbuildFormat6ÚbuildFormat8rb  )re   rŒ   rk   r|   r   r‘   rN   ÚformatsZdataSizeZlookupFormatZwriteMethodrl   Z
actualSizer.   r˜  r/   r‰   W  s4   ÿüþÿÿ
ýÿzAATLookup.writec                 C   sH   |   |¡ |   |¡ t||d\}}}|   |¡ |   |¡ |   |¡ d S )N)ÚnZitemSize)rà   r   )rŒ   ÚnumUnitsÚunitSizeZsearchRangeZentrySelectorZ
rangeShiftr.   r.   r/   ÚwriteBinSearchHeaderw  s   

ÿ

zAATLookup.writeBinSearchHeaderc                    sD   t ˆ  ¡ ƒ}t ˆƒ|krd S ˆjj}d||  d‡ ‡‡‡fdd„fS )NrÖ   r   c                      ó   ˆ  ˆˆ ˆ¡S r*   )ÚwriteFormat0r.   ©rk   re   rN   rŒ   r.   r/   r0   Š  ó    z(AATLookup.buildFormat0.<locals>.<lambda>)rJ  ÚgetGlyphOrderrŽ  r€   )re   rŒ   rk   rN   Ú	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‰   )re   rŒ   rk   rN   ZglyphID_r   r.   r.   r/   r§    s   

ÿÿzAATLookup.writeFormat0c                    s´   |d \}}|}g ‰|dd … D ]\}}||d ks||kr-ˆ  |||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.   ©rk   Úsegmentsre   rŒ   r.   r/   r0   ¥  r©  z(AATLookup.buildFormat2.<locals>.<lambda>)rR   rŽ  r€   rJ  ÚBIN_SEARCH_HEADER_SIZE)re   rŒ   rk   rN   ZsegStartZsegValueZsegEndÚglyphIDZcurValuer¬  r£  r¤  r.   r¯  r/   rž  ”  s    ýzAATLookup.buildFormat2c           
      C   s’   |  d¡ | jj}t|ƒ|d }}|  |||¡ |D ]\}}}	|  |¡ |  |¡ | jj||d |	d d q|  d¡ |  d¡ | d| ¡ d S )NrÖ   rº   r­  éÿÿ  r?  ©rà   rŽ  r€   rJ  r¥  r‰   rK  )
re   rŒ   rk   r°  r¬  r£  r¤  Z
firstGlyphZ	lastGlyphr   r.   r.   r/   r®  ¨  s   



ÿ

zAATLookup.writeFormat2c                    sD   ˆj j}tˆƒ|d }}dˆj |d |  d‡ ‡‡‡fdd„fS )NrÖ   r   r  c                      r¦  r*   )ÚwriteFormat6r.   r¨  r.   r/   r0   ½  r©  z(AATLookup.buildFormat6.<locals>.<lambda>)rŽ  r€   rJ  r±  )re   rŒ   rk   rN   r¬  r£  r¤  r.   r¨  r/   rŸ  ·  s   ýzAATLookup.buildFormat6c           	      C   s|   |  d¡ | jj}t|ƒ|d }}|  |||¡ |D ]\}}|  |¡ | jj||d |d d q|  d¡ | d| ¡ d S )Nr  rÖ   r­  r³  r?  r´  )	re   rŒ   rk   rN   r¬  r£  r¤  r²  r   r.   r.   r/   rµ  À  s   


ÿ
zAATLookup.writeFormat6c                    s^   ˆd d ˆd d }}t ˆƒ|| d krd S ˆjj}dt ˆƒ|  d‡ ‡‡‡fdd„fS )Nr   r‚  r   r  rg   c                      r¦  r*   )ÚwriteFormat8r.   r¨  r.   r/   r0   Õ  r©  z(AATLookup.buildFormat8.<locals>.<lambda>)rJ  rŽ  r€   )re   rŒ   rk   rN   Z
minGlyphIDZ
maxGlyphIDr¬  r.   r¨  r/   r   Í  s   ýzAATLookup.buildFormat8c                 C   sV   |d d }|  d¡ |  |¡ |  t|ƒ¡ |D ]\}}| jj||d |d d qd S )Nr   rg   r­  )rà   rJ  rŽ  r‰   )re   rŒ   rk   rN   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þ   ©ru   Úkr   r˜  r.   r/   Ú
<dictcomp>å  ó    z)AATLookup.readFormat0.<locals>.<dictcomp>)rJ  rª  rŽ  r   rˆ   )re   rs   rk   r«  rH  r.   r˜  r/   r  â  s   zAATLookup.readFormat0c                 C   s¬   i }|j d }| ¡ | ¡ }}|d| jj ksJ |ƒ‚t|ƒD ]3}| |||  d ¡ | ¡ }| ¡ }	| jj||d d}
|dkrSt|	|d ƒD ]	}|
|| |¡< qIq |S )NrÖ   rº   é   ©r|   r³  r   ©rl   rÝ   rŽ  r€   rz   rh   ri   rþ   )re   rs   rk   Úmappingrl   r¤  r£  rj   ÚlastÚfirstr   r»  r.   r.   r/   r‘  ç  s   
€zAATLookup.readFormat2c                 C   sÊ   i }|j d }| ¡ }|dksJ |ƒ‚t| ¡ ƒD ]I}| |||  d ¡ | ¡ }| ¡ }| ¡ }	|dkrb| d¡}
|
 ||	 ¡ | jj|
|d || d d}t|ƒD ]\}}||| || ¡< qTq|S )NrÖ   r  r¾  r³  r   r   r¸  )	rl   rÝ   rz   rh   rm  rŽ  r   rˆ   rþ   )re   rs   rk   rÁ  rl   r¤  rj   rÂ  rÃ  rn  Ú
dataReaderrH  r»  r;  r.   r.   r/   r’  ö  s&   

ÿ€zAATLookup.readFormat4c           	      C   sŠ   i }|j d }| ¡ }|d| jj ksJ |ƒ‚t| ¡ ƒD ]%}| |||  d ¡ | ¡ }| jj||d d}|dkrB||| |¡< q|S )NrÖ   r¾  r¿  r³  rÀ  )	re   rs   rk   rÁ  rl   r¤  rj   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Ã  rk   r.   r/   r¼    s     z)AATLookup.readFormat8.<locals>.<dictcomp>)rÝ   rŽ  r   rˆ   )re   rs   rk   r}   rH  r.   rÅ  r/   r”    s   zAATLookup.readFormat8c           	      C   sF   i }|D ]}t |tƒr |\}}}|dkr | j |||¡||d < q|S )NÚLookupr–  )r+   r,   rŽ  r•   )	re   r“   r”   rk   r   rZ  rU   Ú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   rU   r“   )Úbegintagr¬   r›  ra  rŽ  r˜   Úendtag)re   r—   rk   r   rU   r“   r–  r.   r.   r/   r˜   &  s   ÿ
zAATLookup.xmlWriter*   )rP   r    r¡   r±  rf   ri   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                   @   ó.   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 ]\}
}| || ¡}|  ¡ }| ||¡ ||	|
< q!|	S ©NÚDataOffsets)rË   rm  r‹  rÛ   ri   ra  rL   rM  )re   rs   rk   r|   ZlookupOffsetZ
dataOffsetÚlookupReaderÚlookupÚoffsetsÚresultr–  rn  rÄ  Úitemr.   r.   r/   ri   9  s   

zAATLookupWithDataOffset.readNc                 C   sè   i i d}}}g }	t ||jdD ]0}
tƒ }||
  ||¡ | ¡ }| |d ¡}|d kr=|}|t|ƒ }|||< |	 |¡ |||
< q| ¡ }t	dd d t
ƒ}| ||||d ¡ | ¡ }|j|dd |j|dd |	D ]}| |¡ qjd S )Nr   )ÚkeyrÎ  rº   ro  )r›  r  r   rb   rd  rM   rJ  rR   rc  r‹  rÛ   r‰   rp  rK  )re   rŒ   rk   r|   r   r‘   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDatar–  rq  rH  rn  ÚlookupWriterrÐ  Z
dataWriterÚdr.   r.   r/   r‰   G  s,   


ÿzAATLookupWithDataOffset.writec                 C   s   t dd d | jƒ}| |||¡S rÍ  )r‹  rL   r•   )re   r“   r”   rk   rÐ  r.   r.   r/   r•   j  s   zAATLookupWithDataOffset.xmlReadc                 C   s&   t dd d | jƒ}| |||||¡ d S rÍ  )r‹  rL   r˜   )re   r—   rk   r   rU   r“   rÐ  r.   r.   r/   r˜   n  r  z AATLookupWithDataOffset.xmlWriter*   ©rP   r    r¡   ri   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.   )ru   rÔ  r—  r.   r.   r/   r¼  |  ó    z MorxSubtableConverter.<dictcomp>Nr]   r=   c                C   s   t j| |||||d d S ©Nr=   )r\   rf   rd   r.   r.   r/   rf   ~  s   
ÿzMorxSubtableConverter.__init__c                 C   s6   |d@ dkrd|_ d S |d@ dkrd|_ d S d|_ d S )Né    r   ÚAnyé€   ÚVerticalÚ
Horizontal)ÚTextDirection)re   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 rTJ d|j
 ƒ‚|j | }	|j|j |j |j |	 … }
t|
ƒ|j|	 ksrJ ‚t|
|jd}|ƒ |_|j ||¡ | ||j ¡ |S )	Nr>  r   r'  é   ZmorxFz!unsupported 'morx' lookup type %s)rH  ÚtableTag)rl   r!   rË   r4   ræ   Ú_PROCESSING_ORDERSÚProcessingOrderrâ  rÝ   ÚReservedr5   ÚSubFeatureFlagsr   rM   rH  rJ  r   rä  r:   rM  rh   )re   rs   rk   r|   rl   rž   r  ÚorderKeyrL   ZheaderLengthrH  Z	subReaderr.   r.   r/   ri   ‹  s,   




zMorxSubtableConverter.readc                 C   sÚ   |  ||¡ | ¡  | d|j ¡ | ¡  |jd|jd | ¡  |jd|jd | ¡  |jdkrA|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ó   r4   r«   rá  ræ  rç  r5   rè  r:   rR  rÊ  r–   r.   r.   r/   r˜   ¦  s$   

zMorxSubtableConverter.xmlWritec           
      C   s0  t ƒ }d}d|_tt|ƒD ]~\}}}|dkr5t|d ƒ}|d@ dk|d@ dkf}	| j|	 |_|  ||¡ q|dkrL|d |_|j| jv sKJ d|j ƒ‚q|dkrb|d |_	|j	d	v saJ d
|j	 ƒ‚q|dkrnt|d ƒ|_q|dkrzt|d ƒ|_
q| d¡rˆ| ||||¡ qJ |ƒ‚|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ç  rœ  Úistupler   rå  ræ  râ  Ú_PROCESSING_ORDERS_REVERSEDrá  rè  rD   rY  )
re   r“   r”   rk   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r*dndO }||r2d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Ü  r_  r³  r`  z>L)rç  rì  ræ  rá  rê  rJ  ra  rb  r4   rb   ÚstructÚpack)re   rŒ   rk   r|   r   r‘   rí  ZreverseOrderZlogicalOrderre  rf  ZorigReservedrg  r.   r.   r/   r‰   Ú  s&   ÿ
zMorxSubtableConverter.writer*   )rP   r    r¡   rå  ra  rì  rf   râ  ri   r˜   r•   r‰   r.   r.   r.   r/   rØ  s  s    û rØ  c                   @   sœ   e Zd Zddœdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zd&dd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ ZdS )'Ú	STXHeaderr]   r=   c                C   s`   t j| |||||d t| jtƒsJ ‚tdd d tƒ| _t| jtƒr+tdd d t	ƒ| _
d S d | _
d S )Nr=   ÚGlyphClassesÚPerGlyphLookup)r\   rf   r  rL   r   r‹  rÛ   ÚclassLookupr   rú   ÚperGlyphLookuprd   r.   r.   r/   rf   õ  s   ÿ
zSTXHeader.__init__c                 C   sð  t ƒ }|j}| d¡}| d¡}| d¡}d }	d }
| ¡ |_| || ¡  ¡ | || ¡  ¡ | || ¡  ¡ | jd urL| d¡}| || ¡  ¡ t| jt	ƒr˜| d¡}	|	 || ¡  ¡ | d¡}| || ¡  ¡ | d¡}
|
 || ¡  ¡ |
j|j d }|dksŠJ ‚| 
|¡|_|  |
|¡|_nt| jtƒr¬| d¡}	|	 || ¡  ¡ | j |||¡|_t|j|j |jd  ƒ}t|ƒD ]"}tƒ }|j |¡ t|jƒD ]}| ¡ }|  ||||	¡|j|< qÖqÆ| jd urö|  |||¡|_|S )Nr   rÖ   )r   rl   rm  rË   ÚGlyphClassCountrh   rö  r  rL   r   rÞ   ÚLigComponentsÚ_readLigaturesÚ	Ligaturesr    rõ  ri   ró  rœ   rz   r   ÚStatesrR   rÝ   Ú_readTransitionÚTransitionsÚ_readPerGlyphLookupsÚPerGlyphLookups)re   rs   rk   r|   rN  rl   ZclassTableReaderZstateArrayReaderZentryTableReaderÚactionReaderZligaturesReaderZperGlyphTableReaderZligComponentReaderZnumLigComponentsZ	numStatesÚ
stateIndexÚstateÚ
glyphClassÚ
entryIndexr.   r.   r/   ri      s\   









ÿÿþ
ÿzSTXHeader.readc                 C   s0   |   ¡ }| |j||j  ¡}| |||¡ |S r*   )rL   rm  rl   r€   rM  )re   rs   r  rk   r   Ú
transitionZentryReaderr.   r.   r/   rü  /  s   ÿzSTXHeader._readTransitionc                 C   s(   t |jƒ}||j d }| | |¡¡S r‰  )rJ  rH  rl   rü   rÞ   )re   rs   rk   ÚlimitZnumLigatureGlyphsr.   r.   r/   rù  7  s   
zSTXHeader._readLigaturesc                 C   sb   d}|j D ])}|j ¡ D ]!}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ý  rN   r+   r   Z	MarkIndexÚmaxZCurrentIndex)re   rN  Ú
numLookupsr  r-   r.   r.   r/   Ú_countPerGlyphLookups<  s   



€ûzSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t|  |¡ƒD ]}| d¡}| || ¡  ¡ | | j ||i ¡¡ q|S r´   )	rl   rz   r	  rm  rh   rË   rR   rö  ri   )re   rN  rs   rk   rl   Ú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r*|	d7 }	|	| j	j
7 }	| j	 ||j¡\}
}|  ||j||¡\}}|	t|ƒ }|t|ƒ }|t|ƒ }t|  ||¡dƒ}|
d urk|t|ƒ }nd }d\}}|  ||¡}|  ||¡}|d ur•t|ƒdks‰J ‚|t|
ƒ }|t|ƒ }| |¡ | |	¡ | |¡ | |¡ | jd ur³| |¡ |d ur¼| |¡ |d urÊ| |¡ | |¡ | |¡ | |¡ | |¡ | |¡ |
d urç| |
¡ |d urð| |¡ |d urû| |¡ d S d S )N)r‘   rÖ   r   r'  rº   )NNr   )r   rõ  r‰   ró  r   rd  r  rN   rö  rL   ZactionHeaderSizeZcompileActionsrû  Ú_compileStatesrJ  Ú_compilePerGlyphLookupsÚ_compileLigComponentsÚ_compileLigaturesrÎ   rK  )re   rŒ   rk   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  sd   ÿ

ÿ














ÿzSTXHeader.writec                 C   sÒ   t ƒ }g i }}|D ]L}t|ƒD ]E}	|j|	 }
t ƒ }|
 |||¡ | ¡ }t|ƒ|
jks:J dt|
ƒ|
jt|ƒf ƒ‚| |¡}|d u rPt|ƒ}|||< | 	|¡ | 
|¡ qq
t| ¡ dƒ}tt|ƒdƒ}||fS )Nz1%s has staticSize %d, but actually wrote %d bytesrº   )r   rz   rý  rb   rd  rJ  r€   r[  rM   rR   rà   r   r   )re   rk   Zstatesr  r  ZstateArrayWriterÚentriesZentryIDsr  r  r  ZentryWriterZ	entryDatar  r  r  r.   r.   r/   r  ‹  s2   

ýÿ

ïzSTXHeader._compileStatesc                 C   s€   | j d u rdS |  |¡}t|jƒ|ksJ dt|jƒ|f ƒ‚tƒ }|jD ]}| ¡ }| j  ||i |d ¡ |j|dd q$| ¡ S )Nó    zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %drº   ro  )	rö  r	  rJ  rÿ  r   rc  r‰   rp  rd  )re   rN  rk   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à   rd  )re   rN  rk   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  rd  )re   rN  rk   rŒ   Z	glyphNamer.   r.   r/   r  ½  s   

zSTXHeader._compileLigaturesc                 C   s¶  |  ||¡ | ¡  | d|j ¡ | ¡  t|j ¡ ƒD ]\}}|jd||d | ¡  qt|j	ƒD ]/\}}	|j d|d | ¡  t|	j
 ¡ ƒD ]\}
}|j||d|
idd qI| d¡ | ¡  q3t|jƒD ]/\}}|j d	|d | ¡  t| ¡ ƒD ]\}}|jd
||d | ¡  q}| d	¡ | ¡  qht|dƒrÇ|  d¡ | ¡  tt|dƒƒD ]\}}|jd||d | ¡  q­| d¡ | ¡  |  |||||¡ | |¡ | ¡  d S )NzGlyphClassCount=%sÚ
GlyphClass©r–  r   ÚState)ÚindexÚonGlyphClassÚ
Transition)rk   r“   rU   rô  rÆ  rø  ÚLigComponent)r  r   )rÉ  r¬   ró   r÷  r›  ró  ra  r«   rˆ   rû  rý  rR  rÊ  rÿ  r   r  Ú_xmlWriteLigatures)re   r—   rk   r   rU   r“   ÚgÚklassr  r  r  Ztransrj   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Ê  )re   r—   rk   r   rU   r“   rj   r  r.   r.   r/   r  í  s   



zSTXHeader._xmlWriteLigaturesc                 C   sØ   t ƒ }tt|ƒD ]W\}}}|dkr!|d }|d }	t|	ƒ|j|< q|dkr3|  |||¡}
|j |
¡ q|dkrF| j 	|||¡}|j
 |¡ q|dkrS|  |||¡|_q|dkr_|  |||¡|_qt|j ¡ ƒd |_|S )	Nr  r–  r   r  rô  rø  rú  r   )r   rœ  rë  r   ró  Ú_xmlReadStaterû  rR   rö  r•   rÿ  Ú_xmlReadLigComponentsrø  Ú_xmlReadLigaturesrú  r  rN   r÷  )re   r“   r”   rk   rN  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   rL   rY  rý  )
re   r“   r”   rk   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ë  rR   r   )re   r“   r”   rk   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ë  rR   )re   r“   r”   rk   Zligsrî  rï  r$  r.   r.   r/   r#    s   €zSTXHeader._xmlReadLigaturesr*   )rP   r    r¡   rf   ri   rü  rù  r	  rþ  r‰   r  r  r  r  r˜   r  r•   r!  r"  r#  r.   r.   r.   r/   rò  ô  s$    /
	7(
rò  c                   @   rË  )ÚCIDGlyphMapc                 C   s>   |  ¡ }i }t| |¡ƒD ]\}}|dkr| |¡||< q|S ©Nr³  )rÝ   rˆ   rÞ   rþ   )re   rs   rk   r|   ZnumCIDsrÒ  Úcidr²  r.   r.   r/   ri   (  s   €zCIDGlyphMap.readNc           	         óX   ‡ fdd„|  ¡ D ƒ}|rt|ƒd nd}| |¡ t|ƒD ]}| | |d¡¡ qd S )Nc                    s   i | ]
\}}|ˆ   |¡“qS r.   r•  )ru   r'  r–  r˜  r.   r/   r¼  1  r½  z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   r³  ©ra  r  rà   rz   rM   )	re   rŒ   rk   r|   r   r‘   ra  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   ©re   r“   r”   rk   rÒ  ZeNameZeAttrsZ	_eContentr.   r.   r/   r•   7  s   €zCIDGlyphMap.xmlReadc                 C   óh   |  ||¡ | ¡  t| ¡ ƒD ]\}}|d ur(|dkr(|jd||d | ¡  q| |¡ | ¡  d S )Nr³  r*  )r'  r–  ©rÉ  r¬   r›  ra  r«   rÊ  )re   r—   rk   r   rU   r“   r'  r–  r.   r.   r/   r˜   >  ó   €
zCIDGlyphMap.xmlWriter*   r×  r.   r.   r.   r/   r%  '  s
    
r%  c                   @   rË  )ÚGlyphCIDMapc           
      C   s|   |  ¡ }| ¡ }| |¡}|t|ƒkrt d|t|ƒf ¡ i }ttt|ƒt|ƒƒƒD ]}|| }	|	dkr;|	||| < q+|S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restr³  )rª  rÝ   rÞ   rJ  r  r  rz   Úmin)
re   rs   rk   r|   Z
glyphOrderr}   ZcidsrÒ  r²  r'  r.   r.   r/   ri   J  s    

þÿ€zGlyphCIDMap.readNc           	         r(  )Nc                    s,   i | ]\}}|d ur|dkrˆ   |¡|“qS r&  r•  )ru   r  r'  r˜  r.   r/   r¼  \  s
    
þz%GlyphCIDMap.write.<locals>.<dictcomp>r   r   r³  r)  )	re   rŒ   rk   r|   r   r‘   ra  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   r-  )Nr³  r*  r  r.  )re   r—   rk   r   rU   r“   r–  r'  r.   r.   r/   r˜   m  r/  zGlyphCIDMap.xmlWriter*   r×  r.   r.   r.   r/   r0  I  s
    
r0  c                   @   rË  )Ú
DeltaValuec                 C   s¾   |d }|d }|d }|dv sJ dƒ‚|| d }d|> }d|> }	d|> d }
d|d > }g }d\}}t |ƒD ]$}|dkrE| ¡ d	}}|| }||? |
@ }||@ rW||	 }| |¡ q8|S )
NÚ	StartSizeÚEndSizeÚDeltaFormat©r   rÖ   rì   úillegal DeltaFormatr   )r   r   r   r'  )rz   rÝ   rR   )re   rs   rk   r|   r3  r4  r5  ÚnItemsÚnBitsZminusOffsetÚmaskZsignMaskr2  ÚtmpÚshiftrj   r   r.   r.   r/   ri   y  s(   zDeltaValue.readNc                 C   sº   |d }|d }|d }|}	|dv sJ dƒ‚|| d }
d|> }t |	ƒ|
ks(J ‚d|> d }d\}}|	D ]}|| }|||@ |> B }|dkrO| |¡ d\}}q4|d	kr[| |¡ d S d S )
Nr3  r4  r5  r6  r7  r   )r   r'  r   r'  )rJ  rà   )re   rŒ   rk   r|   r   r‘   r3  r4  r5  r2  r8  r9  r:  r;  r<  r.   r.   r/   r‰     s(   
€ÿzDeltaValue.writec                 C   ó"   |  ||d|fg ¡ | ¡  d S rª   ©r«   r¬   r–   r.   r.   r/   r˜   ¥  ó   zDeltaValue.xmlWritec                 C   ó   t |d ƒS rª   ©r   r’   r.   r.   r/   r•   ©  r  zDeltaValue.xmlReadr*   ©rP   r    r¡   ri   r‰   r˜   r•   r.   r.   r.   r/   r2  x  s
    
r2  c                   @   r]  )ÚVarIdxMapValuec           	         s|   |d }|d }d|d@  }d|> d ‰ dˆ  ‰d| ‰d|d@ d?  }|j |j|j|jd	œ| }‡ ‡‡fd
d„||ƒD ƒS )NÚEntryFormatra   r   rã  l   ÿÿ r'  é0   rº   ©r   rÖ   rì   rº   c                    s    g | ]}|ˆ@ ˆ> |ˆ @ B ‘qS r.   r.   )ru   Úraw©Ú	innerMaskZ	outerMaskÚ
outerShiftr.   r/   r™  ¿  ó    ÿÿz'VarIdxMapValue.read.<locals>.<listcomp>©rç   rÞ   ZreadUInt24ArrayrÌ   )	re   rs   rk   r|   Úfmtr8  Ú	innerBitsÚ	entrySizer   r.   rH  r/   ri   ®  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 )NrD  ra   r   rã  r'  rE  rº   rF  c                    s    g | ]}|d @ ˆ? |ˆ @ B ‘qS )l     þ r.   )ru   Úidx©rI  rJ  r.   r/   r™  Ö  rK  z(VarIdxMapValue.write.<locals>.<listcomp>)ZsetValuerJ  ré   rá   ÚwriteUInt24ArrayrÏ   )re   rŒ   rk   r|   r   r‘   rM  rÁ  rN  rO  r   r.   rQ  r/   r‰   Ä  s&   üûþÿzVarIdxMapValue.writer*   rh  r.   r.   r.   r/   rC  ­  s    rC  c                   @   rË  )ÚVarDataValuec                 C   s–   g }|d }|d }t |d@ ƒ}|d@ }|r|j|j}}	n|j|j}}	t||ƒt||ƒ}
}| ||
ƒ¡ | |	||
 ƒ¡ ||krI||d …= |S )Nr`   Ú	NumShortsé €  éÿ  )ÚboolrÀ   rØ   rã   r1  r  Úextend)re   rs   rk   r|   rN   ÚregionCountÚ	wordCountÚ	longWordsZreadBigArrayZreadSmallArrayÚn1Ún2r.   r.   r/   ri   Þ  s   
zVarDataValue.readNc                 C   s    |d }|d }t |d@ ƒ}|d@ }|j|jf|j|jfdœ| \}	}
t||ƒt||ƒ}}|	|d |… ƒ |
|||… ƒ ||krN| dg||  ¡ d S d S )Nr`   rT  rU  rV  rÙ  r   )rW  rÚ   rä   rÅ   r1  r  ÚwriteSmallArray)re   rŒ   rk   r|   rN   r‘   rY  rZ  r[  ZwriteBigArrayr^  r\  r]  r.   r.   r/   r‰   õ  s   

þýÿzVarDataValue.writec                 C   r=  rª   r>  r–   r.   r.   r/   r˜     r?  zVarDataValue.xmlWritec                 C   r@  rª   rA  r’   r.   r.   r/   r•     r  zVarDataValue.xmlReadr*   rB  r.   r.   r.   r/   rS  Ý  s
    
rS  c                   @   rË  )ÚTupleValuesc                 C   s   t  d |¡d S r´   )r   ZdecompileDeltas_)re   rH  rk   r.   r.   r/   ri     rP  zTupleValues.readNc                 C   s   |j t }ttj|| dƒS )N)ZoptimizeSize)Úcfgr   Úbytesr   ZcompileDeltaValues_)re   rŒ   rk   r|   rN   r‘   ZoptimizeSpeedr.   r.   r/   r‰     s   
ÿzTupleValues.writec                 C   r@  rª   rA  r’   r.   r.   r/   r•     r  zTupleValues.xmlReadc                 C   r=  rª   r>  r–   r.   r.   r/   r˜     r?  zTupleValues.xmlWriter*   r×  r.   r.   r.   r/   r_    s
    
r_  c                   @   sD   e Zd Z	dddddœdd„Zdd„ Zddd	„Zd
d„ Zdd„ ZdS )Ú	CFF2IndexNr]   )Ú	itemClassÚitemConverterClassr>   c                C   s:   t j| |||||d || _|d ur|ƒ | _d S d | _d S rÛ  )r\   rf   Ú
_itemClassÚ
_converter)re   rU   rV   rW   rL   rc  rd  r>   r.   r.   r/   rf   #  s   ÿÿÿzCFF2Index.__init__c                    s  ˆ  ¡ ‰ ˆ dkr
g S ˆ ¡ ‰dd„ ‰ˆˆˆƒ}ˆjduoˆ dk}|sq|ˆ d ƒ}g }| d¡}ˆ |d ¡ |D ]6}	||	ks@J ‚ˆ |	| ¡}
ˆjd ur[ˆ ¡ }| |
ˆˆj¡ |}
nˆjd urgˆj 	|
ˆ¡}
| 
|
¡ |	}q8|S ‡ ‡‡‡‡‡fdd„}|ƒ }t|gˆ  ƒ}|S )	Nr   c                 S   s   | j | j| j| jdœ| S )NrF  rL  )rs   ÚoffSizer.   r.   r/   ÚgetReadArray<  s   üûz$CFF2Index.read.<locals>.getReadArrayFrg   r   c                     sH   ˆ  ¡ ‰ˆj‰ˆˆd ˆ  d ‰ ˆˆˆƒ‰‡ ‡‡‡‡‡‡	fdd„} | S )Nr   c                    sˆ   ˆ  ˆ| ˆ  ¡ ˆdƒ}ˆ  ˆ |d  ¡ ˆ |d |d  ¡}ˆjd ur6ˆ ¡ }| |ˆˆj¡ |}|S ˆjd urBˆj |ˆ¡}|S )NrÖ   r   r   )rh   rF  re  rM  Ú
localStaterf  ri   )rj   rÑ  rÓ  Úobj)Údata_posrk   rg  Ú
offset_posr   rm   re   r.   r/   ro   c  s   

þz8CFF2Index.read.<locals>.get_read_item.<locals>.read_itemrp   rr   ©r}   rk   rh  rg  rs   re   )rk  rl  r   rm   r/   rt   ]  s   
z%CFF2Index.read.<locals>.get_read_item)rË   ræ   rw   ÚpoprF  re  rM  ri  rf  ri   rR   r   )re   rs   rk   r|   r   rw   rÑ  ra  Ú
lastOffsetrn  rÓ  rj  rt   ro   r~   r.   rm  r/   ri   6  s8   




zCFF2Index.readc                    sô   |}ˆ  t|ƒ¡ t|ƒsd S ˆjd ur‡ fdd„|D ƒ}nˆjd ur1‡ ‡‡‡fdd„t|ƒD ƒ}dd„ |D ƒ}tt|ddƒ}|d }|dk rJdn|d	k rPd
n|dk rVdnd}	ˆ |	¡ ˆjˆj	ˆj
ˆjdœ|	 }
|
|ƒ |D ]}ˆ |¡ qpd S )Nc                    s   g | ]}|  ˆ ¡‘qS r.   rO  ©ru   rÓ  r˜  r.   r/   r™  ‚  rÚ  z#CFF2Index.write.<locals>.<listcomp>c              	      s$   g | ]\}}ˆj  ˆˆ ˆ||¡‘qS r.   )rf  r‰   )ru   rj   rÓ  ©rk   re   r|   rŒ   r.   r/   r™  „  s    ÿÿc                 S   s   g | ]}t |ƒ‘qS r.   )rJ  rp  r.   r.   r/   r™  ‰  s    r   )Úinitialr‚  é   i   rÖ   i   rì   rº   rF  )rÎ   rJ  re  rf  rˆ   rš  r&   rè   ré   rá   rR  rÏ   rK  )re   rŒ   rk   r|   rN   r‘   ra  rÑ  ro  rg  r   rÓ  r.   rq  r/   r‰   z  s:   

þÿý
üûÿzCFF2Index.writec                 C   sF   | j d ur|   ¡ }| d |||¡ |S | jd ur | j |||¡S tƒ ‚r*   )re  rY  rf  r•   r…   )re   r“   r”   rk   rj  r.   r.   r/   r•   Ÿ  s   

zCFF2Index.xmlReadc              
   C   sz   | j d urt|ƒD ]\}}| ||d|fg|¡ q	d S | jd ur:t|ƒD ]\}}| j |||||d|fg ¡ q$d S tƒ ‚)Nr  )re  rˆ   rR  rf  r˜   r…   )re   r—   rk   r   rU   r“   rj   rÓ  r.   r.   r/   r˜   ©  s   
ÿ
ÿÿzCFF2Index.xmlWriter*   )rP   r    r¡   rf   ri   r‰   r•   r˜   r.   r.   r.   r/   rb  "  s    û÷
D%
rb  c                   @   rñ   )Ú
LookupFlagc                 C   s®   |  ||d|fg ¡ g }|d@ r| d¡ |d@ r| d¡ |d@ r(| d¡ |d@ r1| d	¡ |d
@ r:| d¡ |d@ rG| d|d?  ¡ |rQ| d |¡¡ | ¡  d S )Nr   r   ZrightToLeftrÖ   ZignoreBaseGlyphsrº   ZignoreLigaturesrg   ZignoreMarksr'  ZuseMarkFilteringSeti ÿ  zmarkAttachmentType[%i]r
  )r«   rR   ró   r  r¬   r  r.   r.   r/   r˜   ·  s"   




zLookupFlag.xmlWriteNrô   r.   r.   r.   r/   rt  ¶  rõ   rt  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/  ri   r†   r1  r.   r/   ri   Î  rÿ   z_UInt8Enum.readc                 C   s   t | j| ¡ ƒS r*   )r  rv  Úupperr  r.   r.   r/   r©   Ñ  ó   z_UInt8Enum.fromStringc                 C   s   |   |¡j ¡ S r*   )rv  rU   Úlowerr  r.   r.   r/   r§   Õ  rx  z_UInt8Enum.toString)
rP   r    r¡   ry   rv  ri   r$  r©   r§   r5  r.   r.   r1  r/   ru  Ë  s    
ru  c                   @   rÒ   )r"   N)rP   r    r¡   Ú_ExtendModerv  r.   r.   r.   r/   r"   Ú  rÔ   r"   c                   @   rÒ   )r#   N)rP   r    r¡   Ú_CompositeModerv  r.   r.   r.   r/   r#   Þ  rÔ   r#   Zint8Zint16Zint32r6   r2   Zuint24r7   Zchar64rð  ZOffsetZLOffsetZOffset24Z	TupleList)rd  ZVarCompositeGlyphList)rc  c                 C   ó   t t| dS ©N)rL   )r'   r‹  ©ÚCr.   r.   r/   r0     ó    c                 C   r|  r}  )r'   rÌ  r~  r.   r.   r/   r0     r€  c                 C   r|  r}  )r'   rò  r~  r.   r.   r/   r0     r€  c                 C   r|  r}  )r'   rO   r~  r.   r.   r/   r0     r€  c                 C   r|  r}  )r'   rs  r~  r.   r.   r/   r0     r€  c                 C   r|  r}  )r'   rv  r~  r.   r.   r/   r0     r€  )r%  r0  r?   r@   rA   r!   r‹  rÌ  rò  ZOffsetToZ	LOffsetToZLOffset24To)|ZfontTools.misc.fixedToolsr   r  r   r!  r   r#  r   r"  r   r8  r   r9  Z%fontTools.ttLib.tables.TupleVariationr   ZfontTools.misc.roundToolsr	   r
   ZfontTools.misc.textToolsr   r   r   r   r   ZfontTools.misc.lazyToolsr   ZfontTools.ttLibr   r   rŠ  r   r   r   r   r   ZotTablesr   r   r   r   r   r   r   r    r!   r"   rz  r#   r{  r$   Ú	itertoolsr%   r&   Ú	functoolsr'   Útypesr(   r£   rð  Útypingr)   ÚloggingÚ	getLoggerrP   r  rë  r[   Úobjectr\   r¤   r¯   r²   r¹   rÉ   rÐ   rÓ   rÕ   rÛ   râ   rå   rë   rò   rE   rF   rG   rù   rú   r  r  r	  r  r  r  r&  r*  r,  r6  r7  r=  rJ   rH   rO   rs  rv  r:   r8   r9   r;   r1   rˆ  r‹  rÌ  rØ  rò  r%  r0  r2  rC  rS  r_  rb  rt  ru  rI   r.   r.   r.   r/   Ú<module>   sD    8
@h


G"		 ;   5"/503 þýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Ý%Ï