o
    a5                  
   @   s  d dl mZmZmZmZm	Z
mZ d dlmZmZ d dlmZmZmZmZmZ d dlmZ ddlmZmZmZmZmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z(m)Z* d dl+m,Z, d d	l-m.Z. d d
l/Z/d d
l0Z0e01e2Z3dd Z4dd Z5G dd de6Z7zd dl8m9Z9 W n e:y   d dl9m9Z9 Y nw G dd de9Z;G dd de<Z=G dd de=Z>G dd de>Z?G dd de>Z@G dd de@ZAG dd de@ZBG d d! d!eBZCG d"d# d#e?eBZDG d$d% d%e@ZEG d&d' d'e@ZFG d(d) d)e@ZGG d*d+ d+e@ZHG d,d- d-e@ZIG d.d/ d/e@ZJG d0d1 d1eJeHZKG d2d3 d3eJeFZLG d4d5 d5eJeBZMG d6d7 d7e>ZNG d8d9 d9e>ZOG d:d; d;eOZPG d<d= d=eFZQG d>d? d?eFZRG d@dA dAe>ZSG dBdC dCeSZTG dDdE dEeSZUG dFdG dGeSZVG dHdI dIeVZWG dJdK dKe>ZXG dLdM dMe>ZYG dNdO dOe=ZZG dPdQ dQeZZ[G dRdS dSeZZ\G dTdU dUe\Z]G dVdW dWe\Z^G dXdY dYeZZ_G dZd[ d[e\Z`G d\d] d]e]e`ZaG d^d_ d_e\ZbG d`da dae@ZcG dbdc dcecZdG ddde dee=ZeG dfdg dge=ZfG dhdi die=ZgG djdk dke=ZhG dldm dme=ZiG dndo doe=ZjG dpdq dqe=ZkG drds dse=ZlG dtdu due=ZmG dvdw dweFZnG dxdy dyeHZoG dzd{ d{eoZ'G d|d} d}eoZ)i d~eGdeEdeHdeFdeIdeBdeYd!eCd#eDdKeXd7eNd9eOd;ePd=eQdCeTdEeUdGeVi dIeWdeZde\de]de^dceddqekdselduemdwend{e'd}e)d?eRdmeidoejde[de[e[egdd dd dd dd dd dd dZpd
S )    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)getSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)
lookupTypesAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeMode)zip_longest)partialNc                 C   s
   t | tS N)
isinstancetuple)t r&   E/usr/lib/python3/dist-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}
|
|||}|jrr|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()	MortChainMortSubtable	MorxChain)r0   r1   r2   r   featureParamTypes)
startswithr)   endswithComputedUInt8ComputedUShortComputedULongr0   r1   r2   r3   StructWithLengthconverterMappingStructeval
tableClassgetr   valuesTable__name__r8   defaultFeatureParamsappend)Z	tableSpecZtableNamespaceZ
convertersZconvertersByNametpnamerepeatauxZdescrZ	tableNameZconverterClassconvrB   r%   clsr&   r&   r'   buildConverters   sf   






rO   c                   @      e Zd ZdZdS )_MissingItemr&   N)rF   
__module____qualname__	__slots__r&   r&   r&   r'   rQ   ]       rQ   )UserListc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	_LazyListc                 C   s   |  t||S r"   )__getitem__slice)selfijr&   r&   r'   __getslice__i      z_LazyList.__getslice__c                    s   t |trt|t  } fdd|D S  j| }t |tr> j j	|d  j
    j j ji }| j|< |S )Nc                    s   g | ]} | qS r&   r&   .0r[   rZ   r&   r'   
<listcomp>o   s    z)_LazyList.__getitem__.<locals>.<listcomp>r   )r#   rY   rangeindiceslendatarQ   readerseekpos
recordSizerM   readfont)rZ   krd   itemr&   ra   r'   rX   l   s   



z_LazyList.__getitem__c                 C   s0   t |tr
t|}nt |trntS t| | S r"   )r#   rW   listNotImplementedrZ   otherr&   r&   r'   __add__w   s   


z_LazyList.__add__c                 C   s   t |tstS |t|  S r"   )r#   ro   rp   rq   r&   r&   r'   __radd__   s   
z_LazyList.__radd__N)rF   rR   rS   r]   rX   rs   rt   r&   r&   r&   r'   rW   g   s
    	rW   c                   @   sT   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdddZ	dd Z
dd ZdS )BaseConverterzYBase class for converter objects. Apart from the constructor, this
	is an abstract class.Nc                 C   sN   || _ || _|| _|| _|dp|dv | _|dp|dk| _|dv | _d S )Nr+   )DesignAxisRecordSizeValueRecordSizeZ
LookupTyper-   )Z
ClassCountZClass2CountZ
FeatureTagZSettingsCountVarRegionCountMappingCountZRegionAxisCountZDesignAxisCountrv   ZAxisValueCountrw   Z	AxisCountZBaseGlyphRecordCountZLayerRecordCount)rJ   rK   rL   rB   r:   ZisCountZisLookupTypeisPropagatedrZ   rJ   rK   rL   rB   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"   )rQ   r_   r&   r&   r'   	<genexpr>   s    z*BaseConverter.readArray.<locals>.<genexpr>)lazygetRecordSizerp   rc   rH   rk   rW   copyrg   ri   rl   rM   rj   extendZadvance)	rZ   rg   rl   	tableDictcountr   rj   lr[   r&   r&   r'   	readArray   s&   


