a
    ZXh!                 /   @   sT  d dl mZmZmZmZm	Z
mZ d dlmZ d dlmZmZ d dlmZmZmZmZmZ d dlmZ d dlmZmZ ddlmZmZm Z m!Z!m"Z" dd	l#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z.m/Z0m1Z1 d d
l2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9Z9d dl:Z:d dl;m<Z< d dl=Z=e=>e?Z@dd ZAdd ZBG dd deCZDG dd deDZEG dd deEZFG dd deEZGG dd deGZHG dd deGZIG dd  d eIZJG d!d" d"eFeIZKG d#d$ d$eGZLG d%d& d&eGZMG d'd( d(eGZNG d)d* d*eGZOG d+d, d,eGZPG d-d. d.eGZQG d/d0 d0eQeOZRG d1d2 d2eQeMZSG d3d4 d4eQeIZTG d5d6 d6eEZUG d7d8 d8eEZVG d9d: d:eVZWG d;d< d<eMZXG d=d> d>eMZYG d?d@ d@eEZZG dAdB dBeZZ[G dCdD dDeZZ\G dEdF dFe\Z]G dGdH dHe\Z^G dIdJ dJe^Z_G dKdL dLe_Z`G dMdN dNeEZaG dOdP dPeEZbG dQdR dReDZcG dSdT dTecZdG dUdV dVecZeG dWdX dXeeZfG dYdZ dZeeZgG d[d\ d\ecZhG d]d^ d^eeZiG d_d` d`efeiZjG dadb dbeeZkG dcdd ddeGZlG dedf dfelZmG dgdh dheDZnG didj djeDZoG dkdl dleDZpG dmdn dneDZqG dodp dpeDZrG dqdr dreDZsG dsdt dteDZtG dudv dveDZuG dwdx dxeDZvG dydz dzZwG d{d| d|eDZxG d}d~ d~eMZyG dd deOZzG dd dezZ-G dd dezZ/eNeLeHeOeMePeIebeJeKeaeUeVeWeXe[e]e^e_e`eceeefegemeteueveye-e/eYe6exewde6exe%deresedededepdd dd dd dd dd dd d.Z{dS )    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)TupleVariation)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)LazyList)OPTIMIZE_FONT_SPEEDgetSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)lookupTypesVarCompositeGlyphAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeModeNO_VARIATION_INDEX)zip_longest
accumulate)partial)SimpleNamespaceN)Optionalc                 C   s
   t | tS N)
isinstancetuple)t r.   h/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/site-packages/fontTools/ttLib/tables/otConverters.py<lambda>-       r0   c                 C   s  g }i }| D ]\}}}}}|}	| dr<|dks6J t}
n|dsN|dv r`tttd| }
nl|dkrnt}
n^|dkr|t}
nP|dkrt}
nB|d	krt	}
n4|d
v rt
}
n&|tvrd|vr|}	t}
nt||t}
|
||||d}|jr|j}n|dv r||}n
||	}|js||_|dv r`|d |_|j D ]*}| D ]}t||||||j< q@q4|d	kr|d |_|d	 |_|j D ]}t||||||j< q|| ||v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)uint8r3   uint32SubTableExtSubTable	SubStructFeatureParams)ZCIDGlyphMappingZGlyphCIDMapping(description)	MortChainMortSubtable	MorxChain)r9   r:   r;   r   featureParamTypes)
startswithr2   endswithComputedUInt8ComputedUShortComputedULongr9   r:   r;   r<   StructWithLengthconverterMappingStructeval
tableClassgetr   valuesTable__name__rC   defaultFeatureParamsappend)Z	tableSpecZtableNamespace
convertersZconvertersByNametpnamerepeatauxdescrZ	tableNameZconverterClassconvrM   r-   clsr.   r.   r/   buildConverters0   sd    








r\   c                   @   sv   e Zd ZdZdddddZdd Zd	d
 Zdd Zdd ZdddZ	dd Z
dd ZedZee dddZdS )BaseConverterz\Base class for converter objects. Apart from the constructor, this
    is an abstract class.N r>   c                C   sp   || _ || _|| _| jr.| js.t| jdd| _|| _|dpD|dv | _|dpX|dk| _|dv | _|| _	d S )Nz<string>rL   r4   )DesignAxisRecordSizeValueRecordSizeZ
