o
    teI                    @   s  d Z ddlZddlmZ ddlm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 dd	lmZ dd
lmZmZ ddlmZmZmZ ddlmZ ddlmZ ddlmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z% ddl&Z&ddl'Z'ddl(m)Z)m*Z*m+Z+m,Z,m-Z- e)rddl.m/Z/ e&0e1Z2G dd de3Z4G dd de3Z5G dd de3Z6G dd de6Z7G dd de6Z8G dd de3Z9G dd  d e6Z:G d!d" d"e6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@d-ZAG d.d/ d/e"d0ZBG d1d2 d2eZCG d3d4 d4eZDG d5d6 d6eZEG d7d8 d8eZFG d9d: d:eZGG d;d< d<eZHG d=d> d>eZIG d?d@ d@eZJG dAdB dBeZKG dCdD dDeZLG dEdF dFeZMG dGdH dHeZNG dIdJ dJe"d0ZOG dKdL dLe"d0ZPG dMdN dNeZQG dOdP dPeZRG dQdR dReZSG dSdT dTe"d0ZTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcddZUdedf ZVdgdh ZWdidj ZXdkdl ZYdmdn ZZdodp Z[eWeXeYdqeZe[drdsZ\dtdu Z]dvdw Z^e^  dxdy Z_dS )zzfontTools.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)reduce)radians)defaultdict
namedtuple)dfs_base_table)quantizeRect)otRound)	TransformIdentity)	bytesjoinpadsafeEval)ControlBoundsPen)TransformPen   )	BaseTableFormatSwitchingBaseTableValueRecordCountReference getFormatSwitchingBaseTableClass)LookupDebugInfoLOOKUP_DEBUG_INFO_KEY)TYPE_CHECKINGIteratorListOptionalSet)_TTGlyphSetc                   @      e Zd Zdd ZdS )AATStateTablec                 C   s   i | _ g | _g | _d S N)ZGlyphClassesZStatesZPerGlyphLookupsself r$   OD:\Projects\ConvertPro\env\Lib\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&   0      
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%   compileActions7   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)r?   r4   r#   flagr$   r$   r%   _setFlagD   s   zAATAction._setFlag)r(   r)   r*   r?   staticmethodr3   rE   rH   r$   r$   r$   r%   r/   4   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VerbrL   rM   rN   r>   r"   r$   r$   r%   r&   a   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   r[       @      )writeUShortr]   r^   r>   rL   rM   rN   r#   writerr1   actionIndexrD   r$   r$   r%   compilei   s   z RearrangementMorphAction.compilec                 C   s`   |d u sJ |  | _|  }|d@ | _t|d@ | _t|d@ | _t|d@ | _|d@ | _d S )Nr[   r_   r`   ra   i  )
readUShortr]   r^   boolrL   rM   rN   r>   r#   readerr1   actionReaderrD   r$   r$   r%   	decompilev   s   

z"RearrangementMorphAction.decompilec                 C   s   |j |fi | |  |jd| jd |  | | |jd| jd | j| j}|d ur6|| |  |	| |  d S )Nr]   r<   r^   )
begintagrB   r@   r]   rE   r^   _VERBSgetcommentendtag)r#   rC   r1   attrsnameZverbCommentr$   r$   r%   toXML   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r6   tr$   r$   r%   r8      r9   z4RearrangementMorphAction.fromXML.<locals>.<listcomp>r]   r=   r^   r>   r:   r;   )
r]   r^   r>   rL   rM   rN   r   splitrH   strip	r#   rs   rr   contentr1   eltNameeltAttrs
eltContentrG   r$   r$   r%   fromXML   s   z RearrangementMorphAction.fromXMLN)r(   r)   r*   
staticSizeactionHeaderSizer?   rn   r&   rf   rl   rt   r   r$   r$   r$   r%   rJ   I   sT    	

rJ   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 )ContextualMorphActionrT   r   SetMarkrM   c                 C   s(   d| _ d\| _| _d| _d\| _| _d S )Nr   FF  r   )r]   r   rM   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 )Nr_   r`   )rb   r]   r>   r   rM   r   r   rc   r$   r$   r%   rf      s   
zContextualMorphAction.compilec                 C   s\   |d u sJ |  | _|  }t|d@ | _t|d@ | _|d@ | _|  | _|  | _d S )Nr_   r`   i?  )rg   r]   rh   r   rM   r>   r   r   ri   r$   r$   r%   rl      s   