zBaseConverter.readArrayc                 C   s   t | dr| jS tS )N
staticSize)hasattrr   rp   rZ   rg   r&   r&   r'   r      s   zBaseConverter.getRecordSizec                 C      t | )zRead a value from the reader.NotImplementedErrorrZ   rg   rl   r   r&   r&   r'   rk         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)rZ   writerrl   r   rD   r[   valueer&   r&   r'   
writeArray   s   zBaseConverter.writeArrayc                 C   r   )zWrite a value to the writer.r   rZ   r   rl   r   r   repeatIndexr&   r&   r'   r      r   zBaseConverter.writec                 C   r   )zRead a value from XML.r   rZ   attrscontentrl   r&   r&   r'   xmlRead   r   zBaseConverter.xmlReadc                 C   r   )zWrite a value to XML.r   rZ   	xmlWriterrl   r   rJ   r   r&   r&   r'   xmlWrite   r   zBaseConverter.xmlWriter"   )rF   rR   rS   __doc__r|   r   r   rk   r   r   r   r   r&   r&   r&   r'   ru      s    

ru   c                   @   s4   e Zd Zedd Zedd Zdd Zdd Zd	S )
SimpleValuec                 C      | S 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)rF   rR   rS   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   )DEFAULTrH   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)rF   rR   rS   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   )intr   r&   r&   r'   r         
zIntValue.fromStringNrF   rR   rS   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'   rk         z	Long.readc                 C   
   | |S r"   )readLongArrayrZ   rg   rl   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rZ   r   rl   r   rD   r&   r&   r'   r      r   zLong.writeArrayr"   rF   rR   rS   r   rk   r   r   r   r&   r&   r&   r'   r          
r   c                   @   r   )ULongr   c                 C   r   r"   	readULongr   r&   r&   r'   rk     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)rF   rR   rS   r   r   r&   r&   r&   r'   r     r   r   c                   @   rP   )VarIndex    N)rF   rR   rS   r   r&   r&   r&   r'   r     rU   r   c                   @   r   )Short   c                 C   r   r"   )	readShortr   r&   r&   r'   rk     r   z
Short.readc                 C   r   r"   )readShortArrayr   r&   r&   r'   r     r   zShort.readArrayNc                 C   r   r"   )
writeShortr   r&   r&   r'   r     r   zShort.writec                 C   r   r"   )writeShortArrayr   r&   r&   r'   r     r   zShort.writeArrayr"   r   r&   r&   r&   r'   r     r   r   c                   @   r   )UShortr   c                 C   r   r"   
readUShortr   r&   r&   r'   rk      r   zUShort.readc                 C   r   r"   )readUShortArrayr   r&   r&   r'   r   "  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     r   r   c                   @   r   )Int8r   c                 C   r   r"   )ZreadInt8r   r&   r&   r'   rk   +  r   z	Int8.readc                 C   r   r"   )readInt8Arrayr   r&   r&   r'   r   -  r   zInt8.readArrayNc                 C   r   r"   )Z	writeInt8r   r&   r&   r'   r   /  r   z
Int8.writec                 C   r   r"   )writeInt8Arrayr   r&   r&   r'   r   1  r   zInt8.writeArrayr"   r   r&   r&   r&   r'   r   )  r   r   c                   @   r   )UInt8r   c                 C   r   r"   )	readUInt8r   r&   r&   r'   rk   6  r   z
UInt8.readc                 C   r   r"   )readUInt8Arrayr   r&   r&   r'   r   8  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   4  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'   rk   A  r   zUInt24.readNc                 C   r   r"   ZwriteUInt24r   r&   r&   r'   r   C  r   zUInt24.writer"   rF   rR   rS   r   rk   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   G  s   zComputedInt.xmlWriteNrF   rR   rS   r   r&   r&   r&   r'   r   F      r   c                   @      e Zd ZdS )r;   NrF   rR   rS   r&   r&   r&   r'   r;   L      r;   c                   @   r   )r<   Nr   r&   r&   r&   r'   r<   N  r   r<   c                   @   r   )r=   Nr   r&   r&   r&   r'   r=   P  r   r=   c                   @   r   )Tagr   c                 C   r   r"   )ZreadTagr   r&   r&   r'   rk   U  r   zTag.readNc                 C   r   r"   )ZwriteTagr   r&   r&   r'   r   W  r   z	Tag.writer"   r   r&   r&   r&   r'   r   S  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   ]     zGlyphID.readArrayc                 C   s   | || j| jS r"   )getGlyphNameZ	readValuer   r   r   r&   r&   r'   rk   _     zGlyphID.readc                 C      | | j|| d S r"   )r   r   ZgetGlyphIDManyr   r&   r&   r'   r   a  r   zGlyphID.writeArrayNc                 C   r   r"   )Z
writeValuer   
getGlyphIDr   r&   r&   r'   r   c  r   zGlyphID.writer"   )	rF   rR   rS   r   r   r   rk   r   r   r&   r&   r&   r'   r   Z  s    r   c                   @   s   e Zd ZdZdZdS )	GlyphID32r   LN)rF   rR   rS   r   r   r&   r&   r&   r'   r   g  s    r   c                   @   r   )NameIDc                 C   st   | ||d|fg  |r4|r4|d}|r4||}|d |r(|| n|d td|  |  d S )Nr   rJ     zmissing from name tablez"name id %d missing from name table)r   rC   ZgetDebugNamer   r   logwarningr   )rZ   r   rl   r   rJ   r   Z	nameTabler&   r&   r'   r   m  s   



