o
    a                     @   s$  d Z ddlZddlmZ ddlZddlmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZmZmZmZmZ dd	lmZmZ ddlZddlZe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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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d&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/d0 d0eZ/G d1d2 d2eZ0G d3d4 d4eZ1G d5d6 d6eZ2G d7d8 d8eZ3G d9d: d:eZ4G d;d< d<eZ5G d=d> d>ed&Z6G d?d@ d@ed&Z7G dAdB dBeZ8G dCdD dDeZ9G dEdF dFeZ:G dGdH dHed&Z;dIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXZ<dYdZ Z=d[d\ Z>d]d^ Z?d_d` Z@dadb ZAdcdd ZBe>e?e@deeAeBdfdgZCdhdi ZDdjdk ZEeE  dldm ZFdS )nzfontTools.ttLib.tables.otTables -- A collection of classes representing the various
OpenType subtables.

Most are constructed upon import from data in otData.py, all are populated with
converter objects from otConverters.py.
    N)IntEnum)defaultdict
namedtuple)otRound)	bytesjoinpadsafeEval   )	BaseTableFormatSwitchingBaseTableValueRecordCountReference getFormatSwitchingBaseTableClass)LookupDebugInfoLOOKUP_DEBUG_INFO_KEYc                   @      e Zd Zdd ZdS )AATStateTablec                 C   s   i | _ g | _g | _d S N)ZGlyphClassesZStatesZPerGlyphLookupsself r   A/usr/lib/python3/dist-packages/fontTools/ttLib/tables/otTables.py__init__   s   
zAATStateTable.__init__N__name__
__module____qualname__r   r   r   r   r   r          r   c                   @   r   )AATStatec                 C   s
   i | _ d S r   )Transitionsr   r   r   r   r   "   s   
zAATState.__init__Nr   r   r   r   r   r   !   r   r   c                   @   s,   e Zd ZdZedd Zdd Zdd ZdS )	AATActionNc                 C   s   dS )NNNr   )fontstatesr   r   r   compileActions)   s   zAATAction.compileActionsc                    sb    fdd j D }|r|jdd|d |   jdkr/|jdd j d |  d S d S )	Nc                    s   g | ]	} j | r|qS r   )__dict__.0fr   r   r   
<listcomp>.       z.AATAction._writeFlagsToXML.<locals>.<listcomp>Flags,valuer   ReservedFlagsz0x%04X)_FLAGS	simpletagjoinnewliner/   )r   	xmlWriterflagsr   r   r   _writeFlagsToXML-   s   
zAATAction._writeFlagsToXMLc                 C   s$   || j v sJ d| d| j|< d S )Nzunsupported flag %sT)r0   r%   r   flagr   r   r   _setFlag8   s   zAATAction._setFlag)r   r   r   r0   staticmethodr$   r6   r9   r   r   r   r   r    &   s    
r    c                   @   s   e Zd ZdZdZg dZi ddddddd	d
ddddddddddddddddddddddd d!Zd"d# Zd$d% Zd&d' Z	d(d) Z
d*d+ Zd,S )-RearrangementMorphAction   r   )	MarkFirstDontAdvanceMarkLastz	no changer	   u	   Ax ⇒ xA   u	   xD ⇒ Dx   u   AxD ⇒ DxAu   ABx ⇒ xAB   u   ABx ⇒ xBA   u   xCD ⇒ CDx   u   xCD ⇒ DCx   u   AxCD ⇒ CDxA	   u   AxCD ⇒ DCxA
   u   ABxD ⇒ DxAB   u   ABxD ⇒ DxBA   u   ABxCD ⇒ CDxAB   u   ABxCD ⇒ CDxBA   u   ABxCD ⇒ DCxAB   u   ABxCD ⇒ DCxBAc                 C   s(   d| _ d| _d| _d| _d| _d| _d S Nr   F)NewStateVerbr=   r>   r?   r/   r   r   r   r   r   U   s   
z!RearrangementMorphAction.__init__c                 C   sz   |d u sJ | | j | jdkr| jdksJ | j| j| jB }| jr(|dO }| jr/|dO }| jr6|dO }| | d S )Nr   rL       @      )writeUShortrN   rO   r/   r=   r>   r?   r   writerr"   actionIndexr5   r   r   r   compile]   s   z RearrangementMorphAction.compilec                 C   s`   |d u sJ |  | _|  }|d@ | _t|d@ | _t|d@ | _t|d@ | _|d@ | _d S )NrL   rP   rQ   rR   i  )
readUShortrN   rO   boolr=   r>   r?   r/   r   readerr"   actionReaderr5   r   r   r   	decompileg   s   

z"RearrangementMorphAction.decompilec                 C   s   |j |fi | |  |jd| jd |  | | |jd| jd | j| j}|d ur6|| |  |	| |  d S )NrN   r-   rO   )
begintagr3   r1   rN   r6   rO   _VERBSgetcommentendtag)r   r4   r"   attrsnameZverbCommentr   r   r   toXMLq   s   


zRearrangementMorphAction.toXMLc           	      C   s   d | _  | _| _d | _ | _| _dd |D }|D ]>\}}}|dkr,t|d | _ q|dkr8t|d | _q|dkrDt|d | _q|d	krY|d d
D ]	}| |	  qOqd S )Nr   Fc                 S      g | ]	}t |tr|qS r   
isinstancetupler'   tr   r   r   r)      r*   z4RearrangementMorphAction.fromXML.<locals>.<listcomp>rN   r.   rO   r/   r+   r,   )
rN   rO   r/   r=   r>   r?   r   splitr9   strip	r   rd   rc   contentr"   eltNameeltAttrs
eltContentr8   r   r   r   fromXML   s   z RearrangementMorphAction.fromXMLN)r   r   r   
staticSizeactionHeaderSizer0   r_   r   rW   r]   re   rs   r   r   r   r   r;   =   sT    	


r;   c                   @   sD   e Zd ZdZdZddgZdd Zdd Zd	d
 Zdd Z	dd Z