LookupTyper6   )Z
ClassCountZClass2CountZ
FeatureTagZSettingsCountVarRegionCountMappingCountZRegionAxisCountZDesignAxisCountr_   ZAxisValueCountr`   Z	AxisCountZBaseGlyphRecordCountZLayerRecordCountZAxisIndicesList)
rV   rW   rX   compilerM   rE   ZisCountZisLookupTypeisPropagatedr?   selfrV   rW   rX   rM   r?   r.   r.   r/   __init__t   s    
zBaseConverter.__init__c           	         s    j o|dk}|r(tu r(d}|sVg }t|D ]}| | q8|S  fdd}| tfddt|D }|  |S dS )z(Read an array of values from the reader.   Fc                     s&     j  fdd} | S )Nc                    s     |     i S r*   )seekread)i)fontposreader_copy
recordSizerf   r.   r/   	read_item   s    zABaseConverter.readArray.<locals>.get_read_item.<locals>.read_itemcopyrm   rp   )rl   readerro   rf   )rm   rn   r/   get_read_item   s    z.BaseConverter.readArray.<locals>.get_read_itemc                 3   s   | ]
} V  qd S r*   r.   ).0rk   rs   r.   r/   	<genexpr>   r1   z*BaseConverter.readArray.<locals>.<genexpr>N)lazygetRecordSizeNotImplementedrangerS   rj   r   Zadvance)	rf   rt   rl   	tableDictcountrx   lrk   ru   r.   )rl   rp   rt   ro   rf   r/   	readArray   s    

zBaseConverter.readArrayc                 C   s   t | dr| jS tS )N
staticSize)hasattrr   rz   rf   rt   r.   r.   r/   ry      s    
zBaseConverter.getRecordSizec                 C   s   t | dS )zRead a value from the reader.NNotImplementedErrorrf   rt   rl   r|   r.   r.   r/   rj      s    zBaseConverter.readc              
   C   sb   z(t |D ]\}}| ||||| q
W n4 ty\ } z|j|f |_ W Y d }~n
d }~0 0 d S r*   )	enumeratewrite	Exceptionargs)rf   writerrl   r|   rO   rk   valueer.   r.   r/   
writeArray   s    zBaseConverter.writeArrayc                 C   s   t | dS )zWrite a value to the writer.Nr   rf   r   rl   r|   r   repeatIndexr.   r.   r/   r      s    zBaseConverter.writec                 C   s   t | dS )zRead a value from XML.Nr   rf   attrscontentrl   r.   r.   r/   xmlRead   s    zBaseConverter.xmlReadc                 C   s   t | dS )zWrite a value to XML.Nr   rf   	xmlWriterrl   r   rV   r   r.   r.   r/   xmlWrite   s    zBaseConverter.xmlWritezVarIndexBase\s*\+\s*(\d+))returnc                 C   s$   | j | j}|sdS t|dS )zJIf description has `VarIndexBase + {offset}`, return the offset else None.Nr   )varIndexBasePlusOffsetREsearchr?   intgroup)rf   mr.   r.   r/   getVarIndexOffset   s    zBaseConverter.getVarIndexOffset)N)N)rQ   
__module____qualname____doc__rg   r   ry   rj   r   r   r   r   rerc   r   r)   r   r   r.   r.   r.   r/   r]   p   s   

r]   c                   @   s4   e Zd Zedd Zedd Zdd Zdd Zd	S )
SimpleValuec                 C   s   | S r*   r.   r   r.   r.   r/   toString   s    zSimpleValue.toStringc                 C   s   | S r*   r.   r   r.   r.   r/   
fromString   s    zSimpleValue.fromStringc                 C   s(   | ||d| |fg  |  d S Nr   )	simpletagr   newliner   r.   r.   r/   r      s    zSimpleValue.xmlWritec                 C   s   |  |d S r   )r   r   r.   r.   r/   r      s    zSimpleValue.xmlReadN)rQ   r   r   staticmethodr   r   r   r   r.   r.   r.   r/   r      s   

r   c                   @   s    e Zd ZdZdd Zdd ZdS )OptionalValueNc                 C   s6   || j kr|d| |f ||| |  d S r   )DEFAULTrS   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)rQ   r   r   r   r   r   r.   r.   r.   r/   r      s   r   c                   @   s   e Zd Zedd ZdS )IntValuec                 C   s
   t | dS Nr   )r   r   r.   r.   r/   r      s    zIntValue.fromStringNrQ   r   r   r   r   r.   r.   r.   r/   r      s   r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )Long   c                 C   s   |  S r*   readLongr   r.   r.   r/   rj     s    z	Long.readc                 C   s
   | |S r*   )readLongArrayrf   rt   rl   r|   r}   r.   r.   r/   r     s    zLong.readArrayNc                 C   s   | | d S r*   )	writeLongr   r.   r.   r/   r     s    z
Long.writec                 C   s   | | d S r*   )writeLongArrayrf   r   rl   r|   rO   r.   r.   r/   r   
  s    zLong.writeArray)NrQ   r   r   r   rj   r   r   r   r.   r.   r.   r/   r      s
   
r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )ULongr   c                 C   s   |  S r*   	readULongr   r.   r.   r/   rj     s    z
ULong.readc                 C   s
   | |S r*   )readULongArrayr   r.   r.   r/   r     s    zULong.readArrayNc                 C   s   | | d S r*   
writeULongr   r.   r.   r/   r     s    zULong.writec                 C   s   | | d S r*   )writeULongArrayr   r.   r.   r/   r     s    zULong.writeArray)Nr   r.   r.   r.   r/   r     s
   
r   c                   @   s   e Zd Zedd ZdS )Flags32c                 C   s   d|  S )Nz0x%08Xr.   r   r.   r.   r/   r     s    zFlags32.toStringN)rQ   r   r   r   r   r.   r.   r.   r/   r     s   r   c                   @   s   e Zd ZeZdS )VarIndexN)rQ   r   r   r$   r   r.   r.   r.   r/   r   $  s   r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )Short   c                 C   s   |  S r*   )	readShortr   r.   r.   r/   rj   +  s    z
Short.readc                 C   s
   | |S r*   )readShortArrayr   r.   r.   r/   r   .  s    zShort.readArrayNc                 C   s   | | d S r*   )
writeShortr   r.   r.   r/   r   1  s    zShort.writec                 C   s   | | d S r*   )writeShortArrayr   r.   r.   r/   r   4  s    zShort.writeArray)Nr   r.   r.   r.   r/   r   (  s
   
r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )UShortr   c                 C   s   |  S r*   
readUShortr   r.   r.   r/   rj   ;  s    zUShort.readc                 C   s
   | |S r*   )readUShortArrayr   r.   r.   r/   r   >  s    zUShort.readArrayNc                 C   s   | | d S r*   writeUShortr   r.   r.   r/   r   A  s    zUShort.writec                 C   s   | | d S r*   )writeUShortArrayr   r.   r.   r/   r   D  s    zUShort.writeArray)Nr   r.   r.   r.   r/   r   8  s
   
r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )Int8r   c                 C   s   |  S r*   )ZreadInt8r   r.   r.   r/   rj   K  s    z	Int8.readc                 C   s
   | |S r*   )readInt8Arrayr   r.   r.   r/   r   N  s    zInt8.readArrayNc                 C   s   | | d S r*   )Z	writeInt8r   r.   r.   r/   r   Q  s    z
Int8.writec                 C   s   | | d S r*   )writeInt8Arrayr   r.   r.   r/   r   T  s    zInt8.writeArray)Nr   r.   r.   r.   r/   r   H  s
   
r   c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )UInt8r   c                 C   s   |  S r*   )	readUInt8r   r.   r.   r/   rj   [  s    z
UInt8.readc                 C   s
   | |S r*   )readUInt8Arrayr   r.   r.   r/   r   ^  s    zUInt8.readArrayNc                 C   s   | | d S r*   )
writeUInt8r   r.   r.   r/   r   a  s    zUInt8.writec                 C   s   | | d S r*   )writeUInt8Arrayr   r.   r.   r/   r   d  s    zUInt8.writeArray)Nr   r.   r.   r.   r/   r   X  s
   
r   c                   @   s"   e Zd ZdZdd ZdddZdS )UInt24   c                 C   s   |  S r*   Z
readUInt24r   r.   r.   r/   rj   k  s    zUInt24.readNc                 C   s   | | d S r*   ZwriteUInt24r   r.   r.   r/   r   n  s    zUInt24.write)NrQ   r   r   r   rj   r   r.   r.   r.   r/   r   h  s   r   c                   @   s   e Zd Zdd ZdS )ComputedIntc                 C   s&   |d ur"| d||f  |  d S )Nz%s=%s)commentr   r   r.   r.   r/   r   s  s    zComputedInt.xmlWriteNrQ   r   r   r   r.   r.   r.   r/   r   r  s   r   c                   @   s   e Zd ZdS )rF   NrQ   r   r   r.   r.   r.   r/   rF   y  s   rF   c                   @   s   e Zd ZdS )rG   Nr   r.   r.   r.   r/   rG   }  s   rG   c                   @   s   e Zd ZdS )rH   Nr   r.   r.   r.   r/   rH     s   rH   c                   @   s"   e Zd ZdZdd ZdddZdS )Tagr   c                 C   s   |  S r*   )ZreadTagr   r.   r.   r/   rj     s    zTag.readNc                 C   s   | | d S r*   )ZwriteTagr   r.   r.   r/   r     s    z	Tag.write)Nr   r.   r.   r.   r/   r     s   r   c                   @   s6   e Zd ZdZdZdd Zdd Zdd Zdd
dZd	S )GlyphIDr   Hc                 C   s   | || j| j|S r*   )getGlyphNameManyr   typecoder   r   r.   r.   r/   r     s    zGlyphID.readArrayc                 C   s   | || j| jS r*   )getGlyphNameZ	readValuer   r   r   r.   r.   r/   rj     s    zGlyphID.readc                 C   s   | | j|| d S r*   )r   r   ZgetGlyphIDManyr   r.   r.   r/   r     s    zGlyphID.writeArrayNc                 C   s   | | j|| d S r*   )Z
writeValuer   
getGlyphIDr   r.   r.   r/   r     s    zGlyphID.write)N)	rQ   r   r   r   r   r   rj   r   r   r.   r.   r.   r/   r     s   r   c                   @   s   e Zd ZdZdZdS )	GlyphID32r   LN)rQ   r   r   r   r   r.   r.   r.   r/   r     s   r   c                   @   s   e Zd Zdd ZdS )NameIDc                 C   st   | ||d|fg  |rh|rh|d}|rh||}|d |rP|| n|d td|  |  d S )Nr   rV     zmissing from name tablez"name id %d missing from name table)r   rN   ZgetDebugNamer   r   logwarningr   )rf   r   rl   r   rV   r   Z	nameTabler.   r.   r/   r     s    



zNameID.xmlWriteNr   r.   r.   r.   r/   r     s   r   c                   @   s   e Zd Zdd ZdS )	STATFlagsc                 C   sh   | ||d|fg  g }|d@ r,|d |d@ r>|d |r\|d |d| |  d S )Nr   r   ZOlderSiblingFontAttributer   ZElidableAxisValueNamer    )r   rS   r   r   joinr   rf   r   rl   r   rV   r   flagsr.   r.   r/   r     s    


zSTATFlags.xmlWriteNr   r.   r.   r.   r/   r     s   r   c                   @   s   e Zd Zedd ZdS )
FloatValuec                 C   s   t | S r*   )floatr   r.   r.   r/   r     s    zFloatValue.fromStringNr   r.   r.   r.   r/   r     s   r   c                   @   s"   e Zd ZdZdd ZdddZdS )
DeciPointsr   c                 C   s   |  d S N
   r   r   r.   r.   r/   rj     s    zDeciPoints.readNc                 C   s   | t|d  d S r   )r   roundr   r.   r.   r/   r     s    zDeciPoints.write)Nr   r.   r.   r.   r/   r     s   r   c                   @   s^   e Zd ZeZeZeZeZdd ZdddZ	e
dd Ze
dd	 Ze
d
d Ze
dd ZdS )BaseFixedValuec                 C   s   |  t|| j S r*   )fromIntgetattrreaderMethodr   r.   r.   r/   rj     s    zBaseFixedValue.readNc                 C   s   t || j| | d S r*   )r   writerMethodtoIntr   r.   r.   r/   r     s    zBaseFixedValue.writec                 C   s   t || jS r*   )fi2flprecisionBitsr[   r   r.   r.   r/   r     s    zBaseFixedValue.fromIntc                 C   s   t || jS r*   )fl2fir   r   r.   r.   r/   r     s    zBaseFixedValue.toIntc                 C   s   t || jS r*   )str2flr   r   r.   r.   r/   r     s    zBaseFixedValue.fromStringc                 C   s   t || jS r*   )fl2strr   r   r.   r.   r/   r     s    zBaseFixedValue.toString)N)rQ   r   r   rz   r   r   r   r   rj   r   classmethodr   r   r   r   r.   r.   r.   r/   r     s   



r   c                   @   s   e Zd ZdZdZdZdZdS )Fixedr      r   r   NrQ   r   r   r   r   r   r   r.   r.   r.   r/   r    s   r  c                   @   s   e Zd ZdZdZdZdZdS )F2Dot14r      r   r   Nr  r.   r.   r.   r/   r    s   r  c                       sP   e Zd ZdZdZe fddZe fddZedd Zed	d
 Z	  Z
S )Angleg        g     ?c                    s   t  || j d S N   )superr   biasr   	__class__r.   r/   r     s    zAngle.fromIntc                    s   t  |d | j S r  )r  r   r  r   r  r.   r/   r   
  s    zAngle.toIntc                 C   s   t t|| j | j S r*   )r
   r   factorr   r.   r.   r/   r     s    zAngle.fromStringc                 C   s   t || jS r*   )r	   r  r   r.   r.   r/   r     s    zAngle.toString)rQ   r   r   r  r  r  r   r   r   r   __classcell__r.   r.   r  r/   r
     s   
r
  c                   @   s   e Zd ZdZdS )BiasedAngleg      ?N)rQ   r   r   r  r.   r.   r.   r/   r    s   r  c                   @   sF   e Zd ZdZdd ZdddZedd Zed	d
 Zedd Z	dS )Versionr   c                 C   s   |  }|S r*   r   )rf   rt   rl   r|   r   r.   r.   r/   rj   !  s    zVersion.readNc                 C   s   t |}|| d S r*   )fi2ver   r   r.   r.   r/   r   %  s    zVersion.writec                 C   s   t | S r*   )ve2fir   r.   r.   r/   r   )  s    zVersion.fromStringc                 C   s   d|  S )N0x%08xr.   r   r.   r.   r/   r   -  s    zVersion.toStringc                 C   s
   t | dS )Nr  )r  )vr.   r.   r/   	fromFloat1  s    zVersion.fromFloat)N)
rQ   r   r   r   rj   r   r   r   r   r  r.   r.   r.   r/   r    s   


r  c                   @   s&   e Zd ZdZdZdd ZdddZdS )	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rXtd|  |S )N    r   asciireplaceencodingerrorsignorez%replaced non-ASCII characters in "%s")readDatar   findr   r   r   )rf   rt   rl   r|   dataZzeroPossr.   r.   r/   rj   ?  s    
zChar64.readNc                 C   sv   t |ddd}|t |dddkr.td|  t|| jkrPtd|| jf  |d| j  d | j }|| d S )Nr  r  r  r"  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr  )r   r   r   lenr   	writeData)rf   r   rl   r|   r   r   r%  r.   r.   r/   r   I  s    zChar64.write)N)rQ   r   r   r   r   rj   r   r.   r.   r.   r/   r  6  s   
r  c                   @   s>   e Zd Zdd Zdd ZdddZdd	 Zd
d Zdd ZdS )rK   c                 C   s   | j o| j |S r*   )rM   ry   r   r.   r.   r/   ry   V  s    zStruct.getRecordSizec                 C   s   |   }||| |S r*   )rM   	decompile)rf   rt   rl   r|   tabler.   r.   r/   rj   Y  s    zStruct.readNc                 C   s   | || d S r*   rc   r   r.   r.   r/   r   ^  s    zStruct.writec                 C   s@   |d u r*|r<| ||dg  |  q<n|j||||d d S )N)emptyr   )rV   )r   r   toXMLr   r.   r.   r/   r   a  s    
zStruct.xmlWritec                 C   s<  d|v rt |d rd S |  }|d}|d ur<t||_t|d }|rd}| D ]^}|jrXd}t|dsvi |_|j}	|j	|	vsJ |j	|	ft
||j	d  t|j|j	|	|j	< qX|D ]*}
t|
tr|
\}}}||||| qq|jt|dd d |r8|r8| D ]&}|jr|j}	|	|j	= |	s|`q|S )Nr,  FormatZpostReadFT_propagator)
propagator)r   rM   rN   r   r.  r   getConvertersrd   r/  rV   setattrr   __dict__r+   r,   fromXMLZpopulateDefaultsr   )rf   r   r   rl   r*  r.  Z
noPostReadZcleanPropagationrZ   r0  elementrV   r.   r.   r/   r   n  sB    