zNameID.xmlWriteNr   r&   r&   r&   r'   r  l  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   rH   r   r   joinr   rZ   r   rl   r   rJ   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'   rk        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    s    r  c                   @   :   e Zd ZdZdd ZdddZedd Zed	d
 ZdS )Fixedr   c                 C      t | dS N   )fi2flr   r   r&   r&   r'   rk     r   z
Fixed.readNc                 C      | t|d d S r  )r   fl2fir   r&   r&   r'   r        zFixed.writec                 C   r   r  str2flr   r&   r&   r'   r     r   zFixed.fromStringc                 C   r   r  fl2strr   r&   r&   r'   r     r   zFixed.toStringr"   	rF   rR   rS   r   rk   r   r   r   r   r&   r&   r&   r'   r        

r  c                   @   r  )F2Dot14r   c                 C   r  N   )r  r   r   r&   r&   r'   rk     r   zF2Dot14.readNc                 C   r  r"  )r   r  r   r&   r&   r'   r     r  zF2Dot14.writec                 C   r   r"  r  r   r&   r&   r'   r     r   zF2Dot14.fromStringc                 C   r   r"  r  r   r&   r&   r'   r     r   zF2Dot14.toStringr"   r  r&   r&   r&   r'   r!    r   r!  c                       sF   e Zd ZdZ fddZd fdd	Zedd Zed	d
 Z  Z	S )Angleg     ?c                    s   t  |||d S )N   )superrk   r   	__class__r&   r'   rk     r  z
Angle.readNc                    s   t  j||||d |d d S )Nr%  r   )r&  r   r   r'  r&   r'   r     s   zAngle.writec                 C   s   t t|| j | j S r"   )r	   r  factorrN   r   r&   r&   r'   r     s   zAngle.fromStringc                 C   s   t || jS r"   )r   r*  r+  r&   r&   r'   r     s   zAngle.toStringr"   )
rF   rR   rS   r*  rk   r   classmethodr   r   __classcell__r&   r&   r'  r'   r$    s    
r$  c                   @   sF   e Zd ZdZdd ZdddZedd Zed	d
 Zedd Z	dS )Versionr   c                 C   s$   |  }|d? dksJ d| |S Nr  r   zUnsupported version 0x%08xr   )rZ   rg   rl   r   r   r&   r&   r'   rk     s   zVersion.readNc                 C   s.   t |}|d? dksJ d| || d S r/  )fi2ver   r   r&   r&   r'   r     s   zVersion.writec                 C   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   r  )r  )vr&   r&   r'   	fromFloat  r   zVersion.fromFloatr"   )
rF   rR   rS   r   rk   r   r   r   r   r4  r&   r&   r&   r'   r.    s    


r.  c                   @   s&   e Zd ZdZdZdd ZdddZdS )	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  )rZ   rg   rl   r   rf   ZzeroPossr&   r&   r'   rk     s   
zChar64.readNc                 C   sv   t |ddd}|t |dddkrtd|  t|| jkr(td|| jf  |d| j  d | j }|| d S )Nr8  r9  r:  r=  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr7  )r   r  r  re   r   	writeData)rZ   r   rl   r   r   r   rf   r&   r&   r'   r     s   zChar64.writer"   )rF   rR   rS   r   r   rk   r   r&   r&   r&   r'   r5    s
    r5  c                   @   s>   e Zd Zdd Zdd ZdddZdd	 Zd
d Zdd ZdS )r@   c                 C   s   | j o| j |S r"   )rB   r   r   r&   r&   r'   r        zStruct.getRecordSizec                 C   s   |   }||| |S r"   )rB   	decompile)rZ   rg   rl   r   tabler&   r&   r'   rk     s   zStruct.readNc                 C   s   | || d S r"   )compiler   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   )rJ   )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 )NrE  FormatZpostReadFT_propagator)
propagator)r   rB   rC   r   rG  r   getConvertersrz   rH  rJ   setattrr   __dict__r#   r$   fromXMLZpopulateDefaultsgetattr)rZ   r   r   rl   rC  rG  Z
noPostReadZcleanPropagationrM   rI  elementrJ   r&   r&   r'   r     sF   




zStruct.xmlReadc                 C   s   dt | j S )Nz
Struct of )reprrB   ra   r&   r&   r'   __repr__7  r   zStruct.__repr__r"   )	rF   rR   rS   r   rk   r   r   r   rQ  r&   r&   r&   r'   r@     s    
*r@   c                   @      e Zd Zdd ZdddZdS )r>   c                 C   s.   |j }|  }||| |||j  |S r"   )ri   rB   rB  rh   r,   )rZ   rg   rl   r   ri   rC  r&   r&   r'   rk   <  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   rJ  rJ   re   itemsr#   r   r   getDataLengthr,   rD  getSubWriterr   
getAllData)rZ   r   rl   r   r   r   Z	convIndexrM   lengthIndexZdeadbeefbeforelengthZlengthWriterr&   r&   r'   r   C  s$   