dS )ContextualMorphActionrE   r   SetMarkr>   c                 C   s(   d| _ d\| _| _d| _d\| _| _d S )Nr   FF  rz   )rN   rw   r>   r/   	MarkIndexCurrentIndexr   r   r   r   r      s   zContextualMorphAction.__init__c                 C   s`   |d u sJ | | j | j}| jr|dO }| jr|dO }| | | | j | | j d S )NrP   rQ   )rS   rN   r/   rw   r>   r{   r|   rT   r   r   r   rW      s   
zContextualMorphAction.compilec                 C   s\   |d u sJ |  | _|  }t|d@ | _t|d@ | _|d@ | _|  | _|  | _d S )NrP   rQ   i?  )rX   rN   rY   rw   r>   r/   r{   r|   rZ   r   r   r   r]      s   


zContextualMorphAction.decompilec                 C   s   |j |fi | |  |jd| jd |  | | |jd| jd |  |jd| jd |  || |  d S )NrN   r-   r{   r|   )r^   r3   r1   rN   r6   r{   r|   rb   r   r4   r"   rc   rd   r   r   r   re      s   

zContextualMorphAction.toXMLc           	      C   s   d | _ | _d | _| _d\| _| _dd |D }|D ]J\}}}|dkr,t|d | _ q|dkrB|d d	D ]	}| |	  q7q|d
krNt|d | _q|dkrZt|d | _q|dkret|d | _qd S )Nr   Fry   c                 S   rf   r   rg   rj   r   r   r   r)      r*   z1ContextualMorphAction.fromXML.<locals>.<listcomp>rN   r.   r+   r,   r/   r{   r|   )
rN   r/   rw   r>   r{   r|   r   rl   r9   rm   rn   r   r   r   rs      s&   zContextualMorphAction.fromXMLN)r   r   r   rt   ru   r0   r   rW   r]   re   rs   r   r   r   r   rv      s    

rv   c                   @   r   )	LigActionc                 C   s   d| _ d| _d S )NFr   )StoreGlyphIndexDeltar   r   r   r   r      s   

zLigAction.__init__Nr   r   r   r   r   r~      r   r~   c                   @   s`   e Zd ZdZdZddgZdd Zdd Zd	d
 Ze	dd Z
dd Zdd Zdd Zdd ZdS )LigatureMorphActionrC   rI   SetComponentr>   c                 C   s"   d| _ d\| _| _d| _g | _d S )Nr   rx   )rN   r   r>   r/   Actionsr   r   r   r   r      s   
zLigatureMorphAction.__init__c                 C   s   |d usJ | | j | j}| jr|dO }| jr|dO }t| jdkr(|dO }| | t| jdkrA|  }| ||  d S | d d S )NrP   rQ   r   rR   )rS   rN   r/   r   r>   lenr   compileLigActions)r   rU   r"   rV   r5   actionsr   r   r   rW      s   
zLigatureMorphAction.compilec                 C   sx   |d usJ |  | _|  }t|d@ | _t|d@ | _t|d@ }|d@ | _|  }|r7| ||| _d S g | _d S )NrP   rQ   rR   i  )rX   rN   rY   r   r>   r/   _decompileLigActionsr   )r   r[   r"   r\   r5   ZperformActionrV   r   r   r   r]      s   



zLigatureMorphAction.decompilec                 C   s   dt  i }}}|D ]}|j D ]\}}||  qqt|dd dD ])}||vrPtdt|dD ]}	||	d  }
t||	 d }||
| q5||7 }q't	|d}||fS )N    c                 S      t |  | fS r   r   xr   r   r   <lambda>      z4LigatureMorphAction.compileActions.<locals>.<lambda>keyr   r<   )
setr   itemsaddr   sortedranger   
setdefaultr   )r"   r#   resultr   rV   state_glyphClasstransaisuffixZsuffixIndexr   r   r   r$     s"   
z"LigatureMorphAction.compileActionsc                 C   sp   g }t | jD ],\}}|t| jd k}|jd@ }||rdndO }||jr'dndO }|td| qt|S )Nr	   ?        r      @z>L)		enumerater   r   r   r   appendstructpackr   )r   r   r   actionlastr.   r   r   r   r   *  s   
z%LigatureMorphAction.compileLigActionsc           	      C   sx   g }d}| |j|d  }|s:| }t|d@ }t }|| t|d@ |_|d@ }|dkr5d| }||_|r|S )NFr<   r   r   r   i    i   )getSubReaderposZ	readULongrY   r~   r   r   r   )	r   r\   rV   r   r   r[   r.   r   deltar   r   r   r   4  s"   

z(LigatureMorphAction._decompileLigActionsc                 C   s   d | _ | _d | _| _d| _g | _dd |D }|D ]\\}}}|dkr,t|d | _ q|dkrB|d dD ]	}| |  q7q|d	krNt|d | _q|d
krwt	 }	|
ddd}
dd |
D }
d|
v |	_t|d |	_| j|	 qd S )Nr   Fc                 S   rf   r   rg   rj   r   r   r   r)   J  r*   z/LigatureMorphAction.fromXML.<locals>.<listcomp>rN   r.   r+   r,   r/   Action c                 S      g | ]}|  qS r   rm   r&   r   r   r   r)   V      r   r   )rN   r/   r   r>   r   r   rl   r9   rm   r~   r`   r   r   r   )r   rd   rc   ro   r"   rp   rq   rr   r8   r   r5   r   r   r   rs   E  s2   
zLigatureMorphAction.fromXMLc                 C   s   |j |fi | |  |jd| jd |  | | | jD ]}d|jfg}|jr1|d |d| |  q!|	| |  d S )NrN   r-   r   )r+   r   r   )
r^   r3   r1   rN   r6   r   r   r   r   rb   )r   r4   r"   rc   rd   r   Zattribsr   r   r   re   \  s   




zLigatureMorphAction.toXMLN)r   r   r   rt   ru   r0   r   rW   r]   r:   r$   r   r   rs   re   r   r   r   r   r      s    

r   c                   @   sX   e Zd ZdZdZg dZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zedd ZdS )InsertionMorphActionrE   r<   )rw   r>   CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 C   s6   d| _ | jD ]}t| |d qd| _g g | _| _d S rM   )rN   r0   setattrr/   CurrentInsertionActionMarkedInsertionActionr7   r   r   r   r   s  s
   
zInsertionMorphAction.__init__c                 C   s   |d usJ | | j | j}| jr|dO }| jr|dO }| jr$|dO }| jr+|dO }| jr2|dO }| jr9|dO }|t	| j
d> O }|t	| jO }| | t	| j
dkr]|t| j
 }nd	}| | t	| jdkrs|t| j }nd	}| | d S )
NrP   rQ   rR            rB   r   rz   )rS   rN   r/   rw   r>   r   r   r   r   r   r   r   ri   )r   rU   r"   rV   r5   ZcurrentIndexZmarkedIndexr   r   r   rW   z  s0   

zInsertionMorphAction.compilec                 C   s   |d usJ |  | _|  }t|d@ | _t|d@ | _t|d@ | _t|d@ | _t|d@ | _t|d@ | _| j	|||  |d@ d? d	| _
| j	|||  |d
@ d	| _d S )NrP   rQ   rR   r   r   r   i  rB   )indexcount   )rX   rN   rY   rw   r>   r   r   r   r   _decompileInsertionActionr   r   rZ   r   r   r   r]     s&   

zInsertionMorphAction.decompilec                 C   s8   |dks|dkr
g S | |j|d  }|||S )Nrz   r   r@   )r   r   getGlyphNameManyZreadUShortArray)r   r\   r"   r   r   r[   r   r   r   r     s   z.InsertionMorphAction._decompileInsertionActionc                 C   s   |j |fi | |  |jd| jd |  | | | jD ]}|jd|d |  q!| jD ]}|jd|d |  q2|| |  d S )NrN   r-   r   glyphr   )r^   r3   r1   rN   r6   r   r   rb   )r   r4   r"   rc   rd   gr   r   r   re     s   





zInsertionMorphAction.toXMLc           	      C   s   |    dd |D }|D ]D\}}}|dkrt|d | _q|dkr4|d dD ]	}| |  q)q|dkrA| j|d  q|d	krN| j|d  qJ |d S )
Nc                 S   rf   r   rg   rj   r   r   r   r)     r*   z0InsertionMorphAction.fromXML.<locals>.<listcomp>rN   r.   r+   r,   r   r   r   )	r   r   rN   rl   r9   rm   r   r   r   rn   r   r   r   rs     s&   zInsertionMorphAction.fromXMLc                 C   s  t  i d}}}|D ]&}|j D ]\}}|jd ur#|t|j |jd ur0|t|j qqt|dd dD ]C}||v rAq:tdt	|D ]"}	t	|d |	 }
t|	t	|D ]}||	|d  }|
||
 qYqH|D ]}| |}|td|7 }qmq:||fS )	Nr   c                 S   r   r   r   r   r   r   r   r     r   z5InsertionMorphAction.compileActions.<locals>.<lambda>r   r   r@   r	   z>H)r   r   r   r   r   ri   r   r   r   r   r   
getGlyphIDr   r   )r"   r#   r   rV   r   r   r   r   r   startZ
startIndexlimitglyphsr   glyphIDr   r   r   r$     s.   


z#InsertionMorphAction.compileActionsN)r   r   r   rt   ru   r0   r   rW   r]   r   re   rs   r:   r$   r   r   r   r   r   l  s    r   c                   @   s   e Zd Zdd ZdddZdS )FeatureParamsc                 C   s>   t |d | jksJ d|d | jjf t| || d S )NZ
FeatureTagz-Wrong FeatureParams type for feature '%s': %s)featureParamTypesr`   	__class__r   r
   rW   )r   rU   r"   r   r   r   rW     s   ,zFeatureParams.compileNc                 C   s   t j| |||| jjd d S )N)rd   )r
   re   r   r   r}   r   r   r   re     s   zFeatureParams.toXMLr!   )r   r   r   rW   re   r   r   r   r   r     s    r   c                   @      e Zd ZdS )FeatureParamsSizeNr   r   r   r   r   r   r   r         r   c                   @   r   )FeatureParamsStylisticSetNr   r   r   r   r   r     r   r   c                   @   r   )FeatureParamsCharacterVariantsNr   r   r   r   r   r     r   r   c                   @   6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )CoverageNc                 C      t | ds
