o
    te                    @   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*m+Z+ d dl,m-Z- d d	l.m/Z/ d d
l0Z0d d
l1Z1d dl2m3Z3 d d
l4Z4e45e6Z7dd Z8dd Z9G dd de:Z;zd dl<m=Z= W n e>y   d dl=m=Z= Y nw G dd de=Z?G dd de@ZAG dd deAZBG dd deBZCG dd deBZDG dd deDZEG dd  d eDZFG d!d" d"eFZGG d#d$ d$eCeFZHG d%d& d&eDZIG d'd( d(eDZJG d)d* d*eDZKG d+d, d,eDZLG d-d. d.eDZMG d/d0 d0eDZNG d1d2 d2eNeLZOG d3d4 d4eNeJZPG d5d6 d6eNeFZQG d7d8 d8eBZRG d9d: d:eBZSG d;d< d<eSZTG d=d> d>eJZUG d?d@ d@eJZVG dAdB dBeBZWG dCdD dDeWZXG dEdF dFeWZYG dGdH dHeYZZG dIdJ dJeYZ[G dKdL dLe[Z\G dMdN dNe\Z]G dOdP dPeBZ^G dQdR dReBZ_G dSdT dTeAZ`G dUdV dVe`ZaG dWdX dXe`ZbG dYdZ dZebZcG d[d\ d\ebZdG d]d^ d^e`ZeG d_d` d`ebZfG dadb dbecefZgG dcdd ddebZhG dedf dfeDZiG dgdh dheiZjG didj djeAZkG dkdl dleAZlG dmdn dneAZmG dodp dpeAZnG dqdr dreAZoG dsdt dteAZpG dudv dveAZqG dwdx dxeAZrG dydz dzeAZsG d{d| d|eJZtG d}d~ d~eLZuG dd deuZ'G dd deuZ)i deKdeIdeLdeJdeMdeFde_d"eGd$eHdPe^d8eRd:eSd<eTd>eUdDeXdHeZdJe[i dLe\dNe]de`debdecdeddhejdveqdxerdzesd|etde'de)d@eVdreodtepdeaeaeaemdd dd dd dd dd dd d	Zvd
S )    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)getSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)lookupTypesAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeModeNO_VARIATION_INDEX)zip_longest)partialN)Optionalc                 C   s
   t | tS N)
isinstancetuple)t r(   SD:\Projects\ConvertPro\env\Lib\site-packages\fontTools/ttLib/tables/otConverters.py<lambda>)   s   
 r*   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sJ ||||< q||fS )zGiven a table spec from otData.py, build a converter object for each
    field of the table. This is called for each table in otData.py, and
    the results are assigned to the corresponding class in otTables.py.ValueFormatuint16Count)StructLength	MorphType)uint8r,   uint32SubTableExtSubTable	SubStructFeatureParams)ZCIDGlyphMappingZGlyphCIDMapping(description)	MortChainMortSubtable	MorxChain)r2   r3   r4   r   featureParamTypes)
startswithr+   endswithComputedUInt8ComputedUShortComputedULongr2   r3   r4   r5   StructWithLengthconverterMappingStructeval
tableClassgetr   valuesTable__name__r<   defaultFeatureParamsappend)Z	tableSpecZtableNamespace
convertersZconvertersByNametpnamerepeatauxdescrZ	tableNameZconverterClassconvrF   r'   clsr(   r(   r)   buildConverters,   sf   