zStructWithLength.writer"   rF   rR   rS   rk   r   r&   r&   r&   r'   r>   ;  s    r>   c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )rE   r   c                 C   r   r"   r   r   r&   r&   r'   
readOffset[  r   zTable.readOffsetc                 C      | d d S r   r   rZ   r   r&   r&   r'   writeNullOffset^  r   zTable.writeNullOffsetc                 C   sN   |  |}|dkrd S |  }||}|jr||_||_|S ||| |S r   )r^  rB   getSubReaderr   rg   rl   rB  )rZ   rg   rl   r   offsetrC  r&   r&   r'   rk   a  s   

z
Table.readNc                 C   sT   |d u r|  | d S |j| jd}| j|_|d ur||_|| ||| d S )NZ
offsetSize)ra  rX  r   rJ   r   writeSubTablerD  )rZ   r   rl   r   r   r   	subWriterr&   r&   r'   r   n  s   
zTable.writer"   )rF   rR   rS   r   r^  ra  rk   r   r&   r&   r&   r'   rE   W  s    rE   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'   r^  }  r   zLTable.readOffsetc                 C   r_  r   r   r`  r&   r&   r'   ra    r   zLTable.writeNullOffsetNrF   rR   rS   r   r^  ra  r&   r&   r&   r'   rh  y      rh  c                   @   rg  )Table24r   c                 C   r   r"   r   r   r&   r&   r'   r^    r   zTable24.readOffsetc                 C   r_  r   r   r`  r&   r&   r'   ra    r   zTable24.writeNullOffsetNri  r&   r&   r&   r'   rk    rj  rk  c                       $   e Zd Zdd Z fddZ  ZS )r2   c                 C   $   | j | | }| | j| j| j|S r"   r   r(  rJ   rK   rL   rZ   Z	tableTypeZ
lookupTyperB   r&   r&   r'   getConverter     zSubStruct.getConverterc                       t t| |||d | d S r"   )r&  r2   r   r   r'  r&   r'   r        zSubStruct.xmlWriterF   rR   rS   rp  r   r-  r&   r&   r'  r'   r2         r2   c                       rl  )r0   c                 C   rm  r"   rn  ro  r&   r&   r'   rp    rq  zSubTable.getConverterc                    rr  r"   )r&  r0   r   r   r'  r&   r'   r     rs  zSubTable.xmlWritert  r&   r&   r'  r'   r0     ru  r0   c                   @   s   e Zd ZdddZdS )r1   Nc                 C   s   d|_ t| ||||| d S )NT)Z	ExtensionrE   r   r   r&   r&   r'   r     s   zExtSubTable.writer"   )rF   rR   rS   r   r&   r&   r&   r'   r1     s    r1   c                   @   r   )r3   c                 C   s&   | j || j}| | j| j| j|S r"   )r8   rC   rG   r(  rJ   rK   rL   )rZ   Z
featureTagrB   r&   r&   r'   rp       zFeatureParams.getConverterN)rF   rR   rS   rp  r&   r&   r&   r'   r3     r   r3   c                   @   s,   e Zd ZdZd	ddZdd Zd	ddZdS )
r)   r   Nc                 C   s0   t | |||| d|d dkrdnd | _d S )Nr)   21)ru   r|   whichr{   r&   r&   r'   r|     s   zValueFormat.__init__c                 C   s   |  }t||| j< |S r"   )r   r   rz  rZ   rg   rl   r   formatr&   r&   r'   rk     s   zValueFormat.readc                 C   s   | | t||| j< d S r"   )r   r   rz  )rZ   r   rl   r   r|  r   r&   r&   r'   r     s   
zValueFormat.writer"   )rF   rR   rS   r   r|   rk   r   r&   r&   r&   r'   r)     s
    
r)   c                   @   s6   e Zd Zdd Zdd ZdddZdd	 Zd
d ZdS )ValueRecordc                 C   s   dt || j  S Nr   )re   rz  r   r&   r&   r'   r     rA  zValueRecord.getRecordSizec                 C   s   || j  ||S r"   )rz  ZreadValueRecordr   r&   r&   r'   rk     rA  zValueRecord.readNc                 C   s   || j  ||| d S r"   )rz  ZwriteValueRecordr   r&   r&   r'   r     r   zValueRecord.writec                 C   s"   |d u rd S | ||| j| d S r"   )rF  rJ   r   r&   r&   r'   r     s   zValueRecord.xmlWritec                 C   s&   ddl m} | }|d ||| |S )Nr   )r}  )otBaser}  rM  )rZ   r   r   rl   r}  r   r&   r&   r'   r     s   zValueRecord.xmlReadr"   )rF   rR   rS   r   rk   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)ddZed	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( ZdS )*	AATLookupr  c                 C   sL   t | |||| t| jtr| jdd d d| _d S tdd d | jd| _d S )NZValue)rJ   rK   rL   )rJ   rK   rL   rB   )ru   r|   
issubclassrB   r   	converterrE   r{   r&   r&   r'   r|     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'   rk     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   )r`   glyphvalrl   r&   r'   rb     s    z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	ro   sortedrV  filterbuildFormat0buildFormat2buildFormat6buildFormat8rW  )rZ   r   rl   r   r   r   rD   formatsZdataSizeZlookupFormatZwriteMethodri   Z
actualSizer&   r  r'   r     s$   


zAATLookup.writec                 C   sH   |  | |  | t||d\}}}|  | |  | |  | d S )N)nZitemSize)r   r   )r   numUnitsunitSizeZsearchRangeZentrySelectorZ
rangeShiftr&   r&   r'   writeBinSearchHeader  s   




zAATLookup.writeBinSearchHeaderc                    sD   t   }t |krd S jj}d||  d fddfS )Nr   r   c                           S r"   )writeFormat0r&   rl   rZ   rD   r   r&   r'   r(         z(AATLookup.buildFormat0.<locals>.<lambda>)re   getGlyphOrderr  r   )rZ   r   rl   rD   	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   )rZ   r   rl   rD   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&   rl   segmentsrZ   r   r&   r'   r(   %  r  z(AATLookup.buildFormat2.<locals>.<lambda>)rH   r  r   re   BIN_SEARCH_HEADER_SIZE)rZ   r   rl   rD   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    r7  r   r  r   re   r  r   r@  )
rZ   r   rl   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   re   r  )rZ   r   rl   rD   r  r  r  r&   r  r'   r  6  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  r7  r  )	rZ   r   rl   rD   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   rw  r   r  r}   c                      r  r"   )writeFormat8r&   r  r&   r'   r(   O  r  z(AATLookup.buildFormat8.<locals>.<lambda>)re   r  r   )rZ   r   rl   rD   Z
minGlyphIDZ
maxGlyphIDr  r&   r  r'   r  I  s   zAATLookup.buildFormat8c                 C   sV   |d d }| d | | | t| |D ]\}}| jj||d |d d qd S )Nr   r}   r  )r   re   r  r   )rZ   r   rl   rD   ZfirstGlyphID_r   r&   r&   r'   r  Q  s   

zAATLookup.writeFormat8c                    s6   t   }| jj| d |d} fddt|D S )Nr   r   c                    s   i | ]
\}}  ||qS r&   r   r`   rm   r   r  r&   r'   
<dictcomp>_      z)AATLookup.readFormat0.<locals>.<dictcomp>)re   r  r  r   r   )rZ   rg   rl   r  rf   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   ri   r   r  r   rc   rh   rk   r   )rZ   rg   rl   mappingri   r  r  r[   lastfirstr   rm   r&   r&   r'   r  b  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  )	ri   r   rc   rh   rb  r  r   r   r   )rZ   rg   rl   r  ri   r  r[   r  r  rc  
dataReaderrf   rm   r3  r&   r&   r'   r  q  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  )	rZ   rg   rl   r  ri   r  r[   r  r   r&   r&   r'   r    s   
zAATLookup.readFormat6c                    s<   |   |  }| jj|d |d} fddt|D S )Nr  c                    s    i | ]\}}  | |qS r&   r  r  r  rl   r&   r'   r    s    z)AATLookup.readFormat8.<locals>.<dictcomp>)r   r  r   r   )rZ   rg   rl   r   rf   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   )	rZ   r   r   rl   r   rO  rJ   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   rJ   r   )begintagr   r  rV  r  r   endtag)rZ   r   rl   r   rJ   r   r  r&   r&   r'   r     s   

