o
    tBh                     @   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)GlyphClassesStatesPerGlyphLookupsself r   v/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-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newliner2   )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)r3   r(   r   flagr   r   r   _setFlag8   s   zAATAction._setFlag)r   r   r   r3   staticmethodr'   r9   r<   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@   rA   rB   r2   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   rO       @      )writeUShortrQ   rR   r2   r@   rA   rB   r   writerr%   actionIndexr8   r   r   r   compile]   s   z RearrangementMorphAction.compilec                 C   s`   |d u sJ |  | _|  }|d@ | _t|d@ | _t|d@ | _t|d@ | _|d@ | _d S )NrO   rS   rT   rU   i  )
readUShortrQ   rR   boolr@   rA   rB   r2   r   readerr%   actionReaderr8   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 )NrQ   r0   rR   )
begintagr6   r4   rQ   r9   rR   _VERBSgetcommentendtag)r   r7   r%   attrsname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>rQ   r1   rR   r2   r.   r/   )
rQ   rR   r2   r@   rA   rB   r   splitr<   strip	r   rg   rf   contentr%   eltNameeltAttrs
eltContentr;   r   r   r   fromXML   s   z RearrangementMorphAction.fromXMLN)r   r   r   
staticSizeactionHeaderSizer3   rb   r   rZ   r`   ri   rw   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 )ContextualMorphActionrH   r   SetMarkrA   c                 C   s(   d| _ d\| _| _d| _d\| _| _d S )Nr   FF  r~   )rQ   r{   rA   r2   	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 )NrS   rT   )rV   rQ   r2   r{   rA   r   r   rW   r   r   r   rZ      s   
zContextualMorphAction.compilec                 C   s\   |d u sJ |  | _|  }t|d@ | _t|d@ | _|d@ | _|  | _|  | _d S )NrS   rT   i?  )r[   rQ   r\   r{   rA   r2   r   r   r]   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 )NrQ   r0   r   r   )ra   r6   r4   rQ   r9   r   r   re   r   r7   r%   rf   rg   r   r   r   ri      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   Fr}   c                 S   rj   r   rk   rn   r   r   r   r,      r-   z1ContextualMorphAction.fromXML.<locals>.<listcomp>rQ   r1   r.   r/   r2   r   r   )
rQ   r2   r{   rA   r   r   r   rp   r<   rq   rr   r   r   r   rw      s&   zContextualMorphAction.fromXMLN)r   r   r   rx   ry   r3   r   rZ   r`   ri   rw   r   r   r   r   rz      s    

rz   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 )LigatureMorphActionrF   rL   SetComponentrA   c                 C   s"   d| _ d\| _| _d| _g | _d S )Nr   r|   )rQ   r   rA   r2   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 )NrS   rT   r   rU   )rV   rQ   r2   r   rA   lenr   compileLigActions)r   rX   r%   rY   r8   actionsr   r   r   rZ      s   
zLigatureMorphAction.compilec                 C   sx   |d usJ |  | _|  }t|d@ | _t|d@ | _t|d@ }|d@ | _|  }|r7| ||| _d S g | _d S )NrS   rT   rU   i  )r[   rQ   r\   r   rA   r2   _decompileLigActionsr   )r   r^   r%   r_   r8   performActionrY   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   rY   state_glyphClasstransaisuffix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lastr1   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pos	readULongr\   r   r   r   r   )	r   r_   rY   r   r   r^   r1   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   rj   r   rk   rn   r   r   r   r,   J  r-   z/LigatureMorphAction.fromXML.<locals>.<listcomp>rQ   r1   r.   r/   r2   Action c                 S      g | ]}|  qS r   rq   r)   r   r   r   r,   V      r   r   )rQ   r2   r   rA   r   r   rp   r<   rq   r   rc   r   r   r   )r   rg   rf   rs   r%   rt   ru   rv   r;   r   r8   r   r   r   rw   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 )NrQ   r0   r   )r.   r   r   )
ra   r6   r4   rQ   r9   r   r   r   r   re   )r   r7   r%   rf   rg   r   attribsr   r   r   ri   \  s   




zLigatureMorphAction.toXMLN)r   r   r   rx   ry   r3   r   rZ   r`   r=   r'   r   r   rw   ri   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 )InsertionMorphActionrH   r?   )r{   rA   CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 C   s6   d| _ | jD ]}t| |d qd| _g g | _| _d S rP   )rQ   r3   setattrr2   CurrentInsertionActionMarkedInsertionActionr:   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 )
NrS   rT   rU            rE   r   r~   )rV   rQ   r2   r{   rA   r   r   r   r   r   r   r   rm   )r   rX   r%   rY   r8   currentIndexmarkedIndexr   r   r   rZ   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 )NrS   rT   rU   r   r   r   i  rE   )indexcount   )r[   rQ   r\   r{   rA   r   r   r   r   _decompileInsertionActionr   r   r]   r   r   r   r`     s&   