zContextualMorphAction.decompilec                 C   s   |j |fi | |  |jd| jd |  | | |jd| jd |  |jd| jd |  || |  d S )Nr]   r<   r   r   )rm   rB   r@   r]   rE   r   r   rq   r#   rC   r1   rr   rs   r$   r$   r%   rt      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   ru   r$   rv   ry   r$   r$   r%   r8      r9   z1ContextualMorphAction.fromXML.<locals>.<listcomp>r]   r=   r:   r;   r>   r   r   )
r]   r>   r   rM   r   r   r   r{   rH   r|   r}   r$   r$   r%   r      s&   zContextualMorphAction.fromXMLN)r(   r)   r*   r   r   r?   r&   rf   rl   rt   r   r$   r$   r$   r%   r      s    
r   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 )LigatureMorphActionrR   rX   SetComponentrM   c                 C   s"   d| _ d\| _| _d| _g | _d S )Nr   r   )r]   r   rM   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 )Nr_   r`   r   ra   )rb   r]   r>   r   rM   lenr   compileLigActions)r#   rd   r1   re   rD   actionsr$   r$   r%   rf      s   
zLigatureMorphAction.compilec                 C   sx   |d usJ |  | _|  }t|d@ | _t|d@ | _t|d@ }|d@ | _|  }|r7| ||| _d S g | _d S )Nr_   r`   ra   i  )rg   r]   rh   r   rM   r>   _decompileLigActionsr   )r#   rj   r1   rk   rD   ZperformActionre   r$   r$   r%   rl     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>1      z4LigatureMorphAction.compileActions.<locals>.<lambda>keyr   rK   )
setr-   itemsaddr   sortedranger   
setdefaultr   )r1   r2   resultr   re   state_glyphClasstransaisuffixZsuffixIndexr$   r$   r%   r3      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 )NFrK   r   r   r   i    i   )getSubReaderposZ	readULongrh   r   r   r   r   )	r#   rk   re   r   r   rj   r=   r   deltar$   r$   r%   r   E  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   ru   r$   rv   ry   r$   r$   r%   r8   Z  r9   z/LigatureMorphAction.fromXML.<locals>.<listcomp>r]   r=   r:   r;   r>   Action c                 S      g | ]}|  qS r$   r|   r5   r$   r$   r%   r8   f      r   r   )r]   r>   r   rM   r   r   r{   rH   r|   r   ro   r   r   r   )r#   rs   rr   r~   r1   r   r   r   rG   r   rD   r$   r$   r%   r   U  s.   
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 )Nr]   r<   r   )r:   r   r   )
rm   rB   r@   r]   rE   r   r   r   r   rq   )r#   rC   r1   rr   rs   r   attribsr$   r$   r%   rt   k  s   




zLigatureMorphAction.toXMLN)r(   r)   r*   r   r   r?   r&   rf   rl   rI   r3   r   r   r   rt   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 )InsertionMorphActionrT   rK   )r   rM   CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 C   s6   d| _ | jD ]}t| |d qd| _g g | _| _d S r\   )r]   r?   setattrr>   CurrentInsertionActionMarkedInsertionActionrF   r$   r$   r%   r&     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 )
Nr_   r`   ra            rQ   r   r   )rb   r]   r>   r   rM   r   r   r   r   r   r   r   rx   )r#   rd   r1   re   rD   ZcurrentIndexZmarkedIndexr$   r$   r%   rf     s4   

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 )Nr_   r`   ra   r   r   r   i  rQ   )indexcount   )rg   r]   rh   r   rM   r   r   r   r   _decompileInsertionActionr   r   ri   r$   r$   r%   rl     s   
zInsertionMorphAction.decompilec                 C   s8   |dks|dkr
g S | |j|d  }|||S )Nr   r   rO   )r   r   getGlyphNameManyZreadUShortArray)r#   rk   r1   r   r   rj   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 )Nr]   r<   r   glyphr   )rm   rB   r@   r]   rE   r   r   rq   )r#   rC   r1   rr   rs   gr$   r$   r%   rt     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   ru   r$   rv   ry   r$   r$   r%   r8     r9   z0InsertionMorphAction.fromXML.<locals>.<listcomp>r]   r=   r:   r;   r   r   r   )	r&   r   r]   r{   rH   r|   r   r   r   r}   r$   r$   r%   r     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   rO   r   z>H)r   r-   r   r   r   rx   r   r   r   r   r   
getGlyphIDr   r   )r1   r2   r   re   r   r   r   r   r   startZ
startIndexlimitglyphsr   glyphIDr$   r$   r%   r3     s.   


z#InsertionMorphAction.compileActionsN)r(   r)   r*   r   r   r?   r&   rf   rl   r   rt   r   rI   r3   r$   r$   r$   r%   r   {  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)featureParamTypesro   	__class__r(   r   rf   )r#   rd   r1   r$   r$   r%   rf     s   zFeatureParams.compileNc                 C   s   t j| |||| jjd d S )N)rs   )r   rt   r   r(   r   r$   r$   r%   rt     s   zFeatureParams.toXMLr0   )r(   r)   r*   rf   rt   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   
GlyphArrayrO   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#   rawTabler1   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   rP   r   c                 S   r   r!   )StartIDr   r$   r$   r%   r   _  r   z#Coverage.preWrite.<locals>.<lambda>r   rO   r   )getattrr   getGlyphIDManyr   r   r   r   r   r   ZgetGlyphNamer   r   r   r   r   sortr   )r#   r1   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   r@   rB   )r#   rC   r1   	glyphNamer$   r$   r%   toXML2i  s   
zCoverage.toXML2c                 C   s0   t | dd }|d u rg }|| _||d  d S )Nr   r=   )r   r   r   )r#   rs   rr   r~   r1   r   r$   r$   r%   r   n  s
   zCoverage.fromXMLr!   r(   r)   r*   r   r   r  r  r   r$   r$   r$   r%   r     s    
,r   l    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   r1   r$   r$   r%   r     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         rO   i rP   rK   )max)r	  ZoredidxinnerZ	innerBitsZ	entrySizer$   r$   r%   getEntryFormat  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   r4   copyr  )r#   r1   r	  r   r$   r$   r%   r    s   

zDeltaSetIndexMap.preWritec                 C   st   | d |  tt| dg D ]&\}}d|fg}|tkr-|d|d? fd|d@ fg |d| |  qd S )	Nz7Omitted values default to 0xFFFF/0xFFFF (no variations)r	  r   outerr  r  r   Map)rp   rB   r   r   NO_VARIATION_INDEXr   r@   )r#   rC   r1   r   r=   rr   r$   r$   r%   r    s   




zDeltaSetIndexMap.toXML2c           	      C   sn   t | dd }|d u rg  | _}t|d }t|dd}t|dd}|dks+J |||d> |B  d S )Nr	  r   r  Z0xFFFFr  r   r  )r   r	  r   ro   insert)	r#   rs   rr   r~   r1   r	  r   r  r  r$   r$   r%   r     s   
zDeltaSetIndexMap.fromXMLr!   )
r(   r)   r*   r   r   rI   r  r  r  r   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   r1   
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$   r6   r   r  r$   r%   r8     r   z&VarIdxMap.preWrite.<locals>.<listcomp>r   r   r  r  )r   r	  r  r   r  r  )r#   r1   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   r@   rB   )r#   rC   r1   r   r=   rr   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#   rs   rr   r~   r1   r	  r   r  r  r$   r$   r%   r     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)ro   r   Zaxesr#  r4   r   )r#   r1   Z	fvarTabler$   r$   r%   r    s   
zVarRegionList.preWriteNr(   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$   )r6   r   r   r$   r%   r8         z(SingleSubst.postRead.<locals>.<listcomp>rO   Z
GlyphCountz invalid SingleSubstFormat2 table
Substituter   unknown format: %s)_getGlyphsFromCoverageTabler   r   r   r  r   r	  )r#   r   r1   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$   )r6   r   br   r$   r%   r8   +  s     z(SingleSubst.preWrite.<locals>.<listcomp>rO   r'  r   c                 S   s   g | ]}|d  d qS )r   r   r$   r6   itemr$   r$   r%   r8   A  r)  c                 S   s   g | ]}|d  d  qS r   r$   r4  r$   r$   r%   r8   B  r)  r   r&  r*  )
r   r	  listr   r   r   r  r   r   r   )r#   r1   r	  r   ZgidItemsZsortableItemsr   r   ZinIDZoutIDr   covr-  r0  r$   r3  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   r@   rB   )r#   rC   r1   r   inGlyphZoutGlyphr$   r$   r%   r  L  
   
zSingleSubst.toXML2c                 C   s2   t | dd }|d u ri }|| _|d ||d < d S )Nr	  r/  r;  )r   r	  )r#   rs   rr   r~   r1   r	  r$   r$   r%   r   R  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   [  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      g | ]}|j qS r$   )r*  )r6   sr$   r$   r%   r8   c      z*MultipleSubst.postRead.<locals>.<listcomp>Sequencer   r+  )r   r,  r  r  r	  )r#   r   r1   r	  r   r0  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_)r6   r   r	  r#   r$   r%   r8   s  r9   z*MultipleSubst.preWrite.<locals>.<listcomp>)r   rB  )	r   r	  r   r   r7  keysr   r   r   )r#   r1   r8  r   r$   rD  r%   r  j  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   rA   r@   rB   )r#   rC   r1   r   r<  	outGlyphsr/  r$   r$   r%   r  w  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=   rB  r   r*  r/  r;   c                 S   r   r$   r   r   r$   r$   r%   r8     r   z)MultipleSubst.fromXML.<locals>.<listcomp>r;  )
r   r	  Zold_coverage_rw   rx   r   intro   r   r{   )r#   rs   rr   r~   r1   r	  elementZelement_nameZelement_attrs_r   r   Zglyph_mappingrF  r$   r$   r%   r   ~  s8   




zMultipleSubst.fromXMLc                 C   s   t  }| |_|S r!   )rB  r*  )r   seqr$   r$   r%   rC    s   zMultipleSubst.makeSequence_r!   )
r(   r)   r*   r   r   r  r  r   rI   rC  r$   r$   r$   r%   r>  Z  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   rL  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ClassValueArrayrO   ClassRangeRecordzUnknown ClassDef format: %s)r   r   r   r   r   r  Classr   r   r   r   rL  )r#   r   r1   rL  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 )NrL  r   r   r   )r   rL  r   r   r   r   r   )r#   r1   rL  r   r   r  rQ  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 )NrO   rO  r   r   r   rP   )rM  rN  )rT  r   r   rO  r   r   rP  r   )r#   r1   r   r   r   Z
startGlyphZendGlyphZ
glyphCountr   rQ  r   Z	startNamer   ZendNamerS  ZstartGlyphNameclassesr   r$   r$   r%   r    s6   





zClassDef.preWritec                 C   r9  )NrK  r   class)r   rL  r   r@   rB   )r#   rC   r1   r   r  rQ  r$   r$   r%   r    r=  zClassDef.toXML2c                 C   s6   t | dd }|d u ri }|| _t|d ||d < d S )NrL  rV  r   )r   rL  rG  )r#   rs   rr   r~   r1   rL  r$   r$   r%   r     s
   zClassDef.fromXMLr!   )	r(   r)   r*   r   r   rT  r  r  r   r$   r$   r$   r%   rK    s    
rK  c                   @   r   )AlternateSubstNc                 C   r  )N
alternates)r   rX  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  	AlternaterX  )r#   r   r1   rX  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   rX  c                 S      g | ]}|d  qS r6  r$   r4  r$   r$   r%   r8   ,  r   z+AlternateSubst.preWrite.<locals>.<listcomp>c                 S   r]  r   r$   r4  r$   r$   r%   r8   .  r   )r   rY  )r   r   rX  r7  r   r   r   r   r   r   r   rY  rZ  r   sortCoverageLast)
r#   r1   rX  r   r   r  r   r8  setListr[  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 )NrY  r   rZ  )r   rX  r   rm   rB   r@   rq   )r#   rC   r1   r   r  rX  r\  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 )NrX  r   )r   rX  rw   rx   r   )	r#   rs   rr   r~   r1   rX  r  r   rH  r$   r$   r%   r   F  s   

zAlternateSubst.fromXMLr!   r  r$   r$   r$   r%   rW    s    
rW  c                   @   r   )LigatureSubstNc                 C   r  )N	ligatures)r   rb  r   r$   r$   r%   r   V  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   Ligaturerb  )r#   r   r1   rb  r-  ligSetsr   r$   r$   r%   r   Z  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   rb  c                 S   s   t | d  | d fS Nr   r   r5  r$   r$   r%   r   t  s    z(LigatureSubst.preWrite.<locals>.<lambda>r   r   c                 S   r]  r6  r$   r4  r$   r$   r%   r8     r   z*LigatureSubst.preWrite.<locals>.<listcomp>c                 S   r]  r^  r$   r4  r$   r$   r%   r8     r   )r   rc  )r   r   rb  rw   nextiterrx   r  r   r   rd  	Componentr   	CompCountLigGlyphr   r   r7  r   r   r   r   r   rc  r_  )r#   r1   rb  ZnewLigaturescompsligZligaturer   r   r  r   r8  re  r`  ZligSetligsr$   r$   r%   r  g  s@   