zAATLookup.xmlWriter"   )rF   rR   rS   r  r|   rk   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   rb  r  r   rk   rV  rB   rB  )rZ   rg   rl   r   ZlookupOffsetZ
dataOffsetlookupReaderlookupZoffsetsresultr  rc  r  rn   r&   r&   r'   rk     s   

zAATLookupWithDataOffset.readNc                 C   s   i i d}}}g }	t ||jdD ]0}
t }||
 || | }||d }|d kr=|}|t| }|||< |	| |||
< q|jdd}t	dd d t
}|||||d  |jdd}|| || |	D ]}|| qjd S )Nr   )keyr   rd  r  )r  r   r   rD  rY  rC   re   rH   rX  r  r   r   re  r@  )rZ   r   rl   r   r   r   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDatar  rf  rf   rc  lookupWriterr  Z
dataWriterdr&   r&   r'   r     s,   




zAATLookupWithDataOffset.writec                 C   s   t dd d | j}||||S r  )r  rB   r   )rZ   r   r   rl   r  r&   r&   r'   r     s   zAATLookupWithDataOffset.xmlReadc                 C   s&   t dd d | j}|||||| d S r  )r  rB   r   )rZ   r   rl   r   rJ   r   r  r&   r&   r'   r     rv  z AATLookupWithDataOffset.xmlWriter"   rF   rR   rS   rk   r   r   r   r&   r&   r&   r'   r    s
    