zStruct.xmlReadc                 C   s   dt | j S )Nz
Struct of )reprrM   )rf   r.   r.   r/   __repr__  s    zStruct.__repr__)N)	rQ   r   r   ry   rj   r   r   r   r7  r.   r.   r.   r/   rK   U  s   
*rK   c                   @   s   e Zd Zdd ZdddZdS )rI   c                 C   s.   |j }|  }||| |||j  |S r*   )rm   rM   r)  ri   r5   )rf   rt   rl   r|   rm   r*  r.   r.   r/   rj     s
    zStructWithLength.readNc                 C   s   t | D ]\}}|jdkr q$qt|j| }t|trD|d7 }dddd|j }	| }
|	|_	|
|| | |
 }| }||||| |j| dd |j ksJ | |j|< d S )Nr5   r      i     >[= )r   r   r      ޭ)r   r1  rV   r'  itemsr+   r   r   getDataLengthr5   rc   getSubWriterr   
getAllData)rf   r   rl   r|   r   r   Z	convIndexrZ   lengthIndexZdeadbeefbeforelengthZlengthWriterr.   r.   r/   r     s    

zStructWithLength.write)NrQ   r   r   rj   r   r.   r.   r.   r/   rI     s   rI   c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )rP   r   c                 C   s   |  S r*   r   r   r.   r.   r/   
readOffset  s    zTable.readOffsetc                 C   s   | d d S r   r   rf   r   r.   r.   r/   writeNullOffset  s    zTable.writeNullOffsetc                 C   sL   |  |}|dkrd S |  }||}|jr<||_||_n||| |S r   )rC  rM   getSubReaderrx   rt   rl   r)  )rf   rt   rl   r|   offsetr*  r.   r.   r/   rj     s    