zLigatureSubst.preWritec                 C   st   t | j }|D ].\}}|jd|d |  |D ]}|jd|jd|jd |  q|	d |  q	d S )Nrc  r   rd  r;   )r   
components)
r   rb  r   rm   rB   r@   rl  rA   rj  rq   )r#   rC   r1   r   r  re  rn  r$   r$   r%   r    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 )Nrb  r   rp  r;   )r   rb  rw   rx   rd  rl  r{   rj  r   rk  r   )r#   rs   rr   r~   r1   rb  r  ro  rH  rn  rp  r$   r$   r%   r     s$   


zLigatureSubst.fromXMLr!   r  r$   r$   r$   r%   ra  U  s    
,ra  c                   @   s0   e Zd Zdd Zdd Zddddef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   getConvertersrs   advancer   readAssertionErrorr   rl   )r#   rj   r1   Z	subReaderconvr$   r$   r%   rl     s   
zCOLR.decompilec                 C   s    d | _ i | jdt| jdiS )Nrs  )rs  r4   r   r#   r1   r$   r$   r%   r    s   zCOLR.preWriter   glyphSetr   quantizationc           	      C   s   | j dkrd S i }| jjD ]1}z
|j| ||}W n ty4 } zddlm} |d|j|d }~ww |d ur>|||j< qt	| doH| j
d u}|sT|rRd | _
d S d S |s^t
 | _