#r  c                   @   s^   e Zd ZdddddZdd e D Zdd	 Zd
d Zdd Zdd Z	dd Z
dddZdS )MorxSubtableConverterZLayoutOrderZReversedLayoutOrderZLogicalOrderZReversedLogicalOrder))FF)TFFT)TTc                 C   s   i | ]\}}||qS r&   r&   )r`   r  r  r&   r&   r'   r    s    
z MorxSubtableConverter.<dictcomp>c                 C   s   t | ||| d S r"   )ru   r|   )rZ   rJ   rK   rL   r&   r&   r'   r|     r  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)rZ   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 )	Nr6  r   r     ZmorxFz!unsupported 'morx' lookup type %s)rf   tableTag)ri   r   r   r,   r   _PROCESSING_ORDERSProcessingOrderr  r   Reservedr-   SubFeatureFlagsr   rC   rf   re   r   r  r2   rB  rh   )rZ   rg   rl   r   ri   mr	  orderKeyrB   ZheaderLengthrf   Z	subReaderr&   r&   r'   rk   	  s8   




zMorxSubtableConverter.readc                 C   s   | || |  |d|j  |  |jd|jd |  |jd|jd |  |jdk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  r2  )r  r   r   r,   r   r  r  r  r-   r  r2   rF  r  r   r&   r&   r'   r   '  s0   

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   r6  r  r  zunknown ProcessingOrder: %sr  >   r  r  r  zunknown TextDirection %sr  r  ZMorphFr  )r   r  r  istupler   r  r  r  _PROCESSING_ORDERS_REVERSEDr  r  r:   rM  )
rZ   r   r   rl   r  covFlagseltNameeltAttrsr  r  r&   r&   r'   r   >  s<   




zMorxSubtableConverter.xmlReadNc                 C   s   |j d@ d? }| j|j \}}||jdkrdndO }||rdndO }||jdk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   r6  r  r  rT  r  rU  z>L)r  r  r  r  r  re   rV  rW  r,   rD  structZpack)rZ   r   rl   r   r   r   r  ZreverseOrderZlogicalOrderrZ  r[  ZorigReservedr\  r&   r&   r'   r   ]  s&   
zMorxSubtableConverter.writer"   )rF   rR   rS   r  rV  r  r|   r  rk   r   r   r   r&   r&   r&   r'   r    s    r  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zd$ddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# ZdS )%	STXHeaderc                 C   s\   t | |||| t| jtsJ tdd d t| _t| jtr)tdd d t	| _
d S d | _
d S )NGlyphClassesPerGlyphLookup)ru   r|   r  rB   r   r  r   classLookupr   r   perGlyphLookupr{   r&   r&   r'   r|   w  s   

zSTXHeader.__init__c                 C   s  t  }|j}|d}|d}|d}d }	d }
| |_|||   |||   |||   | jd u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   ri   rb  r   GlyphClassCountrh   r  r  rB   r   r   LigComponents_readLigatures	Ligaturesr   r  rk   r  r   rc   r   StatesrH   r   _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)rZ   rg   rl   r   rC  ri   ZclassTableReaderZstateArrayReaderZentryTableReaderactionReaderZligaturesReaderZperGlyphTableReaderZligComponentReaderZnumLigComponentsZ	numStates
stateIndexstate
glyphClass
entryIndexr&   r&   r'   rk     sn   











zSTXHeader.readc                 C   s0   |   }||j||j  }|||| |S r"   )rB   rb  ri   r   rB  )rZ   rg   r  rl   r  
transitionZentryReaderr&   r&   r'   r    s   zSTXHeader._readTransitionc                 C   s(   t |j}||j d }|||S r~  )re   rf   ri   r   r   )rZ   rg   rl   limitZnumLigatureGlyphsr&   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  rD   r#   r   Z	MarkIndexmaxZCurrentIndex)rZ   rC  
numLookupsr  r%   r&   r&   r'   _countPerGlyphLookups  s"   




zSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t| |D ]}|d}|||   || j||i  q|S r   )	ri   rc   r  rb  rh   r   rH   r  rk   )rZ   rC  rg   rl   ri   Zlookupsr  r  r&   r&   r'   r    s   
zSTXHeader._readPerGlyphLookupsNc                 C   s  t  }| jj||||jd d t| d}t|j d }d}	| jd u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 )Nr)  r   r   r  r   )NNr   )r   r  r   r  r   rY  r  rD   r  rB   ZactionHeaderSizeZcompileActionsr  _compileStatesre   _compilePerGlyphLookups_compileLigComponents_compileLigaturesr   r@  )rZ   r   rl   r   r   r   ZglyphClassWriterZglyphClassDataglyphClassCountZglyphClassTableOffsetZ
actionDataactionIndexstateArrayDataentryTableDataZstateArrayOffsetZentryTableOffsetZperGlyphOffsetZperGlyphDataZactionOffsetZligaturesOffsetZligComponentsOffsetZligComponentsDataZligaturesDatar&   r&   r'   r     sh   
















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   rc   r  rD  rY  re   r   rP  rC   rH   r   r   r
   )rZ   rl   Zstatesr  r  ZstateArrayWriterentriesZentryIDsr  r  r  ZentryWriterZ	entryDatar  r  r  r&   r&   r'   r    s8   



zSTXHeader._compileStatesc                 C   s   | j d u rdS | |}t|j|ksJ dt|j|f t }|jD ]}|jdd}| j ||i |d  || q$| S )N    zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   rd  )	r  r  re   r  r   rX  r   re  rY  )rZ   rC  rl   r  r   r  r  r&   r&   r'   r  ,  s    



z!STXHeader._compilePerGlyphLookupsc                 C   s2   t |dsd S t }|jD ]}|| q| S )Nr  )r   r   r  r   rY  )rZ   rC  rl   r   Z	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   rY  )rZ   rC  rl   r   Z	glyphNamer&   r&   r'   r  D  s   

zSTXHeader._compileLigaturesc                 C   s  | || |  |d|j  |  t|j D ]\}}|jd||d |  qt|j	D ]/\}}	|j d|d |  t|	j
 D ]\}
}|j||d|
idd 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)rl   r   rJ   r  r  r  LigComponent)r  r   )r  r   r   r  r  r  rV  r   r   r  r  rF  r  r  r   rN  _xmlWriteLigatures)rZ   r   rl   r   rJ   r   gklassr  r  r  Ztransr[   r  r  r  r&   r&   r'   r   L  sP   










zSTXHeader.xmlWritec                 C   sf   t |dsd S |d |  tt|dD ]\}}|jd||d |  q|d |  d S )Nr  Ligature)r  r  )r   r  r   r   rN  r   r  )rZ   r   rl   r   rJ   r   r[   r	  r&   r&   r'   r  s  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  rH   r  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r  rD   r  )rZ   r   r   rl   rC  r  r  r  r  r   r  r  r&   r&   r'   r   ~  s6   zSTXHeader.xmlReadc           
      C   sV   t  }tt|D ] \}}}|dkr(t|d }|  }	|	|||| |	|j|< q|S )Nr  r  )r   r  r  r   rB   rM  r  )
rZ   r   r   rl   r  r  r  r  r  r  r&   r&   r'   r    s   
zSTXHeader._xmlReadStatec                 C   s8   g }t t|D ]\}}}|dkr|t|d  q|S )Nr  r   )r  r  rH   r   )rZ   r   r   rl   ZligComponentsr  r  _eltContentr&   r&   r'   r    s   
zSTXHeader._xmlReadLigComponentsc                 C   s4   g }t t|D ]\}}}|dkr||d  q|S )Nr  r  )r  r  rH   )rZ   r   r   rl   Zligsr  r  r  r&   r&   r'   r    s   zSTXHeader._xmlReadLigaturesr"   )rF   rR   rS   r|   rk   r  r  r  r  r   r  r  r  r  r   r  r   r  r  r  r&   r&   r&   r'   r  v  s$    
1

7'r  c                   @   r  )CIDGlyphMapc                 C   s>   |  }i }t||D ]\}}|dkr||||< q|S Nr  )r   r   r   r   )rZ   rg   rl   r   ZnumCIDsr  cidr  r&   r&   r'   rk     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  )r`   r  r  r  r&   r'   r    r  z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   r  rV  r  r   rc   rC   )	rZ   r   rl   r   r   r   rV  r   r  r&   r  r'   r     s   

