U
    »mœdé  ã                   @   sD  d Z ddlZddl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 ddlmZ ddlmZ dd	lmZ dd
lmZ ddl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% ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z, e -d¡Z.ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: G dd„ de;ƒZ<G dd„ de<ƒZ=e= >ej?d¡dd„ ƒZ@dd„ ZAdedd „ZBe= >ejC¡d!d„ ƒZ@e= >ejD¡d"d„ ƒZ@d#d$„ ZEd%d&„ ZFe= >ejG¡d'd„ ƒZ@e= >ejH¡d(d„ ƒZ@d)d*„ ZIdfd+d,„ZJdgd-d.„ZKdhd0d1„ZLd2d3„ ZMe= >ejN¡d4d„ ƒZ@did7d8„ZOe= >ejP¡d9d„ ƒZ@e= >ejQ¡d:d„ ƒZ@d;d<„ ZRd=d>„ ZSd?d@„ ZTdAdB„ ZUdCdD„ ZVe= >ejW¡dEd„ ƒZ@G dFdG„ dGe=ƒZXeX >ejY¡dHd„ ƒZ@eX >ejD¡dId„ ƒZ@eX >ejC¡dJd„ ƒZ@G dKdL„ dLe=ƒZZeZ >ejY¡dMd„ ƒZ@eZ >ejD¡dNd„ ƒZ@eZ >ejC¡dOd„ ƒZ@G dPdQ„ dQe=ƒZ[dRdS„ Z\e[ >ej]¡dTd„ ƒZ@e[ >ejY¡dUd„ ƒZ@e[ >ejD¡dVd„ ƒZ@e[ >ejC¡dWd„ ƒZ@G dXdY„ dYe[ƒZ^e^ >ej_¡dZd„ ƒZ@e^ >ej`¡d[d„ ƒZ@d\d]„ Zad^d_„ Zbe^ >ejcejdf¡d`d„ ƒZ@e^ >ejeejff¡dad„ ƒZ@e^ >ejg¡dbd„ ƒZ@e^ >ejhdc¡ddd„ ƒZ@dS )jz4
Merge OpenType Layout tables (GDEF / GPOS / GSUB).
é    N)Úior)ÚMAX_PAINT_COLR_LAYER_COUNTÚLayerReuseCache)ÚclassifyTools)ÚotRound)Úbuild_n_ary_tree)ÚotTables)ÚotBase)ÚBaseFixedValue)Údfs_base_table)ÚDefaultTable)ÚbuilderÚmodelsÚvarStore)ÚnonNoneÚallNoneÚallEqualÚ
allEqualToÚsubList)ÚVarStoreInstancer)Úreduce)ÚbuildSinglePos)Ú_compression_level_from_envÚcompact_pair_poszfontTools.varLib.mergeré   )ÚShouldBeConstantÚ
FoundANoneÚMismatchedTypesÚNotANoneÚLengthsDifferÚ
KeysDifferÚInconsistentGlyphOrderÚInconsistentExtensionsÚInconsistentFormatsÚUnsupportedFormatÚVarLibMergeErrorc                   @   sV   e Zd Zddd„Zeddd„ƒZei fdd„ƒZdd
d„Zdd„ Zdd„ Z	dd„ Z
dS )ÚMergerNc                 C   s   || _ d | _d S ©N)ÚfontÚttfs)Úselfr(   © r+   úP/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/fontTools/varLib/merger.pyÚ__init__.   s    zMerger.__init__r'   c                    s^   ˆt kstdƒ‚dˆjkr i ˆ_tˆƒttjfkr8ˆf‰tˆ ƒtkrJˆ f‰ ‡ ‡‡fdd„}|S )NzSubclass Merger instead.Úmergersc                    sn   | j dkst‚g }ˆD ]R}||kr$q| |¡ ˆj |i ¡}ˆ D ]&}||ks^td|j |f ƒ‚| ||< q@qd S )NÚmergez=Oops, class '%s' has merge function for '%s' defined already.)Ú__name__ÚAssertionErrorÚappendr.   Ú
setdefault)ÚmethodÚdoneZclazzr.   Úattr©ÚattrsÚcelfÚclazzesr+   r,   Úwrapper=   s    

ÿÿzMerger.merger.<locals>.wrapper)r&   r1   Ú__dict__r.   ÚtypeÚenumÚEnumMetaÚstr)r9   r:   r8   r;   r+   r7   r,   Úmerger3   s    
zMerger.mergerc                 C   sP   t |ƒ}|  ¡ D ]:} t| dd ƒ}|d kr, qL| j |d ¡}|d k	r|  S q|S )Nr.   )r=   ÚmroÚgetattrr.   Úget)r9   ÚthingÚ_defaultÚtypr.   Úmr+   r+   r,   Ú
mergersForO   s    
zMerger.mergersForr+   c              
      s  t |dƒr|jdd� |D ]}t |dƒr|jdd� qtt|ƒ ¡ ƒ‰t‡fdd„|D ƒƒstt| ˆdd„ |D ƒd�‚|  |¡}| d	| j	j
¡}zLˆD ]B‰ ˆ |kr¢q”t|ˆ ƒ}‡ fd
d„|D ƒ}| ˆ |¡}	|	| ||ƒ q”W n6 tk
�r }
 z|
j dˆ  ¡ ‚ W 5 d }
~
X Y nX d S )NÚensureDecompiledF)Úrecursec                 3   s"   | ]}ˆ t t|ƒ ¡ ƒkV  qd S r'   ©ÚsortedÚvarsÚkeys©Ú.0Úv©rO   r+   r,   Ú	<genexpr>e   s     z&Merger.mergeObjects.<locals>.<genexpr>c                 S   s   g | ]}t t|ƒ ¡ ƒ‘qS r+   rL   rP   r+   r+   r,   Ú
<listcomp>g   s     z'Merger.mergeObjects.<locals>.<listcomp>©ÚexpectedÚgotÚ*c                    s   g | ]}t |ˆ ƒ‘qS r+   ©rC   ©rQ   Útable©Úkeyr+   r,   rU   p   s     Ú.)ÚhasattrrJ   rM   rN   rO   Úallr    rI   rD   Ú	__class__ÚmergeThingsrC   r%   Ústackr2   )r*   ÚoutÚlstÚexcludeÚitemr.   ZdefaultMergerÚvalueÚvaluesÚ
mergerFuncÚer+   )r^   rO   r,   ÚmergeObjects^   s2    

  ÿ