d| j
_|| j
_d S )Nr   )
TTLibErrorz#Failed to compute COLR ClipBox for ClipListr   )VersionBaseGlyphListBaseGlyphPaintRecordPaintcomputeClipBox	ExceptionZfontTools.ttLibr|  	BaseGlyphr   r}  r   clips)	r#   rz  r{  r  rS  clipBoxer|  ZhasClipListr$   r$   r%   computeClipBoxes  s6   



zCOLR.computeClipBoxesNr6  )r(   r)   r*   rl   r  rG  r  r$   r$   r$   r%   rq    s    
rq  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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 )NZDebgz: z in z (/)r   )r   datasuperr  r  rt  repeatr   rs   r   strr   locationfeaturerp   rB   ZxmlWriteZauxevalvars)r#   rC   r1   Z	debugDatarx  r=   lookupIndexr5  infotagscriptlanguager  r   r$   r%   r    s>   
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   r  rS  r1   r$   r%   r         z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>r   )r   ZBaseGlyphRecordr4   r  ry  r$   r  r%   r       
zBaseGlyphRecordArray.preWriteNr$  r$   r$   r$   r%   r    r+   r  c                   @   r   )r  c                    r  )Nc                    r  r!   r  r  r  r$   r%   r   &  r  z(BaseGlyphList.preWrite.<locals>.<lambda>r   )r   r  r4   r  ry  r$   r  r%   r  $  r  zBaseGlyphList.preWriteNr$  r$   r$   r$   r%   r  #  r+   r  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )ClipBoxFormatr   rO   c                 C   s
   | | j u S r!   Variabler"   r$   r$   r%   is_variable/  r.   zClipBoxFormat.is_variablec                 C   r   r!   r  r"   r$   r$   r%   as_variable2  s   zClipBoxFormat.as_variableN)r(   r)   r*   Staticr  r  r  r$   r$   r$   r%   r  +  s
    r  c                   @   s    e Zd ZeZdd Zdd ZdS )ClipBoxc                    s   t  fdd  D S )Nc                 3   s    | ]	}t  |jV  qd S r!   )r   rs   )r6   rx  r"   r$   r%   	<genexpr>:  s    z#ClipBox.as_tuple.<locals>.<genexpr>)rx   rt  r"   r$   r"   r%   as_tuple9  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  