zInsertionMorphAction.decompilec                 C   s8   |dks|dkr
g S | |j|d  }|||S )Nr~   r   rC   )r   r   getGlyphNameMany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 )NrQ   r0   r   glyphr   )ra   r6   r4   rQ   r9   r   r   re   )r   r7   r%   rf   rg   gr   r   r   ri     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   rj   r   rk   rn   r   r   r   r,     r-   z0InsertionMorphAction.fromXML.<locals>.<listcomp>rQ   r1   r.   r/   r   r   r   )	r   r   rQ   rp   r<   rq   r   r   r   rr   r   r   r   rw     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   rC   r	   z>H)r   r"   r   r   r   rm   r   r   r   r   r   
getGlyphIDr   r   )r%   r&   r   rY   r   r   r   r   r   start
startIndexlimitglyphsr   glyphIDr   r   r   r'     s.   


z#InsertionMorphAction.compileActionsN)r   r   r   rx   ry   r3   r   rZ   r`   r   ri   rw   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 )N
FeatureTagz-Wrong FeatureParams type for feature '%s': %s)featureParamTypesrc   	__class__r   r
   rZ   )r   rX   r%   r   r   r   rZ     s   ,zFeatureParams.compileNc                 C   s   t j| |||| jjd d S )N)rg   )r
   ri   r   r   r   r   r   r   ri     s   zFeatureParams.toXMLr$   )r   r   r   rZ   ri   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   
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	   
GlyphArrayrC   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   ranges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   rD   r   c                 S   r   r   )StartIDr   r   r   r   r   D  r   z#Coverage.preWrite.<locals>.<lambda>r   rC   r   )getattrr   getGlyphIDManyr   r   r   r   r   r   getGlyphNamer   r   r   r   r   sortr   )r   r%   r   formatr   glyphIDs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   Glyphr0   )r   r4   r6   )r   r7   r%   	glyphNamer   r   r   toXML2N  s   
zCoverage.toXML2c                 C   s0   t | dd }|d u rg }|| _||d  d S )Nr   r1   )r   r   r   )r   rg   rf   rs   r%   r   r   r   r   rw   S  s
   zCoverage.fromXMLr   r   r   r   r   r   r  r  rw   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   r~   r	         rC   i rD   r?   )max)r
  oredidxinner	innerBits	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
  r~   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  r~   Map)r   r   r4   r6   )r   r7   r%   r   r1   rf   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  r~   r  )r   r
  r   insert)	r   rg   rf   rs   r%   r
  r   r  r  r   r   r   rw     s   
zDeltaSetIndexMap.fromXMLr   )
r   r   r   r   r   r=   r  r  r  rw   r   r   r   r   r  [  s    



r  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%   
glyphOrder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  r~   r  )r   r   r   r4   r6   )r   r7   r%   r   r1   rf   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  r~   r  )r   r
  r   r   )	r   rg   rf   rs   r%   r
  r   r  r  r   r   r   rw     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 )NfvarRegionAxisCount)rc   r   axesr)  r(   r   )r   r%   	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>rC   
GlyphCountz invalid SingleSubstFormat2 table
Substituter   unknown format: %s)_getGlyphsFromCoverageTabler   r   r   r"  r   r
  )r   r   r%   r
  input	inputGIDSoutGIDSoutNamesinpoutsubstsubr   r1  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>rC   r0  r	   c                 S   s   g | ]}|d  d qS )r	   r   r   r*   itemr   r   r   r,     r2  c                 S   s   g | ]}|d  d  qS r	   r   rA  r   r   r   r,     r2  r   r/  r4  )
r   r
  listr   r   r   r"  r   r   r   )r   r%   r
  r   gidItemssortableItemsr   r   inIDoutIDr   covr7  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   r4   r6   )r   r7   r%   r   inGlyphoutGlyphr   r   r   r  (  s   
zSingleSubst.toXML2c                 C   s2   t | dd }|d u ri }|| _|d ||d < d S )Nr
  r<  rL  )r   r
  )r   rg   rf   rs   r%   r
  r   r   r   rw   /  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   )r4  )r*   sr   r   r   r,   A  s    z*MultipleSubst.postRead.<locals>.<listcomp>Sequencer   r5  )r   r6  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   rQ  )	r   r
  r   r   rD  keysr   r   r   )r   r%   rI  r   r   rS  r   r  H  s   
