U
    Q»{j‚í  ã                   @   sl  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„ ZAdgd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*„ ZIdhd+d,„ZJdid-d.„ZKdjd0d1„ZLd2d3„ ZMe= >ejN¡d4d„ ƒZ@dkd7d8„ZOe= >ejP¡d9d„ ƒZ@e= >ejQ¡d:d„ ƒZ@d;d<„ ZRd=d>„ ZSd?d@„ ZTdAdB„ ZUdCdD„ ZVe= >ejW¡dEd„ ƒZ@e= >ejX¡dFd„ ƒZ@e= >ejY¡dGd„ ƒZ@G dHdI„ dIe=ƒZZeZ >ej[¡dJd„ ƒZ@eZ >ejD¡dKd„ ƒZ@eZ >ejC¡dLd„ ƒZ@G dMdN„ dNe=ƒZ\e\ >ej[¡dOd„ ƒZ@e\ >ejD¡dPd„ ƒZ@e\ >ejC¡dQd„ ƒZ@G dRdS„ dSe=ƒZ]dTdU„ Z^e] >ej_¡dVd„ ƒZ@e] >ej[¡dWd„ ƒZ@e] >ejD¡dXd„ ƒZ@e] >ejC¡dYd„ ƒZ@G dZd[„ d[e]ƒZ`e` >eja¡d\d„ ƒZ@e` >ejb¡d]d„ ƒZ@d^d_„ Zcd`da„ Zde` >ejeejff¡dbd„ ƒZ@e` >ejgejhf¡dcd„ ƒZ@e` >eji¡ddd„ ƒZ@e` >ejjde¡dfd„ ƒZ@dS )lz4
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+   úV/var/www/html/bwave/python/venv/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,   Úmerger4   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,   Ú
mergersForP   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)Zrecursec                 3   s"   | ]}ˆ t t|ƒ ¡ ƒkV  qd S r'   ©ÚsortedÚvarsÚkeys©Ú.0Úv©rN   r+   r,   Ú	<genexpr>f   s     z&Merger.mergeObjects.<locals>.<genexpr>c                 S   s   g | ]}t t|ƒ ¡ ƒ‘qS r+   rK   rO   r+   r+   r,   Ú
<listcomp>h   s     z'Merger.mergeObjects.<locals>.<listcomp>©ÚexpectedÚgotÚ*c                    s   g | ]}t |ˆ ƒ‘qS r+   ©rC   ©rP   Útable©Úkeyr+   r,   rT   q   s     Ú.)ÚhasattrrJ   rL   rM   rN   Úallr    rI   rD   Ú	__class__ÚmergeThingsrC   r%   Ústackr2   )r*   ÚoutÚlstÚexcludeÚitemr.   ZdefaultMergerÚvalueÚvaluesÚ
mergerFuncÚer+   )r]   rN   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©rP   Úxr+   r+   r,   rT   z   s     z%Merger.mergeLists.<locals>.<listcomp>rU   z[%d])	r   rn   r   Ú	enumerateÚziprb   r%   rc   r2   )r*   rd   re   Úirh   ri   rk   r+   r+   r,   Ú
mergeListsx   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   ro   r+   r+   r,   rT   …   s     z&Merger.mergeThings.<locals>.<listcomp>rU   r<   )r   r=   r   r0   rI   rD   Ú
isinstancer>   ÚEnumr   r_   rl   Úlistrt   )r*   rd   re   rj   r+   r+   r,   rb   ‚   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   ©rP   rH   ©Útagr+   r,   rT   �   s     z&Merger.mergeTables.<locals>.<listcomp>)r)   rb   r%   rc   r2   )r*   r(   Úmaster_ttfsÚ	tableTagsrk   r+   rz   r,   ÚmergeTables—   s    "zMerger.mergeTables)N)r'   )r+   )r0   Ú
__module__Ú__qualname__r-   ÚclassmethodrA   rI   rl   rt   rb   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 )
NrU   c                 S   s   g | ]
}|j ‘qS r+   )Ú	classDefs©rP   Úlr+   r+   r,   rT   ±   s     úmerge.<locals>.<listcomp>c                 S   s   g | ]}|  ¡ ‘qS r+   rR   r„   r+   r+   r,   rT   ·   s     c                 3   s   | ]}|  ˆ ¡V  qd S r'   rx   r„   ©Úkr+   r,   rS   ¹   s     úmerge.<locals>.<genexpr>r   r^   )rV   rW   rc   )r   r   rƒ   ÚsetÚupdater   r   r   )rA   r*   re   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©rP   Ú_©r*   r+   r,   rT   Ì   s     z._SinglePosUpgradeToFormat2.<locals>.<listcomp>)	ÚFormatÚotÚ	SinglePosÚCoverageÚValueFormatÚglyphsrŽ   rn   Ú
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,   rT   Û   s     z&_merge_GlyphOrders.<locals>.<listcomp>c                 S   s$   g | ]\}}d d„ t ||ƒD ƒ‘qS )c                 S   s   i | ]\}}||“qS r+   r+   )rP   ÚgrQ   r+   r+   r,   Ú
<dictcomp>Ý   s      z1_merge_GlyphOrders.<locals>.<listcomp>.<dictcomp>)rr   )rP   r…   Úvsr+   r+   r,   rT   Ý   s     r\   c                 3   s   | ]}t |ˆ d �|kV  qdS )r\   N)rL   ©rP   r�   )ÚsortKeyr+   r,   rS   ä   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+   ©rP   Úglyph©ÚdefaultÚdict_setr+   r,   rT   ë   s     ú1_merge_GlyphOrders.<locals>.<listcomp>.<listcomp>r+   ©rP   ©r£   Úorder©r¤   r,   rT   ê   s   ÿc                    s    g | ]‰ ‡‡ fd d„ˆD ƒ‘qS )c                    s    g | ]}|ˆkrˆ| nˆ ‘qS r+   r+   r    r¢   r+   r,   rT   ñ   s     r¥   r+   r¦   r§   r©   r,   rT   ð   s   ÿ)
rr   rŠ   r‹   ÚgetReverseGlyphMapÚ__getitem__rL   r`   r!   rn   r1   )r(   re   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<   Úcopyrl   ©rA   r*   re   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,   rT   6  s     r†   r   r   iðÿÿÿr³   r´   c                 s   s   | ]}|j d kV  qdS )r   N©r’   rO   r+   r+   r,   rS   <  s     r‰   c                 3   s   | ]}ˆ |j jkV  qd S r'   ©r•   r—   rO   )ÚcoverageGlyphsr+   r,   rS   <  s    c                 S   s$   g | ]}|j d k	r|j nt ¡ ‘qS r'   )rŽ   r	   ÚValueRecordrO   r+   r+   r,   rT   F  s     rŒ   c                 S   s   g | ]}t |ƒ‘qS r+   )rš   rO   r+   r+   r,   rT   M  s     c                 S   s   g | ]}|j j‘qS r+   rÈ   rO   r+   r+   r,   rT   Q  s     c                 S   s   g | ]
}|j ‘qS r+   r�   rO   r+   r+   r,   rT   Q  s     c                    s   g | ]}t  ˆ ¡‘qS r+   )r	   rÊ   r�   )ÚvalueFormatr+   r,   rT   U  s     )r’   r•   rŽ   r˜   r–   ©rf   c                 S   s   g | ]}|  ¡ ‘qS r+   )ZgetEffectiveFormatrO   r+   r+   r,   rT   n  s     )r   ÚintÚ__or__r–   rn   r$   r•   r—   r`   r	   rÊ   rŽ   rb   Ú	getFormatr’   r®   r(   r˜   rq   r¸   Úlookup_subtablesrt   rl   )
rA   r*   re   r—   r­   rs   ri   Újr¡   rQ   r+   )rÉ   rË   r,   r/   4  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½   rO   r+   r+   r,   rT   w  s     z$merge.<locals>.<listcomp>.<listcomp>©r¼   rž   r+   r+   r,   rT   w  s     r†   c                 S   s   g | ]
}|j ‘qS r+   rÓ   rž   r+   r+   r,   rT   x  s     )NNÚValue1ÚValue2)Úsrc)r®   r(   r¼   r“   r½   ÚvalueFormat1r	   rÊ   rÔ   ÚvalueFormat2rÕ   r2   rn   ÚPairValueCountrq   rÅ   rÐ   Ú_firstGlyphrC   rt   )rA   r*   re   r—   r­   Úpvrsr¡   rÃ   rs   ri   rÑ   rQ   ZvpairZv1Zv2r+   r+   r,   r/   r  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,   rT   ª  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È   rO   r+   r+   r,   rT   »  s     c                 S   s   g | ]
}|j ‘qS r+   ©r»   rO   r+   r+   r,   rT   ¼  s     ©r£   c                 S   s   g | ]}t  ¡ ‘qS r+   )r“   r»   r�   r+   r+   r,   rT   Á  s     )r   r1   rl   r“   r»   r¼   rÙ   r®   r(   r•   r—   rn   rà   rr   rÚ   rt   )r*   re   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   )ru   Údictrƒ   Úmaxri   Úranger2   rŠ   ÚitemsÚaddÚintersection_updateÚdifference_update)
r*   Ú	allGlyphsrƒ   rH   r™   r�   rˆ   rQ   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ƒ   rn   r   Ú
Classifierrr   rï   r‹   Z
getClassesÚinsertrŠ   rq   )re   ZallGlyphsesr*   rƒ   ZallGlyphsesWasNoneÚ
classifierZclassDefrí   ZsetsÚclassesrs   Ú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,   rT     s     z2_PairPosFormat2_align_matrices.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r+   )r¾   r„   r+   r+   r,   rT     s     c                 S   s   g | ]}|j j‘qS r+   rÈ   r„   r+   r+   r,   rT     s     r   c                 S   s   g | ]
}|j ‘qS r+   )r¿   r„   r+   r+   r,   rT   4  s     )rö   r¾   rn   ÚClass1Countrr   rŠ   r•   r—   rƒ   ÚnextÚiterr“   rÀ   rÁ   rè   ÚClass2Countrá   r	   rÊ   rÔ   rÞ   rÕ   r2   rD   r¿   r±   Údeepcopy)r*   re   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,   rT   P  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È   rO   r+   r+   r,   rT   c  s     éÿÿÿÿr   )r   r1   rl   r®   r(   r•   r—   rr   rÐ   r   rw   rÀ   rt   )r*   re   rA   r—   r�   r…   r·   rý   r+   r+   r,   Ú_PairPosFormat2_mergeN  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,   rT   z  s     r†   r   c                 S   s   g | ]
}|j ‘qS r+   ©rÞ   r„   r+   r+   r,   rT   }  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*   re   Zvf1Zvf2ZpairSetZpairValueRecordZpv1Zpv2Zclass1RecordZclass2Recordr+   r+   r,   r/   w  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,   rS   ¤  s     z,_MarkBasePosFormat1_merge.<locals>.<genexpr>c                    s   g | ]}t |ˆ d  ƒj‘qS ©r•   ©rC   r—   r„   ©r  r+   r,   rT   ¨  s     z-_MarkBasePosFormat1_merge.<locals>.<listcomp>c                    s   g | ]}t |ˆ d  ƒj‘qS )ÚArray)rC   Ú
MarkRecordr„   r  r+   r,   rT   ©  s     r•   c                    s   g | ]}t |ˆ d  ƒj‘qS r	  r
  r„   ©r  r+   r,   rT   ¯  s     c                    s$   g | ]}t t |ˆ d  ƒˆ d ƒ‘qS )r  ÚRecordrY   r„   r  r+   r,   rT   °  s     c                 S   s   g | ]}|d k	r|j ‘qS r'   )ÚClass©rP   Úrr+   r+   r,   rT   ·  s      r   rU   c                 S   s   g | ]}|d krd n|j ‘qS r'   )Ú