formatEnumr  r  r$   r$   r$   r%   r  6  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 )r}  Nc                 C   r  )Nr  )r   r  r   r$   r$   r%   r   A  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   r1   r  r  r   rS  ZredefinedGlyphsZmissingGlyphsr   r   r$   r$   r%   r   E  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)r6   r   r   ZuniqueClipsr$   r%   
<dictcomp>x  s    z#ClipList.groups.<locals>.<dictcomp>)r   r7  r  r   r  r   )r#   ZglyphsByClipr  r  r   r$   r  r%   groupsp  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$   )r6   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#   r1   ZclipBoxRangesr   r  r  r   r   r   r   r   ZclipRecordsrecordr   r$   r  r%   r  |  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 rf  )r  rg  r$   r$   r%   r     r  z ClipList.toXML.<locals>.<lambda>r   Clipr  r<   r  )r   r(   r   r   r   rm   rB   r   r  r   r@   r  rq   )	r#   rC   r1   rr   rs   	tableNamer   r  r  r$   r$   r%   rt     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  rw   rx   r   r  r   r   r   )
r#   rs   rr   r~   r1   r  r   r  elemr  r$   r$   r%   r     s4   





zClipList.fromXMLr!   r0   )	r(   r)   r*   r   r   r  r  rt   r   r$   r$   r$   r%   r}  @  s    
+
$r}  c                   @   s   e Zd ZdZdZdZdS )
ExtendModer   r   rO   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   rO   rP   rK   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r                                   N)r(   r)   r*   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!d" Z#d#d$ Z$d%S )&PaintFormatr   rO   rP   rK   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r  r  r  r  r  r  r  r  r  r  r  r           r       c                 C   s   | j dS )NPaintVar)rs   
startswithr"   r$   r$   r%   r    s   zPaintFormat.is_variablec                 C   s>   |   r| S ztjd| jdd    W S  ty   Y d S w )Nr  rQ   )r  r  __members__rs   KeyErrorr"   r$   r$   r%   r  !  s   zPaintFormat.as_variableN)%r(   r)   r*   PaintColrLayersZ
PaintSolidZPaintVarSolidZPaintLinearGradientZPaintVarLinearGradientZPaintRadialGradientZPaintVarRadialGradientZPaintSweepGradientZPaintVarSweepGradient
PaintGlyphPaintColrGlyphPaintTransformZPaintVarTransformPaintTranslateZPaintVarTranslate
PaintScaleZPaintVarScalePaintScaleAroundCenterZPaintVarScaleAroundCenterPaintScaleUniformZPaintVarScaleUniformPaintScaleUniformAroundCenterZ PaintVarScaleUniformAroundCenterPaintRotateZPaintVarRotatePaintRotateAroundCenterZPaintVarRotateAroundCenter	PaintSkewZPaintVarSkewPaintSkewAroundCenterZPaintVarSkewAroundCenterZPaintCompositer  r  r$   r$   r$   r%   r    sF    r  c                
   @   s   e Zd ZeZdd ZdddZdedee	j
 fdd	Zded  fd