zCIDGlyphMap.writec                 C   s>   i }t t|D ]\}}}|dkr|d  |t|d < q|S )NCIDr  r  )r  r  stripr   rZ   r   r   rl   r  ZeNameZeAttrsZ	_eContentr&   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  rV  r   r  )rZ   r   rl   r   rJ   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   re   r  r  rc   min)
rZ   rg   rl   r   Z
glyphOrderr   Zcidsr  r  r  r&   r&   r'   rk     s   

zGlyphCIDMap.readNc           	         r  )Nc                    s,   i | ]\}}|d ur|dkr  ||qS r  r  )r`   r	  r  r  r&   r'   r    s    z%GlyphCIDMap.write.<locals>.<dictcomp>r   r   r  r  )	rZ   r   rl   r   r   r   rV  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     s   

zGlyphCIDMap.xmlReadc                 C   r  )Nr  r  r  r  )rZ   r   rl   r   rJ   r   r  r  r&   r&   r'   r     r  zGlyphCIDMap.xmlWriter"   r  r&   r&   r&   r'   r    s
    
	r  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  )rc   r   rH   )rZ   rg   rl   r   r  r  r   nItemsnBitsZminusOffsetmaskZsignMaskr  tmpshiftr[   r   r&   r&   r'   rk     s(   zDeltaValue.readNc                 C   s   |d }|d }|d }|}	|dv sJ d|| d }
d|> }t |	|
ks(J d|> d }d\}}|	D ]}|| }|||@ |> B }|dkrO|| d\}}q4|d	kr[|| d S d S )
Nr  r  r   r!  r"  r   )r   r  r   r  )re   r   )rZ   r   rl   r   r   r   r  r  r   r  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   3     zDeltaValue.xmlWritec                 C      t |d S r   r   r   r&   r&   r'   r   7  r  zDeltaValue.xmlReadr"   rF   rR   rS   rk   r   r   r   r&   r&   r&   r'   r    s
    
r  c                   @   rR  )VarIdxMapValuec           	         s|   |d }|d }d|d@  }d|> d  d  d| d|d@ d?  }|j |j|j|jd	| } fd
d||D S )NEntryFormatry   r   r  r   r  0   r   r   r   r   r   c                    s    g | ]}|@ > | @ B qS r&   r&   )r`   raw	innerMaskZ	outerMask
outerShiftr&   r'   rb   N      z'VarIdxMapValue.read.<locals>.<listcomp>)r   r   ZreadUInt24Arrayr   )	rZ   rg   rl   r   fmtr#  	innerBits	entrySizer   r&   r3  r'   rk   =  s"   zVarIdxMapValue.readNc                    s   |d }|}|d  t| d|d@  }d|> d  d| d|d@ d?  }	|j|j|j|jd|	 }
|
 fd	d