g | _d S d S )Nr   )hasattrr   r   Z
propagatorr   r   r   populateDefaults     

zCoverage.populateDefaultsc                 C   s   | j dkr|d | _| ` d S | j dkrVg  }| _|d }t|dd d}||kr/td |}~|D ]}|j}|j}||}	||d }
||	t
|	|
 q2| ` d S g | _td	| j  | ` d S )
Nr	   
GlyphArrayr@   RangeRecordc                 S      | j S r   )StartCoverageIndexr   r   r   r   r         z#Coverage.postRead.<locals>.<lambda>r   .GSUB/GPOS Coverage is not sorted by glyph ids.zUnknown Coverage format: %s)Formatr   r   logwarningStartEndr   extendr   r   )r   rawTabler"   r   rangesZsorted_rangesrr   endstartIDendIDr   r   r   postRead	  s*   





zCoverage.postReadc                 C   s\  t | dd }|d u rg  }| _d}d|i}|r||}t||k}|d }|gg}|dd  D ]}	|	|d krE|d | ||	g |	}q0|d | |s[t|d t|k rd}
tt|D ])}|| \}}t }||_|	||_
|	||_|
|_|||< |
| | d }
qc|rtd |jdd	 d
 |D ]}|`qd}d|i}|| _|S )Nr   r	   r   r   rA   r   c                 S   r   r   )StartIDr   r   r   r   r   D  r   z#Coverage.preWrite.<locals>.<lambda>r   r@   r   )getattrr   getGlyphIDManyr   r   r   r   r   r   ZgetGlyphNamer   r   r   r   r   sortr   )r   r"   r   formatr   glyphIDsZbrokenOrderr   r   r   r   r   r   r   r   r   r   r   preWrite"  sH   


zCoverage.preWritec                 C   s,   t | dg D ]}|jd|d |  qd S )Nr   Glyphr-   )r   r1   r3   )r   r4   r"   	glyphNamer   r   r   toXML2N  s   
zCoverage.toXML2c                 C   s0   t | dd }|d u rg }|| _||d  d S )Nr   r.   )r   r   r   )r   rd   rc   ro   r"   r   r   r   r   rs   S  s
   zCoverage.fromXMLr   r   r   r   r   r   r   r   rs   r   r   r   r   r     s    
,r   c                   @   sB   e Zd ZdddZdd Zedd Zdd	 Zd
d Zdd Z	dS )DeltaSetIndexMapNc                 C   r   Nmappingr   r   r   r   r   r   r   ]  r   z!DeltaSetIndexMap.populateDefaultsc                 C   s"   |d d@ dks
J |d | _ d S )NEntryFormat  r   r   r   )r   r   r"   r   r   r   r   a  s   zDeltaSetIndexMap.postReadc                 C   s   d}| D ]}||O }q|d@ }d}|r|d7 }|dL }|st |d}|dks(J |d| ? |d|> d @ B }|dkr=d}n|dkrDd}n	|dkrKd}nd	}|d d	> |d B S )
Nr   rz   r	         r@   i rA   r<   )max)r   ZoredidxinnerZ	innerBitsZ	entrySizer   r   r   getEntryFormate  s(   

zDeltaSetIndexMap.getEntryFormatc                 C   s\   t | dd }|d u rg  }| _t|dkrdnd| _| j }t||d< | ||d< |S )Nr   rz   r	   r   MappingCountr   )r   r   r   r   r%   copyr  )r   r"   r   r   r   r   r   r     s   

zDeltaSetIndexMap.preWritec                 C   sP   t t| dg D ]\}}d|fd|d? fd|d@ ff}|d| |  qd S )Nr   r   outerr   r  rz   Map)r   r   r1   r3   )r   r4   r"   r   r.   rc   r   r   r   r     s   