z
Table.readNc                 C   sR   |d u r|  | n:| }| j|_|d ur2||_|j|| jd ||| d S )NZ
offsetSize)rE  r=  rV   r   writeSubTabler   rc   )rf   r   rl   r|   r   r   	subWriterr.   r.   r/   r     s    zTable.write)N)rQ   r   r   r   rC  rE  rj   r   r.   r.   r.   r/   rP     s
   rP   c                   @   s    e Zd ZdZdd Zdd ZdS )LTabler   c                 C   s   |  S r*   r   r   r.   r.   r/   rC    s    zLTable.readOffsetc                 C   s   | d d S r   r   rD  r.   r.   r/   rE    s    zLTable.writeNullOffsetNrQ   r   r   r   rC  rE  r.   r.   r.   r/   rK    s   rK  c                   @   s    e Zd ZdZdd Zdd ZdS )Table24r   c                 C   s   |  S r*   r   r   r.   r.   r/   rC    s    zTable24.readOffsetc                 C   s   | d d S r   r   rD  r.   r.   r/   rE    s    zTable24.writeNullOffsetNrL  r.   r.   r.   r/   rM    s   rM  c                       s$   e Zd Zdd Z fddZ  ZS )r;   c                 C   s$   | j | | }| | j| j| j|S r*   r   r  rV   rW   rX   rf   Z	tableTypeZ
lookupTyperM   r.   r.   r/   getConverter  s    zSubStruct.getConverterc                    s   t t| |||d | d S r*   )r  r;   r   r   r  r.   r/   r     s    zSubStruct.xmlWriterQ   r   r   rP  r   r  r.   r.   r  r/   r;     s   r;   c                       s$   e Zd Zdd Z fddZ  ZS )r9   c                 C   s$   | j | | }| | j| j| j|S r*   rN  rO  r.   r.   r/   rP    s    zSubTable.getConverterc                    s   t t| |||d | d S r*   )r  r9   r   r   r  r.   r/   r     s    zSubTable.xmlWriterQ  r.   r.   r  r/   r9     s   r9   c                   @   s   e Zd ZdddZdS )r:   Nc                 C   s   d|_ t| ||||| d S )NT)	ExtensionrP   r   r   r.   r.   r/   r     s    zExtSubTable.write)N)rQ   r   r   r   r.   r.   r.   r/   r:     s   r:   c                   @   s   e Zd Zdd ZdS )r<   c                 C   s&   | j || j}| | j| j| j|S r*   )rC   rN   rR   r  rV   rW   rX   )rf   Z
featureTagrM   r.   r.   r/   rP  
  s    zFeatureParams.getConverterN)rQ   r   r   rP  r.   r.   r.   r/   r<   	  s   r<   c                   @   s2   e Zd ZdZdddddZdd Zdd	d
ZdS )r2   r   Nr^   r>   c                C   s4   t j| |||||d d|d dkr(dnd | _d S )Nr>   r2   21)r]   rg   whichre   r.   r.   r/   rg     s    zValueFormat.__init__c                 C   s   |  }t||| j< |S r*   )r   r   rV  rf   rt   rl   r|   formatr.   r.   r/   rj     s    zValueFormat.readc                 C   s   | | t||| j< d S r*   )r   r   rV  )rf   r   rl   r|   rX  r   r.   r.   r/   r     s    
zValueFormat.write)N)N)rQ   r   r   r   rg   rj   r   r.   r.   r.   r/   r2     s   r2   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   )r'  rV  r   r.   r.   r/   ry   #  s    zValueRecord.getRecordSizec                 C   s   || j  ||S r*   )rV  ZreadValueRecordr   r.   r.   r/   rj   &  s    zValueRecord.readNc                 C   s   || j  ||| d S r*   )rV  ZwriteValueRecordr   r.   r.   r/   r   )  s    zValueRecord.writec                 C   s    |d u r
n| ||| j| d S r*   )r-  rV   r   r.   r.   r/   r   ,  s    zValueRecord.xmlWritec                 C   s&   ddl m} | }|d ||| |S )Nr   )rY  )otBaserY  r4  )rf   r   r   rl   rY  r   r.   r.   r/   r   2  s    zValueRecord.xmlRead)N)rQ   r   r   ry   rj   r   r   r   r.   r.   r.   r/   rY  "  s
   
rY  c                   @   s   e Zd ZdZddddZdd Zd+d	d
Zedd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* ZdS ),	AATLookupr   r^   r>   c                C   sN   t j| |||||d t| jtr6| jdd d d| _ntdd d | jd| _d S )Nr>   Value)rV   rW   rX   )rV   rW   rX   rM   )r]   rg   
issubclassrM   r   	converterrP   re   r.   r.   r/   rg   =  s    
zAATLookup.__init__c                 C   s   |  }|dkr| ||S |dkr0| ||S |dkrD| ||S |dkrX| ||S |dkrl| ||S ds|J d| d S )Nr   r   r      rh   Fzunsupported lookup format: %d)r   readFormat0readFormat2readFormat4readFormat6readFormat8rW  r.   r.   r/   rj   H  s    zAATLookup.readNc                    s   t t fdd| D }t ttd | | || | || | || | |g}|d \}}	}
| }|
  | | }||ksJ d|	||f d S )Nc                    s   g | ]\}}  ||fqS r.   r   )rv   glyphvalrl   r.   r/   
<listcomp>Y  r1   z#AATLookup.write.<locals>.<listcomp>r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	listsortedr;  filterbuildFormat0buildFormat2buildFormat6buildFormat8r<  )rf   r   rl   r|   r   r   rO   formatsZdataSizeZlookupFormatZwriteMethodrm   Z
actualSizer.   ri  r/   r   W  s6    zAATLookup.writec                 C   sH   |  | |  | t||d\}}}|  | |  | |  | d S )N)nZitemSize)r   r   )r   numUnitsunitSizeZsearchRangeZentrySelectorZ
rangeShiftr.   r.   r/   writeBinSearchHeaderw  s    



zAATLookup.writeBinSearchHeaderc                    sD   t   }t |krd S jj}d||  d fddfS )Nr   r   c                      s     S r*   )writeFormat0r.   rl   rf   rO   r   r.   r/   r0     r1   z(AATLookup.buildFormat0.<locals>.<lambda>)r'  getGlyphOrderr_  r   )rf   r   rl   rO   	numGlyphs	valueSizer.   rx  r/   rn    s    
zAATLookup.buildFormat0c                 C   s2   | d |D ]\}}| jj||d |d d qd S )Nr   r|   r   r   )r   r_  r   )rf   r   rl   rO   ZglyphID_r   r.   r.   r/   rw    s
    