rU   c                   @      e Zd ZdZdS )_MissingItemr(   N)rJ   
__module____qualname__	__slots__r(   r(   r(   r)   rW   l       rW   )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__w      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(   .0ra   r`   r(   r)   
<listcomp>}   s    z)_LazyList.__getitem__.<locals>.<listcomp>r   )r%   r_   rangeindiceslendatarW   readerseekpos
recordSizerS   readfont)r`   krj   itemr(   rg   r)   r^   z   s   



z_LazyList.__getitem__c                 C   s0   t |tr
t|}nt |trntS t| | S r$   )r%   r]   listNotImplementedr`   otherr(   r(   r)   __add__   s   


z_LazyList.__add__c                 C   s   t |tstS |t|  S r$   )r%   ru   rv   rw   r(   r(   r)   __radd__   s   
z_LazyList.__radd__N)rJ   rX   rY   rc   r^   ry   rz   r(   r(   r(   r)   r]   v   s
    	r]   c                   @   sv   e Zd ZdZdddddZdd Zd	d
 Zdd Zdd ZdddZ	dd Z
dd ZedZ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 r7   c                C   sT   || _ || _|| _|| _|dp|dv | _|dp|dk| _|dv | _|| _d S )Nr-   )DesignAxisRecordSizeValueRecordSizeZ
LookupTyper/   )Z
ClassCountZClass2CountZ
FeatureTagZSettingsCountVarRegionCountMappingCountZRegionAxisCountZDesignAxisCountr}   ZAxisValueCountr~   Z	AxisCountZBaseGlyphRecordCountZLayerRecordCount)	rO   rP   rQ   rF   r>   ZisCountZisLookupTypeisPropagatedr8   r`   rO   rP   rQ   rF   r8   r(   r(   r)   __init__   s   

zBaseConverter.__init__c           	      C   s   |j o|dk}|r| |}|tu rd}|s+g }t|D ]}|| ||| q|S t }| |_|jj	|_	||_
| |_||_|dd t|D  |||  |S )z(Read an array of values from the reader.   Fc                 s   s    | ]}t |gV  qd S r$   )rW   re   r(   r(   r)   	<genexpr>   s    z*BaseConverter.readArray.<locals>.<genexpr>)lazygetRecordSizerv   ri   rL   rq   r]   copyrm   ro   rr   rS   rp   extendadvance)	r`   rm   rr   	tableDictcountr   rp   lra   r(   r(   r)   	readArray   s&   


zBaseConverter.readArrayc                 C   s   t | dr| jS tS )N
staticSize)hasattrr   rv   r`   rm   r(   r(   r)   r      s   
zBaseConverter.getRecordSizec                 C      t | )zRead a value from the reader.NotImplementedErrorr`   rm   rr   r   r(   r(   r)   rq         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)r`   writerrr   r   rH   ra   valueer(   r(   r)   
writeArray   s   zBaseConverter.writeArrayc                 C   r   )zWrite a value to the writer.r   r`   r   rr   r   r   repeatIndexr(   r(   r)   r      r   zBaseConverter.writec                 C   r   )zRead a value from XML.r   r`   attrscontentrr   r(   r(   r)   xmlRead   r   zBaseConverter.xmlReadc                 C   r   )zWrite a value to XML.r   r`   	xmlWriterrr   r   rO   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searchr8   intgroup)r`   mr(   r(   r)   getVarIndexOffset   s   zBaseConverter.getVarIndexOffsetr$   )rJ   rX   rY   __doc__r   r   r   rq   r   r   r   r   recompiler   r#   r   r   r(   r(   r(   r)   r{      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)rJ   rX   rY   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   )DEFAULTrL   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)rJ   rX   rY   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rJ   rX   rY   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)   rq        z	Long.readc                 C   
   | |S r$   )readLongArrayr`   rm   rr   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r`   r   rr   r   rH   r(   r(   r)   r   %  r   zLong.writeArrayr$   rJ   rX   rY   r   rq   r   r   r   r(   r(   r(   r)   r         
r   c                   @   r   )ULongr   c                 C   r   r$   	readULongr   r(   r(   r)   rq   ,  r   z
ULong.readc                 C   r   r$   )readULongArrayr   r(   r(   r)   r   /  r   zULong.readArrayNc                 C   r   r$   
writeULongr   r(   r(   r)   r   2  r   zULong.writec                 C   r   r$   )writeULongArrayr   r(   r(   r)   r   5  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)rJ   rX   rY   r   r   r(   r(   r(   r)   r   9  r   r   c                   @      e Zd ZeZdS )VarIndexN)rJ   rX   rY   r    r   r(   r(   r(   r)   r   ?  r[   r   c                   @   r   )Short   c                 C   r   r$   )	readShortr   r(   r(   r)   rq   F  r   z
Short.readc                 C   r   r$   )readShortArrayr   r(   r(   r)   r   I  r   zShort.readArrayNc                 C   r   r$   )
writeShortr   r(   r(   r)   r   L  r   zShort.writec                 C   r   r$   )writeShortArrayr   r(   r(   r)   r   O  r   zShort.writeArrayr$   r   r(   r(   r(   r)   r   C  r   r   c                   @   r   )UShortr   c                 C   r   r$   
readUShortr   r(   r(   r)   rq   V  r   zUShort.readc                 C   r   r$   )readUShortArrayr   r(   r(   r)   r   Y  r   zUShort.readArrayNc                 C   r   r$   writeUShortr   r(   r(   r)   r   \  r   zUShort.writec                 C   r   r$   )writeUShortArrayr   r(   r(   r)   r   _  r   zUShort.writeArrayr$   r   r(   r(   r(   r)   r   S  r   r   c                   @   r   )Int8r   c                 C   r   r$   )ZreadInt8r   r(   r(   r)   rq   f  r   z	Int8.readc                 C   r   r$   )readInt8Arrayr   r(   r(   r)   r   i  r   zInt8.readArrayNc                 C   r   r$   )Z	writeInt8r   r(   r(   r)   r   l  r   z
Int8.writec                 C   r   r$   )writeInt8Arrayr   r(   r(   r)   r   o  r   zInt8.writeArrayr$   r   r(   r(   r(   r)   r   c  r   r   c                   @   r   )UInt8r   c                 C   r   r$   )	readUInt8r   r(   r(   r)   rq   v  r   z
UInt8.readc                 C   r   r$   )readUInt8Arrayr   r(   r(   r)   r   y  r   zUInt8.readArrayNc                 C   r   r$   )Z
writeUInt8r   r(   r(   r)   r   |  r   zUInt8.writec                 C   r   r$   )writeUInt8Arrayr   r(   r(   r)   r     r   zUInt8.writeArrayr$   r   r(   r(   r(   r)   r   s  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)   rq     r   zUInt24.readNc                 C   r   r$   ZwriteUInt24r   r(   r(   r)   r     r   zUInt24.writer$   rJ   rX   rY   r   rq   r   r(   r(   r(   r)   r         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   zComputedInt.xmlWriteNrJ   rX   rY   r   r(   r(   r(   r)   r         r   c                   @      e Zd ZdS )r?   NrJ   rX   rY   r(   r(   r(   r)   r?         r?   c                   @   r  )r@   Nr  r(   r(   r(   r)   r@     r  r@   c                   @   r  )rA   Nr  r(   r(   r(   r)   rA     r  rA   c                   @   r   )Tagr   c                 C   r   r$   )ZreadTagr   r(   r(   r)   rq     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)   rq        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$   )	rJ   rX   rY   r   r	  r   rq   r   r   r(   r(   r(   r)   r    s    r  c                   @   s   e Zd ZdZdZdS )	GlyphID32r   LN)rJ   rX   rY   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   rO     zmissing from name tablez"name id %d missing from name table)r   rG   ZgetDebugNamer   r   logwarningr   )r`   r   rr   r   rO   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   rL   r   r   joinr   r`   r   rr   r   rO   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)   rq        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)   rq     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rT   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$   )rJ   rX   rY   rv   r   r*  r%  r&  rq   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rJ   rX   rY   r   r*  r%  r&  r(   r(   r(   r)   r2    
    r2  c                   @   r1  )F2Dot14r      r   r   Nr4  r(   r(   r(   r)   r6    r5  r6  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 r9  )r;  r'  r<  r+  r=  r(   r)   r'  %  r?  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   r@  r+  r(   r(   r)   r   .  r,  zAngle.toString)rJ   rX   rY   r<  r@  r0  r#  r'  r   r   __classcell__r(   r(   r=  r)   r8    s    
r8  c                   @   rV   )BiasedAngleg      ?N)rJ   rX   rY   r<  r(   r(   r(   r)   rB  3  s    rB  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   )r`   rm   rr   r   r   r(   r(   r)   rq   <  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   D  r   zVersion.fromStringc                 C   r   )N0x%08xr(   r   r(   r(   r)   r   H  r   zVersion.toStringc                 C   r   )Nr3  )r-  )vr(   r(   r)   	fromFloatL  r   zVersion.fromFloatr$   )
rJ   rX   rY   r   rq   r   r   r   r   rH  r(   r(   r(   r)   rC  9  s    


rC  c                   @   s&   e Zd ZdZdZdd ZdddZdS )	Char64zAn 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")ZreadDatar   findr   r  r  )r`   rm   rr   r   rl   ZzeroPossr(   r(   r)   rq   Z  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 )NrL  rM  rN  rQ  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesrK  )r   r  r  rk   r   	writeData)r`   r   rr   r   r   r   rl   r(   r(   r)   r   d  s   zChar64.writer$   )rJ   rX   rY   r   r   rq   r   r(   r(   r(   r)   rI  Q  s
    
rI  c                   @   s>   e Zd Zdd Zdd ZdddZdd	 Zd
d Zdd ZdS )rD   c                 C   s   | j o| j |S r$   )rF   r   r   r(   r(   r)   r   q     zStruct.getRecordSizec                 C   s   |   }||| |S r$   )rF   	decompile)r`   rm   rr   r   tabler(   r(   r)   rq   t  s   zStruct.readNc                 C   s   | || d S r$   )r   r   r(   r(   r)   r   y  rd   zStruct.writec                 C   sF   |d u r|r| ||dg  |  d S 	 d S |j||||d d S )N)emptyr   )rO   )r   r   toXMLr   r(   r(   r)   r   |  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 )NrX  FormatZpostReadFT_propagator)
propagator)r   rF   rG   r   rZ  r   getConvertersr   r[  rO   setattrr   __dict__r%   r&   fromXMLZpopulateDefaultsr$  )r`   r   r   rr   rW  rZ  Z
noPostReadZcleanPropagationrS   r\  elementrO   r(   r(   r)   r     sF   




zStruct.xmlReadc                 C   s   dt | j S )Nz
Struct of )reprrF   rg   r(   r(   r)   __repr__  r   zStruct.__repr__r$   )	rJ   rX   rY   r   rq   r   r   r   rc  r(   r(   r(   r)   rD   p  s    
*rD   c                   @      e Zd Zdd ZdddZdS )rB   c                 C   s.   |j }|  }||| |||j  |S r$   )ro   rF   rV  rn   r.   )r`   rm   rr   r   ro   rW  r(   r(   r)   rq     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 )Nr.   r      i     >[= )r   r   r      ޭ)r   r]  rO   rk   itemsr%   r   r   getDataLengthr.   r   getSubWriterr   
getAllData)r`   r   rr   r   r   r   Z	convIndexrS   lengthIndexZdeadbeefbeforelengthZlengthWriterr(   r(   r)   r     s    

zStructWithLength.writer$   rJ   rX   rY   rq   r   r(   r(   r(   r)   rB     s    rB   c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )rI   r   c                 C   r   r$   r   r   r(   r(   r)   
readOffset  r   zTable.readOffsetc                 C      | d d S r   r   r`   r   r(   r(   r)   writeNullOffset  r   zTable.writeNullOffsetc                 C   sN   |  |}|dkrd S |  }||}|jr||_||_|S ||| |S r   )rp  rF   getSubReaderr   rm   rr   rV  )r`   rm   rr   r   offsetrW  r(   r(   r)   rq     s   

z
Table.readNc                 C   sT   |d u r|  | d S | }| j|_|d ur||_|j|| jd ||| d S )NZ
offsetSize)rs  rj  rO   r   writeSubTabler   r   )r`   r   rr   r   r   r   	subWriterr(   r(   r)   r     s   zTable.writer$   )rJ   rX   rY   r   rp  rs  rq   r   r(   r(   r(   r)   rI     s    rI   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)   rp    r   zLTable.readOffsetc                 C   rq  r   r   rr  r(   r(   r)   rs    r   zLTable.writeNullOffsetNrJ   rX   rY   r   rp  rs  r(   r(   r(   r)   rz        rz  c                   @   ry  )Table24r   c                 C   r   r$   r   r   r(   r(   r)   rp    r   zTable24.readOffsetc                 C   rq  r   r   rr  r(   r(   r)   rs    r   zTable24.writeNullOffsetNr{  r(   r(   r(   r)   r}    r|  r}  c                       $   e Zd Zdd Z fddZ  ZS )r4   c                 C   $   | j | | }| | j| j| j|S r$   r   r>  rO   rP   rQ   r`   Z	tableTypeZ
lookupTyperF   r(   r(   r)   getConverter     zSubStruct.getConverterc                       t t| |||d | d S r$   )r;  r4   r   r   r=  r(   r)   r        zSubStruct.xmlWriterJ   rX   rY   r  r   rA  r(   r(   r=  r)   r4         r4   c                       r~  )r2   c                 C   r  r$   r  r  r(   r(   r)   r    r  zSubTable.getConverterc                    r  r$   )r;  r2   r   r   r=  r(   r)   r     r  zSubTable.xmlWriter  r(   r(   r=  r)   r2     r  r2   c                   @   s   e Zd ZdddZdS )r3   Nc                 C   s   d|_ t| ||||| d S )NT)Z	ExtensionrI   r   r   r(   r(   r)   r     s   zExtSubTable.writer$   )rJ   rX   rY   r   r(   r(   r(   r)   r3     s    r3   c                   @   r   )r5   c                 C   s&   | j || j}| | j| j| j|S r$   )r<   rG   rK   r>  rO   rP   rQ   )r`   Z
featureTagrF   r(   r(   r)   r  %     zFeatureParams.getConverterN)rJ   rX   rY   r  r(   r(   r(   r)   r5   $  r  r5   c                   @   s2   e Zd ZdZdddddZdd Zdd	d
ZdS )r+   r   Nr|   r7   c                C   s4   t j| |||||d d|d dkrdnd | _d S )Nr7   r+   21)r{   r   whichr   r(   r(   r)   r   -  s   zValueFormat.__init__c                 C   s   |  }t||| j< |S r$   )r   r   r  r`   rm   rr   r   formatr(   r(   r)   rq   3  s   zValueFormat.readc                 C   s   | | t||| j< d S r$   )r   r   r  )r`   r   rr   r   r  r   r(   r(   r)   r   8  s   
zValueFormat.writer$   )rJ   rX   rY   r   r   rq   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   )rk   r  r   r(   r(   r)   r   >  rU  zValueRecord.getRecordSizec                 C   s   || j  ||S r$   )r  ZreadValueRecordr   r(   r(   r)   rq   A  rU  zValueRecord.readNc                 C   s   || j  ||| d S r$   )r  ZwriteValueRecordr   r(   r(   r)   r   D  r  zValueRecord.writec                 C   s"   |d u rd S | ||| j| d S r$   )rY  rO   r   r(   r(   r)   r   G  s   zValueRecord.xmlWritec                 C   s&   ddl m} | }|d ||| |S )Nr   )r  )otBaser  r`  )r`   r   r   rr   r  r   r(   r(   r)   r   M  s   zValueRecord.xmlReadr$   )rJ   rX   rY   r   rq   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|   r7   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 )Nr7   Value)rO   rP   rQ   )rO   rP   rQ   rF   )r{   r   
issubclassrF   r   	converterrI   r   r(   r(   r)   r   X  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      r   Fzunsupported lookup format: %d)r   readFormat0readFormat2readFormat4readFormat6readFormat8r  r(   r(   r)   rq   c  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  )rf   glyphvalrr   r(   r)   rh   t  s    z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	ru   sortedrh  filterbuildFormat0buildFormat2buildFormat6buildFormat8ri  )r`   r   rr   r   r   r   rH   formatsZdataSizeZlookupFormatZwriteMethodro   Z
actualSizer(   r  r)   r   r  s4   
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 r$   )writeFormat0r(   rr   r`   rH   r   r(   r)   r*         z(AATLookup.buildFormat0.<locals>.<lambda>)rk   getGlyphOrderr  r   )r`   r   rr   rH   	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   )r`   r   rr   rH   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(   rr   segmentsr`   r   r(   r)   r*     r  z(AATLookup.buildFormat2.<locals>.<lambda>)rL   r  r   rk   BIN_SEARCH_HEADER_SIZE)r`   r   rr   rH   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    rK  r   r  r   rk   r  r   rT  )
r`   r   rr   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)   r*     r  z(AATLookup.buildFormat6.<locals>.<lambda>)r  r   rk   r  )r`   r   rr   rH   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  rK  r  )	r`   r   rr   rH   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  r   c                      r  r$   )writeFormat8r(   r  r(   r)   r*     r  z(AATLookup.buildFormat8.<locals>.<lambda>)rk   r  r   )r`   r   rr   rH   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   r   r  )r   rk   r  r   )r`   r   rr   rH   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
  rf   rs   r   r  r(   r)   
<dictcomp>       z)AATLookup.readFormat0.<locals>.<dictcomp>)rk   r  r  r   r   )r`   rm   rr   r  rl   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   ro   r   r  r   ri   rn   rq   r
  )r`   rm   rr   mappingro   r  r  ra   lastfirstr   rs   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  )	ro   r   ri   rn   rt  r  r   r   r
  )r`   rm   rr   r  ro   r  ra   r  r  ru  