MarkAnchorr  r+   r+   r,   rT   Î  s     r   r  r  ÚAnchorc                    s&   g | ]}|d krg nt |ˆ d ƒ‘qS )Nr  rY   r  r  r+   r,   rT   å  s    ZCount)rç   r  r®   r(   rC   r—   rr   r   r   r“   r  r  r   r  r’   rb   r  r2   Z	MarkArrayrn   Z	MarkCountÚsetattrÚextend)r*   re   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,   rS   û  s     r‰   zmark-to-base positioning lookupc                 S   s   g | ]
}|j ‘qS r+   rÇ   r„   r+   r+   r,   rT      s     r†   ©rµ   rV   rW   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,   rS   
  s     r‰   zmark-to-mark positioning lookupc                 S   s   g | ]
}|j ‘qS r+   rÇ   r„   r+   r+   r,   rT     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Ò   rO   r+   r+   r,   rT     s     z/_PairSet_flatten.<locals>.<listcomp>.<listcomp>rÓ   rž   r+   r+   r,   rT     s     z$_PairSet_flatten.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r+   rÓ   rž   r+   r+   r,   rT     s     F)r“   r»   r•   r®   r—   r¼   rr   r2   r1   rn   rÙ   )re   r(   r*   r—   r­   rÛ   ri   rQ   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,   rT   2  s      z<_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>rß   r   c                 S   s   g | ]
}|j ‘qS r+   r  r„   r+   r+   r,   rT   8  s     r   c                 S   s   g | ]
}|j ‘qS r+   r  r„   r+   r+   r,   rT   9  s     c                 S   s   g | ]}|j j‘qS r+   rÈ   rO   r+   r+   r,   rT   =  s     c                 S   s   g | ]
}|j ‘qS r+   râ   rO   r+   r+   r,   rT   =  s     c                    s    g | ]}t d d„ |D ƒˆ ƒ‘qS )c                 S   s   g | ]}|d k	r|‘qS r'   r+   rO   r+   r+   r,   rT   B  s      zG_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>.<listcomp>)r  )rP   ri   ©r(   r+   r,   rT   A  s   ÿ)r   r1   r“   rº   r’   r•   r   rÍ   rÎ   rá   rÞ   r®   r—   rr   r»   rn   rà   )re   r(   r*   r—   r­   r+   r  r,   Ú(_Lookup_PairPosFormat1_subtables_flatten0  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,   rT   K  s      z<_Lookup_PairPosFormat2_subtables_flatten.<locals>.<listcomp>rß   rŒ   c                 S   s   g | ]
}|j ‘qS r+   r  r„   r+   r+   r,   rT   Q  s     r   c                 S   s   g | ]
}|j ‘qS r+   r  r„   r+   r+   r,   rT   R  s     c                 S   s   g | ]}|j j‘qS r+   rÈ   rO   r+   r+   r,   rT   U  s     T)rü   c                 s   s   | ]}|j V  qd S r'   )rÁ   r  r+   r+   r,   rS   `  s     z;_Lookup_PairPosFormat2_subtables_flatten.<locals>.<genexpr>c                 s   s   | ]}|d k	r|V  qd S r'   r+   ©rP   Úcr+   r+   r,   rS   a  s      )r   r1   r“   rº   r’   r•   r   rÍ   rÎ   rá   rÞ   r®   r—   r   rÀ   rr   r2   rÁ   rw   rø   rù   )re   r(   r*   r—   r�   rý   rþ   ÚrowsÚrowÚcolsÚcolr+   r+   r,   Ú(_Lookup_PairPosFormat2_subtables_flattenI  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Œ   )rw   rn   r’   r   r'  )re   r(   r…   rs   r+   r+   r,   Ú&_Lookup_PairPos_subtables_canonicalizeg  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È   rO   r+   r+   r,   rT   }  s     z7_Lookup_SinglePos_subtables_flatten.<locals>.<listcomp>rŒ   r   )r®   rn   r“   r”   r’   r–   r•   r—   r˜   rŽ   r¶   r±   rû   rq   )re   r(   Zmin_inclusive_rec_formatr—   r�   Z
num_glyphsÚnewZ	singlePosZval_recÚgnamers   rÑ   r+   r+   r,   Ú#_Lookup_SinglePos_subtables_flatten|  s*    





r+  c                 C   s¤   t | jdd„ |D ƒdd„ |D ƒƒ\}}d|_t ¡ |_||j_g |_|D ]<}t ¡ }t ¡ |_d|j_t ¡ |_	d|j	_|j 
|¡ qH|  |j|¡ t|jƒ|_d S )Nc                 S   s   g | ]}|j j‘qS r+   rÈ   r„   r+   r+   r,   rT   ™  s     r†   c                 S   s   g | ]
}|j ‘qS r+   )ÚEntryExitRecordr„   r+   r+   r,   rT   š  s     r   )r®   r(   r’   r“   r•   r—   r,  r  ÚEntryAnchorÚ
ExitAnchorr2   rt   rn   ZEntryExitCount)rA   r*   re   r—   r­   r�   rÄ   r+   r+   r,   r/   ”  s$    ý