zAATLookup.writeFormat0c                    s   |d \}}|}g |dd  D ]>\}}||d ks<||krZ |||f | }}|}q |}q  |||f jj}	td |	d  }
}dj |
|  d fddfS )Nr   r   r   r   c                      s     S r*   )writeFormat2r.   rl   segmentsrf   r   r.   r/   r0     r1   z(AATLookup.buildFormat2.<locals>.<lambda>)rS   r_  r   r'  BIN_SEARCH_HEADER_SIZE)rf   r   rl   rO   ZsegStartZsegValueZsegEndglyphIDZcurValuer{  rt  ru  r.   r~  r/   ro    s     zAATLookup.buildFormat2c           
      C   s   | d | jj}t||d  }}| ||| |D ]4\}}}	| | | | | jj||d |	d d q6| d | d |d|  d S )Nr   r   r|    r  r   r_  r   r'  rv  r   r(  )
rf   r   rl   r  r{  rt  ru  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                      s     S r*   )writeFormat6r.   rx  r.   r/   r0     r1   z(AATLookup.buildFormat6.<locals>.<lambda>)r_  r   r'  r  )rf   r   rl   rO   r{  rt  ru  r.   rx  r/   rp    s    zAATLookup.buildFormat6c           	      C   s|   | d | jj}t||d  }}| ||| |D ](\}}| | | jj||d |d d q6| d |d|  d S )Nr`  r   r|  r  r  r  )	rf   r   rl   rO   r{  rt  ru  r  r   r.   r.   r/   r    s    



zAATLookup.writeFormat6c                    s^   d d d d  }}t || d kr2d S jj}dt |  d fddfS )Nr   rS  r   r`  rh   c                      s     S r*   )writeFormat8r.   rx  r.   r/   r0     r1   z(AATLookup.buildFormat8.<locals>.<lambda>)r'  r_  r   )rf   r   rl   rO   Z
minGlyphIDZ
maxGlyphIDr{  r.   rx  r/   rq    s    zAATLookup.buildFormat8c                 C   sV   |d d }| d | | | t| |D ]\}}| jj||d |d d q2d S )Nr   rh   r|  )r   r'  r_  r   )rf   r   rl   rO   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   rv   kr   ri  r.   r/   
<dictcomp>  r1   z)AATLookup.readFormat0.<locals>.<dictcomp>)r'  ry  r_  r   r   )rf   rt   rl   rz  r%  r.   ri  r/   ra    s    zAATLookup.readFormat0c                 C   s   i }|j d }| |  }}|d| jj ks8J |t|D ]f}||||  d  | }| }	| jj||d d}
|dkr@t|	|d D ]}|
|||< qq@|S )Nr   r      r|   r  r   rm   r   r_  r   r{   ri   rj   r   )rf   rt   rl   mappingrm   ru  rt  rk   lastfirstr   r  r.   r.   r/   rb    s    
zAATLookup.readFormat2c                 C   s   i }|j d }| }|dks&J |t| D ]}||||  d  | }| }| }	|dkr2|d}
|
||	  | jj|
|d || d d}t|D ]\}}||||| < qq2|S )Nr   r`  r  r  r   r   r  )	rm   r   r{   ri   rF  r_  r   r   r   )rf   rt   rl   r  rm   ru  rk   r  r  rG  
dataReaderr%  r  r  r.   r.   r/   rc    s$    

zAATLookup.readFormat4c           	      C   s   i }|j d }| }|d| jj ks.J |t| D ]J}||||  d  | }| jj||d d}|dkr:||||< q:|S )Nr   r  r  r  r  )	rf   rt   rl   r  rm   ru  rk   r  r   r.   r.   r/   rd  
  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    r1   z)AATLookup.readFormat8.<locals>.<dictcomp>)r   r_  r   r   )rf   rt   rl   r}   r%  r.   r  r/   re    s    zAATLookup.readFormat8c           	      C   sF   i }|D ]8}t |tr|\}}}|dkr| j|||||d < q|S )NLookuprg  )r+   r,   r_  r   )	rf   r   r   rl   r   r5  rV   a
eltContentr.   r.   r/   r     s    

zAATLookup.xmlReadc                 C   s\   | || |  t| D ]$\}}| jj|||dd|fgd q || |  d S )Nr  rg  )r   rV   r   )begintagr   rl  r;  r_  r   endtag)rf   r   rl   r   rV   r   rg  r.   r.   r/   r   &  s    
zAATLookup.xmlWrite)N)rQ   r   r   r  rg   rj   r   r   rv  rn  rw  ro  r}  rp  r  rq  r  ra  rb  rc  rd  re  r   r   r.   r.   r.   r/   r\  :  s*   
 

	
	r\  c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )AATLookupWithDataOffsetc                 C   sz   |  }|  }||}tdd d t}||||}i }	| D ]2\}
}||| }|  }||| ||	|
< qB|	S NDataOffsets)r   rF  r\  r   rj   r;  rM   r)  )rf   rt   rl   r|   ZlookupOffsetZ
dataOffsetlookupReaderlookupoffsetsresultrg  rG  r  itemr.   r.   r/   rj   9  s    