dataReaderrl   rs   rG  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  )	r`   rm   rr   r  ro   r  ra   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  rr   r(   r)   r  6  s     z)AATLookup.readFormat8.<locals>.<dictcomp>)r   r  r   r   )r`   rm   rr   r   rl   r(   r  r)   r  2  s   zAATLookup.readFormat8c           	      C   sF   i }|D ]}t |tr |\}}}|dkr | j|||||d < q|S )NLookupr  )r%   r&   r  r   )	r`   r   r   rr   r   ra  rO   a
eltContentr(   r(   r)   r   8  s   

zAATLookup.xmlReadc                 C   s\   | || |  t| D ]\}}| jj|||dd|fgd q|| |  d S )Nr  r  )r   rO   r   )begintagr   r  rh  r  r   endtag)r`   r   rr   r   rO   r   r  r(   r(   r)   r   A  s   
zAATLookup.xmlWriter$   )rJ   rX   rY   r  r   rq   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r(   r(   r(   r)   r  U  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   rt  r  r   rq   rh  rF   rV  )r`   rm   rr   r   ZlookupOffsetZ
dataOffsetlookupReaderlookupoffsetsresultr  ru  r  rt   r(   r(   r)   rq   T  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   rv  )r  r  r   r   rk  rG   rk   rL   rj  r  r   r   rw  rT  )r`   r   rr   r   r   r   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDatar  rx  rl   ru  lookupWriterr  Z
dataWriterdr(   r(   r)   r   b  s,   


zAATLookupWithDataOffset.writec                 C   s   t dd d | j}||||S r  )r  rF   r   )r`   r   r   rr   r  r(   r(   r)   r     s   zAATLookupWithDataOffset.xmlReadc                 C   s&   t dd d | j}|||||| d S r  )r  rF   r   )r`   r   rr   r   rO   r   r  r(   r(   r)   r     r  z AATLookupWithDataOffset.xmlWriter$   rJ   rX   rY   rq   r   r   r   r(   r(   r(   r)   r  S  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(   )rf   r  r  r(   r(   r)   r    s    z MorxSubtableConverter.<dictcomp>Nr|   r7   c                C   s   t j| |||||d d S )Nr7   )r{   r   r   r(   r(   r)   r     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)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 rTJ d|j
 |j | }	|j|j |j |j |	  }
t|
|j|	 ksrJ t|
|jd}| |_|j|| |||j  |S )	NrJ  r   r3     ZmorxFz!unsupported 'morx' lookup type %s)rl   tableTag)ro   r   r   r.   r   _PROCESSING_ORDERSProcessingOrderr  r   Reservedr/   SubFeatureFlagsr   rG   rl   rk   r   r  r4   rV  rn   )r`   rm   rr   r   ro   r   r  orderKeyrF   ZheaderLengthrl   Z	subReaderr(   r(   r)   rq     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  rF  )r  r   r   r.   r   r  r  r  r/   r  r4   rY  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   rJ  r3  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  r>   r`  )
r`   r   r   rr   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   r3  r  r  r   rJ  r  r  rf  r  rg  z>L)r  r  r  r  r  rk   rh  ri  r.   r   structpack)r`   r   rr   r   r   r   r  ZreverseOrderZlogicalOrderrl  rm  ZorigReservedrn  r(   r(   r)   r     s&   
zMorxSubtableConverter.writer$   )rJ   rX   rY   r  rh  r  r   r  rq   r   r   r   r(   r(   r(   r)   r    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|   r7   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 )Nr7   GlyphClassesPerGlyphLookup)r{   r   r  rF   r   r  r   classLookupr   r  perGlyphLookupr   r(   r(   r)   r     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sJ |
||_| |
||_nt| jtr|d}	|	||   | j||||_t|j|j |jd  }t|D ]"}t }|j| t|jD ]}| }| ||||	|j|< qq| jd ur| ||||_|S )Nr   r   )r   ro   rt  r   GlyphClassCountrn   r  r  rF   r   r   LigComponents_readLigatures	Ligaturesr   r  rq   r  r   ri   r   StatesrL   r   _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)r`   rm   rr   r   rW  ro   ZclassTableReaderZstateArrayReaderZentryTableReaderactionReaderZligaturesReaderZperGlyphTableReaderZligComponentReaderZnumLigComponentsZ	numStates
stateIndexstate
glyphClass
entryIndexr(   r(   r)   rq     s\   










zSTXHeader.readc                 C   s0   |   }||j||j  }|||| |S r$   )rF   rt  ro   r   rV  )r`   rm   r  rr   r  
transitionZentryReaderr(   r(   r)   r  J  s   zSTXHeader._readTransitionc                 C   s(   t |j}||j d }|||S r  )rk   rl   ro   r  r   )r`   rm   rr   limitZnumLigatureGlyphsr(   r(   r)   r  R  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  rH   r%   r   Z	MarkIndexmaxZCurrentIndex)r`   rW  
numLookupsr  r'   r(   r(   r)   _countPerGlyphLookupsW  s   



zSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t| |D ]}|d}|||   || j||i  q|S r   )	ro   ri   r
  rt  rn   r   rL   r  rq   )r`   rW  rm   rr   ro   lookupsr  r  r(   r(   r)   r  f  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rt|dksJ |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   r3  r   )NNr   )r   r  r   r  r   rk  r  rH   r  rF   ZactionHeaderSizeZcompileActionsr  _compileStatesrk   _compilePerGlyphLookups_compileLigComponents_compileLigaturesr   rT  )r`   r   rr   r   r   r   ZglyphClassWriterZglyphClassDataglyphClassCountZglyphClassTableOffsetZ
actionDataactionIndexstateArrayDataentryTableDataZstateArrayOffsetZentryTableOffsetZperGlyphOffsetZperGlyphDataZactionOffsetZligaturesOffsetZligComponentsOffsetZligComponentsDataZligaturesDatar(   r(   r)   r   o  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   ri   r  r   rk  rk   r   rb  rG   rL   r   r   r
   )r`   rr   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   rv  )	r  r
  rk   r   r   rj  r   rw  rk  )r`   rW  rr   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   rk  )r`   rW  rr   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  rk  )r`   rW  rr   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)rr   r   rO   r  r  r  LigComponent)r  r   )r  r   r   r  r  r  rh  r   r   r  r  rY  r  r   r   r$  _xmlWriteLigatures)r`   r   rr   r   rO   r   gklassr  r  r  transra   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  )r`   r   rr   r   rO   r   ra   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  rL   r  r   r   _xmlReadLigComponentsr  _xmlReadLigaturesr  r  rH   r  )r`   r   r   rr   rW  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   rF   r`  r  )
r`   r   r   rr   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  rL   r   )r`   r   r   rr   ZligComponentsr  r  _eltContentr(   r(   r)   r$  3  s   zSTXHeader._xmlReadLigComponentsc                 C   s4   g }t t|D ]\}}}|dkr||d  q|S )Nr"  r  )r  r  rL   )r`   r   r   rr   Zligsr  r  r&  r(   r(   r)   r%  :  s   zSTXHeader._xmlReadLigaturesr$   )rJ   rX   rY   r   rq   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
  )r`   rm   rr   r   ZnumCIDsr  cidr  r(   r(   r)   rq   C  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  )rf   r)  r  r  r(   r)   r  L  r  z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   r  rh  r  r   ri   rG   )	r`   r   rr   r   r   r   rh  r   r)  r(   r  r)   r   K  s   