c                 C   s@   t dd„ |D ƒƒrd |_t dd„ |D ƒƒr0d |_|  ||¡ d S )Nc                 s   s   | ]}|j d kV  qd S r'   )r-  ©rP   Zmasterr+   r+   r,   rS   ®  s     r‰   c                 s   s   | ]}|j d kV  qd S r'   )r.  r/  r+   r+   r,   rS   °  s     )r`   r-  r.  rl   r²   r+   r+   r,   r/   ¬  s
    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,   rT   ·  s     r†   r   Ú	Extensionc                 S   s   g | ]
}|j ‘qS r+   ©ra   ©rP   Ústr+   r+   r,   rT   ¾  s     c                 S   s   g | ]}|j j‘qS r+   )ra   r0   r3  r+   r+   r,   rT   Â  s     rU   c                 S   s   g | ]
}|j ‘qS r+   )ÚExtensionLookupTyper3  r+   r+   r,   rT   Ä  s     c                 S   s   g | ]
}|j ‘qS r+   )ZExtSubTabler3  r+   r+   r,   rT   Ç  s     c                    s   g | ]}t |ˆ jƒ‘qS r+   )r(  r(   r3  ©rA   r+   r,   rT   Ô  s    c                 S   s   g | ]}t |ƒ‘qS r+   rm   r3  r+   r+   r,   rT   Ú  s     c                    s   g | ]}|ˆ d  k‘qS rÜ   r+   )rP   Znums)ÚnumSubtablesr+   r,   rT   Û  s     c                 S   s   g | ]}|D ]
}|j ‘qqS r+   rÆ   )rP   r4  Útr+   r+   r,   rT   ß  s       c                    s   g | ]}t |ˆ jˆƒ‘qS r+   )r+  r(   r3  )rA   Úmirfr+   r,   rT   å  s   ÿTFr   r  rŒ   z0fontTools.otlLib.optimize.gpos:COMPRESSION_LEVELrã   zCompacting GPOS...c                 S   s   i | ]\}}||“qS r+   r+   )rP   r*  Z	valRecordr+   r+   r,   rœ     s     úmerge.<locals>.<dictcomp>r0  ÚSubTableCountrÌ   )(rÐ   rw   rr   r0  ra   r0   Ú
startswithr   r"   r5  Z
LookupTyper  ru   r“   rº   r(  r(   r”   r`   r   r   r+  rt   rn   r;  r’   r1   r•   r—   ÚpopÚcfgrD   r   ÚlogÚinfor   rŽ   r   rª   rl   )rA   r*   re   r·   r…   ÚstsZnew_stsZ	isPairPosZisSinglePosZvalueFormatListZ	flattenedÚlevelZsinglePosTabler—   ZsinglePosMappingr+   )rA   r9  r7  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getMasterScalarsÚmasterScalars)r*   r(   rD  rE  r+   r+   r,   r-   #  s    zInstancerMerger.__init__N©r0   r   r€   Ú__doc__r-   r+   r+   r+   r,   rC    s   rC  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©rP   Úar+   r+   r,   rT   -  s     r†   )r’   r1   rD  rF  r   ÚinterpolateFromValuesAndScalarsrJ  )rA   r*   re   ZCoordsrD  rF  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+   ©ÚXCoordinaterK  r+   r+   r,   rT   8  s     r†   c                 S   s   g | ]
}|j ‘qS r+   ©ÚYCoordinaterK  r+   r+   r,   rT   9  s     )r’   r1   rD  rF  r   rM  rO  rQ  )rA   r*   re   ZXCoordsZYCoordsrD  rF  r+   r+   r,   r/   5  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Ü   rY   rK  ©Únamer+   r,   rT   R  s     r†   )rD  rF  r_   r1   r   rM  r  )rA   r*   re   rD  rF  Ú	tableNameri   rh   r+   rS  r,   r/   D  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(   rW  rX  r+   r+   r,   r-   d  s    zMutatorMerger.__init__N)TrG  r+   r+   r+   r,   rV  ^  s   rV  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’   rW  ÚDeviceTablerX  ÚDeltaFormatr1   Ú	StartSizeÚEndSizer   rJ  )rA   r*   re   rW  ÚdevÚvaridxÚdeltar+   r+   r,   r/   j  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   rY  ZXYr\  rZ  r[  rJ  r   )r<   r±   r’   rW  r_   rC   rX  Údelattrr]  r1   r^  r_  r   r  )
rA   r*   re   rW  rQ   rU  r`  ra  rb  r6   r+   r+   r,   r/   €  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   rR  rZ  r[  )r<   r±   rW  r_   rC   rX  rc  r]  r1   r^  r_  r   r  )	rA   r*   re   rW  rT  rU  r`  ra  rb  r+   r+   r,   r/   ž  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*   rD  ÚaxisTagsr(   r+   r+   r,   r-   Â  s    zVariationMerger.__init__c                 C   s   || _ | j |¡ d S r'   )rD  re  rf  )r*   rD  r+   r+   r,   rf  Ç  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)rW   c                 S   s   g | ]}|d k	‘qS r'   r+   rO   r+   r+   r,   rT   Ø  s     z/VariationMerger.mergeThings.<locals>.<listcomp>)
r   r   r)   r   rD  ZgetSubModelrf  Úsuperrd  rb   )r*   rd   re   ZmasterModelZorigTTFsrD  r2  r+   r,   rb   Ë  s$    