zMultipleSubst.preWritec                 C   sJ   t | j }|D ]\}}d|}|dd|fd|fg |  q	d S )Nr/   rK  rL  r<  )r   r
  r   r5   r4   r6   )r   r7   r%   r   rM  	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  r1   rQ  r   r4  r<  r/   c                 S   r   r   r   r%  r   r   r   r,   |  r   z)MultipleSubst.fromXML.<locals>.<listcomp>rL  )
r   r
  old_coverage_rl   rm   r   intrc   r   rp   )r   rg   rf   rs   r%   r
  elementelement_nameelement_attrs_r   r   glyph_mappingrU  r   r   r   rw   ^  s8   




zMultipleSubst.fromXMLc                 C   s   t  }| |_|S r   )rQ  r4  )r   seqr   r   r   rR  ~  s   zMultipleSubst.makeSequence_r   )
r   r   r   r   r   r  r  rw   r=   rR  r   r   r   r   rO  7  s    
 rO  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   r_  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ClassValueArrayrC   ClassRangeRecordzUnknown ClassDef format: %s)r   r   r   r   r   r"  Classr   r   r   r   r_  )r   r   r%   r_  r   	classListr   r   
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 )Nr_  r   r	   r   )r   r_  r   r   r   r   r   )r   r%   r_  r   r   r  rf  r   lastName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 )NrC   rb  r   r	   r   rD   )r`  ra  )rk  r   r   rb  r   r   rc  r   )r   r%   r   r   r   
startGlyphendGlyph
glyphCountr   rf  r   	startNamer   endNamerh  startGlyphNameclassesr   r   r   r   r    s6   





zClassDef.preWritec                 C   rJ  )Nr^  r   class)r   r_  r   r4   r6   )r   r7   r%   r   r  rf  r   r   r   r    s
   
zClassDef.toXML2c                 C   s6   t | dd }|d u ri }|| _t|d ||d < d S )Nr_  rs  r   )r   r_  rW  )r   rg   rf   rs   r%   r_  r   r   r   rw     s
   zClassDef.fromXMLr   )	r   r   r   r   r   rk  r  r  rw   r   r   r   r   r^    s    
r^  c                   @   r   )AlternateSubstNc                 C   r  )N
alternates)r   ru  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   r5  )r   r6  r   r"  	Alternateru  )r   r   r%   ru  r7  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	   ru  c                 S      g | ]}|d  qS rC  r   rA  r   r   r   r,     r   z+AlternateSubst.preWrite.<locals>.<listcomp>c                 S   rz  r   r   rA  r   r   r   r,     r   )r   rv  )r   r   ru  rD  r   r   r   r   r   r   r   rv  rw  r   sortCoverageLast)
r   r%   ru  r   r   r  r   rI  setListrx  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 )Nrv  r   rw  )r   ru  r   ra   r6   r4   re   )r   r7   r%   r   r  ru  ry  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 )Nru  r   )r   ru  rl   rm   r   )	r   rg   rf   rs   r%   ru  r  r   rX  r   r   r   rw   (  s   

zAlternateSubst.fromXMLr   r  r   r   r   r   rt    s    
rt  c                   @   r   )LigatureSubstNc                 C   r  )N	ligatures)r   r  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   r5  )r   r6  r   r   Ligaturer  )r   r   r%   r  r7  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	   r  c                 S   s   t | d  | d fS Nr   r   rB  r   r   r   r   V  s    z(LigatureSubst.preWrite.<locals>.<lambda>r   r   c                 S   rz  rC  r   rA  r   r   r   r,   d  r   z*LigatureSubst.preWrite.<locals>.<listcomp>c                 S   rz  r{  r   rA  r   r   r   r,   g  r   )r   r  )r   r   r  rl   nextiterrm   r!  r   r   r  	Componentr   	CompCountLigGlyphr   r   rD  r   r   r   r   r   r  r|  )r   r%   r  newLigaturescompsligligaturer   r   r  r   rI  r  r}  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 )Nr  r   r  r/   )r   
components)
r   r  r   ra   r6   r4   r  r5   r  re   )r   r7   r%   r   r  r  r  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 )Nr  r   r  r/   )r   r  rl   rm   r  r  rp   r  r   r  r   )r   rg   rf   rs   r%   r  r  r  rX  r  r  r   r   r   rw     s$   


zLigatureSubst.fromXMLr   r  r   r   r   r   r~  7  s    
*r~  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)	tableDictz$LayerRecordCount converter not found)	r   getConvertersrg   advancerx   readAssertionErrorr
   r`   )r   r^   r%   	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)NSubstGSUB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 )NDebgz: z in z (/)r   )r   datasuperr  r  r  repeatr   rg   r   strr   locationfeaturerd   r6   xmlWriteauxevalvars)r   r7   r%   	debugDatar  r1   lookupIndexrB  infotagscriptlanguager  r   r   r   r    s4   