zDeltaSetIndexMap.toXML2c           	      C   sf   t | dd }|d u rg  | _}t|d }t|d }t|d }|dks'J |||d> |B  d S )Nr   r   r  r  rz   r   )r   r   r   insert)	r   rd   rc   ro   r"   r   r   r  r  r   r   r   rs     s   
zDeltaSetIndexMap.fromXMLr   )
r   r   r   r   r   r:   r  r   r   rs   r   r   r   r   r   [  s    



r   Zuint8c                   @   r   )	VarIdxMapNc                 C      t | ds
i | _d S d S r   r   r   r   r   r   r     r   zVarIdxMap.populateDefaultsc                 C   sX   |d d@ dks
J |  }|d }||d gt|t|   tt||| _d S )Nr   r   r   r   r   )getGlyphOrderr   r   dictzipr   )r   r   r"   
glyphOrderZmapListr   r   r   r     s
    zVarIdxMap.postReadc                    s   t | dd   d u ri   | _| } fdd|D  t dkr; d  d kr; d= t dkr; d  d ks*d i}t |d< t |d< |S )	Nr   c                    s   g | ]} | qS r   r   r'   r   r   r   r   r)     r   z&VarIdxMap.preWrite.<locals>.<listcomp>r	   r   r  r   )r   r   r  r   r   r  )r   r"   r  r   r   r   r   r     s   
zVarIdxMap.preWritec                 C   sT   t t| di  D ]\}}d|fd|d? fd|d@ ff}|d| |  q
d S )Nr   r   r  r   r  rz   r  )r   r   r   r1   r3   )r   r4   r"   r   r.   rc   r   r   r   r     s   


zVarIdxMap.toXML2c           	      C   s|   t | dd }|d u ri }|| _z|d }W n   | |d  }Y t|d }t|d }|dks4J |d> |B ||< d S )Nr   r   r   r  r  rz   r   )r   r   r  r   )	r   rd   rc   ro   r"   r   r   r  r  r   r   r   rs     s   zVarIdxMap.fromXMLr   r   r   r   r   r   r	    s    

r	  c                   @   r   )VarRegionListc                 C   s4   | d}|rt|j| _i | jdt| jdiS )NZfvarRegionAxisCount)r`   r   Zaxesr  r%   r   )r   r"   Z	fvarTabler   r   r   r     s   
zVarRegionList.preWriteNr   r   r   r   r   r   r   r   r        r  c                   @   r   )SingleSubstNc                 C   r
  r   r   r   r   r   r   r     r   zSingleSubst.populateDefaultsc                    s   i }t |d }| jdkr3|d  ||} fdd|D }||}t||D ]\}}	|	||< q)n+| jdkrWt||d ksDJ d|d	 }
t||
D ]\}}|||< qMnJ d| j || _| `d S )Nr   r	   DeltaGlyphIDc                    s   g | ]}|  d  qS )   r   )r'   r   r   r   r   r)         z(SingleSubst.postRead.<locals>.<listcomp>r@   Z
GlyphCountz invalid SingleSubstFormat2 table
Substituter   unknown format: %s)_getGlyphsFromCoverageTabler   r   r   r  r   r   )r   r   r"   r   inputZ	inputGIDSZoutGIDSZoutNamesinpoutsubstsubr   r  r   r     s*   





zSingleSubst.postReadc                    s  t | dd }|d u ri  }| _t| }|j  fdd|D }tt||}d}d }|D ]\}}	|d u r<|	| d }|| d |	krF n
q.|d u rNd}nd}i }
|| _t }dd |D }dd |D }||_	||
d	< |dkr}|d uswJ ||
d
< |
S ||
d< |
S )Nr   c                    s    g | ]\}} | |fqS r   r   )r'   r   br   r   r   r)     s     z(SingleSubst.preWrite.<locals>.<listcomp>r@   r  r	   c                 S   s   g | ]}|d  d qS )r	   r   r   r'   itemr   r   r   r)     r  c                 S   s   g | ]}|d  d  qS r	   r   r$  r   r   r   r)     r  r   r  r  )
r   r   listr   r   r   r  r   r   r   )r   r"   r   r   ZgidItemsZsortableItemsr   r   ZinIDZoutIDr   covr  r   r   r#  r   r     s>   
zSingleSubst.preWritec                 C   @   t | j }|D ]\}}|dd|fd|fg |  q	d S )NSubstitutioninr  )r   r   r   r1   r3   )r   r4   r"   r   inGlyphZoutGlyphr   r   r   r   (  s   
zSingleSubst.toXML2c                 C   s2   t | dd }|d u ri }|| _|d ||d < d S )Nr   r  r+  )r   r   )r   rd   rc   ro   r"   r   r   r   r   rs   /  s
   zSingleSubst.fromXMLr   r   r   r   r   r   r    s    
'r  c                   @   sB   e Zd ZdddZdd Zdd Zdd	 Zd
d Zedd Z	dS )MultipleSubstNc                 C   r
  r   r   r   r   r   r   r   9  r   zMultipleSubst.populateDefaultsc                 C   sX   i }| j dkrt|d }dd |d D }tt||}nJ d| j  || _| ` d S )Nr	   r   c                 S   s   g | ]}|j qS r   )r  )r'   sr   r   r   r)   A  s    z*MultipleSubst.postRead.<locals>.<listcomp>Sequencer   r  )r   r  r  r  r   )r   r   r"   r   r   r   r   r   r   r   =  s   
zMultipleSubst.postReadc                    sb   t dd   d u ri   _t }tt  |jd|_d_| fdd|jD d}|S )Nr   r   r	   c                    s   g | ]	}  | qS r   )makeSequence_)r'   r   r   r   r   r   r)   Q  s    z*MultipleSubst.preWrite.<locals>.<listcomp>)r   r/  )	r   r   r   r   r'  keysr   r   r   )r   r"   r(  r   r   r1  r   r   H  s   
zMultipleSubst.preWritec                 C   sJ   t | j }|D ]\}}d|}|dd|fd|fg |  q	d S )Nr,   r*  r+  r  )r   r   r   r2   r1   r3   )r   r4   r"   r   r,  	outGlyphsr  r   r   r   r   V  s   

zMultipleSubst.toXML2c                 C   s  t | dd }|d u ri }|| _|dkr4g | _|D ]}t|ts q|\}}}	|dkr1| j|d  qd S |dkrjt|dt|}
| j|
 }g  }||< |D ]}t|tsWqO|\}}}	|dkrg||d  qOd S |d ru|d 	d	ng }d
d |D ||d < d S )Nr   r   r   r.   r/  r   r  r  r,   c                 S   r   r   r   r  r   r   r   r)   |  r   z)MultipleSubst.fromXML.<locals>.<listcomp>r+  )
r   r   Zold_coverage_rh   ri   r   intr`   r   rl   )r   rd   rc   ro   r"   r   elementZelement_nameZelement_attrs_r   r   Zglyph_mappingr3  r   r   r   rs   ^  s8   




zMultipleSubst.fromXMLc                 C   s   t  }| |_|S r   )r/  r  )r   seqr   r   r   r0  ~  s   zMultipleSubst.makeSequence_r   )
r   r   r   r   r   r   r   rs   r:   r0  r   r   r   r   r-  7  s    
 r-  c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )ClassDefNc                 C   r
  )N	classDefs)r   r9  r   r   r   r   r     r   zClassDef.populateDefaultsc                 C   s   i }| j dkr3|d }|d }||}|t| }|t||}t||D ]