zMerger.mergeObjectsc                 C   s’   t ||tƒs(t| t|ƒdd„ |D ƒd�‚tt|t|Ž ƒƒD ]R\}\}}z|  ||¡ W q: tk
rŠ } z|j d| ¡ ‚ W 5 d }~X Y q:X q:d S )Nc                 S   s   g | ]}t |ƒ‘qS r+   ©Úlen©rQ   Úxr+   r+   r,   rU   y   s     z%Merger.mergeLists.<locals>.<listcomp>rV   z[%d])	r   ro   r   Ú	enumerateÚziprc   r%   rd   r2   )r*   re   rf   Úiri   rj   rl   r+   r+   r,   Ú
mergeListsw   s    zMerger.mergeListsc                 C   sÄ   t ||tƒs*t| t|ƒjdd„ |D ƒd�‚|  |¡ d d ¡}|d k	rR|| ||ƒ nnt|tjƒrxt ||ƒsÀt	| ||d�‚nHt
|dƒr�|  ||¡ n0t|tƒr¨|  ||¡ nt ||ƒsÀt	| ||d�‚d S )Nc                 S   s   g | ]}t |ƒj‘qS r+   )r=   r0   rp   r+   r+   r,   rU   „   s     z&Merger.mergeThings.<locals>.<listcomp>rV   r<   )r   r=   r   r0   rI   rD   Ú
isinstancer>   ÚEnumr   r`   rm   Úlistru   )r*   re   rf   rk   r+   r+   r,   rc   �   s$      ÿ



zMerger.mergeThingsc                    sr   |D ]h‰ ˆ |krqz(|| _ |  |ˆ  ‡ fdd„|D ƒ¡ W q tk
rj } z|j ˆ ¡ ‚ W 5 d }~X Y qX qd S )Nc                    s   g | ]}|  ˆ ¡‘qS r+   ©rD   ©rQ   rH   ©Útagr+   r,   rU   œ   s     z&Merger.mergeTables.<locals>.<listcomp>)r)   rc   r%   rd   r2   )r*   r(   Úmaster_ttfsÚ	tableTagsrl   r+   r{   r,   ÚmergeTables–   s    "zMerger.mergeTables)N)r'   )r+   )r0   Ú
__module__Ú__qualname__r-   ÚclassmethodrA   rI   rm   ru   rc   r   r+   r+   r+   r,   r&   -   s   


r&   c                   @   s   e Zd ZdS )ÚAligningMergerN)r0   r€   r�   r+   r+   r+   r,   rƒ   ¥   s   rƒ   ZGlyphClassDefc                    s¶   |d kr"t |ƒst| d |d�‚d S dd„ |D ƒ}i |_|j}tƒ }|jdd„ |D ƒŽ  |D ]V‰ t‡ fdd„|D ƒƒ}t|ƒs–t| |d |dˆ  gd	�‚|s¤d |ˆ < qZ|d |ˆ < qZd S )
NrV   c                 S   s   g | ]
}|j ‘qS r+   )Ú	classDefs©rQ   Úlr+   r+   r,   rU   °   s     úmerge.<locals>.<listcomp>c                 S   s   g | ]}|  ¡ ‘qS r+   rS   r…   r+   r+   r,   rU   ¶   s     c                 3   s   | ]}|  ˆ ¡V  qd S r'   ry   r…   ©Úkr+   r,   rT   ¸   s     úmerge.<locals>.<genexpr>r   r_   )rW   rX   rd   )r   r   r„   ÚsetÚupdater   r   r   )rA   r*   rf   ZallKeysZ	allValuesr+   rˆ   r,   r/   ©   s*       ÿ
r/   c                    sT   ˆ j dkrˆ S t ¡ }d|_ ˆ j|_ˆ j|_‡ fdd„|jjD ƒ|_t|jƒ|_|S )Né   c                    s   g | ]
}ˆ j ‘qS r+   ©ÚValue©rQ   Ú_©r*   r+   r,   rU   Ë   s     z._SinglePosUpgradeToFormat2.<locals>.<listcomp>)	ÚFormatÚotÚ	SinglePosÚCoverageÚValueFormatÚglyphsr�   ro   Ú
ValueCount)r*   Úretr+   r’   r,   Ú_SinglePosUpgradeToFormat2Ã   s    
r›   c                    sÂ   |dkrdd„ |D ƒ}ndd„ t ||ƒD ƒ}tƒ }|j|Ž  |  ¡ j‰t|ˆd�‰t‡fdd„|D ƒƒsntƒ ‚~d}|dkr’‡ ‡fdd„|D ƒ}n(t|ƒt|ƒks¦t	‚‡ ‡fd	d„|D ƒ}ˆ|fS )
aT  Takes font and list of glyph lists (must be sorted by glyph id), and returns
    two things:
    - Combined glyph list,
    - If values_lst is None, return input glyph lists, but padded with None when a glyph
      was missing in a list.  Otherwise, return values_lst list-of-list, padded with None
      to match combined glyph lists.
    Nc                 S   s   g | ]}t |ƒ‘qS r+   )r‹   r…   r+   r+   r,   rU   Ú   s     z&_merge_GlyphOrders.<locals>.<listcomp>c                 S   s$   g | ]\}}d d„ t ||ƒD ƒ‘qS )c                 S   s   i | ]\}}||“qS r+   r+   )rQ   ÚgrR   r+   r+   r,   Ú
<dictcomp>Ü   s      z1_merge_GlyphOrders.<locals>.<listcomp>.<dictcomp>)rs   )rQ   r†   Úvsr+   r+   r,   rU   Ü   s     r]   c                 3   s   | ]}t |ˆ d �|kV  qdS )r]   N)rM   ©rQ   rž   )ÚsortKeyr+   r,   rT   ã   s     z%_merge_GlyphOrders.<locals>.<genexpr>c                    s    g | ]‰ ‡‡ fd d„ˆD ƒ‘qS )c                    s   g | ]}|ˆkr|nˆ ‘qS r+   r+   ©rQ   Úglyph©ÚdefaultÚdict_setr+   r,   rU   ê   s     ú1_merge_GlyphOrders.<locals>.<listcomp>.<listcomp>r+   ©rQ   ©r¤   Úorder©r¥   r,   rU   é   s   ÿc                    s    g | ]‰ ‡‡ fd d„ˆD ƒ‘qS )c                    s    g | ]}|ˆkrˆ| nˆ ‘qS r+   r+   r¡   r£   r+   r,   rU   ð   s     r¦   r+   r§   r¨   rª   r,   rU   ï   s   ÿ)
rs   r‹   rŒ   ÚgetReverseGlyphMapÚ__getitem__rM   ra   r!   ro   r1   )r(   rf   Z
values_lstr¤   Z	dict_setsÚcombinedZpaddedValuesÚpaddedr+   )r¤   r©   r    r,   Ú_merge_GlyphOrdersÑ   s(    

þþr¯   c                 C   s    |d j  ¡ |_ |  ||¡ d S ©Nr   ©r<   Úcopyrm   ©rA   r*   rf   r+   r+   r,   r/   ö   s    c                 C   s    |d j  ¡ |_ |  ||¡ d S r°   r±   r³   r+   r+   r,   r/   þ   s    c                 C   s~   |D ]t}|d kst |ƒtjks|jd ks||jjkr6q|jdkrJ|j  S |jdkrl|j|jj |¡   S t| dd�‚qd S )Nr   r�   úsingle positioning lookup©Úsubtable)	r=   r”   r•   r–   r˜   r“   r�   Úindexr$   )rA   Ú	subtablesr¢   r*   r+   r+   r,   Ú%_Lookup_SinglePos_get_effective_value  s     ÿþý
ü


r¹   c           
      C   sÎ   |D ]Ä}|d kst |ƒtjks|jd ks||jjkr6q|jdkr~|j|jj |¡ }|j}|D ]}|j	|kr^|    S q^qq|jdkr¼|j
j |d¡}|jj |d¡}	|j| j|	   S t| dd�‚qd S )Nr   r�   r   úpair positioning lookuprµ   )r=   r”   ÚPairPosr–   r˜   r“   ÚPairSetr·   ÚPairValueRecordÚSecondGlyphÚ	ClassDef1r„   rD   Ú	ClassDef2ÚClass1RecordÚClass2Recordr$   )
rA   r¸   Z
firstGlyphZsecondGlyphr*   ÚpsÚpvrÚrecZklass1Zklass2r+   r+   r,   Ú(_Lookup_PairPos_get_effective_value_pair  s.    ÿþý
ü


rÆ   c           
         sº  t tjdd„ |D ƒdƒ |_‰t|ƒdksBˆd@ dksBt| dd�‚|jj‰ tdd	„ |D ƒƒr²t‡ fd
d	„|D ƒƒr²t	 
ˆ|j¡|_ˆdkr¢|  |jdd„ |D ƒ¡ |j ¡ |_d S d|_dd„ |D ƒ}t| jdd„ |D ƒdd„ |D ƒƒ\}}||j_‡fdd„|D ƒ|_t|jƒ|_t|ƒD ]^\}}t|ƒD ]J\}}|| d k	�rF�q,t| | j| |ƒ}	|	d k�rlt	 
ˆ¡}	|	||< �q,�q|  |j|¡ | j||dd� t tjdd„ |jD ƒdƒ|_d S )Nc                 S   s   g | ]
}|j ‘qS r+   ©r—   r…   r+   r+   r,   rU   5  s     r‡   r   r   iðÿÿÿr´   rµ   c                 s   s   | ]}|j d kV  qdS )r   N©r“   rP   r+   r+   r,   rT   ;  s     rŠ   c                 3   s   | ]}ˆ |j jkV  qd S r'   ©r–   r˜   rP   )ÚcoverageGlyphsr+   r,   rT   ;  s    c                 S   s$   g | ]}|j d k	r|j nt ¡ ‘qS r'   )r�   r	   ÚValueRecordrP   r+   r+   r,   rU   E  s     r�   c                 S   s   g | ]}t |ƒ‘qS r+   )r›   rP   r+   r+   r,   rU   L  s     c                 S   s   g | ]}|j j‘qS r+   rÉ   rP   r+   r+   r,   rU   P  s     c                 S   s   g | ]
}|j ‘qS r+   rŽ   rP   r+   r+   r,   rU   P  s     c                    s   g | ]}t  ˆ ¡‘qS r+   )r	   rË   r�   )ÚvalueFormatr+   r,   rU   T  s     )r“   r–   r�   r™   r—   ©rg   c                 S   s   g | ]}|  ¡ ‘qS r+   )ZgetEffectiveFormatrP   r+   r+   r,   rU   m  s     )r   ÚintÚ__or__r—   ro   r$   r–   r˜   ra   r	   rË   r�   rc   Ú	getFormatr“   r¯   r(   r™   rr   r¹   Úlookup_subtablesru   rm   )
rA   r*   rf   r˜   r®   rt   rj   Újr¢   rR   r+   )rÊ   rÌ   r,   r/   3  s`    ÿþ  ÿ  ÿ

  ÿ  ÿc                 C   sp  t | jdd„ |D ƒdd„ |D ƒƒ\}}g  |_}|D ]L}t ¡ }||_| jrXt | j¡nd |_| j	rpt | j	¡nd |_