dZdefddZdefddZ	ddedddedee fddZdS )r  c                 C   s0   z|  | jjW S  ty   td| j w )NzUnknown Paint format: )r  r   rs   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   rm   rp   r  rB   r  rq   )r#   rC   r1   rr   rs   r  r$   r$   r%   rt   3  s   
zPaint.toXMLcolrreturnc                 c   s    | j tjkr)g }|jd ur|jj}dd t|| j| j| j  D E d H  d S | j tjkrP|j	j
D ]}|j| jkrGtjd|jdV   d S q3t| jd|  D ]}|jd urrt|jt| rrt| |j}tj|j|dV  qTd S )Nc                 s   s$    | ]\}}t jd ||dV  qdS )ZLayers)rs   r=   r   N)r   SubTableEntry)r6   r   vr$   r$   r%   r  E  s
    
z+Paint.iterPaintSubTables.<locals>.<genexpr>r  )rs   r=   z not in colr.BaseGlyphList)r   r  r  Z	LayerListr  r   ZFirstLayerIndexZ	NumLayersr  r  r  r  r  r   r  r  rt  Z
tableClass
issubclassr  r   rs   )r#   r  Zlayersr  rx  r=   r$   r$   r%   iterPaintSubTables?  s0   
zPaint.iterPaintSubTablesc                 C   s   dd |  |D S )Nc                 S   r?  r$   r<   )r6   pr$   r$   r%   r8   \  rA  z%Paint.getChildren.<locals>.<listcomp>r  )r#   r  r$   r$   r%   getChildrenZ  s   zPaint.getChildrenc                    s@   t |stdt|  fdddD ]}|d j}|| qdS )zEDepth-first traversal of graph rooted at self, callback on each node.zcallback must be callablec                    
   |   S r!   r  paintr  r$   r%   r   d     
 z Paint.traverse.<locals>.<lambda>Ziter_subtables_fnr   N)callable	TypeErrorr   r=   )r#   r  callbackpathr  r$   r  r%   traverse^  s   