zVariationMerger.mergeThings)r0   r   r€   rH  r-   rf  rb   Ú__classcell__r+   r+   r2  r,   rd  ¾  s   rd  c                 C   s0   t |ƒr|d d fS |  |¡\}}|t |¡fS r¯   )r   ÚstoreMastersr   ÚbuildVarDevTable)re  Úmaster_valuesÚbaseÚvarIdxr+   r+   r,   rk  æ  s    rk  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+   rI  rK  r+   r+   r,   rT   ò  s     r†   rY  ©r’   r$   rk  re  rJ  r\  ©rA   r*   re   r\  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+   rI  rK  r+   r+   r,   rT   þ  s     r†   rY  ro  rp  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+   rN  rK  r+   r+   r,   rT   
  s     r†   c                 S   s   g | ]
}|j ‘qS r+   rP  rK  r+   r+   r,   rT     s     rY  )r’   r$   rk  re  rO  rQ  ÚXDeviceTableÚYDeviceTable)rA   r*   re   rq  rr  r+   r+   r,   r/     s    
 ÿ
 ÿ
c                    sV   dD ]L\‰ }t |ˆ ƒrt| j‡ fdd„|D ƒƒ\}}t|ˆ |ƒ |rt|||ƒ qd S )NrR  c                    s   g | ]}t |ˆ d ƒ‘qS rÜ   rY   rK  rS  r+   r,   rT     s     r†   )r_   rk  re  r  )rA   r*   re   rU  rh   ZdeviceTabler+   rS  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)
rd  r-   ÚvarIndexCacheÚvarIdxesrŠ   ÚvarTableIdsÚlayersÚlayerReuseCacher   Ú_doneBaseGlyphs)r*   rD  rg  r(   ZallowLayerReuser+   r+   r,   r-   1  s    zCOLRVariationMerger.__init__©ÚCOLRc                 C   s4   d|kr d|kr |   |d j¡ t | |||¡ d S )Nr{  )ÚexpandPaintColrLayersr[   rd  r~   )r*   r(   r|   r}   r+   r+   r,   r~   C  s    	zCOLRVariationMerger.mergeTablesc                 C   s   dS )NTr+   )r�   r+   r+   r,   Ú<lambda>P  ó    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µ   rh   r’   r  )
r’   Ú
formatEnumÚ
ValueErrorr$   r=   r0   rC   r2   r   r#   )
r*   rd   re   ÚvalidateÚfmtr  ÚokrV   rW   rQ   r+   r+   r,   ÚcheckFormatEnumP  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+   rx   rO   r‡   r+   r,   rT   q  s     z7COLRVariationMerger.mergeSparseDict.<locals>.<listcomp>ú[ú])rN   rb   r%   rc   r2   )r*   rd   re   rk   r+   r‡   r,   ÚmergeSparseDictn  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+   rY   ©rP   rg   ©r6   r+   r,   rT   y  s     z2COLRVariationMerger.mergeAttrs.<locals>.<listcomp>r^   )rC   rb   r%   rc   r2   )r*   rd   re   r8   rh   ri   rk   r+   r‰  r,   Ú
mergeAttrsv  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+   rY   rˆ  r‰  r+   r,   rT   �  s     z;COLRVariationMerger.storeMastersForAttr.<locals>.<listcomp>FTc                    s   g | ]}ˆ   |¡‘qS r+   )ZtoIntrO   )Úconvr+   r,   rT   Š  s     r   )	ZgetConverterByNameru   r
   r“   ÚNO_VARIATION_INDEXr   re  rj  ZfromInt)r*   rd   re   r6   rl  Zis_fixed_size_floatÚ	baseValuern  r+   )r6   r‹  r,   ÚstoreMastersForAttr€  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  )Útuplert  rD   rè   rn   ru  r  )r*   ru  r]   ÚvarIndexBasers   Únr+   r+   r,   ÚstoreVariationIndices–  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Œ  rO   r+   r+   r,   rS   »  s     z9COLRVariationMerger.mergeVariableAttrs.<locals>.<genexpr>)r“   rŒ  rŽ  r  r2   Úanyr“  )	r*   rd   re   r8   r‘  ru  r6   r�  rn  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=   rh   )Úpathr+   r+   r,   r}  Å  s    z?COLRVariationMerger.convertSubTablesToVarType.<locals>.<lambda>)Z	skip_rootÚ	predicater  éþÿÿÿ)r   rh   r=   r–  r<   r‹   ZpopulateDefaultsr¶   rC   rT  r  )Úclsr[   r—  r4  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ÚPaintColrLayersrw   Ú_flatten_layersrn   Úidr±   rû   r1   r2   rê   ÚFirstLayerIndexÚ	NumLayersÚgetChildrenr  ÚreversedÚ
LayerCount)	ÚcolrZuniqueLayerIDsZnewLayerListrÄ   ZfrontierÚpaintÚchildrenZfirst_layer_indexÚlayerr+   r+   r,   r|  Õ  s4    