zLookupList.toXML2)r   r   r   propertyr  r  __classcell__r   r   r  r   r    s    
	r  c                   @   r   )BaseGlyphRecordArrayc                    "   t | j fddd| _| j S )Nc                         | jS r   r   	BaseGlyphrh  r%   r   r   r         z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>r   )r   BaseGlyphRecordr(   r  r  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  r  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   rg   )r*   r  r   r   r   	<genexpr>  s    z#ClipBox.as_tuple.<locals>.<genexpr>)rm   r  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   rh  redefinedGlyphs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   uniqueClipsr   r   
<dictcomp>/  s    z#ClipList.groups.<locals>.<dictcomp>)r   rD  r  r   r  r   )r   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  glyphMapr   r   r  :  s    z$ClipList.preWrite.<locals>.<genexpr>r   r	   r   )	ClipCountr  )r   r  getReverseGlyphMapr  r   r   r   r  r  r  r  r   )r   r%   clipBoxRangesr   r  r  r   r   r   r   r   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 r  )r  r  r   r   r   r   c  r  z ClipList.toXML.<locals>.<lambda>r   Clipr  r0   r  )r   r   r   r   r   ra   r6   r   r  r   r4   r  re   )	r   r7   r%   rf   rg   	tableNamer   r  r  r   r   r   ri   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  r1   r  r   )	r   r  rl   rm   r   r  r   r   rw   )
r   rg   rf   rs   r%   r  r   r  elemr  r   r   r   rw   t  s4   





zClipList.fromXMLr   r$   )	r   r   r   r   r   r  r  ri   rw   r   r   r   r   r    s    
,
%r  c                   @   s   e Zd ZdZdZdZdS )
ExtendModer   r	   rC   N)r   r   r   PADREPEAT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	   rC   rD   r?   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   r                                   N)r   r   r   CLEARSRCDESTSRC_OVER	DEST_OVERSRC_INDEST_INSRC_OUTDEST_OUTSRC_ATOP	DEST_ATOPXORPLUSSCREENOVERLAYDARKENLIGHTENCOLOR_DODGE
COLOR_BURN
HARD_LIGHT
SOFT_LIGHT
DIFFERENCE	EXCLUSIONMULTIPLYHSL_HUEHSL_SATURATION	HSL_COLOR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	   rC   )rD   r?   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   r  r  r  r  r  r  r  r  r  r  r  r           r       N)#r   r   r   PaintColrLayers
PaintSolidPaintVarSolidPaintLinearGradientPaintVarLinearGradientPaintRadialGradientPaintVarRadialGradientPaintSweepGradientPaintVarSweepGradient
PaintGlyphPaintColrGlyphPaintTransformPaintVarTransformPaintTranslatePaintVarTranslate
PaintScalePaintVarScalePaintScaleAroundCenterPaintVarScaleAroundCenterPaintScaleUniformPaintVarScaleUniformPaintScaleUniformAroundCenter PaintVarScaleUniformAroundCenterPaintRotatePaintVarRotatePaintRotateAroundCenterPaintVarRotateAroundCenter	PaintSkewPaintVarSkewPaintSkewAroundCenterPaintVarSkewAroundCenter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   rg   r  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   ra   rd   r=  r6   r  re   )r   r7   r%   rf   rg   r  r   r   r   ri     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  	LayerListr;  FirstLayerIndex	NumLayersr%  r  r  r  r  KeyErrorr  
tableClass
issubclassr  r   r   rg   )r   colrlayersr  childrenr  r   r   r   getChildren  s&   
zPaint.getChildrenrD  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   reversedrG  )r   rD  callbackstackvisitedcurrentr   r   r   traverse  s   zPaint.traverser$   )r   r   r   r=  ri   rG  r  rQ  r   r   r   r   r;    s
    