\}	}
|
r1|
||	< q'n?| j dkrk|d }|D ]+}|j}
|
sFq>|j}|j}||}||d }|t||}|D ]}	|
||	< qbq>nt	
d| j  || _| ` d S )Nr	   
StartGlyphClassValueArrayr@   ClassRangeRecordzUnknown ClassDef format: %s)r   r   r   r   r   r  Classr   r   r   r   r9  )r   r   r"   r9  r   Z	classListr   r   Z
glyphNamesr   clsrecordsrecr   r   r   r   r     s<   




zClassDef.postReadc                 C   s   t | dd }|d u ri | _d S |j}g }| D ]\}}|sq|||||f q|ru|  |d \}}}	|	||gg}
|dd  D ]&\}}}||d ksR||	krc|
d ||g |
|||g |}|}|}	qC|
d ||g |
S d S )Nr9  r   r	   r   )r   r9  r   r   r   r   r   )r   r"   r9  r   r   r   r>  r   ZlastNameZlastClsr   r   r   r   r   _getClassRanges  s0   zClassDef._getClassRangesc                 C   s
  d}dg i}|  |}|r|d d }|d d }|| d }t|d |d k rRtt|D ]}|| \}	}
}}}t }||_||_|	|_|||< q/d}d|i}n.|d d }dg| }|D ]\}	}
}}}t|
| || d D ]}|	||< qqq_d}||d}|| _|S )Nr@   r<  r   r	   r   rA   )r:  r;  )rA  r   r   r<  r   r   r=  r   )r   r"   r   r   r   Z
startGlyphZendGlyphZ
glyphCountr   r>  r   Z	startNamer   ZendNamer@  ZstartGlyphNameZclassesr   r   r   r   r     s6   





zClassDef.preWritec                 C   r)  )Nr8  r   class)r   r9  r   r1   r3   )r   r4   r"   r   r   r>  r   r   r   r     s
   
zClassDef.toXML2c                 C   s6   t | dd }|d u ri }|| _t|d ||d < d S )Nr9  rB  r   )r   r9  r4  )r   rd   rc   ro   r"   r9  r   r   r   rs     s
   zClassDef.fromXMLr   )	r   r   r   r   r   rA  r   r   rs   r   r   r   r   r8    s    
r8  c                   @   r   )AlternateSubstNc                 C   r
  )N
alternates)r   rD  r   r   r   r   r     r   zAlternateSubst.populateDefaultsc                 C   sr   i }| j dkr+t|d }|d }t|t|ksJ t||D ]	\}}|j||< q nJ d| j  || _| ` d S )Nr	   r   AlternateSetr   r  )r   r  r   r  	AlternaterD  )r   r   r"   rD  r  altsr  altr   r   r   r     s   
zAlternateSubst.postReadc           
      C   s   d| _ t| dd }|d u ri  }| _t| }tt|D ]}|| \}}||||f||< q|  t	 }dd |D |_
g }dd |D }|D ]}t }	||	_||	 qKd| _||dS )Nr	   rD  c                 S      g | ]}|d  qS r&  r   r$  r   r   r   r)     r   z+AlternateSubst.preWrite.<locals>.<listcomp>c                 S   rI  r   r   r$  r   r   r   r)     r   )r   rE  )r   r   rD  r'  r   r   r   r   r   r   r   rE  rF  r   sortCoverageLast)
r   r"   rD  r   r   r   r   r(  setListrG  r   r   r   r     s&   

zAlternateSubst.preWritec                 C   sh   t | j }|D ](\}}|jd|d |  |D ]}|jd|d |  q|d |  q	d S )NrE  r   rF  )r   rD  r   r^   r3   r1   rb   )r   r4   r"   r   r   rD  rH  r   r   r   r     s   


zAlternateSubst.toXML2c           	      C   sd   t | dd }|d u ri }|| _|d }g }|||< |D ]}t|ts#q|\}}}||d  qd S )NrD  r   )r   rD  rh   ri   r   )	r   rd   rc   ro   r"   rD  r   r   r5  r   r   r   rs   (  s   

zAlternateSubst.fromXMLr   r   r   r   r   r   rC    s    
rC  c                   @   r   )LigatureSubstNc                 C   r
  )N	ligatures)r   rN  r   r   r   r   r   9  r   zLigatureSubst.populateDefaultsc                 C   sx   i }| j dkr.t|d }|d }t|t|ksJ tt|D ]}|| j||| < q!nJ d| j  || _| ` d S )Nr	   r   LigatureSetr   r  )r   r  r   r   LigaturerN  )r   r   r"   rN  r  ligSetsr   r   r   r   r   =  s   
zLigatureSubst.postReadc                 C   sR  d| _ t| dd }|d u ri  }| _|rNttt|trNt }t|	 dd dD ]!\}}t
 }|dd  |_t||_||_||d g | q*|}t|	 }tt|D ]}|| \}	}
||	|	|
f||< qZ|  t }dd |D |_g }d	d |D }|D ]}
t }g  }|_
|
D ]}|| q|| qd| _||d
S )Nr	   rN  c                 S   s   t | d  | d fS Nr   r   r%  r   r   r   r   V  s    z(LigatureSubst.preWrite.<locals>.<lambda>r   r   c                 S   rI  r&  r   r$  r   r   r   r)   d  r   z*LigatureSubst.preWrite.<locals>.<listcomp>c                 S   rI  rJ  r   r$  r   r   r   r)   g  r   )r   rO  )r   r   rN  rh   nextiterri   r  r   r   rP  	Componentr   	CompCountLigGlyphr   r   r'  r   r   r   r   r   rO  rK  )r   r"   rN  ZnewLigaturescompsligZligaturer   r   r   r   r(  rQ  rL  ZligSetligsr   r   r   r   J  s<   



zLigatureSubst.preWritec                 C   st   t | j }|D ].\}}|jd|d |  |D ]}|jd|jd|jd |  q|	d |  q	d S )NrO  r   rP  r,   )r   
components)
r   rN  r   r^   r3   r1   rX  r2   rV  rb   )r   r4   r"   r   r   rQ  rZ  r   r   r   r   t  s   




zLigatureSubst.toXML2c                 C   s   t | dd }|d u ri }|| _|d }g }|||< |D ].}t|ts#q|\}}}t }	|d |	_|d }
|
r;|
dng |	_t|	j|	_	|
|	 qd S )NrN  r   r\  r,   )r   rN  rh   ri   rP  rX  rl   rV  r   rW  r   )r   rd   rc   ro   r"   rN  r   r[  r5  rZ  r\  r   r   r   rs     s$   


zLigatureSubst.fromXMLr   r   r   r   r   r   rM  7  s    
*rM  c                   @      e Zd Zdd Zdd ZdS )COLRc                 C   s`   |j dd}|  D ]}|jdkr||j q
|j||i d||j<  ntdt| ||S )Nr   )offsetLayerRecordCount)Z	tableDictz$LayerRecordCount converter not found)	r   getConvertersrd   Zadvancert   readAssertionErrorr
   r]   )r   r[   r"   Z	subReaderconvr   r   r   r]     s   
zCOLR.decompilec                 C   s    d | _ i | jdt| jdiS )Nr`  )r`  r%   r   r   r"   r   r   r   r     s   zCOLR.preWriteN)r   r   r   r]   r   r   r   r   r   r^    s    r^  c                       s(   e Zd Zedd Z fddZ  ZS )
LookupListc                 C   sL   | j D ] }|jD ]}t|jdr  dS t|jdr"  dS qqt)NZSubstGSUBZPosGPOS)LookupSubTabletyper   endswith
ValueError)r   lstr   r   r   table  s   