z)COLRVariationMerger.expandPaintColrLayersN)T)rz  )r0   r   r€   rH  r-   r~   r„  r‡  rŠ  rŽ  rÍ   r“  r•  r�   r�  Ústaticmethodr|  r+   r+   r+   r,   rs  &  s   




rs  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©rP   rÄ   r+   r+   r,   rœ     s      r:  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   ry   r+   r+   r,   rT   	  s     r†   c                    s   g | ]}|  ˆ ¡‘qS r+   rx   rO   ©r›   r+   r,   rT     s     z.BaseGlyphPaintRecord[r†  zbase glyph rE  T)	r   rq   rN   rb   r%   rc   r2   Úcausery  )rA   r*   re   rd   Zmastersrs   rk   r+   r²  r,   r/     s    "c                 C   s&   | j stdƒ‚t| jƒ|_| j|_d S )Nz-BaseGlyphList must be merged before LayerList)ry  r1   rn   rw  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 )Nr{  c                    s*   g | ]"}t tˆ | ˆj| d  jƒƒ‘qS rz  )rw   r¤  r)   r[   )rP   rs   )re   r*   r+   r,   rT   3  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,   rT   O  s     zD_merge_PaintColrLayers.<locals>.listToColrLayers.<locals>.<listcomp>)ru   rw   r“   r¡  rÍ   r¢  r£  r’   rn   r§  rw  r¦  r  rx  rê   )r¬  rw  )r¶  r*   r+   r,   r¶  M  s    