| |¡ q4t|jƒ|_t|ƒD ]Â\}}	t|ƒD ]°\}
}t ¡ }||_|	|
 d k	rÒ|	|
 }nt| | j| |j|ƒ}|d krúd\}}nt|dd ƒ}t|dd ƒ}| j�r*tj| j|d�nd |_| j	�rHtj| j	|d�nd |_
||	|
< q¦q–|`|  |j|¡ d S )Nc                 S   s   g | ]}d d„ |j D ƒ‘qS )c                 S   s   g | ]
}|j ‘qS r+   ©r¾   rP   r+   r+   r,   rU   v  s     z$merge.<locals>.<listcomp>.<listcomp>©r½   rŸ   r+   r+   r,   rU   v  s     r‡   c                 S   s   g | ]
}|j ‘qS r+   rÔ   rŸ   r+   r+   r,   rU   w  s     )NNÚValue1ÚValue2)Úsrc)r¯   r(   r½   r”   r¾   ÚvalueFormat1r	   rË   rÕ   ÚvalueFormat2rÖ   r2   ro   ÚPairValueCountrr   rÆ   rÑ   Ú_firstGlyphrC   ru   )rA   r*   rf   r˜   r®   Úpvrsr¢   rÄ   rt   rj   rÒ   rR   ZvpairZv1Zv2r+   r+   r,   r/   q  sT    ý
ÿÿ
   ÿ
ÿýÿýc                 C   sº   t dd„ |D ƒƒstdƒ‚|j| |dd� t ¡ }g |_d|_t|jdd„ |D ƒdd„ |D ƒ|d	�\}}|| j	_
d
d„ |D ƒ| _t| jƒ| _t|| jƒD ]\}}||_q˜| | j|¡ d S )Nc                 S   s   g | ]}|j r|jd k‘qS ©r   ©r¼   ÚValueFormat2r…   r+   r+   r,   rU   ©  s      z)_PairPosFormat1_merge.<locals>.<listcomp>úReport bug against fonttools.)r–   r¼   ÚPairSetCountÚValueFormat1rß   rÍ   r   c                 S   s   g | ]}|j j‘qS r+   rÉ   rP   r+   r+   r,   rU   º  s     c                 S   s   g | ]
}|j ‘qS r+   ©r¼   rP   r+   r+   r,   rU   »  s     ©r¤   c                 S   s   g | ]}t  ¡ ‘qS r+   )r”   r¼   r�   r+   r+   r,   rU   À  s     )r   r1   rm   r”   r¼   r½   rÚ   r¯   r(   r–   r˜   ro   rá   rs   rÛ   ru   )r*   rf   rA   Úemptyr˜   r®   r¢   rÃ   r+   r+   r,   Ú_PairPosFormat1_merge§  s2    ÿþýü
ræ   c           
      C   sÆ   t | tƒr| }n| r | jr | jni }|r4t| ¡ ƒnd}g }t|d ƒD ]}| tƒ ¡ qH| ¡ D ]\}}||  	|¡ qb|d krŒd |d< n6t|ƒ |d< }|dd … D ]}	|	 
|¡ | |	¡ q¨|S )Nr   r   )rv   Údictr„   Úmaxrj   Úranger2   r‹   ÚitemsÚaddÚintersection_updateÚdifference_update)
r*   Ú	allGlyphsr„   rH   rš   r‘   r‰   rR   Zclass0Úsr+   r+   r,   Ú_ClassDef_invertÈ  s     


rð   c                 C   sÀ   t  ¡ }i  |_}|d k}|r,d gt| ƒ }t ¡ }t| |ƒD ]0\}}t||ƒ}|d krd|dd … }| |¡ q>| 	¡ }	|rŠ|	 
dtƒ ¡ t|	ƒD ]$\}
}|
dkr¤q’|D ]}|
||< q¨q’||	fS )Nr   r   )r”   ÚClassDefr„   ro   r   Ú
Classifierrs   rð   rŒ   Z
getClassesÚinsertr‹   rr   )rf   ZallGlyphsesr*   r„   ZallGlyphsesWasNoneÚ
classifierZclassDefrî   ZsetsÚclassesrt   ÚclassSetrœ   r+   r+   r,   Ú_ClassDef_merge_classifyä  s(    

r÷   Fc                 C   s  dd„ |D ƒ}t dd„ |D ƒdd„ |D ƒƒ\| _}t|ƒ| _g }t||ƒD ]î\}}d }	t|jjƒ}
|jj}g }|D ]º}t	t
|ƒƒ}||
k�rd }	|	d k�rt ¡ }	g  }|	_t|jƒD ]P}|rÄd }n8t ¡ }| jrÞt | j¡nd |_| jröt | j¡nd |_| |¡ q¶|	}n| |d¡}|| }| |¡ qr| |¡ qJ|}~t dd„ |D ƒƒ\| _}t|ƒ| _g }t||ƒD ]š\}}|jj}g }|D ]t}|j}t ¡ }g  }|_|D ]F}|�s¼|d }n t	t
|ƒƒ}| |d¡}|| }| t |¡¡ �q¨| |¡ �qˆ| |¡ �qp|}~|S )Nc                 S   s   g | ]
}|j ‘qS r+   )rÁ   r…   r+   r+   r,   rU      s     z2_PairPosFormat2_align_matrices.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r+   )r¿   r…   r+   r+   r,   rU     s     c                 S   s   g | ]}|j j‘qS r+   rÉ   r…   r+   r+   r,   rU     s     r   c                 S   s   g | ]
}|j ‘qS r+   )rÀ   r…   r+   r+   r,   rU   3  s     )r÷   r¿   ro   ÚClass1Countrs   r‹   r–   r˜   r„   ÚnextÚiterr”   rÁ   rÂ   ré   ÚClass2Countrâ   r	   rË   rÕ   rß   rÖ   r2   rD   rÀ   r²   Údeepcopy)r*   rf   r(   ÚtransparentÚmatricesrõ   Znew_matricesr†   ÚmatrixZnullRowZcoverageZ	classDef1Zclass1Recordsrö   ZexemplarGlyphZclass2recordsr‘   Zrec2Zrec1ÚklassZ	classDef2Zrec1oldZoldClass2RecordsZrec1newZclass2Recordsr+   r+   r,   Ú_PairPosFormat2_align_matricesÿ  sz     ÿ




ÿýÿý


r  c                 C   s¬   t dd„ |D ƒƒstdƒ‚|j| |dd� t|jdd„ |D ƒƒ\}}|| j_t||jƒD ]$\}}|jj|krX||d ksXt‚qXt	| ||jƒ}t
|d ƒ| _| | j|¡ d S )	Nc                 S   s   g | ]}|j r|jd k‘qS rÝ   ©rÁ   rß   r…   r+   r+   r,   rU   O  s      z)_PairPosFormat2_merge.<locals>.<listcomp>rà   )r–   r¿   rø   rÀ   rû   rÁ   râ   rß   rÍ   c                 S   s   g | ]}|j j‘qS r+   rÉ   rP   r+   r+   r,   rU   b  s     éÿÿÿÿr   )r   r1   rm   r¯   r(   r–   r˜   rs   rÑ   r  rx   rÁ   ru   )r*   rf   rA   r˜   r‘   r†   r¸   rþ   r+   r+   r,   Ú_PairPosFormat2_mergeM  s$    ÿþý	r  c                 C   sl  t tjdd„ |D ƒdƒ | _|_t tjdd„ |D ƒdƒ | _|_|jdkrXt||| ƒ n$|jdkrpt	||| ƒ nt
| dd�‚| `| `d}d}|jdkrð|jD ]P}|jD ]D}t|d	d ƒ}|d k	rÊ|| ¡ O }t|d
d ƒ}|d k	r¦|| ¡ O }q¦qœnl|jdk�r\|jD ]X}	|	jD ]J}
t|
d	d ƒ}|d k	�r2|| ¡ O }t|
d
d ƒ}|d k	�r|| ¡ O }�q�q||_||_d S )Nc                 S   s   g | ]
}|j ‘qS r+   ©râ   r…   r+   r+   r,   rU   y  s     r‡   r   c                 S   s   g | ]
}|j ‘qS r+   ©rß   r…   r+   r+   r,   rU   |  s     r   r�   rº   rµ   rÕ   rÖ   )r   rÎ   rÏ   rØ   râ   rÙ   rß   r“   ræ   r  r$   r¼   r½   rC   rÐ   rÁ   rÂ   )rA   r*   rf   Zvf1Zvf2ZpairSetZpairValueRecordZpv1Zpv2Zclass1RecordZclass2Recordr+   r+   r,   r/   v  sL      ÿ  ÿ








ÚMarkÚBasec                    sx  t dd„ |D ƒƒ| _t|j‡fdd„|D ƒ‡fdd„|D ƒƒ\}}|t| ˆd ƒ_t|j‡ fdd„|D ƒ‡ fdd„|D ƒƒ\}}|t| ˆ d ƒ_g }	t|t|Ž ƒD ]Œ\}
}d	d„ |D ƒ}t|ƒsÔt||d
 |d�‚nPt	 
¡ }|d
 |_dd„ |D ƒ}t|ƒ�rd }nt	 ¡ }d|_| ||¡ ||_|	 |¡ q¢t	 ¡ }|	|_
t|	ƒ|_t| ˆd |ƒ g }	t|t|Ž ƒD ]Ä\}
}t|ƒ�r‚d }n tt	ˆ d ƒƒ }g }t|ˆ d |ƒ ‡ fdd„|D ƒ}|D ] }| d g| jt|ƒ  ¡ �q¼t|Ž D ]:}t|ƒ�rúd }nt	 ¡ }d|_| ||¡ | |¡ �qæ|	 |¡ �qjtt	ˆ d ƒƒ }t|ˆ d |	ƒ t|ˆ d t|	ƒƒ t| ˆ d |ƒ d S )Nc                 s   s   | ]}|j V  qd S r'   )Ú
ClassCountr…   r+   r+   r,   rT   £  s     z,_MarkBasePosFormat1_merge.<locals>.<genexpr>c                    s   g | ]}t |ˆ d  ƒj‘qS ©r–   ©rC   r˜   r…   ©r  r+   r,   rU   §  s     z-_MarkBasePosFormat1_merge.<locals>.<listcomp>c                    s   g | ]}t |ˆ d  ƒj‘qS )ÚArray)rC   Ú
MarkRecordr…   r  r+   r,   rU   ¨  s     r–   c                    s   g | ]}t |ˆ d  ƒj‘qS r
  r  r…   ©r  r+   r,   rU   ®  s     c                    s$   g | ]}t t |ˆ d  ƒˆ d ƒ‘qS )r  ÚRecordrZ   r…   r  r+   r,   rU   ¯  s     c                 S   s   g | ]}|d k	r|j ‘qS r'   )ÚClass©rQ   Úrr+   r+   r,   rU   ¶  s      r   rV   c                 S   s   g | ]}|d krd n|j ‘qS r'   )Ú
MarkAnchorr  r+   r+   r,   rU   Í  s     r   r  r  ÚAnchorc                    s&   g | ]}|d krg nt |ˆ d ƒ‘qS )Nr  rZ   r  r  r+   r,   rU   ä  s    ZCount)rè   r	  r¯   r(   rC   r˜   rs   r   r   r”   r  r  r   r  r“   rc   r  r2   Z	MarkArrayro   Z	MarkCountÚsetattrÚextend)r*   rf   rA   r  r  ZMarkCoverageGlyphsZMarkRecordsZBaseCoverageGlyphsZBaseRecordsÚrecordsrœ   ZglyphRecordsZ
allClassesrÅ   Z
allAnchorsÚanchorÚarrayÚanchorsZglyphAnchorsr†   r+   )r  r  r,   Ú_MarkBasePosFormat1_merge¢  sp    ýý




ÿ
r  c                 C   sZ   t |jdd„ |D ƒƒs2t| d|jdd„ |D ƒd�‚|jdkrJt||| ƒ nt| dd�‚d S )	Nc                 s   s   | ]}|j V  qd S r'   rÈ   r…   r+   r+   r,   rT   ú  s     rŠ   zmark-to-base positioning lookupc                 S   s   g | ]
}|j ‘qS r+   rÈ   r…   r+   r+   r,   rU   ÿ  s     r‡   ©r¶   rW   rX   r   rµ   ©r   r“   r#   r  r$   r³   r+   r+   r,   r/   ø  s    ü
c                 C   s^   t |jdd„ |D ƒƒs2t| d|jdd„ |D ƒd�‚|jdkrNt||| dd	ƒ nt| dd
�‚d S )Nc                 s   s   | ]}|j V  qd S r'   rÈ   r…   r+   r+   r,   rT   	  s     rŠ   zmark-to-mark positioning lookupc                 S   s   g | ]
}|j ‘qS r+   rÈ   r…   r+   r+   r,   rU     s     r‡   r  r   ZMark1ZMark2rµ   r  r³   r+   r+   r,   r/     s    ü
c                 C   sŽ   t  ¡ }t  ¡ |_t|dd„ | D ƒdd„ | D ƒƒ\}}||j_g  |_}t|Ž D ],}|D ]}|d k	rX| |¡  qPqXdsPt‚qPt	|jƒ|_
|S )Nc                 S   s   g | ]}d d„ |j D ƒ‘qS )c                 S   s   g | ]
}|j ‘qS r+   rÓ   rP   r+   r+   r,   rU     s     z/_PairSet_flatten.<locals>.<listcomp>.<listcomp>rÔ   rŸ   r+   r+   r,   rU     s     z$_PairSet_flatten.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r+   rÔ   rŸ   r+   r+   r,   rU     s     F)r”   r¼   r–   r¯   r˜   r½   rs   r2   r1   ro   rÚ   )rf   r(   r*   r˜   r®   rÜ   rj   rR   r+   r+   r,   Ú_PairSet_flatten  s"    
ý


r  c                    sº   t dd„ | D ƒƒstdƒ‚t ¡ }d|_t ¡ |_ttjdd„ | D ƒdƒ|_	ttjdd„ | D ƒdƒ|_
tˆ dd„ | D ƒd	d„ | D ƒƒ\}}||j_‡ fd
d„t|Ž D ƒ|_t|jƒ|_|S )Nc                 S   s   g | ]}|j r|jd k‘qS rÝ   rÞ   r…   r+   r+   r,   rU   1  s      z<_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>rà   r   c                 S   s   g | ]
}|j ‘qS r+   r  r…   r+   r+   r,   rU   7  s     r   c                 S   s   g | ]
}|j ‘qS r+   r  r…   r+   r+   r,   rU   8  s     c                 S   s   g | ]}|j j‘qS r+   rÉ   rP   r+   r+   r,   rU   <  s     c                 S   s   g | ]
}|j ‘qS r+   rã   rP   r+   r+   r,   rU   <  s     c                    s    g | ]}t d d„ |D ƒˆ ƒ‘qS )c                 S   s   g | ]}|d k	r|‘qS r'   r+   rP   r+   r+   r,   rU   A  s      zG_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>.<listcomp>)r  )rQ   rj   ©r(   r+   r,   rU   @  s   ÿ)r   r1   r”   r»   r“   r–   r   rÎ   rÏ   râ   rß   r¯   r˜   rs   r¼   ro   rá   )rf   r(   r*   r˜   r®   r+   r   r,   Ú(_Lookup_PairPosFormat1_subtables_flatten/  s*    ÿþ
  ÿ
þr!  c                 C   s  t dd„ | D ƒƒstdƒ‚t ¡ }d|_t ¡ |_ttjdd„ | D ƒdƒ|_	ttjdd„ | D ƒdƒ|_
t|dd„ | D ƒƒ\}}||j_t|| |d	d
�}g  }|_t|Ž D ]^}t ¡ }| |¡ g |_|j}ttdd„ |D ƒƒŽ D ]$}	ttdd„ |	D ƒƒƒ}
| |
¡ qàq¨|S )Nc                 S   s   g | ]}|j r|jd k‘qS rÝ   r  r…   r+   r+   r,   rU   J  s      z<_Lookup_PairPosFormat2_subtables_flatten.<locals>.<listcomp>rà   r�   c                 S   s   g | ]
}|j ‘qS r+   r  r…   r+   r+   r,   rU   P  s     r   c                 S   s   g | ]
}|j ‘qS r+   r  r…   r+   r+   r,   rU   Q  s     c                 S   s   g | ]}|j j‘qS r+   rÉ   rP   r+   r+   r,   rU   T  s     T)rý   c                 s   s   | ]}|j V  qd S r'   )rÂ   r  r+   r+   r,   rT   _  s     z;_Lookup_PairPosFormat2_subtables_flatten.<locals>.<genexpr>c                 s   s   | ]}|d k	r|V  qd S r'   r+   ©rQ   Úcr+   r+   r,   rT   `  s      )r   r1   r”   r»   r“   r–   r   rÎ   rÏ   râ   rß   r¯   r˜   r  rÁ   rs   r2   rÂ   rx   rù   rú   )rf   r(   r*   r˜   r‘   rþ   rÿ   ÚrowsÚrowÚcolsÚcolr+   r+   r,   Ú(_Lookup_PairPosFormat2_subtables_flattenH  s.    ÿþ


r(  c                 C   s    t | ƒ} t| ƒ}d}||k r4| | jdkr4|d7 }qt| d|… |ƒg| d|…< t| ƒ}|}|dkr€| |d  jdkr€|d8 }q\t| |d… |ƒg| |d…< | S )zÍMerge multiple Format1 subtables at the beginning of lst,
    and merge multiple consecutive Format2 subtables that have the same
    Class2 (ie. were split because of offset overflows).  Returns new list.r   r   Nr�   )rx   ro   r“   r!  r(  )rf   r(   r†   rt   r+   r+   r,   Ú&_Lookup_PairPos_subtables_canonicalizef  s    

r)  c                 C   sè   t |dd„ | D ƒd ƒ\}}t|ƒ}t ¡ }d|_||_t ¡ |_||j_||_d g| |_	| D ]‚}|jdkrœ|j	}|jjD ]}	| 
|	¡}
t |¡|j	|
< qzq^|jdkr^t|jjƒD ],\}}	|j	| }| 
|	¡}
t |¡|j	|
< q²q^|gS )Nc                 S   s   g | ]}|j j‘qS r+   rÉ   rP   r+   r+   r,   rU   |  s     z7_Lookup_SinglePos_subtables_flatten.<locals>.<listcomp>r�   r   )r¯   ro   r”   r•   r“   r—   r–   r˜   r™   r�   r·   r²   rü   rr   )rf   r(   Zmin_inclusive_rec_formatr˜   r‘   Z
num_glyphsÚnewZ	singlePosZval_recÚgnamert   rÒ   r+   r+   r,   Ú#_Lookup_SinglePos_subtables_flatten{  s*    





r,  c                    s  dd„ |D ƒ }ˆ _ tt||ƒƒ||jfg D ]’\}}|s<q.|d jj d¡r.tdd„ |D ƒƒsxtˆ ddd„ |D ƒd�‚tdd„ |D ƒƒs’tˆ ƒ‚|d j	|_
d	d„ |D ƒ}|d d …= | |¡ q.|joØt|jd tjƒ}|�r
t|jˆ jƒ|_‡ fd
d„|D ƒ }ˆ _ n”|j�o"t|jd tjƒ}|�rždd„ |D ƒ‰t‡fdd„ˆD ƒƒ�sšdd„ |D ƒ}	tt|	ƒ‰t|jˆ jˆƒ|_‡ ‡fdd„|D ƒ }ˆ _ d}
nd}
ˆ  |j|¡ t|jƒ|_|�r¦t|jƒdk�rà|jd jdk�sät‚|jd jj�s|j d¡ | jd8  _t|jƒdk�r0|jd jdk�s4t‚|jd jj�s^|j d¡ | jd8  _ˆ jjjdt ƒ d�}|dk�rìt! "d¡ t#ˆ j||jƒ|_t|jƒ|_nF|�rì|
�rì|jd }|jj}dd„ t||j$ƒD ƒ}t%|ˆ j &¡ ƒ|_ˆ j'||ddgd� ˆ ` d S )Nc                 S   s   g | ]
}|j ‘qS r+   )ÚSubTabler…   r+   r+   r,   rU   •  s     r‡   r   Ú	Extensionc                 S   s   g | ]
}|j ‘qS r+   ©rb   ©rQ   Ústr+   r+   r,   rU   œ  s     c                 S   s   g | ]}|j j‘qS r+   )rb   r0   r0  r+   r+   r,   rU      s     rV   c                 S   s   g | ]
}|j ‘qS r+   )ÚExtensionLookupTyper0  r+   r+   r,   rU   ¢  s     c                 S   s   g | ]
}|j ‘qS r+   )ZExtSubTabler0  r+   r+   r,   rU   ¥  s     c                    s   g | ]}t |ˆ jƒ‘qS r+   )r)  r(   r0  ©rA   r+   r,   rU   ²  s    c                 S   s   g | ]}t |ƒ‘qS r+   rn   r0  r+   r+   r,   rU   ¸  s     c                    s   g | ]}|ˆ d  k‘qS rÝ   r+   )rQ   Únums)ÚnumSubtablesr+   r,   rU   ¹  s     c                 S   s   g | ]}|D ]
}|j ‘qqS r+   rÇ   )rQ   r1  Útr+   r+   r,   rU   ½  s       c                    s   g | ]}t |ˆ jˆƒ‘qS r+   )r,  r(   r0  )rA   Úmirfr+   r,   rU   Ã  s   ÿTFr   r  r�   z0fontTools.otlLib.optimize.gpos:COMPRESSION_LEVELrä   zCompacting GPOS...c                 S   s   i | ]\}}||“qS r+   r+   )rQ   r+  Z	valRecordr+   r+   r,   r�   í  s     úmerge.<locals>.<dictcomp>r-  ÚSubTableCountrÍ   )(rÑ   rx   rs   r-  rb   r0   Ú
startswithr   r"   r2  Z
LookupTyper  rv   r”   r»   r)  r(   r•   ra   r   r   r,  ru   ro   r9  r“   r1   r–   r˜   ÚpopÚcfgrD   r   ÚlogÚinfor   r�   r   r«   rm   )rA   r*   rf   r¸   r†   ÚstsZnew_stsZ	isPairPosZisSinglePosZvalueFormatListZ	flattenedÚlevelZsinglePosTabler˜   ZsinglePosMappingr+   )rA   r7  r5  r,   r/   “  s’    "ý
 ÿ