zLookupList.tablec              
      sD  |rd|vst |d jvrt ||S |d jt  | j }|  D ]}}|jrt| |jg }t	|D ]M\}}t
||v rrt|t
|  }|j}	|jrR|j d|	 }	|jri|j\}
}}|	 d| d|
 d| d}	||	 |  |||||jd|fg q2q"|jrt|jd t| sq"t| |jd }|||||jg  q"d S )NZDebgz: z in z (/)r   )r   datasuperr   rp  ra  repeatr   rd   r   strr   locationfeaturera   r3   ZxmlWriteZauxevalvars)r   r4   r"   Z	debugDatard  r.   lookupIndexr%  infotagZscriptlanguagerx  r   r   r   r     s4   
zLookupList.toXML2)r   r   r   propertyrp  r   __classcell__r   r   r  r   rf    s    
	rf  c                   @   r   )BaseGlyphRecordArrayc                    "   t | j fddd| _| j S )Nc                         | jS r   r   	BaseGlyphr@  r"   r   r   r         z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>r   )r   ZBaseGlyphRecordr%   r  re  r   r  r   r     
   

zBaseGlyphRecordArray.preWriteNr  r   r   r   r   r    r  r  c                   @   r   )BaseGlyphListc                    r  )Nc                    r  r   r  r  r  r   r   r     r  z(BaseGlyphList.preWrite.<locals>.<lambda>r   )r   BaseGlyphPaintRecordr%   r  re  r   r  r   r     r  zBaseGlyphList.preWriteNr  r   r   r   r   r    r  r  c                   @   r]  )ClipBoxc                    s   t  fdd  D S )Nc                 3   s    | ]	}t  |jV  qd S r   )r   rd   )r'   rd  r   r   r   	<genexpr>  s    z#ClipBox.as_tuple.<locals>.<genexpr>)ri   ra  r   r   r   r   as_tuple  s   zClipBox.as_tuplec                 C   s   | j j |   S r   )r   r   r  r   r   r   r   __repr__  s   zClipBox.__repr__N)r   r   r   r  r  r   r   r   r   r    s    r  c                   @   s@   e Zd ZdddZdd Zdd Zdd	 Zdd
dZdd ZdS )ClipListNc                 C   r
  )Nclips)r   r  r   r   r   r   r     r   zClipList.populateDefaultsc              
   C   s   i }|  }t|d D ]h\}}|j|jkr!td||j|j qg }g }t|j|jd D ])}	z||	 }
W n tyD   ||	 Y q.w |
|vrRt		|j
||
< q.||	 q.|rftd|t|t| |rttd|t|t| q|| _d S )N
ClipRecordzCinvalid ClipRecord[%i].StartGlyphID (%i) > EndGlyphID (%i); skippedr	   zqClipRecord[%i] overlaps previous records; ignoring redefined clip boxes for the following glyph ID range: [%i-%i]z:ClipRecord[%i] range references missing glyph IDs: [%i-%i])r  r   StartGlyphID
EndGlyphIDr   r   r   
IndexErrorr   r  r  minr   r  )r   r   r"   r  r  r   r@  ZredefinedGlyphsZmissingGlyphsr   r   r   r   r   r     sN   

zClipList.postReadc                    s\   t t}i  | j D ]\}}| }|| | | vr"| |< q fdd| D S )Nc                    s   i | ]\}}t | | qS r   )	frozenset)r'   r   r   ZuniqueClipsr   r   
<dictcomp>/  s    z#ClipList.groups.<locals>.<dictcomp>)r   r'  r  r   r  r   )r   ZglyphsByClipr   clipBoxr   r   r  r   groups'  s   
zClipList.groupsc                    s$  t | dsi | _i }|  |   D ]T\}}t fdd|D }|s&q|d }|gg}|dd  D ]}||d krI|d | ||g |}q4|d | |D ]\}	}
|	|
f|vsaJ |||	|
f< qUqg }t| D ]\\}	}
}t }|	|_|
|_	||_
|| qqt||d}|S )Nr  c                 3   s     | ]}| v r | V  qd S r   r   )r'   r   ZglyphMapr   r   r  :  s    
z$ClipList.preWrite.<locals>.<genexpr>r   r	   r   )Z	ClipCountr  )r   r  ZgetReverseGlyphMapr  r   r   r   r  r  r  r  r   )r   r"   ZclipBoxRangesr   r  r   r   r   r   r   r   ZclipRecordsrecordr   r   r  r   r   4  sB   
zClipList.preWritec           	      C   s  |r|n| j j}|d u rg }t| dr|d| jf ||| |  t|  	 dd dD ]E\}}|d |  t|D ]}|j
d|d |  qB|dd|jfg |  ||| |d |  |d |  q1|| |  d S )	Nr   c                 S   s   t | d S rR  )r  rS  r   r   r   r   c  r  z ClipList.toXML.<locals>.<lambda>r   Clipr   r-   r  )r   r   r   r   r   r^   r3   r   r  r   r1   r   rb   )	r   r4   r"   rc   rd   	tableNamer   r  r   r   r   r   re   Y  s0   






zClipList.toXMLc           
      C   s   t | dd }|d u ri  | _}|dksJ g }d }|D ]?}t|ts#q|\}}}|dkr4||d  q|dkrZt }t|d |_|D ]}t|tsLqD|\}}}||||| qDq|rf|D ]}	|||	< q_d S d S )Nr  r  r   r.   r  r   )	r   r  rh   ri   r   r  r   r   rs   )
r   rd   rc   ro   r"   r  r   r  elemr   r   r   r   rs   t  s4   