r;  )
Mark1Array)DefaultLangSys)MarkCoverageBaseCoverageLigatureCoverageMark1CoverageMark2CoverageBacktrackCoverageInputCoverageLookAheadCoverageVertGlyphCoverageHorizGlyphCoverageTopAccentCoverageExtendedShapeCoverageMathKernCoverage)	ClassDef1	ClassDef2BacktrackClassDefInputClassDefLookAheadClassDefGlyphClassDefMarkAttachClassDef)EntryAnchor
ExitAnchor
BaseAnchorLigatureAnchorMark2Anchor
MarkAnchor)
XPlaDevice
YPlaDevice
XAdvDevice
YAdvDeviceXDeviceTableYDeviceTableDeviceTable)	HorizAxisVertAxis)DefaultMinMax)MinCoordMaxCoord)DefJstfLangSys)ShrinkageEnableGSUBShrinkageDisableGSUBExtensionEnableGSUBExtensionDisableGSUB)ShrinkageEnableGPOSShrinkageDisableGPOSExtensionEnableGPOSExtensionDisableGPOS)ShrinkageJstfMaxExtensionJstfMax)TopRightMathKernTopLeftMathKernBottomRightMathKernBottomLeftMathKern)VertGlyphConstructionHorizGlyphConstruction)	MarkArrayLangSysr   r^  AnchorDeviceAxisMinMax	BaseCoordJstfLangSysJstfGSUBModListJstfGPOSModListJstfMaxMathKern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	   r  rG   r  rI   )LookupListIndexSubTableIndex	tableTyper  r  r  r  r   
LookupTyper   r   lookupTypesr   ExtSubTable)ttfoverflowRecordokr  extTypelookupslookupsisubTable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   rC   rQ  r   )r   r
  r   r   itemName	itemIndexr   )
oldSubTablenewSubTabler  r  
oldMappingoldLennewLenr   rB  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	   r|  r  rC   rv  r   )	r   r|  r   ru  r   r   r  r  r   )
r  r  r  r  oldAltsr  r  r   rB  r   r   r   r   splitAlternateSubst  s    





r  c           
      C   r  )Nr	   r  rC   r  r   )r   r  r   r   r  r  r   )
r  r  r  r  oldLigsr  r  r   rB  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ValueFormat2rC   TClass2Countr   )r  rb  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,     r2  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,     r2  c                    s"   i | ]\}}| kr||  qS r   r   r  r  r   r   r    s   " )r   r   PairSetr   r   r   r   r   PairSetCountClass1Recordr   Class2Recordr  	DontSharera  r_  r   r   Class1Count)	r  r  r  r  r  rg   coveragerg  r_  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 )NrC   FT)
ClassCountr"  rT  r   r  
MarkRecordrc  r   	BaseArray
BaseRecordr   rj  r   rU  r   	MarkCount	BaseCount)r  r  r  
classCountoldClassCountnewClassCountoldMarkCoverageoldMarkRecordsnewMarkCoveragenewMarkRecordsr  
markRecordoldBaseRecordsnewBaseRecordsrh  oldBaseRecordnewBaseRecordr   r   r   splitMarkBasePos  sT   






r  )rC   rD   r?   )rC   r?   r  r  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  r  r  r  r  r  r  r   r  r  r   r  r  r   r  
splitTablerA  r   errorr  )r  r  r  r  subIndexsubtablesubTableTyper  newExtSubTableClassnewExtSubTabletoInsertnewSubTableClassr  	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	   rC   rD   r?   rE   rF   rG   rH   )	r	   rC   rD   r?   rE   rF   rG   rH   rI   r?   )r   r	   rC   r?   rE   )r  r  mortmorxr  JSTFsizer  zss%02dd   zcv%02d)buildConverters
converters)1rer  rZ   globalsr
   matchgroupr   r  r  _equivalentsr   r.  rO  rt  r~  ContextSubstChainContextSubstExtensionSubstReverseChainSingleSubst	SinglePosPairPos
CursivePosMarkBasePos
MarkLigPosMarkMarkPos
ContextPosChainContextPosExtensionPosNoncontextualMorphRearrangementMorphContextualMorphLigatureMorphInsertionMorphr  valuesr  r   r   r   r   r   otConvertersr  r  rW  r   r  convertersByName)r  r  	formatPat	namespacerg   r  	baseClassm
formatTyperf  baserx  ry  
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   r6    s   r6  )G__doc__r  r  r   	itertoolscollectionsr   r   fontTools.misc.roundToolsr   fontTools.misc.textToolsr   r   r   otBaser
   r   r   r   r    fontTools.feaLib.lookupDebugInfor   r   loggingr   	getLoggerr   r   objectr   r!   r#   r>   rz   r   r   r   r   r   r   r   r   r  r  r'  r.  rO  r^  rt  r~  r  r  r  r  r  r  r  r  r  r;  r  r  r  r  r  r  r  r  r  r  r6  r   r   r   r   <module>   s   
R@  	ZC5QNkG]&

	 #B :C?8f