ÿ
  ÿþ&&þ



ÿ ÿc                   @   s   e Zd ZdZdd„ ZdS )ÚInstancerMergerzLA merger that takes multiple master fonts, and instantiates
    an instance.c                 C   s(   t  | |¡ || _|| _| |¡| _d S r'   )r&   r-   ÚmodelÚlocationZ
getScalarsÚscalars)r*   r(   rB  rC  r+   r+   r,   r-     s    zInstancerMerger.__init__N©r0   r€   r�   Ú__doc__r-   r+   r+   r+   r,   rA  ý  s   rA  c                 C   s>   |j dkst‚dd„ |D ƒ}| j}| j}t| ||¡ƒ|_d S )Nr   c                 S   s   g | ]
}|j ‘qS r+   ©Ú
Coordinate©rQ   Úar+   r+   r,   rU     s     r‡   )r“   r1   rB  rD  r   Ú interpolateFromMastersAndScalarsrH  )rA   r*   rf   ZCoordsrB  rD  r+   r+   r,   r/     s
    c                 C   s^   |j dkst‚dd„ |D ƒ}dd„ |D ƒ}| j}| j}t| ||¡ƒ|_t| ||¡ƒ|_d S )Nr   c                 S   s   g | ]
}|j ‘qS r+   ©ÚXCoordinaterI  r+   r+   r,   rU     s     r‡   c                 S   s   g | ]
}|j ‘qS r+   ©ÚYCoordinaterI  r+   r+   r,   rU     s     )r“   r1   rB  rD  r   rK  rM  rO  )rA   r*   rf   ZXCoordsZYCoordsrB  rD  r+   r+   r,   r/     s    c                    sd   | j }| j}dD ]N\‰ }t||ƒr&t‚t|ˆ ƒr‡ fdd„|D ƒ}t| ||¡ƒ}t|ˆ |ƒ qd S )N©)ZXAdvanceZ
XAdvDevice)ZYAdvanceZ
YAdvDevice)Z
XPlacementZ
XPlaDevice)Z
YPlacementZ
YPlaDevicec                    s   g | ]}t |ˆ d ƒ‘qS rÝ   rZ   rI  ©Únamer+   r,   rU   *  s     r‡   )rB  rD  r`   r1   r   rK  r  )rA   r*   rf   rB  rD  Ú	tableNamerj   ri   r+   rQ  r,   r/     s    
c                   @   s   e Zd ZdZddd„ZdS )ÚMutatorMergerzËA merger that takes a variable font, and instantiates
    an instance.  While there's no "merging" to be done per se,
    the operation can benefit from many operations that the
    aligning merger does.Tc                 C   s   t  | |¡ || _|| _d S r'   )r&   r-   Ú	instancerÚdeleteVariations)r*   r(   rU  rV  r+   r+   r,   r-   :  s    zMutatorMerger.__init__N)TrE  r+   r+   r+   r,   rT  4  s   rT  c                 C   s€   |d j  ¡ |_ |jdkrd S | j}|j}| jr4|`|rp|jdksFt‚|jd> |j	 }t