|D  d S )Nr/  ry   r   r  r  r0  r   r1  c                    s    g | ]}|d @ ? | @ B qS )l      r&   )r`   idxr4  r5  r&   r'   rb   b  r6  z(VarIdxMapValue.write.<locals>.<listcomp>)ZsetValuere   r   r   ZwriteUInt24Arrayr   )rZ   r   rl   r   r   r   r7  r  r8  r9  r   r&   r;  r'   r   Q  s"   zVarIdxMapValue.writer"   r]  r&   r&   r&   r'   r.  ;  s    r.  c                   @   r  )VarDataValuec                 C   s   g }|d }|d }t |d@ }|d@ }|r|j|j}}	n|j|j}}	t||t||}
}|||
 ||	||
  ||krI||d = |S )Nrx   	NumShorts     )boolr   r   r   r  r  r   )rZ   rg   rl   r   rD   regionCount	wordCount	longWordsZreadBigArrayZreadSmallArrayn1n2r&   r&   r'   rk   h  s   
zVarDataValue.readNc                 C   s   |d }|d }t |d@ }|d@ }|j|jf|j|jfd| \}	}
t||t||}}|	|d |  |
|||  ||krN|dg||   d S d S )Nrx   r=  r>  r?  r  r   )r@  r   r   r   r  r  writeSmallArray)rZ   r   rl   r   rD   r   rA  rB  rC  ZwriteBigArrayrF  rD  rE  r&   r&   r'   r     s   

zVarDataValue.writec                 C   r(  r   r)  r   r&   r&   r'   r     r*  zVarDataValue.xmlWritec                 C   r+  r   r,  r   r&   r&   r'   r     r  zVarDataValue.xmlReadr"   r-  r&   r&   r&   r'   r<  f  s
    
r<  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ignoreMarksr  ZuseMarkFilteringSeti   zmarkAttachmentType[%i]r  )r   rH   r   r  r   r  r&   r&   r'   r     s   zLookupFlag.xmlWriteNr   r&   r&   r&   r'   rG    r   rG  c                       s8   e Zd ZeZ fddZedd Zedd Z  Z	S )
_UInt8Enumc                    s   |  t |||S r"   )	enumClassr&  rk   r   r'  r&   r'   rk     r   z_UInt8Enum.readc                 C   s   t | j| S r"   )rN  rI  upperr+  r&   r&   r'   r        z_UInt8Enum.fromStringc                 C   s   |  |j S r"   )rI  rJ   lowerr+  r&   r&   r'   r     rK  z_UInt8Enum.toString)
rF   rR   rS   rp   rI  rk   r,  r   r   r-  r&   r&   r'  r'   rH    s    
rH  c                   @      e Zd ZeZdS )r   N)rF   rR   rS   _ExtendModerI  r&   r&   r&   r'   r     rU   r   c                   @   rM  )r   N)rF   rR   rS   _CompositeModerI  r&   r&   r&   r'   r     rU   r   Zint8Zint16r.   r*   Zuint24r/   Zchar64r  ZOffsetZLOffsetZOffset24r5   r6   c                 C      t t| dS N)rB   )r!   r  Cr&   r&   r'   r(         c                 C   rP  rQ  )r!   r  rR  r&   r&   r'   r(     rT  c                 C   rP  rQ  )r!   r  rR  r&   r&   r'   r(     rT  c                 C   rP  rQ  )r!   rE   rR  r&   r&   r'   r(     rT  c                 C   rP  rQ  )r!   rh  rR  r&   r&   r'   r(     rT  c                 C   rP  rQ  )r!   rk  rR  r&   r&   r'   r(     rT  )r7   r   r  r  r  ZOffsetToZ	LOffsetToZLOffset24To)qZfontTools.misc.fixedToolsr   r  r   r  r   r  r   r  r   r0  r   r1  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   rN  r   rO  	itertoolsr    	functoolsr!   r  ZloggingZ	getLoggerrF   r  r  rO   r$   rQ   collectionsrV   ImportErrorrW   objectru   r   r   r   r   r   r   r   r   r   r   r   r   r   r;   r<   r=   r   r   r   r  r  r
  r  r  r!  r$  r.  r5  r@   r>   rE   rh  rk  r2   r0   r1   r3   r)   r}  r  r  r  r  r  r  r  r.  r<  rG  rH  r?   r&   r&   r&   r'   <module>   s6    0
@QH" g;   >%.6+3	
"#$%&