zClipList.fromXMLr   r!   )	r   r   r   r   r   r  r   re   rs   r   r   r   r   r    s    
,
%r  c                   @   s   e Zd ZdZdZdZdS )
ExtendModer   r	   r@   N)r   r   r   ZPADREPEATZREFLECTr   r   r   r   r    s    r  c                   @   s|   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )CompositeModer   r	   r@   rA   r<   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   r                                    N)r   r   r   ZCLEARZSRCZDESTZSRC_OVERZ	DEST_OVERZSRC_INZDEST_INZSRC_OUTZDEST_OUTZSRC_ATOPZ	DEST_ATOPZXORPLUSZSCREENZOVERLAYZDARKENZLIGHTENZCOLOR_DODGEZ
COLOR_BURNZ
HARD_LIGHTZ
SOFT_LIGHTZ
DIFFERENCEZ	EXCLUSIONZMULTIPLYZHSL_HUEZHSL_SATURATIONZ	HSL_COLORZHSL_LUMINOSITYr   r   r   r   r    s:    r  c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!S )"PaintFormatr	   r@   )rA   r<   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   r   r  r  r  r  r  r  r  r  r  r  r           r       N)#r   r   r   PaintColrLayersZ
PaintSolidZPaintVarSolidZPaintLinearGradientZPaintVarLinearGradientZPaintRadialGradientZPaintVarRadialGradientZPaintSweepGradientZPaintVarSweepGradientZ
PaintGlyphPaintColrGlyphZPaintTransformZPaintVarTransformZPaintTranslateZPaintVarTranslateZ
PaintScaleZPaintVarScaleZPaintScaleAroundCenterZPaintVarScaleAroundCenterZPaintScaleUniformZPaintVarScaleUniformZPaintScaleUniformAroundCenterZ PaintVarScaleUniformAroundCenterZPaintRotateZPaintVarRotateZPaintRotateAroundCenterZPaintVarRotateAroundCenterZ	PaintSkewZPaintVarSkewZPaintSkewAroundCenterZPaintVarSkewAroundCenterZPaintCompositer   r   r   r   r    sB    r  c                   @   s4   e Zd Zdd ZdddZdd Zdefd	d
ZdS )Paintc                 C   s.   zt | jjW S  ty   td| j w )NzUnknown Paint format: )r  r   rd   rm  NotImplementedErrorr   r   r   r   getFormatName  s
   zPaint.getFormatNameNc                 C   sp   |r|n| j j}|d u rg }|d| jf ||| ||   |  | || |	| |  d S )Nr   )
r   r   r   r   r^   ra   r  r3   r   rb   )r   r4   r"   rc   rd   r  r   r   r   re     s   
zPaint.toXMLc                 C   s   | j tjkrg }|jd ur|jj}|| j| j| j  S | j tjkr=|jj	D ]}|j
| jkr4|jg  S q&t| jdg }|  D ]}|jd ur[t|jt| r[|t| |j qC|S )Nz not in colr.BaseGlyphList)r   r  r  Z	LayerListr  ZFirstLayerIndexZ	NumLayersr  r  r  r  r   KeyErrorra  Z
tableClass
issubclassrk  r   r   rd   )r   colrZlayersr  childrenrd  r   r   r   getChildren  s&   
zPaint.getChildrenr  c                 C   sl   t |std| g}t }|r4| }t||v rq|| |t| |t|| |sdS dS )zEDepth-first traversal of graph rooted at self, callback on each node.zcallback must be callableN)	callable	TypeErrorr   popidr   r   reversedr  )r   r  callbackstackZvisitedZcurrentr   r   r   traverse  s   zPaint.traverser!   )r   r   r   r  re   r  r^  r  r   r   r   r   r    s
    
r  )Z
Mark1Array)ZDefaultLangSys)MarkCoverageBaseCoverageZLigatureCoverageZMark1CoverageZMark2CoverageZBacktrackCoverageZInputCoverageZLookAheadCoverageZVertGlyphCoverageZHorizGlyphCoverageZTopAccentCoverageZExtendedShapeCoverageZMathKernCoverage)	ClassDef1	ClassDef2ZBacktrackClassDefZInputClassDefZLookAheadClassDefZGlyphClassDefZMarkAttachClassDef)ZEntryAnchorZ
ExitAnchor
BaseAnchorZLigatureAnchorZMark2AnchorZ
MarkAnchor)Z
XPlaDeviceZ
YPlaDeviceZ
XAdvDeviceZ
YAdvDeviceZXDeviceTableZYDeviceTableZDeviceTable)Z	HorizAxisZVertAxis)ZDefaultMinMax)ZMinCoordZMaxCoord)ZDefJstfLangSys)ZShrinkageEnableGSUBZShrinkageDisableGSUBZExtensionEnableGSUBZExtensionDisableGSUB)ZShrinkageEnableGPOSZShrinkageDisableGPOSZExtensionEnableGPOSZExtensionDisableGPOS)ZShrinkageJstfMaxZExtensionJstfMax)ZTopRightMathKernZTopLeftMathKernZBottomRightMathKernZBottomLeftMathKern)ZVertGlyphConstructionZHorizGlyphConstruction)	MarkArrayZLangSysr   r8  ZAnchorZDeviceZAxisZMinMaxZ	BaseCoordZJstfLangSysZJstfGSUBModListZJstfGPOSModListZJstfMaxZMathKernZMathGlyphConstructionc                 C   s  d}|j }|jdu r|d }|dk r|S |jdkrd}n|jdkr#d}| |j jjj}|| }|jd jj|krO|d }|dk rB|S || }|jd jj|ks8t	|t
|D ]2}|| }|j|kr||_t	t
|jD ]}|j| }t|j | }	|	 }
d|
_||
_|
|j|< qkqVd}|S )a   Either the offset from the LookupList to a lookup overflowed, or
	an offset from a lookup to a subtable overflowed.
	The table layout is:
	GPSO/GUSB
		Script List
		Feature List
		LookUpList
			Lookup[0] and contents
				SubTable offset list
					SubTable[0] and contents
					...
					SubTable[n] and contents
			...
			Lookup[n] and contents
				SubTable offset list
					SubTable[0] and contents
					...
					SubTable[n] and contents
	If the offset to a lookup overflowed (SubTableIndex is None)
		we must promote the *previous*	lookup to an Extension type.
	If the offset from a lookup to subtable overflowed, then we must promote it
		to an Extension Lookup type.
	r   Nr	   rg  rD   rh  rF   )LookupListIndexSubTableIndex	tableTyperp  rf  ri  rj  r   
LookupTyper   r   lookupTypesr   ExtSubTable)ttfoverflowRecordokr{  ZextTypeZlookupslookupsiZsubTableZextSubTableClassextSubTabler   r   r   fixLookupOverFlows9  s@   




r  c           
      C      d}t | j }t|}|jdv r|d }n
|jdkr!|jd }i |_t||D ]}|| }|d }	|d |j|	< | j|	= q)|S )Nr	   r   r   r@   r/  r   )r   r   r   r   itemName	itemIndexr   )
oldSubTablenewSubTabler  r  Z
oldMappingoldLennewLenr   r%  r   r   r   r   splitMultipleSubsts     