|| ƒ}| j|7  _| jr|d|_d S )Nr   é   é €  é   r   )r<   r²   r“   rU  ÚDeviceTablerV  ÚDeltaFormatr1   Ú	StartSizeÚEndSizer   rH  )rA   r*   rf   rU  ÚdevÚvaridxÚdeltar+   r+   r,   r/   @  s    
c           
      C   s¾   |d j  ¡ |_ |jdkrd S | j}dD ]„}|d }t||ƒs@q(t||ƒ}| jrZt||ƒ |d krdq(|jdksrt	‚|j
d> |j }t|| ƒ}|d }	t||	t||	ƒ| ƒ q(| jrºd|_d S )	Nr   rW  ZXYrZ  rX  rY  rH  r   )r<   r²   r“   rU  r`   rC   rV  Údelattrr[  r1   r\  r]  r   r  )
rA   r*   rf   rU  rR   rS  r^  r_  r`  r6   r+   r+   r,   r/   V  s(    



c           	      C   sš   |d j  ¡ |_ | j}dD ]z\}}t||ƒs.qt||ƒ}| jrHt||ƒ |d krRq|jdks`t‚|j	d> |j
 }t|| ƒ}t||t||dƒ| ƒ qd S )Nr   rP  rX  rY  )r<   r²   rU  r`   rC   rV  ra  r[  r1   r\  r]  r   r  )	rA   r*   rf   rU  rR  rS  r^  r_  r`  r+   r+   r,   r/   t  s    


c                       s0   e Zd ZdZdd„ Zdd„ Z‡ fdd„Z‡  ZS )ÚVariationMergerzJA merger that takes multiple master fonts, and builds a
    variable font.c                 C   s&   t  | |¡ t |¡| _|  |¡ d S r'   )r&   r-   r   ZOnlineVarStoreBuilderÚstore_builderÚsetModel)r*   rB  ÚaxisTagsr(   r+   r+   r,   r-   ˜  s    zVariationMerger.__init__c                 C   s   || _ | j |¡ d S r'   )rB  rc  rd  )r*   rB  r+   r+   r,   rd  �  s    zVariationMerger.setModelc                    s    d }d }d |krrt |ƒr0|d k	r,t| |d�‚d S | j}| jrTtdd„ |D ƒ| jƒ| _| j}| |¡\}}|  |¡ tt| ƒ 	||¡ |r’|  |¡ |rœ|| _d S )N)rX   c                 S   s   g | ]}|d k	‘qS r'   r+   rP   r+   r+   r,   rU   ®  s     z/VariationMerger.mergeThings.<locals>.<listcomp>)
r   r   r)   r   rB  ZgetSubModelrd  Úsuperrb  rc   )r*   re   rf   ZmasterModelZorigTTFsrB  r/  r+   r,   rc   ¡  s$    

zVariationMerger.mergeThings)r0   r€   r�   rF  r-   rd  rc   Ú__classcell__r+   r+   r/  r,   rb  ”  s   rb  c                 C   s0   t |ƒr|d d fS |  |¡\}}|t |¡fS r°   )r   ÚstoreMastersr   ÚbuildVarDevTable)rc  Úmaster_valuesÚbaseÚvarIdxr+   r+   r,   ri  ¼  s    ri  c                 C   sF   |j dkrt| dd�‚t| jdd„ |D ƒƒ\|_}|rBd|_ ||_d S )Nr   za baseline coordinaterµ   c                 S   s   g | ]
}|j ‘qS r+   rG  rI  r+   r+   r,   rU   È  s     r‡   rW  ©r“   r$   ri  rc  rH  rZ  ©rA   r*   rf   rZ  r+   r+   r,   r/   Ã  s    
 ÿ
c                 C   sF   |j dkrt| dd�‚t| jdd„ |D ƒƒ\|_}|rBd|_ ||_d S )Nr   za caretrµ   c                 S   s   g | ]
}|j ‘qS r+   rG  rI  r+   r+   r,   rU   Ô  s     r‡   rW  rm  rn  r+   r+   r,   r/   Ï  s    
 ÿ
c                 C   sl   |j dkrt| dd�‚t| jdd„ |D ƒƒ\|_}t| jdd„ |D ƒƒ\|_}|sV|rhd|_ ||_||_d S )Nr   z	an anchorrµ   c                 S   s   g | ]
}|j ‘qS r+   rL  rI  r+   r+   r,   rU   à  s     r‡   c                 S   s   g | ]
}|j ‘qS r+   rN  rI  r+   r+   r,   rU   ã  s     rW  )r“   r$   ri  rc  rM  rO  ÚXDeviceTableÚYDeviceTable)rA   r*   rf   ro  rp  r+   r+   r,   r/   Û  s    
 ÿ
 ÿ
c                    sV   dD ]L\‰ }t |ˆ ƒrt| j‡ fdd„|D ƒƒ\}}t|ˆ |ƒ |rt|||ƒ qd S )NrP  c                    s   g | ]}t |ˆ d ƒ‘qS rÝ   rZ   rI  rQ  r+   r,   rU   õ  s     r‡   )r`   ri  rc  r  )rA   r*   rf   rS  ri   ZdeviceTabler+   rQ  r,   r/   ë  s    
 ÿc                   @   s€   e Zd ZdZddd„Zddd„Zdd	„ fd