zAATLookupWithDataOffset.readNc                 C   s   i i d  }}}g }	t ||jdD ]`}
t }||
 || | }||d }|d krz|}|t| }|||< |	| |||
< q"| }t	dd d t
}|||||d  | }|j|dd |j|dd |	D ]}|| qd S )Nr   )keyr  r   rH  )rl  r   r   rc   r>  rN   r'  rS   r=  r\  r   r   rI  r(  )rf   r   rl   r|   r   r   ZoffsetByGlyphZoffsetByDataZdataLenZcompiledDatarg  rJ  r%  rG  lookupWriterr  Z
dataWriterdr.   r.   r/   r   G  s*    


zAATLookupWithDataOffset.writec                 C   s   t dd d | j}||||S r  )r\  rM   r   )rf   r   r   rl   r  r.   r.   r/   r   j  s    zAATLookupWithDataOffset.xmlReadc                 C   s&   t dd d | j}|||||| d S r  )r\  rM   r   )rf   r   rl   r   rV   r   r  r.   r.   r/   r   n  s    z AATLookupWithDataOffset.xmlWrite)NrQ   r   r   rj   r   r   r   r.   r.   r.   r/   r  8  s   
#r  c                   @   sf   e Zd ZdddddZdd e D Zdd	d
ddZdd Zdd Zdd Z	dd Z
dddZdS )MorxSubtableConverterZLayoutOrderZReversedLayoutOrderZLogicalOrderZReversedLogicalOrder))FF)TFFT)TTc                 C   s   i | ]\}}||qS r.   r.   )rv   r  rh  r.   r.   r/   r  |  r1   z MorxSubtableConverter.<dictcomp>Nr^   r>   c                C   s   t j| |||||d d S Nr>   )r]   rg   re   r.   r.   r/   rg   ~  s    zMorxSubtableConverter.__init__c                 C   s2   |d@ dkrd|_ n|d@ dkr(d|_ nd|_ d S )N    r   Any   Vertical
Horizontal)TextDirection)rf   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 rdsJ d|j
 |j | }	|j|j |j |j |	  }
t|
|j|	 ksJ t|
|jd}| |_|j|| |||j  |S )	Nr  r   r     ZmorxFz!unsupported 'morx' lookup type %s)r%  tableTag)rm   r!   r   r5   r   _PROCESSING_ORDERSProcessingOrderr  r   Reservedr6   SubFeatureFlagsr   rN   r%  r'  r   r  r;   r)  ri   )rf   rt   rl   r|   rm   r   r   orderKeyrM   ZheaderLengthr%  Z	subReaderr.   r.   r/   rj     s,    




zMorxSubtableConverter.readc                 C   s   | || |  |d|j  |  |jd|jd |  |jd|jd |  |jdkr|jdd|j d |  |d|j  |  |jd	d
|j	 d |  |j
|| || |  d S )NzStructLength=%dr  r   r  r   r  z0x%04xzMorphType=%dr  r  )r  r   r   r5   r   r  r  r  r6   r  r;   r-  r  r   r.   r.   r/   r     s$    

zMorxSubtableConverter.xmlWritec           
      C   s:  t  }d}d|_tt|D ]\}}}|dkrlt|d }|d@ dk|d@ dkf}	| j|	 |_| || q|dkr|d |_|j| jv sJ d|j q|dkr|d |_	|j	d	v sJ d
|j	 q|dkrt|d |_q|dkrt|d |_
q|dr||||| qdsJ |q|d@ d> |jB |_|S )Nr   CoverageFlagsr   r  r  r  zunknown ProcessingOrder: %sr  >   r  r  r  zunknown TextDirection %sr  r  ZMorphFr  )r!   r  rm  istupler   r  r  r  _PROCESSING_ORDERS_REVERSEDr  r  rE   r4  )
rf   r   r   rl   r   covFlagseltNameeltAttrsr  r  r.   r.   r/   r     s8    

zMorxSubtableConverter.xmlReadc                 C   s   |j d@ d? }| j|j \}}||jdkr.dndO }||r>dndO }||jdkrTdndO }||rddndO }||_t|j}	| }
d	|_|j }|j d
@ |_ |	|| ||_ |j|	 dksJ | |
 }t
d||j|	< d S )Ni   r  r  r  r   r  r  r  r9  r  r:  z>L)r  r  r  r  r  r'  r;  r<  r5   rc   structpack)rf   r   rl   r|   r   r   r  ZreverseOrderZlogicalOrderr?  r@  ZorigReservedrA  r.   r.   r/   r     s&    
zMorxSubtableConverter.write)N)N)rQ   r   r   r  r;  r  rg   r  rj   r   r   r   r.   r.   r.   r/   r  s  s    r  c                   @   s   e Zd ZddddZdd Zdd Zd	d
 Zdd Zdd Zd&ddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% ZdS )'	STXHeaderr^   r>   c                C   s^   t j| |||||d t| jts&J tdd d t| _t| jtrTtdd d t	| _
nd | _
d S )Nr>   GlyphClassesPerGlyphLookup)r]   rg   r^  rM   r   r\  r   classLookupr   r   perGlyphLookupre   r.   r.   r/   rg     s    zSTXHeader.__init__c                 C   s  t  }|j}|d}|d}|d}d }	d }
| |_|||   |||   |||   | jd ur|d}|||   t| jt	r4|d}	|	||   |d}|||   |d}
|
||   |
j|j d }|dksJ |
||_| |
||_n*t| jtr^|d}	|	||   | j||||_t|j|j |jd  }t|D ]H}t }|j| t|jD ]$}| }| ||||	|j|< qq| jd ur| ||||_|S )Nr   r   )r   rm   rF  r   GlyphClassCountri   r  r^  rM   r   r   LigComponents_readLigatures	Ligaturesr    r  rj   r  r   r{   r   StatesrS   r   _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)rf   rt   rl   r|   r*  rm   ZclassTableReaderZstateArrayReaderZentryTableReaderactionReaderZligaturesReaderZperGlyphTableReaderZligComponentReaderZnumLigComponentsZ	numStates
stateIndexstate
glyphClass
entryIndexr.   r.   r/   rj      sZ    









zSTXHeader.readc                 C   s0   |   }||j||j  }|||| |S r*   )rM   rF  rm   r   r)  )rf   rt   r  rl   r  
transitionZentryReaderr.   r.   r/   r  /  s    zSTXHeader._readTransitionc                 C   s(   t |j}||j d }|||S rZ  )r'  r%  rm   r   r   )rf   rt   rl   limitZnumLigatureGlyphsr.   r.   r/   r  7  s    
zSTXHeader._readLigaturesc                 C   sb   d}|j D ]R}|j D ]B}t|tr|jdkr@t||jd }|jdkrt||jd }qq
|S )Nr   r  r   )r  r  rO   r+   r   Z	MarkIndexmaxZCurrentIndex)rf   r*  
numLookupsr  r-   r.   r.   r/   _countPerGlyphLookups<  s    



zSTXHeader._countPerGlyphLookupsc                 C   sT   |j }g }t| |D ]6}|d}|||   || j||i  q|S r   )	rm   r{   r  rF  ri   r   rS   r  rj   )rf   r*  rt   rl   rm   lookupsr  r  r.   r.   r/   r  K  s    
zSTXHeader._readPerGlyphLookupsNc                 C   s  t  }| jj||||jd d t| d}t|j d }d}	| jd urT|	d7 }	|	| j	j
7 }	| j	||j\}
}| ||j||\}}|	t| }|t| }|t| }t| ||d}|
d ur|t| }nd }d\}}| ||}| ||}|d ur.t|dksJ |t|
 }|t| }|| ||	 || || | jd url|| |d ur|| |d ur|| || || || || || |
d ur||
 |d ur|| |d ur|| d S )N)r   r   r   r  r   )NNr   )r   r  r   r  r   r>  r  rO   r  rM   ZactionHeaderSizeZcompileActionsr  _compileStatesr'  _compilePerGlyphLookups_compileLigComponents_compileLigaturesr   r(  )rf   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   T  sb    





















zSTXHeader.writec                 C   s   t  }g i  }}|D ]}t|D ]}	|j|	 }
t  }|
||| | }t||
jkstJ dt|
|
jt|f ||}|d u rt|}|||< |	| |
| q qt| d}tt|d}||fS )Nz1%s has staticSize %d, but actually wrote %d bytesr   )r   r{   r  rc   r>  r'  r   r6  rN   rS   r   r   r   )rf   rl   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 qH| S )Nr1   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   rH  )	r  r  r'  r  r   r=  r   rI  r>  )rf   r*  rl   r  r   r  r  r.   r.   r/   r    s    


z!STXHeader._compilePerGlyphLookupsc                 C   s2   t |dsd S t }|jD ]}|| q| S )Nr  )r   r   r  r   r>  )rf   r*  rl   r   	componentr.   r.   r/   r    s    

zSTXHeader._compileLigComponentsc                 C   s8   t |dsd S t }|jD ]}||| q| S )Nr  )r   r   r  r   r   r>  )rf   r*  rl   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 q|d |  qft|jD ]^\}}|j d	|d |  t| D ] \}}|jd
||d |  q|d	 |  qt|dr| d |  tt|dD ]"\}}|jd||d |  q\|d |  | ||||| || |  d S )NzGlyphClassCount=%s
GlyphClassrg  r   State)indexonGlyphClass
Transition)rl   r   rV   r  r  r  LigComponent)r  r   )r  r   r   r  rl  r  r;  r   r   r  r  r-  r  r  r   r   _xmlWriteLigatures)rf   r   rl   r   rV   r   gklassr  r  r  Ztransrk   r  rg  rh  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  rg  )r   r  r   r   r   r   r  )rf   r   rl   r   rV   r   rk   r  r.   r.   r/   r    s    



zSTXHeader._xmlWriteLigaturesc                 C   s   t  }tt|D ]\}}}|dkrB|d }|d }	t|	|j|< q|dkrf| |||}
|j|
 q|dkr| j	|||}|j
| q|dkr| ||||_q|dkr| ||||_qt|j d |_|S )	Nr  rg  r   r  r  r  r  r   )r   rm  r  r   r  _xmlReadStater  rS   r  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r  rO   r  )rf   r   r   rl   r*  r  r  r  rg  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   rm  r  r   rM   r4  r  )
rf   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   )rm  r  rS   r   )rf   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  rg  )rm  r  rS   )rf   r   r   rl   Zligsr  r  r  r.   r.   r/   r    s
    zSTXHeader._xmlReadLigatures)N)rQ   r   r   rg   rj   r  r  r  r  r   r  r  r  r  r   r  r   r  r  r  r.   r.   r.   r/   r    s"   /	
7(
r  c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )CIDGlyphMapc                 C   s>   |  }i }t||D ]\}}|dkr||||< q|S Nr  )r   r   r   r   )rf   rt   rl   r|   ZnumCIDsr  cidr  r.   r.   r/   rj   (  s    zCIDGlyphMap.readNc           	         sX    fdd|  D }|r&t|d nd}|| t|D ]}|||d q<d S )Nc                    s   i | ]\}}|  |qS r.   rf  )rv   r  rg  ri  r.   r/   r  1  r1   z%CIDGlyphMap.write.<locals>.<dictcomp>r   r   r  r;  r  r   r{   rN   )	rf   r   rl   r|   r   r   r;  r}   r  r.   ri  r/   r   0  s
    
zCIDGlyphMap.writec                 C   s>   i }t t|D ]*\}}}|dkr|d  |t|d < q|S )NCIDrg  r  )rm  r  stripr   rf   r   r   rl   r  ZeNameZeAttrsZ	_eContentr.   r.   r/   r   7  s
    zCIDGlyphMap.xmlReadc                 C   sh   | || |  t| D ]0\}}|d ur |dkr |jd||d |  q || |  d S )Nr  r  )r  rg  r  r   rl  r;  r   r  )rf   r   rl   r   rV   r   r  rg  r.   r.   r/   r   >  s    

zCIDGlyphMap.xmlWrite)Nr  r.   r.   r.   r/   r  '  s   
r  c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )GlyphCIDMapc           
      C   s|   |  }| }||}|t|kr<td|t|f  i }ttt|t|D ] }|| }	|	dkrV|	||| < qV|S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restr  )ry  r   r   r'  r   r   r{   min)
rf   rt   rl   r|   Z
glyphOrderr}   Zcidsr  r  r  r.   r.   r/   rj   J  s    

zGlyphCIDMap.readNc           	         sX    fdd|  D }|r&t|d nd}|| t|D ]}|||d q<d S )Nc                    s,   i | ]$\}}|d ur|dkr  ||qS r  rf  )rv   r  r  ri  r.   r/   r  \  s   z%GlyphCIDMap.write.<locals>.<dictcomp>r   r   r  r  )	rf   r   rl   r|   r   r   r;  r}   r  r.   ri  r/   r   [  s    

zGlyphCIDMap.writec                 C   s:   i }t t|D ]&\}}}|dkrt|d ||d < q|S )Nr  r   rg  )rm  r  r   r  r.   r.   r/   r   f  s
    zGlyphCIDMap.xmlReadc                 C   sh   | || |  t| D ]0\}}|d ur |dkr |jd||d |  q || |  d S )Nr  r  r  r  )rf   r   rl   r   rV   r   rg  r  r.   r.   r/   r   m  s    

zGlyphCIDMap.xmlWrite)Nr  r.   r.   r.   r/   r  I  s   
r  c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )
DeltaValuec                 C   s   |d }|d }|d }|dv s(J d|| d }d|> }d|> }	d|> d }
d|d > }g }d\}}t |D ]H}|dkr| d	 }}|| }||? |
@ }||@ r||	 }|| qp|S )
N	StartSizeEndSizeDeltaFormatr   r   r   illegal DeltaFormatr   )r   r   r   r  )r{   r   rS   )rf   rt   rl   r|   r  r  r  nItemsnBitsZminusOffsetmaskZsignMaskr  tmpshiftrk   r   r.   r.   r/   rj   y  s(    zDeltaValue.readNc                 C   s   |d }|d }|d }|}	|dv s,J d|| d }
d|> }t |	|
ksPJ d|> d }d\}}|	D ]6}|| }|||@ |> B }|dkrh|| d\}}qh|d	kr|| d S )
Nr  r  r  r  r  r   )r   r  r   r  )r'  r   )rf   r   rl   r|   r   r   r  r  r  r  r   r  r  r  r  r.   r.   r/   r     s$    

zDeltaValue.writec                 C   s"   | ||d|fg  |  d S r   r   r   r   r.   r.   r/   r     s    zDeltaValue.xmlWritec                 C   s   t |d S r   r   r   r.   r.   r/   r     s    zDeltaValue.xmlRead)NrQ   r   r   rj   r   r   r   r.   r.   r.   r/   r  x  s   
r  c                   @   s   e Zd Zdd ZdddZdS )VarIdxMapValuec           	         s|   |d }|d }d|d@  }d|> d  d  d| d|d@ d?  }|j |j|j|jd	| } fd
d||D S )NEntryFormatrb   r   r  l    r  0   r   r   r   r   r   c                    s    g | ]}|@ > | @ B qS r.   r.   )rv   raw	innerMaskZ	outerMask
outerShiftr.   r/   rj    s   z'VarIdxMapValue.read.<locals>.<listcomp>r   r   ZreadUInt24Arrayr   )	rf   rt   rl   r|   fmtr   	innerBits	entrySizer   r.   r  r/   rj     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	  rb   r   r  r  r
  r   r  c                    s    g | ]}|d @ ? | @ B qS )l      r.   )rv   idxr  r  r.   r/   rj    s   z(VarIdxMapValue.write.<locals>.<listcomp>)ZsetValuer'  r   r   writeUInt24Arrayr   )rf   r   rl   r|   r   r   r  r  r  r  r   r.   r  r/   r     s&    zVarIdxMapValue.write)NrB  r.   r.   r.   r/   r    s   r  c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )VarDataValuec                 C   s   g }|d }|d }t |d@ }|d@ }|r<|j|j }}	n|j|j }}	t||t|| }
}|||
 ||	||
  ||kr||d = |S )Nra   	NumShorts     )boolr   r   r   r  r  extend)rf   rt   rl   r|   rO   regionCount	wordCount	longWordsZreadBigArrayZreadSmallArrayn1n2r.   r.   r/   rj     s    
zVarDataValue.readNc                 C   s   |d }|d }t |d@ }|d@ }|j|jf|j|jfd| \}	}
t||t|| }}|	|d |  |
|||  ||kr|dg||   d S )Nra   r  r  r  r  r   )r  r   r   r   r  r  writeSmallArray)rf   r   rl   r|   rO   r   r  r  r  ZwriteBigArrayr"  r   r!  r.   r.   r/   r     s    

zVarDataValue.writec                 C   s"   | ||d|fg  |  d S r   r  r   r.   r.   r/   r     s    zVarDataValue.xmlWritec                 C   s   t |d S r   r  r   r.   r.   r/   r     s    zVarDataValue.xmlRead)Nr  r.   r.   r.   r/   r    s   
r  c                   @   s.   e Zd Zdd Zd
ddZdd Zdd	 ZdS )TupleValuesc                 C   s   t d |d S r   )r   ZdecompileDeltas_)rf   r%  rl   r.   r.   r/   rj     s    zTupleValues.readNc                 C   s   |j t }ttj|| dS )N)ZoptimizeSize)cfgr   bytesr   ZcompileDeltaValues_)rf   r   rl   r|   rO   r   ZoptimizeSpeedr.   r.   r/   r     s    
zTupleValues.writec                 C   s   t |d S r   r  r   r.   r.   r/   r     s    zTupleValues.xmlReadc                 C   s"   | ||d|fg  |  d S r   r  r   r.   r.   r/   r     s    zTupleValues.xmlWrite)Nr  r.   r.   r.   r/   r#    s   
r#  c                   @   sB   e Zd ZdddddddZdd Zddd	Zd
d Zdd ZdS )	CFF2IndexNr^   )	itemClassitemConverterClassr?   c                C   s4   t j| |||||d || _|d ur*| nd | _d S r  )r]   rg   
_itemClass
_converter)rf   rV   rW   rX   rM   r'  r(  r?   r.   r.   r/   rg   #  s    zCFF2Index.__init__c                    s      dkrg S  dd }jduo> dk}|s| d }g }|d}|d  |D ]l}	||	ksJ |	| }
jd ur }||
j |}
njd urΈj	|
}
|
|
 |	}qp|S  fdd}| }t|g  }|S d S )	Nr   c                 S   s   | j | j| j| jd| S )Nr  r  )rt   offSizer.   r.   r/   getReadArray<  s    z$CFF2Index.read.<locals>.getReadArrayFrh   r   c                     sH     jd   d   	fdd} | S )Nr   c                    s    |    d}  |d   |d |d  }jd urj }||j |}njd urj|}|S )Nr   r   r   )ri   r#  r)  r)  
localStater*  rj   )rk   r  r  obj)data_posrl   r+  
offset_posr   rn   rf   r.   r/   rp   c  s    

z8CFF2Index.read.<locals>.get_read_item.<locals>.read_itemrq   rs   r}   rl   r,  r+  rt   rf   )r/  r0  r   rn   r/   ru   ]  s    
z%CFF2Index.read.<locals>.get_read_item)r   r   rx   popr#  r)  r)  r-  r*  rj   rS   r   )rf   rt   rl   r|   r   rx   r  r;  
lastOffsetrG  r  r.  ru   rp   r~   r.   r1  r/   rj   6  s8    




zCFF2Index.readc                    s   |} t| t|sd S jd ur< fdd|D }n&jd urb fddt|D }dd |D }tt|dd}|d }|dk rdn|d	k rd
n|dk rdnd}	|	 jj	j
jd|	 }
|
| |D ]}| qd S )Nc                    s   g | ]}|  qS r.   r+  rv   r  ri  r.   r/   rj    r1   z#CFF2Index.write.<locals>.<listcomp>c              	      s$   g | ]\}}j  ||qS r.   )r*  r   )rv   rk   r  rl   rf   r|   r   r.   r/   rj    s   c                 S   s   g | ]}t |qS r.   )r'  r4  r.   r.   r/   rj    r1   r   )initialrS     i   r   i   r   r   r  )r   r'  r)  r*  r   rk  r&   r   r   r   r  r   r(  )rf   r   rl   r|   rO   r   r;  r  r3  r+  r   r  r.   r5  r/   r   z  s8    


zCFF2Index.writec                 C   sJ   | j d ur&|   }|d ||| |S | jd ur@| j|||S t d S r*   )r)  r4  r*  r   r   )rf   r   r   rl   r.  r.   r.   r/   r     s    

zCFF2Index.xmlReadc              
   C   sz   | j d ur4t|D ]\}}|||d|fg| qnB| jd urpt|D ]&\}}| j|||||d|fg  qFnt d S )Nr  )r)  r   r-  r*  r   r   )rf   r   rl   r   rV   r   rk   r  r.   r.   r/   r     s    

zCFF2Index.xmlWrite)N)N)rQ   r   r   rg   rj   r   r   r   r.   r.   r.   r/   r&  "  s    D
%
r&  c                   @   s   e Zd Zdd ZdS )
LookupFlagc                 C   s   | ||d|fg  g }|d@ r,|d |d@ r>|d |d@ rP|d |d@ rb|d	 |d
@ rt|d |d@ r|d|d?   |r|d| |  d S )Nr   r   ZrightToLeftr   ZignoreBaseGlyphsr   ZignoreLigaturesrh   ZignoreMarksr  ZuseMarkFilteringSeti   zmarkAttachmentType[%i]r   )r   rS   r   r   r   r   r.   r.   r/   r     s"    




zLookupFlag.xmlWriteNr   r.   r.   r.   r/   r8    s   r8  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  rj   r   r  r.   r/   rj     s    z_UInt8Enum.readc                 C   s   t | j| S r*   )r   r:  upperr   r.   r.   r/   r     s    z_UInt8Enum.fromStringc                 C   s   |  |j S r*   )r:  rV   lowerr   r.   r.   r/   r     s    z_UInt8Enum.toString)
rQ   r   r   rz   r:  rj   r  r   r   r  r.   r.   r  r/   r9    s   
r9  c                   @   s   e Zd ZeZdS )r"   N)rQ   r   r   _ExtendModer:  r.   r.   r.   r/   r"     s   r"   c                   @   s   e Zd ZeZdS )r#   N)rQ   r   r   _CompositeModer:  r.   r.   r.   r/   r#     s   r#   )r(  )r'  c                 C   s   t t| dS N)rM   )r'   r\  Cr.   r.   r/   r0     r1   c                 C   s   t t| dS r?  )r'   r  r@  r.   r.   r/   r0     r1   c                 C   s   t t| dS r?  )r'   r  r@  r.   r.   r/   r0     r1   c                 C   s   t t| dS r?  )r'   rP   r@  r.   r.   r/   r0     r1   c                 C   s   t t| dS r?  )r'   rK  r@  r.   r.   r/   r0     r1   c                 C   s   t t| dS r?  )r'   rM  r@  r.   r.   r/   r0     r1   ).Zint8int16int32r7   r3   Zuint24r8   Zchar64r   r   r  r   r   r   r   r   r  r  r
  r  r  ZOffsetZLOffsetZOffset24rY  r  r  r  r8  r"   r#   r   Z	TupleListZVarCompositeGlyphListr  r  r@   rA   rB   r!   r\  r  r  ZOffsetToZ	LOffsetToZLOffset24To)|ZfontTools.misc.fixedToolsr   r   r   r  r   r  r   r  r   r  r   r  Z%fontTools.ttLib.tables.TupleVariationr   ZfontTools.misc.roundToolsr	   r
   ZfontTools.misc.textToolsr   r   r   r   r   ZfontTools.misc.lazyToolsr   ZfontTools.ttLibr   r   r[  r   r   r   r   r   ZotTablesr   r   r   r   r   r   r   r    r!   r"   r=  r#   r>  r$   	itertoolsr%   r&   	functoolsr'   typesr(   r   r  typingr)   logging	getLoggerrQ   r   r  r\   objectr]   r   r   r   r   r   r   r   r   r   r   r   r   r   rF   rG   rH   r   r   r   r   r   r   r   r   r  r  r
  r  r  r  rK   rI   rP   rK  rM  r;   r9   r:   r<   r2   rY  r\  r  r  r  r  r  r  r  r  r#  r&  r8  r9  rJ   r.   r.   r.   r/   <module>   s    8
@h


G"		   ;   5"/503 