zCIDGlyphMap.writec                 C   s>   i }t t|D ]\}}}|dkr|d  |t|d < q|S )NCIDr  r)  )r  r  stripr   r`   r   r   rr   r  ZeNameZeAttrsZ	_eContentr(   r(   r)   r   R  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  rh  r   r  )r`   r   rr   r   rO   r   r)  r  r(   r(   r)   r   Y     
zCIDGlyphMap.xmlWriter$   r  r(   r(   r(   r)   r'  B  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   rk   r  r  ri   min)
r`   rm   rr   r   Z
glyphOrderr   Zcidsr  r  r)  r(   r(   r)   rq   e  s    

zGlyphCIDMap.readNc           	         r*  )Nc                    s,   i | ]\}}|d ur|dkr  ||qS r(  r  )rf   r  r)  r  r(   r)   r  w  s
    
z%GlyphCIDMap.write.<locals>.<dictcomp>r   r   r  r+  )	r`   r   rr   r   r   r   rh  r   r  r(   r  r)   r   v  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     s   zGlyphCIDMap.xmlReadc                 C   r/  )Nr  r,  r  r0  )r`   r   rr   r   rO   r   r  r)  r(   r(   r)   r     r1  zGlyphCIDMap.xmlWriter$   r  r(   r(   r(   r)   r2  d  s
    
r2  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   r3  )ri   r   rL   )r`   rm   rr   r   r5  r6  r7  nItemsnBitsZminusOffsetmaskZsignMaskr4  tmpshiftra   r   r(   r(   r)   rq     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 )
Nr5  r6  r7  r8  r9  r   )r   r3  r   r3  )rk   r   )r`   r   rr   r   r   r   r5  r6  r7  r4  r:  r;  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$   rJ   rX   rY   rq   r   r   r   r(   r(   r(   r)   r4    s
    
r4  c                   @   rd  )VarIdxMapValuec           	         s|   |d }|d }d|d@  }d|> d  d  d| d|d@ d?  }|j |j|j|jd	| } fd
d||D S )NEntryFormatr   r   r  l    r3  0   r   r   r   r   r   c                    s    g | ]}|@ > | @ B qS r(   r(   )rf   raw	innerMaskZ	outerMask
outerShiftr(   r)   rh         z'VarIdxMapValue.read.<locals>.<listcomp>)r   r   ZreadUInt24Arrayr   )	r`   rm   rr   r   fmtr:  	innerBits	entrySizer   r(   rJ  r)   rq     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 )NrF  r   r   r  r3  rG  r   rH  c                    s    g | ]}|d @ ? | @ B qS )l      r(   )rf   idxrK  rL  r(   r)   rh     rM  z(VarIdxMapValue.write.<locals>.<listcomp>)ZsetValuerk   r   r   ZwriteUInt24Arrayr   )r`   r   rr   r   r   r   rN  r  rO  rP  r   r(   rR  r)   r     s&   zVarIdxMapValue.writer$   ro  r(   r(   r(   r)   rE    s    rE  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   r3  r  r   )r`   rm   rr   r   rH   regionCount	wordCount	longWordsZreadBigArrayZreadSmallArrayn1n2r(   r(   r)   rq     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   r3  r  writeSmallArray)r`   r   rr   r   rH   r   rX  rY  rZ  ZwriteBigArrayr]  r[  r\  r(   r(   r)   r     s   

zVarDataValue.writec                 C   r?  r   r@  r   r(   r(   r)   r   #  rA  zVarDataValue.xmlWritec                 C   rB  r   rC  r   r(   r(   r)   r   '  r   zVarDataValue.xmlReadr$   rD  r(   r(   r(   r)   rS    s
    
rS  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ignoreLigaturesr   ZignoreMarksr3  ZuseMarkFilteringSeti   zmarkAttachmentType[%i]r  )r   rL   r   r  r   r  r(   r(   r)   r   ,  s"   




zLookupFlag.xmlWriteNr   r(   r(   r(   r)   r^  +  r  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;  rq   r   r=  r(   r)   rq   C  r  z_UInt8Enum.readc                 C   s   t | j| S r$   )r$  r`  upperr+  r(   r(   r)   r   F     z_UInt8Enum.fromStringc                 C   s   |  |j S r$   )r`  rO   lowerr+  r(   r(   r)   r   J  rb  z_UInt8Enum.toString)
rJ   rX   rY   rv   r`  rq   r0  r   r   rA  r(   r(   r=  r)   r_  @  s    
r_  c                   @   r   )r   N)rJ   rX   rY   _ExtendModer`  r(   r(   r(   r)   r   O  r[   r   c                   @   r   )r   N)rJ   rX   rY   _CompositeModer`  r(   r(   r(   r)   r   S  r[   r   Zint8Zint16r0   r,   Zuint24r1   Zchar64r  ZOffsetZLOffsetZOffset24r9   c                 C      t t| dS N)rF   )r"   r  Cr(   r(   r)   r*         c                 C   rf  rg  )r"   r  rh  r(   r(   r)   r*     rj  c                 C   rf  rg  )r"   r  rh  r(   r(   r)   r*     rj  c                 C   rf  rg  )r"   rI   rh  r(   r(   r)   r*     rj  c                 C   rf  rg  )r"   rz  rh  r(   r(   r)   r*     rj  c                 C   rf  rg  )r"   r}  rh  r(   r(   r)   r*     rj  )	r:   r;   r   r  r  r  ZOffsetToZ	LOffsetToZLOffset24To)wZfontTools.misc.fixedToolsr   r)  r   r-  r   r/  r   r.  r   rD  r   rE  ZfontTools.misc.roundToolsr   r	   ZfontTools.misc.textToolsr
   r   r   r   r   ZfontTools.ttLibr   r  r   r   r   r   r   ZotTablesr   r   r   r   r   r   r   r   r   rd  r   re  r    	itertoolsr!   	functoolsr"   r   r  typingr#   logging	getLoggerrJ   r  r  rU   r&   rW   collectionsr\   ImportErrorr]   objectr{   r   r   r   r   r   r   r   r   r   r   r   r   r   r?   r@   rA   r  r  r  r  r  r  r  r"  r2  r6  r8  rB  rC  rI  rD   rB   rI   rz  r}  r4   r2   r3   r5   r+   r  r  r  r  r  r'  r2  r4  rE  rS  r^  r_  rC   r(   r(   r(   r)   <module>   s@    4
@_


G"		 ;   5"/503	
 "#$%