d„Zdd„ Zdd„ Zdd„ Z	e
dœdd„Ze
dœdd„Zedd„ ƒZedd„ ƒZdS )ÚCOLRVariationMergera½  A specialized VariationMerger that takes multiple master fonts containing
    COLRv1 tables, and builds a variable COLR font.

    COLR tables are special in that variable subtables can be associated with
    multiple delta-set indices (via VarIndexBase).
    They also contain tables that must change their type (not simply the Format)
    as they become variable (e.g. Affine2x3 -> VarAffine2x3) so this merger takes
    care of that too.
    Tc                 C   sF   t  | |||¡ i | _g | _tƒ | _g | _d | _|r<tƒ | _d| _	d S )NF)
rb  r-   ÚvarIndexCacheÚvarIdxesr‹   ÚvarTableIdsÚlayersÚlayerReuseCacher   Ú_doneBaseGlyphs)r*   rB  re  r(   ZallowLayerReuser+   r+   r,   r-     s    zCOLRVariationMerger.__init__©ÚCOLRc                 C   s4   d|kr d|kr |   |d j¡ t | |||¡ d S )Nry  )ÚexpandPaintColrLayersr\   rb  r   )r*   r(   r}   r~   r+   r+   r,   r     s    	zCOLRVariationMerger.mergeTablesc                 C   s   dS )NTr+   )r‘   r+   r+   r,   Ú<lambda>&  ó    zCOLRVariationMerger.<lambda>c           
   	   C   sÀ   |j }|j}d}z||ƒ}W n tk