r  c           
      C   s   d}t | dr| j|_t| j }t|}|jdv r |d }n
|jdkr*|jd }i |_t||D ]}|| }|d }	|d |j|	< | j|	= q2|S )Nr	   rK  r  r@   rE  r   )	r   rK  r   rD  r   r   r  r  r   )
r  r  r  r  ZoldAltsr  r  r   r%  r   r   r   r   splitAlternateSubst  s    





r  c           
      C   r  )Nr	   r  r@   rO  r   )r   rN  r   r   r  r  r   )
r  r  r  r  ZoldLigsr  r  r   r%  r   r   r   r   splitLigatureSubst  r  r  c           	         s  | }d}| j |_ | j dkrdt| jdkrddD ]}t||t| | q| j |_| jj}| j}t| jd |d  | j_|d  | _|d  |j_|d  |_t| j| _t|j|_d}|S | j dkrt| j	dkrt
| dst| j	d j| _dD ]}t||t| | qd| _| j |_| j |_| jj}| jj}| j	}t| j	d tfd	d
| D   fdd|D | j_fdd| D | j_|d  | _	 fdd|D |j_fdd| D |j_|d  |_	t| j	| _t|j	|_d}|S )NFr	   )ValueFormat1ValueFormat2r@   TClass2Countr   )r  r  r  r  c                 3   s     | ]\}}| kr|V  qd S r   r   r'   kvoldCountr   r   r    s    zsplitPairPos.<locals>.<genexpr>c                    s   g | ]}| vr|qS r   r   r  	newGlyphsr   r   r)     r  z splitPairPos.<locals>.<listcomp>c                    s   i | ]\}}| k r||qS r   r   r  r  r   r   r    s    z splitPairPos.<locals>.<dictcomp>c                    s   g | ]}| v r|qS r   r   r  r  r   r   r)     r  c                    s"   i | ]\}}| kr||  qS r   r   r  r  r   r   r    s   " )r   r   ZPairSetr   r   r   r   r   ZPairSetCountZClass1Recordr   ZClass2Recordr  	DontSharer  r9  r   r   ZClass1Count)	r  r  r  ro  r  rd   coverager?  r9  r   )r  r  r   splitPairPos  sR   &
r  c                 C   s  | j }|dk r	dS |d }|| }g g }}g g }}	t| jj| jjD ]%\}
}|j|k r8||
 || q$| j|8  _||
 |	| q$g g }}| jj	D ]%}|
 |
 }}|jd | |_|j|d  |_|| || qS| j|_|| j_| j
 |_||j_| j|_|| _ ||_ || j_| j
 |_|	|j_t|| j_t|	|j_|| j_	| j
 |_||j_	t|| j_t||j_dS )Nr@   FT)Z
ClassCountr  r  r   r  Z
MarkRecordr=  r   Z	BaseArrayZ
BaseRecordr   r  r   r  r   Z	MarkCountZ	BaseCount)r  r  r  Z
classCountZoldClassCountZnewClassCountZoldMarkCoverageZoldMarkRecordsZnewMarkCoverageZnewMarkRecordsr   Z
markRecordZoldBaseRecordsZnewBaseRecordsr@  ZoldBaseRecordZnewBaseRecordr   r   r   splitMarkBasePos  sT   






r  )r@   rA   r<   )r@   r<   rg  rh  c                 C   s0  | |j  j}|jj|j }|j}|j| }t|dsd|_dS t|drN|j	j
j}|}|j	}t|j  |j
j }| }	|j|	_|	}
t|j  | }| }||	_	n|j
j}t|j  | }| }|}
t|dri|jd |_z	t|j  | }W n ty   td|j | Y dS w ||||}|r|j|d |
 |S )zd
	An offset has overflowed within a sub-table. We need to divide this subtable into smaller parts.
	r  Tr  SubTableCountr	   z)Don't know how to split %s lookup type %sF)r  rp  rf  ri  r  r  rj  r   r  r  r   r  r  r   r  
splitTabler  r   errorr  )r  r  rp  r  ZsubIndexZsubtableZsubTableTyper  ZnewExtSubTableClassZnewExtSubTableZtoInsertZnewSubTableClassr  Z	splitFuncr  r   r   r   fixSubTableOverFlows[  sL   




r  c                  C   s  dd l } ddlm} | d}t }|D ]2\}}t}||}|r0|d}|d d }t|}||vrFt||fi }	|dv rBd|	_	|	||< qt
 D ]\}
}||
 }
|D ]}|
||< qUqKttttttttdtttttttttd	d	tittt tt!d
da"t"d t"d< t"# D ]}| D ]\}}	||	_$qqdt%ia&t'ddD ]}t(t&d| < qt'ddD ]}t)t&d| < qddl*m+} |D ]G\}}||}|r|, \}}t-|}|| }	t.|	dsi |	_/i |	_0||dd  |\}}||	j/|< ||	j0|< q|| }	|||\|	_/|	_0qd S )Nr   r	   )otDataz([A-Za-z0-9]+)Format(\d+)$r  T)r	   r@   rA   r<   rB   rC   rD   rE   )	r	   r@   rA   r<   rB   rC   rD   rE   rF   r<   )r   r	   r@   r<   rB   )rg  rh  ZmortZmorxrh  ZJSTFsizer  zss%02dd   zcv%02d)buildConverters
converters)1rer  rW   globalsr
   matchgroupr   rk  r  _equivalentsr   r  r-  rC  rM  ZContextSubstZChainContextSubstZExtensionSubstZReverseChainSingleSubstZ	SinglePosZPairPosZ
CursivePosZMarkBasePosZ
MarkLigPosZMarkMarkPosZ
ContextPosZChainContextPosZExtensionPosZNoncontextualMorphZRearrangementMorphZContextualMorphZLigatureMorphZInsertionMorphr  valuesr  r   r   r   r   r   ZotConvertersr  r  r4  r   r  convertersByName)r  r  Z	formatPat	namespacerd   rp  Z	baseClassmZ
formatTyper>  baserG  rH  Z
lookupEnumenumr   r  r   r  r  r   r   r   _buildClasses  s   



"


r
  c                 C   s   | d u rg S | j S r   )r   )r  r   r   r   r    s   r  )G__doc__r  r	  r   	itertoolscollectionsr   r   ZfontTools.misc.roundToolsr   ZfontTools.misc.textToolsr   r   r   ZotBaser
   r   r   r   r   Z fontTools.feaLib.lookupDebugInfor   r   Zloggingr   Z	getLoggerr   r   objectr   r   r    r;   rv   r~   r   r   r   r   r   r   r   r   r	  r  r  r-  r8  rC  rM  r^  rf  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r   r   r   r   <module>   s   
R@  	ZC5QNkG]&

	 #B :C?8f