zPaint.traversec                 C   s  | j tjkr| j}t|j|j|j|j|j|j	S | j tj
kr&t| j| j	S | j tjkr4t| j| jS | j tjkrPt| j| j| j| j| j | j S | j tjkr\t| jS | j tjkrvt| j| j| j| j | j S | j tjkrtt| jS | j tjkrt| j| jt| j| j | j S | j tjkrtt| j t| jS | j tjkrt| j| jt| j t| j| j | j S t| j   rt!d| j  tS )NzVariable Paints not supported: )"r   r  r  r
   xxZyxZxyyyZdxZdyr  r   	translater  scaleZscaleXZscaleYr  ZcenterXZcenterYr  r  r  rotater   Zangler  r  ZskewZ
xSkewAngleZ
ySkewAngler  r  r  )r#   rz   r$   r$   r%   getTransformi  sH   zPaint.getTransformr   rz  r   r{  c           	         s   t |}t|  fdddD ]$}|d j}|jtjkr2ttjdd |D t	}||j
 t|| q|jd u r:d S t }ttj|_t|j|\|_|_|_|_|S )Nc                    r  r!   r  r  r  r$   r%   r     r  z&Paint.computeClipBox.<locals>.<lambda>r  r   c                 s   s    | ]}|j  V  qd S r!   )r=   r	  )r6   r  r$   r$   r%   r    s    z'Paint.computeClipBox.<locals>.<genexpr>)r   r   r=   r   r  r  r   r
   Z	transformr   r  Zdrawr   Zboundsr  rG  r  r  r   ZxMinZyMinZxMaxZyMax)	r#   r  rz  r{  penr  r  Ztransformationcbr$   r  r%   r    s&   


zPaint.computeClipBoxr0   r6  )r(   r)   r*   r  r  r  rt   rq  r   r   r  r  r   r  r  r
   r	  rG  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   rK  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   r  rS   r  rU   )LookupListIndexSubTableIndex	tableTyper  r  r  r  r   
LookupTyper   r   lookupTypesr   ExtSubTable)ttfoverflowRecordokr  ZextTypelookupslookupsiZsubTableZextSubTableClassextSubTabler$   r$   r%   fixLookupOverFlows  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   rO   rB  r   )r   r	  r   r   itemName	itemIndexr   )
oldSubTablenewSubTabler  r  Z
oldMappingoldLennewLenr   r5  r   r$   r$   r%   splitMultipleSubstC     




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!  rO   rY  r   )	r   r_  r   rX  r   r   r"  r#  r   )
r$  r%  r  r  ZoldAltsr&  r'  r   r5  r   r$   r$   r%   splitAlternateSubst]  s    





r*  c           
      C   r   )Nr   r!  rO   rc  r   )r   rb  r   r   r"  r#  r   )