z0_merge_PaintColrLayers.<locals>.listToColrLayersc                    s   g | ]}ˆ |ƒ‘qS r+   r+   r„   rµ  r+   r,   rT   Y  s     r   r   )rw   r¤  r(   r[   rn   r)   r1   rè   rt   r%   rc   r2   rx  Z	try_reuser   r   r’   r“   r¢  r£  r§  r¦  rw  r  rê   )r*   rd   re   Z
out_layersZmaster_layersesrk   Zis_treer+   )r¶  re   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}  p  r~  zmerge.<locals>.<lambda>r+   c                 3   s   | ]}|j ˆ kr|j V  qd S r'   rS  r!  ©ÚvarAttrsr+   r,   rS   {  s     
 r‰   c                 S   s   g | ]
}|j ‘qS r+   )rh   r3  r+   r+   r,   rT   �  s     r†   c                 3   s   | ]}t |ƒˆ jkV  qd S r'   ©r¥  rv  rZ   r6  r+   r,   rS   „  s    )r„  r“   r¢  r£  r·  Zas_variabler	   ÚgetVariableAttrsr=   ÚgetConvertersrŠ  r•  ZiterSubTablesrŒ  r”  ÚVarIndexBaser�  r1   rÍ   r’   )	rA   r*   re   r‚  Z	varFormatÚstaticAttrsr‘  Z	subTablesZ
isVariabler+   )rA   r¹  r,   r/   n  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'   rS  r!  r¸  r+   r,   rS   œ  s     
 r‰   )r=   r–  r	   r»  r¼  rŠ  r•  r“   rŒ  r½  rv  rê   r¥  )rA   r*   re   r›  r¾  r‘  r+   r¸  r,   r/   —  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'   rS  r!  r+   r+   r,   rS   ª  s     r‰   c                 3   s   | ]}t |ƒˆ jkV  qd S r'   rº  )rP   Ústopr6  r+   r,   rS   ¬  s     )rŠ  r¼  r”  Ú	ColorStopr�  rv  rê   r¥  r²   r+   r6  r,   r/   ¨  s    
Zclipsc                 C   s   |   ||¡ d S r'   )r‡  r²   r+   r+   r,   r/   ±  s    )NN)N)N)F)r  r  )krH  Ú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
CursivePosr,  ZLookuprC  Z
CaretValuerV  rd  rk  Z	BaseCoordrs  rŸ  rž  r¤  r·  r¡  ZClipBoxZ	Affine2x3rÀ  Z	ColorLineZClipListr+   r+   r+   r,   Ú<module>   sÊ   
4x

%





=

5!


N)

+
V









i



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