r0   Y n
X ||ƒ}|sRt| t|ƒj|d�‚|}g }|D ]<}	t|	dd ƒ}z||ƒ}W n tk
rŽ   Y nX | |¡ q^t||ƒs¼t	| t|ƒj||d�‚|S )NF)r¶   ri   r“   r  )
r“   Ú
formatEnumÚ
ValueErrorr$   r=   r0   rC   r2   r   r#   )
r*   re   rf   ÚvalidateÚfmtr}  ÚokrW   rX   rR   r+   r+   r,   ÚcheckFormatEnum&  s6    
üz#COLRVariationMerger.checkFormatEnumc                    sn   |  ¡ D ]`‰ z"|  |ˆ  ‡ fdd„|D ƒ¡ W q tk
rf } z|j dˆ ›d�¡ ‚ W 5 d }~X Y qX qd S )Nc                    s   g | ]}|  ˆ ¡‘qS r+   ry   rP   rˆ   r+   r,   rU   G  s     z7COLRVariationMerger.mergeSparseDict.<locals>.<listcomp>ú[ú])rO   rc   r%   rd   r2   )r*   re   rf   rl   r+   rˆ   r,   ÚmergeSparseDictD  s    "z#COLRVariationMerger.mergeSparseDictc                    sr   |D ]h‰ t |ˆ ƒ}‡ fdd„|D ƒ}z|  ||¡ W q tk
rj } z|j dˆ › �¡ ‚ W 5 d }~X Y qX qd S )Nc                    s   g | ]}t |ˆ ƒ‘qS r+   rZ   ©rQ   rh   ©r6   r+   r,   rU   O  s     z2COLRVariationMerger.mergeAttrs.<locals>.<listcomp>r_   )rC   rc   r%   rd   r2   )r*   re   rf   r8   ri   rj   rl   r+   r‡  r,   Ú
mergeAttrsL  s    
zCOLRVariationMerger.mergeAttrsc                    s|   ‡ fdd„|D ƒ}d}|  ˆ ¡‰tˆtƒr@d}‡fdd„|D ƒ}|d }tj}t|ƒsf| j |¡\}}|rtˆ |¡}||fS )Nc                    s   g | ]}t |ˆ ƒ‘qS r+   rZ   r†  r‡  r+   r,   rU   W  s     z;COLRVariationMerger.storeMastersForAttr.<locals>.<listcomp>FTc                    s   g | ]}ˆ   |¡‘qS r+   )ZtoIntrP   )Úconvr+   r,   rU   `  s     r   )	ZgetConverterByNamerv   r
   r”   ÚNO_VARIATION_INDEXr   rc  rh  ZfromInt)r*   re   rf   r6   rj  Zis_fixed_size_floatÚ	baseValuerl  r+   )r6   r‰  r,   ÚstoreMastersForAttrV  s    


z'COLRVariationMerger.storeMastersForAttr)Úreturnc                 C   s  t |ƒ}| j |¡}|d krhtt| jƒt|ƒ d ƒD ]0}| j||t|ƒ … |kr6| | j|< } qhq6|d krÖtt|ƒd ddƒD ]P}| j| d … |d |… kr„t| jƒ| }|| j|< | j ||d … ¡  qÖq„|d krþt| jƒ | j|< }| j |¡ |S )Nr   r   r  )Útuplerr  rD   ré   ro   rs  r  )r*   rs  r^   ÚvarIndexBasert   Únr+   r+   r,   ÚstoreVariationIndicesl  s$    
z)COLRVariationMerger.storeVariationIndicesc           	      C   s\   t j}g }|D ],}|  |||¡\}}t|||ƒ | |¡ qtdd„ |D ƒƒrX|  |¡}|S )Nc                 s   s   | ]}|t jkV  qd S r'   )r”   rŠ  rP   r+   r+   r,   rT   ‘  s     z9COLRVariationMerger.mergeVariableAttrs.<locals>.<genexpr>)r”   rŠ  rŒ  r  r2   Úanyr‘  )	r*   re   rf   r8   r�  rs  r6   r‹  rl  r+   r+   r,   ÚmergeVariableAttrs‰  s    
z&COLRVariationMerger.mergeVariableAttrsc                 C   s†   t |ddd„ d�D ]n}|d }|j}t|ƒj}|ƒ }|j |j¡ | ¡  |d j}|jd k	rr|t||j	ƒ|j< qt
||j	|ƒ qd S )NTc                 S   s   t t| d jƒdd ƒd k	S )Nr  ÚVarType)rC   r=   ri   )Úpathr+   r+   r,   r{  ›  s    z?COLRVariationMerger.convertSubTablesToVarType.<locals>.<lambda>)Z	skip_rootÚ	predicater  éþÿÿÿ)r   ri   r=   r”  r<   rŒ   ZpopulateDefaultsr·   rC   rR  r  )Úclsr\   r•  r1  ZsubTableÚvarTypeZnewSubTableÚparentr+   r+   r,   ÚconvertSubTablesToVarType–  s    ý



z-COLRVariationMerger.convertSubTablesToVarTypec           	      C   s  | j s
dS tƒ }g }| jjD ]Â}|jg}|r| ¡ }|jtjj	krFq(nˆ|jtjj
krÄtt|| ƒƒ}t|ƒ}|D ]B}t|ƒ|kr˜t |¡}t|ƒ|ks˜t‚| |¡ | t|ƒ¡ qn||_t|ƒ|_n
| | ¡}| t|ƒ¡ q(qt|ƒt|ƒksôt‚|| j _t|ƒ| j _dS )aû  Rebuild LayerList without PaintColrLayers reuse.

        Each base paint graph is fully DFS-traversed (with exception of PaintColrGlyph
        which are irrelevant for this); any layers referenced via PaintColrLayers are
        collected into a new LayerList and duplicated when reuse is detected, to ensure
        that all paints are distinct objects at the end of the process.
        PaintColrLayers's FirstLayerIndex/NumLayers are updated so that no overlap
        is left. Also, any consecutively nested PaintColrLayers are flattened.
        The COLR table's LayerList is replaced with the new unique layers.
        A side effect is also that any layer from the old LayerList which is not
        referenced by any PaintColrLayers is dropped.
        N)Ú	LayerListr‹   ÚBaseGlyphListÚBaseGlyphPaintRecordÚPaintr;  r“   r”   ÚPaintFormatZPaintColrGlyphÚPaintColrLayersrx   Ú_flatten_layersro   Úidr²   rü   r1   r2   rë   ÚFirstLayerIndexÚ	NumLayersÚgetChildrenr  ÚreversedÚ
LayerCount)	ÚcolrZuniqueLayerIDsZnewLayerListrÅ   ZfrontierÚpaintÚchildrenZfirst_layer_indexÚlayerr+   r+   r,   rz  «  s4    


z)COLRVariationMerger.expandPaintColrLayersN)T)rx  )r0   r€   r�   rF  r-   r   r‚  r…  rˆ  rŒ  rÎ   r‘  r“  r‚   r›  Ústaticmethodrz  r+   r+   r+   r,   rq  ü  s   




rq  c                    sª   dd„ |j D ƒ}dd„ |D ƒ}t| ¡ ƒD ]t\}‰ z"|  |ˆ  ‡ fdd„|D ƒ¡ W q* tk
rœ } z*|j d|› d�¡ dˆ ›�|jd	< ‚ W 5 d }~X Y q*X q*d
| _d S )Nc                 S   s   i | ]}|j |“qS r+   ©Z	BaseGlyph©rQ   rÅ   r+   r+   r,   r�   Þ  s      r8  c                 S   s   g | ]}d d„ |j D ƒ‘qS )c                 S   s   i | ]}|j |“qS r+   r®  r¯  r+   r+   r,   r�   ß  s      z$merge.<locals>.<listcomp>.<dictcomp>)rž  rz   r+   r+   r,   rU   ß  s     r‡   c                    s   g | ]}|  ˆ ¡‘qS r+   ry   rP   ©rœ   r+   r,   rU   ä  s     z.BaseGlyphPaintRecord[r„  zbase glyph rC  T)	rž  rr   rO   rc   r%   rd   r2   Úcauserw  )rA   r*   rf   re   Zmastersrt   rl   r+   r°  r,   r/   Û  s    "c                 C   s&   | j stdƒ‚t| jƒ|_| j|_d S )Nz-BaseGlyphList must be merged before LayerList)rw  r1   ro   ru  r¨  rŸ  r³   r+   r+   r,   r/   í  s    c                 c   sL   | j tjjkst‚|  |¡D ]*}|j tjjkr@t||ƒE d H  q|V  qd S r'   )r“   r”   r   r¡  r1   r¦  r¢  )Úrootr©  rª  r+   r+   r,   r¢  ÷  s
    r¢  c              
      s\  t t|ˆjd jƒƒ}tˆjƒtˆƒks,t‚‡‡fdd„ttˆƒƒD ƒ}zˆ ||¡ W n0 t	k
rˆ } z|j
 d¡ ‚ W 5 d }~X Y nX ˆjd k	r ˆj |¡}t|ƒtk}t|td�}‡ ‡fdd„‰ ‡ fdd„|D ƒ}t|ƒd	k�r|d
 jtjjk�r|d
 j|_|d
 j|_nDt|ƒ|_tˆjƒ|_ˆj |¡ ˆjd k	�rX|�sXˆj ||j¡ d S )Nry  c                    s*   g | ]"}t tˆ | ˆj| d  jƒƒ‘qS rx  )rx   r¢  r)   r\   )rQ   rt   )rf   r*   r+   r,   rU   	  s   ÿz*_merge_PaintColrLayers.<locals>.<listcomp>z.Layers)r�  c                    sr   t | tƒrn‡ fdd„| D ƒ}t ¡ } ttjjƒ| _t|ƒ| _	tˆj
ƒ| _ˆj
 |¡ ˆjd k	rnˆj || j¡ | S )Nc                    s   g | ]}ˆ |ƒ‘qS r+   r+   r…   ©ÚlistToColrLayersr+   r,   rU   %  s     zD_merge_PaintColrLayers.<locals>.listToColrLayers.<locals>.<listcomp>)rv   rx   r”   rŸ  rÎ   r   r¡  r“   ro   r¥  ru  r¤  r  rv  rë   )rª  ru  )r´  r*   r+   r,   r´  #  s    


z0_merge_PaintColrLayers.<locals>.listToColrLayersc                    s   g | ]}ˆ |ƒ‘qS r+   r+   r…   r³  r+   r,   rU   /  s     r   r   )rx   r¢  r(   r\   ro   r)   r1   ré   ru   r%   rd   r2   rv  Z	try_reuser   r   r“   r”   r   r¡  r¥  r¤  ru  r  rë   )r*   re   rf   Z
out_layersZmaster_layersesrl   Zis_treer+   )r´  rf   r*   r,   Ú_merge_PaintColrLayers   s0    
þ
"
rµ  c           	         sì   ˆ   ||dd„ ¡}|tjjkr.tˆ ||ƒ d S | ¡ }d‰|d k	rRt t|ƒ|¡‰‡fdd„| 	¡ D ƒ}ˆ  
|||¡ ˆ  ||ˆ¡}dd„ | ¡ D ƒ}|tjkp´t‡ fdd„|D ƒƒ}|rèˆrÄ||_|rÒˆ  |¡ |d k	sÞt‚t|ƒ|_d S )	Nc                 S   s
   |   ¡  S r'   )Zis_variable)r€  r+   r+   r,   r{  F  r|  zmerge.<locals>.<lambda>r+   c                 3   s   | ]}|j ˆ kr|j V  qd S r'   rQ  r"  ©ÚvarAttrsr+   r,   rT   Q  s     
 rŠ   c                 S   s   g | ]
}|j ‘qS r+   )ri   r0  r+   r+   r,   rU   W  s     r‡   c                 3   s   | ]}t |ƒˆ jkV  qd S r'   ©r£  rt  r[   r3  r+   r,   rT   Z  s    )r‚  r”   r   r¡  rµ  Zas_variabler	   ÚgetVariableAttrsr=   ÚgetConvertersrˆ  r“  ZiterSubTablesrŠ  r’  ÚVarIndexBaser›  r1   rÎ   r“   )	rA   r*   rf   r€  Z	varFormatÚstaticAttrsr�  Z	subTablesZ
isVariabler+   )rA   r·  r,   r/   D  s,    ÿ
c                    sj   t |ƒj}t |¡‰ ‡ fdd„| ¡ D ƒ}|  |||¡ |  ||ˆ ¡}|tjkrf||_	| j
 t|ƒ¡ d S )Nc                 3   s   | ]}|j ˆ kr|j V  qd S r'   rQ  r"  r¶  r+   r,   rT   r  s     
 rŠ   )r=   r”  r	   r¹  rº  rˆ  r“  r”   rŠ  r»  rt  rë   r£  )rA   r*   rf   r™  r¼  r�  r+   r¶  r,   r/   m  s    


c                    sR   ˆ   ||dd„ | ¡ D ƒ¡ t‡ fdd„|jD ƒƒrNˆ  |¡ ˆ j t|ƒ¡ d S )Nc                 s   s   | ]}|j V  qd S r'   rQ  r"  r+   r+   r,   rT   €  s     rŠ   c                 3   s   | ]}t |ƒˆ jkV  qd S r'   r¸  )rQ   Ústopr3  r+   r,   rT   ‚  s     )rˆ  rº  r’  Ú	ColorStopr›  rt  rë   r£  r³   r+   r3  r,   r/   ~  s    
Zclipsc                 C   s   |   ||¡ d S r'   )r…  r³   r+   r+   r,   r/   ‡  s    )NN)N)N)F)r  r  )irF  Úosr²   r>   Úoperatorr   ÚloggingZfontTools.colorLib.builderr   r   ZfontTools.miscr   ZfontTools.misc.roundToolsr   ZfontTools.misc.treeToolsr   ZfontTools.ttLib.tablesr   r”   r	   Z#fontTools.ttLib.tables.otConvertersr
   Z!fontTools.ttLib.tables.otTraverser   Z#fontTools.ttLib.tables.DefaultTabler   ZfontTools.varLibr   r   r   ZfontTools.varLib.modelsr   r   r   r   r   ZfontTools.varLib.varStorer   Ú	functoolsr   ZfontTools.otlLib.builderr   ZfontTools.otlLib.optimize.gposr   r   Ú	getLoggerr=  Úerrorsr   r   r   r   r   r    r!   r"   r#   r$   r%   Úobjectr&   rƒ   rA   ZGDEFr/   r›   r¯   rË   r  r¹   rÆ   r•   r¼   ræ   rð   r÷   r  r  r»   r  ZMarkBasePosZMarkMarkPosr  r!  r(  r)  r,  ZLookuprA  Z
CaretValuerT  rb  ri  Z	BaseCoordrq  r�  rœ  r¢  rµ  rŸ  ZClipBoxZ	Affine2x3r¾  Z	ColorLineZClipListr+   r+   r+   r,   Ú<module>   sÂ   
4x

%





=

5!


N)

+
V





i












(







 `



		D
(