r$  r%  r  r  ZoldLigsr&  r'  r   r5  r   r$   r$   r%   splitLigatureSubstz  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ValueFormat2rO   TClass2Countr   )r.  r  r,  r-  c                 3   s     | ]\}}| kr|V  qd S r!   r$   r6   kr  oldCountr$   r%   r    s    zsplitPairPos.<locals>.<genexpr>c                    s   g | ]}| vr|qS r$   r$   r   	newGlyphsr$   r%   r8     r)  z splitPairPos.<locals>.<listcomp>c                    s   i | ]\}}| k r||qS r$   r$   r/  r1  r$   r%   r    s    z splitPairPos.<locals>.<dictcomp>c                    s   g | ]}| v r|qS r$   r$   r   r3  r$   r%   r8     r)  c                    s"   i | ]\}}| kr||  qS r$   r$   r/  r1  r$   r%   r    s    )r   r   ZPairSetr   r   r   r   r   ZPairSetCountZClass1Recordr   ZClass2Recordr.  	DontSharer  rL  r   r   ZClass1Count)	r$  r%  r  r  r  rs   coveragerR  rL  r$   )r4  r2  r%   splitPairPos  sZ   *




r7  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 )NrO   FT)Z
ClassCountr  r  r   r  Z
MarkRecordrP  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newBaseRecordsrS  ZoldBaseRecordZnewBaseRecordr$   r$   r%   splitMarkBasePos  sR   






r8  )rO   rP   rK   )rO   rK   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 )zj
    An offset has overflowed within a sub-table. We need to divide this subtable into smaller parts.
    r5  Tr  SubTableCountr   z)Don't know how to split %s lookup type %sF)r  r  r  r  r  r  r  r   r5  r  r   r  r  r   r:  
splitTabler  r   errorr  )r  r  r  r  ZsubIndexZsubtableZsubTableTyper  ZnewExtSubTableClassZnewExtSubTableZtoInsertZnewSubTableClassr%  Z	splitFuncr  r$   r$   r%   fixSubTableOverFlows0  sP   




r=  c                  C   sp  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|D ])\}}
|
drrt|dkrr|dd  |v rr|| }||dd   }||_||_qIt D ]\}}|| }|D ]}|||< qqwt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 ]I\}}||}|r(|0 \}}t1|}|| }	t2|	dsi |	_3i |	_4||dd  |\}}||	j3|< ||	j4|< q|| }	|||\|	_3|	_4qd S )Nr   r   )otDataz([A-Za-z0-9]+)Format(\d+)$r9  TZVarrP   )r   rO   rP   rK   rQ   rR   rS   rT   )	r   rO   rP   rK   rQ   rR   rS   rT   rU   rK   )r   r   rO   rK   rQ   )r  r  ZmortZmorxr  ZJSTFsizer  zss%02dd   zcv%02d)buildConverters
converters)5rer>  rf   globalsr   matchgroupr   r  r5  r  r   Z	NoVarTypeZVarType_equivalentsr   r%  r>  rW  ra  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otConvertersrA  r  rG  r   rB  convertersByName)rC  r>  Z	formatPat	namespacers   r  Z	baseClassmZ
formatTyperQ  rI  ZvarTypeZ	noVarTypebaser[  r\  Z
lookupEnumenumr   rA  r   rB  rI  r$   r$   r%   _buildClassesk  s   


&
"

rN  c                 C   s   | d u rg S | j S r!   )r   )r6  r$   r$   r%   r,    s   r,  )`__doc__r  rM  r   	functoolsr   mathr   	itertoolscollectionsr   r   Z!fontTools.ttLib.tables.otTraverser   ZfontTools.misc.arrayToolsr   ZfontTools.misc.roundToolsr	   ZfontTools.misc.transformr
   r   ZfontTools.misc.textToolsr   r   r   ZfontTools.pens.boundsPenr   ZfontTools.pens.transformPenr   ZotBaser   r   r   r   r   Z fontTools.feaLib.lookupDebugInfor   r   loggingr   typingr   r   r   r   r   ZfontTools.ttLib.ttGlyphSetr   	getLoggerr(   r   objectr    r,   r/   rJ   r   r   r   r   r   r   r   r   r   r  r  r  r"  r%  r>  rK  rW  ra  rq  r  r  r  r  r  r}  r  r  r  r  rG  r  r(  r*  r+  r7  r8  r;  r=  rN  r,  r$   r$   r$   r%   <module>   s   
UA  \I4PKjF_9.
 . 		U;G?;o