a
    èÝEb¥‡  ã                   @   s6  d Z ddlZddlZddlmZ ddl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 ddlmZ ddlmZ ddlmZ ddlm Z m!Z!m"Z" e #d¡Z$ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m-Z-m.Z. G dd„ de/ƒZ0G dd„ de0ƒZ1e1 2ej3d¡dd„ ƒZ4dd„ Z5dRdd„Z6dd„ Z7dd „ Z8e1 2ej9¡d!d„ ƒZ4e1 2ej:¡d"d„ ƒZ4d#d$„ Z;dSd%d&„Z<dTd'd(„Z=dUd*d+„Z>d,d-„ Z?e1 2ej@¡d.d„ ƒZ4dVd1d2„ZAe1 2ejB¡d3d„ ƒZ4e1 2ejC¡d4d„ ƒZ4d5d6„ ZDd7d8„ ZEd9d:„ ZFd;d<„ ZGd=d>„ ZHe1 2ejI¡d?d„ ƒZ4G d@dA„ dAe1ƒZJeJ 2ejK¡dBd„ ƒZ4eJ 2ejL¡dCd„ ƒZ4eJ 2ejM¡dDd„ ƒZ4G dEdF„ dFe1ƒZNeN 2ejK¡dGd„ ƒZ4eN 2ejL¡dHd„ ƒZ4eN 2ejM¡dId„ ƒZ4G dJdK„ dKe1ƒZOdLdM„ ZPeO 2ejQ¡dNd„ ƒZ4eO 2ejK¡dOd„ ƒZ4eO 2ejL¡dPd„ ƒZ4eO 2ejM¡dQd„ ƒZ4dS )Wz4
Merge OpenType Layout tables (GDEF / GPOS / GSUB).
é    N)Úior)ÚclassifyTools)ÚotRound)ÚotTables)ÚotBase)ÚDefaultTable)ÚbuilderÚmodelsÚvarStore)ÚnonNoneÚallNoneÚallEqualÚ
allEqualTo)ÚVarStoreInstancer)Úreduce)ÚbuildSinglePos)Úcompact_pair_posÚGPOS_COMPACT_MODE_DEFAULTÚGPOS_COMPACT_MODE_ENV_KEYzfontTools.varLib.mergeré   )
ÚShouldBeConstantÚ
FoundANoneÚMismatchedTypesÚLengthsDifferÚ
KeysDifferÚInconsistentGlyphOrderÚInconsistentExtensionsÚUnsupportedFormatr   Ú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 S ©N©Úfont)Úselfr"   © r$   úW/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/varLib/merger.pyÚ__init__)   s    zMerger.__init__r    c                    sX   ˆt ksJ dƒ‚dˆjvr i ˆ_tˆƒtkr2ˆf‰tˆ ƒtkrDˆ f‰ ‡ ‡‡fdd„}|S )NzSubclass Merger instead.Úmergersc                    sn   | j dksJ ‚g }ˆD ]R}||v r$q| |¡ ˆj |i ¡}ˆ D ]&}||vs^J d|j |f ƒ‚| ||< q@qd S )NÚmergez=Oops, class '%s' has merge function for '%s' defined already.)Ú__name__Úappendr'   Ú
setdefault)ÚmethodÚdoneZclazzr'   Úattr©ÚattrsÚcelfÚclazzesr$   r%   Úwrapper5   s    


ÿzMerger.merger.<locals>.wrapper)r   Ú__dict__r'   ÚtypeÚstr)r1   r2   r0   r3   r$   r/   r%   Úmerger,   s    
zMerger.mergerc                 C   sP   t |ƒ}|  ¡ D ]:} t| dd ƒ}|d u r, qL| j |d ¡}|d ur|  S q|S )Nr'   )r5   ÚmroÚgetattrr'   Úget)r1   ÚthingÚ_defaultÚtypr'   Úmr$   r$   r%   Ú
mergersForC   s    
zMerger.mergersForr$   c              
      s  t |dƒr| ¡  |D ]}t |dƒr| ¡  qtt|ƒ ¡ ƒ‰t‡fdd„|D ƒƒslt| ˆdd„ |D ƒd�‚|  |¡}| d| j	j
¡}zLˆD ]B‰ ˆ |v ršqŒt|ˆ ƒ}‡ fdd„|D ƒ}| ˆ |¡}	|	| ||ƒ qŒW n8 t�y
 }
 z|
j d	ˆ  ¡ ‚ W Y d }
~
n
d }
~
0 0 d S )
NÚensureDecompiledc                 3   s"   | ]}ˆ t t|ƒ ¡ ƒkV  qd S r    ©ÚsortedÚvarsÚkeys©Ú.0Úv©rD   r$   r%   Ú	<genexpr>Z   ó    z&Merger.mergeObjects.<locals>.<genexpr>c                 S   s   g | ]}t t|ƒ ¡ ƒ‘qS r$   rA   rE   r$   r$   r%   Ú
<listcomp>\   rJ   z'Merger.mergeObjects.<locals>.<listcomp>©ÚexpectedÚgotÚ*c                    s   g | ]}t |ˆ ƒ‘qS r$   ©r9   )rF   Útable©Úkeyr$   r%   rK   d   rJ   Ú.)Úhasattrr@   rB   rC   rD   Úallr   r?   r:   Ú	__class__ÚmergeThingsr9   r   Ústackr*   )r#   ÚoutÚlstÚexcludeÚitemr'   ZdefaultMergerÚvalueÚvaluesÚ
mergerFuncÚer$   )rS   rD   r%   ÚmergeObjectsS   s,    


ÿ


zMerger.mergeObjectsc                 C   s”   t ||tƒs(t| t|ƒdd„ |D ƒd�‚tt|t|Ž ƒƒD ]T\}\}}z|  ||¡ W q: tyŒ } z|j d| ¡ ‚ W Y d }~q:d }~0 0 q:d S )Nc                 S   s   g | ]}t |ƒ‘qS r$   ©Úlen©rF   Úxr$   r$   r%   rK   m   rJ   z%Merger.mergeLists.<locals>.<listcomp>rL   z[%d])	r   rd   r   Ú	enumerateÚziprX   r   rY   r*   )r#   rZ   r[   Úir^   r_   ra   r$   r$   r%   Ú
mergeListsk   s    zMerger.mergeListsc                 C   sž   t ||tƒs*t| t|ƒjdd„ |D ƒd�‚|  |¡ d d ¡}|d urR|| ||ƒ nHt|dƒrj|  ||¡ n0t|t	ƒr‚|  
||¡ nt ||ƒsšt| ||d�‚d S )Nc                 S   s   g | ]}t |ƒj‘qS r$   )r5   r)   re   r$   r$   r%   rK   y   rJ   z&Merger.mergeThings.<locals>.<listcomp>rL   r4   )r   r5   r   r)   r?   r:   rU   rb   Ú
isinstanceÚlistrj   r   )r#   rZ   r[   r`   r$   r$   r%   rX   u   s    þ


zMerger.mergeThingsc                    s‚   |D ]x‰ ˆ |vrqz6‡ fdd„|D ƒ| _ |  |ˆ  ‡ fdd„|D ƒ¡ W q tyz } z|j ˆ ¡ ‚ W Y d }~qd }~0 0 qd S )Nc                    s   g | ]}ˆ |v r|‘qS r$   r$   ©rF   r>   ©Útagr$   r%   rK   Š   rJ   z&Merger.mergeTables.<locals>.<listcomp>c                    s    g | ]}ˆ |v r|ˆ  nd ‘qS r    r$   rm   rn   r$   r%   rK   ‹   s   ÿ)ZttfsrX   r   rY   r*   )r#   r"   Zmaster_ttfsZ	tableTagsra   r$   rn   r%   ÚmergeTables†   s    
ÿzMerger.mergeTables)N)r    )r$   )r)   Ú
__module__Ú__qualname__r&   Úclassmethodr7   r?   rb   rj   rX   rp   r$   r$   r$   r%   r   '   s   


r   c                   @   s   e Zd ZdS )ÚAligningMergerN)r)   rq   rr   r$   r$   r$   r%   rt   ”   s   rt   ZGlyphClassDefc                    s¶   |d u 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 )
NrL   c                 S   s   g | ]
}|j ‘qS r$   )Ú	classDefs©rF   Úlr$   r$   r%   rK   ž   rJ   úmerge.<locals>.<listcomp>c                 S   s   g | ]}|  ¡ ‘qS r$   rH   rv   r$   r$   r%   rK   ¤   rJ   c                 3   s   | ]}|  ˆ ¡V  qd S r    )r:   rv   ©Úkr$   r%   rI   ¦   rJ   úmerge.<locals>.<genexpr>r   rT   )rM   rN   rY   )r   ZNotANoneru   ÚsetÚupdater   r   r   )r7   r#   r[   ZallKeysZ	allValuesr$   ry   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©rF   Ú_©r#   r$   r%   rK   µ   rJ   z._SinglePosUpgradeToFormat2.<locals>.<listcomp>)	ÚFormatÚotÚ	SinglePosÚCoverageÚValueFormatÚglyphsr€   rd   Ú
ValueCount)r#   Úretr$   rƒ   r%   Ú_SinglePosUpgradeToFormat2®   s    rŒ   c                    sÂ   |du rdd„ |D ƒ}ndd„ t ||ƒD ƒ}tƒ }|j|Ž  |  ¡ j‰t|ˆd�‰t‡fdd„|D ƒƒsntƒ ‚~d}|du r’‡ ‡fdd„|D ƒ}n(t|ƒt|ƒks¦J ‚‡ ‡fd	d„|D ƒ}ˆ|fS )
aB  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|   rv   r$   r$   r%   rK   Ã   rJ   z&_merge_GlyphOrders.<locals>.<listcomp>c                 S   s$   g | ]\}}d d„ t ||ƒD ƒ‘qS )c                 S   s   i | ]\}}||“qS r$   r$   )rF   ÚgrG   r$   r$   r%   Ú
<dictcomp>Å   rJ   z1_merge_GlyphOrders.<locals>.<listcomp>.<dictcomp>)rh   )rF   rw   Úvsr$   r$   r%   rK   Å   rJ   rR   c                 3   s   | ]}t |ˆ d �|kV  qdS )rR   N)rB   ©rF   r�   )ÚsortKeyr$   r%   rI   Ì   rJ   z%_merge_GlyphOrders.<locals>.<genexpr>c                    s    g | ]‰ ‡‡ fd d„ˆD ƒ‘qS )c                    s   g | ]}|ˆv r|nˆ ‘qS r$   r$   ©rF   Úglyph©ÚdefaultÚdict_setr$   r%   rK   Ò   s   ÿú1_merge_GlyphOrders.<locals>.<listcomp>.<listcomp>r$   ©rF   ©r•   Úorder©r–   r%   rK   Ò   s   þÿc                    s    g | ]‰ ‡‡ fd d„ˆD ƒ‘qS )c                    s    g | ]}|ˆv rˆ| nˆ ‘qS r$   r$   r’   r”   r$   r%   rK   ×   s   ÿr—   r$   r˜   r™   r›   r%   rK   ×   s   þÿ)	rh   r|   r}   ÚgetReverseGlyphMapÚ__getitem__rB   rV   r   rd   )r"   r[   Z
values_lstr•   Z	dict_setsÚcombinedZpaddedValuesÚpaddedr$   )r•   rš   r‘   r%   Ú_merge_GlyphOrdersº   s(    

þþr    c                 C   s~   |D ]t}|d u st |ƒtjks|jd u s||jjv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)	r5   r…   r†   r‡   r‰   r„   r€   Úindexr   )r7   Ú	subtablesr“   r#   r$   r$   r%   Ú%_Lookup_SinglePos_get_effective_valueÜ   s    ÿþ
ý


r¦   c           
      C   sÎ   |D ]Ä}|d u st |ƒtjks|jd u s||jjv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¢   )r5   r…   ÚPairPosr‡   r‰   r„   ÚPairSetr¤   ÚPairValueRecordÚSecondGlyphÚ	ClassDef1ru   r:   Ú	ClassDef2ÚClass1RecordÚClass2Recordr   )
r7   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 u�rF�q,t| | j| |ƒ}	|	d u �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ˆ   rv   r$   r$   r%   rK     rJ   rx   r   r   iðÿÿÿr¡   r¢   c                 s   s   | ]}|j d kV  qdS )r   N©r„   rE   r$   r$   r%   rI   	  rJ   r{   c                 3   s   | ]}ˆ |j jkV  qd S r    ©r‡   r‰   rE   )ÚcoverageGlyphsr$   r%   rI   	  rJ   c                 S   s   g | ]
}|j ‘qS r$   r   rE   r$   r$   r%   rK     rJ   r~   c                 S   s   g | ]}t |ƒ‘qS r$   )rŒ   rE   r$   r$   r%   rK     rJ   c                 S   s   g | ]}|j j‘qS r$   r¶   rE   r$   r$   r%   rK     rJ   c                 S   s   g | ]
}|j ‘qS r$   r   rE   r$   r$   r%   rK     rJ   c                    s   g | ]}t  ˆ ¡‘qS r$   )r   ÚValueRecordr�   )ÚvalueFormatr$   r%   rK     rJ   )r„   r‡   r€   rŠ   rˆ   ©r\   c                 S   s   g | ]}|  ¡ ‘qS r$   )ZgetEffectiveFormatrE   r$   r$   r%   rK   .  rJ   )r   ÚintÚ__or__rˆ   rd   r   r‡   r‰   rV   r   r¸   r€   rX   Ú	getFormatr„   r    r"   rŠ   rg   r¦   Úlookup_subtablesrj   rb   )
r7   r#   r[   r‰   rŸ   ri   r_   Újr“   rG   r$   )r·   r¹   r%   r(     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 urÒ|	|
 }nt| | j| |j|ƒ}|d u 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«   rE   r$   r$   r%   rK   4  rJ   z$merge.<locals>.<listcomp>.<listcomp>©rª   r�   r$   r$   r%   rK   4  rJ   rx   c                 S   s   g | ]
}|j ‘qS r$   rÁ   r�   r$   r$   r%   rK   5  rJ   )NNÚValue1ÚValue2)Úsrc)r    r"   rª   r…   r«   ÚvalueFormat1r   r¸   rÂ   ÚvalueFormat2rÃ   r*   rd   ÚPairValueCountrg   r³   r¾   Ú_firstGlyphr9   rj   )r7   r#   r[   r‰   rŸ   Úpvrsr“   r±   ri   r_   r¿   rG   ZvpairÚv1Úv2r$   r$   r%   r(   0  s<    þ

ÿ
c                 C   sº   t dd„ |D ƒƒsJ 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©   ÚValueFormat2rv   r$   r$   r%   rK   X  rJ   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¶   rE   r$   r$   r%   rK   f  rJ   c                 S   s   g | ]
}|j ‘qS r$   ©r©   rE   r$   r$   r%   rK   g  rJ   )r•   c                 S   s   g | ]}t  ¡ ‘qS r$   )r…   r©   r�   r$   r$   r%   rK   k  rJ   )r   rb   r…   r©   rª   rÇ   r    r"   r‡   r‰   rd   rÐ   rh   rÈ   rj   )r#   r[   r7   Úemptyr‰   rŸ   r“   r°   r$   r$   r%   Ú_PairPosFormat1_mergeW  s$    ÿý
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 u rŒd |d< n6t|ƒ |d< }|dd … D ]}	|	 
|¡ | |	¡ q¨|S )Nr   r   )rk   Údictru   Úmaxr_   Úranger*   r|   ÚitemsÚaddÚintersection_updateÚdifference_update)
r#   Ú	allGlyphsru   r>   r‹   r‚   rz   rG   Zclass0Úsr$   r$   r%   Ú_ClassDef_invertr  s     


rÞ   c                 C   sÀ   t  ¡ }i  |_}|d u }|r,d gt| ƒ }t ¡ }t| |ƒD ]0\}}t||ƒ}|d u rd|dd … }| |¡ q>| 	¡ }	|rŠ|	 
dtƒ ¡ t|	ƒD ]$\}
}|
dkr¤q’|D ]}|
||< q¨q’||	fS )Nr   r   )r…   ÚClassDefru   rd   r   Ú
Classifierrh   rÞ   r}   Z
getClassesÚinsertr|   rg   )r[   ZallGlyphsesr#   ru   ZallGlyphsesWasNoneÚ
classifierZclassDefrÜ   ZsetsÚclassesri   Ú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
|ƒƒ}||
v�rd }	|	d u �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®   rv   r$   r$   r%   rK   ª  rJ   z2_PairPosFormat2_align_matrices.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r$   )r¬   rv   r$   r$   r%   rK   ­  rJ   c                 S   s   g | ]}|j j‘qS r$   r¶   rv   r$   r$   r%   rK   ­  rJ   r   c                 S   s   g | ]
}|j ‘qS r$   )r­   rv   r$   r$   r%   rK   Ó  rJ   )rå   r¬   rd   ÚClass1Countrh   r|   r‡   r‰   ru   ÚnextÚiterr…   r®   r¯   r×   ÚClass2CountrÑ   r   r¸   rÂ   rÎ   rÃ   r*   r:   r­   ÚcopyÚdeepcopy)r#   r[   r"   ÚtransparentÚmatricesrã   Znew_matricesrw   ÚmatrixZnullRowZcoverageZ	classDef1Zclass1Recordsrä   ZexemplarGlyphZclass2recordsr‚   Zrec2Zrec1ÚklassZ	classDef2Zrec1oldZoldClass2RecordsZrec1newZclass2Recordsr$   r$   r%   Ú_PairPosFormat2_align_matrices¨  sh    $






rð   c                 C   s¬   t dd„ |D ƒƒsJ dƒ‚|j| |dd� t|jdd„ |D ƒƒ\}}|| j_t||jƒD ]$\}}|jj|krX||d ksXJ ‚qXt| ||jƒ}t	|d ƒ| _
| | j
|¡ d S )	Nc                 S   s   g | ]}|j r|jd k‘qS rÌ   ©r®   rÎ   rv   r$   r$   r%   rK   í  rJ   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¶   rE   r$   r$   r%   rK   ø  rJ   éÿÿÿÿr   )r   rb   r    r"   r‡   r‰   rh   r¾   rð   rl   r®   rj   )r#   r[   r7   r‰   r‚   rw   r¥   rí   r$   r$   r%   Ú_PairPosFormat2_mergeì  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 urÊ|| ¡ O }t|d
d ƒ}|d ur¦|| ¡ O }q¦qœnl|jdk�r\|jD ]X}	|	jD ]J}
t|
d	d ƒ}|d u�r2|| ¡ O }t|
d
d ƒ}|d u�r|| ¡ O }�q�q||_||_d S )Nc                 S   s   g | ]
}|j ‘qS r$   ©rÑ   rv   r$   r$   r%   rK     rJ   rx   r   c                 S   s   g | ]
}|j ‘qS r$   ©rÎ   rv   r$   r$   r%   rK     rJ   r   r~   r§   r¢   rÂ   rÃ   )r   r»   r¼   rÅ   rÑ   rÆ   rÎ   r„   rÔ   ró   r   r©   rª   r9   r½   r®   r¯   )r7   r#   r[   Zvf1Zvf2ZpairSetZpairValueRecordZpv1Zpv2Zclass1RecordZclass2Recordr$   r$   r%   r(     s<      








Ú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    )Ú
ClassCountrv   r$   r$   r%   rI   3  rJ   z,_MarkBasePosFormat1_merge.<locals>.<genexpr>c                    s   g | ]}t |ˆ d  ƒj‘qS ©r‡   ©r9   r‰   rv   ©rö   r$   r%   rK   7  rJ   z-_MarkBasePosFormat1_merge.<locals>.<listcomp>c                    s   g | ]}t |ˆ d  ƒj‘qS )ÚArray)r9   Ú
MarkRecordrv   rû   r$   r%   rK   8  rJ   r‡   c                    s   g | ]}t |ˆ d  ƒj‘qS rù   rú   rv   ©r÷   r$   r%   rK   =  rJ   c                    s$   g | ]}t t |ˆ d  ƒˆ d ƒ‘qS )rü   ÚRecordrP   rv   rþ   r$   r%   rK   >  rJ   c                 S   s   g | ]}|d ur|j ‘qS r    )ÚClass©rF   Úrr$   r$   r%   rK   D  rJ   r   rL   c                 S   s   g | ]}|d u rd n|j ‘qS r    )Ú
MarkAnchorr  r$   r$   r%   rK   [  rJ   r   rü   rÿ   ÚAnchorc                    s&   g | ]}|d u rg nt |ˆ d ƒ‘qS )Nr  rP   r  rþ   r$   r%   rK   r  s   ÿZCount)rÖ   rø   r    r"   r9   r‰   rh   r   r   r…   rý   r   r   r  r„   rX   r  r*   Z	MarkArrayrd   Z	MarkCountÚsetattrÚextend)r#   r[   r7   rö   r÷   ZMarkCoverageGlyphsZMarkRecordsZBaseCoverageGlyphsZBaseRecordsÚrecordsr�   ZglyphRecordsZ
allClassesr²   Z
allAnchorsÚanchorÚarrayÚanchorsZglyphAnchorsrw   r$   )r÷   rö   r%   Ú_MarkBasePosFormat1_merge2  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µ   rv   r$   r$   r%   rI   †  rJ   r{   zmark-to-base positioning lookupc                 S   s   g | ]
}|j ‘qS r$   rµ   rv   r$   r$   r%   rK   ‹  rJ   rx   ©r£   rM   rN   r   r¢   ©r   r„   ZInconsistentFormatsr  r   ©r7   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µ   rv   r$   r$   r%   rI   ”  rJ   r{   zmark-to-mark positioning lookupc                 S   s   g | ]
}|j ‘qS r$   rµ   rv   r$   r$   r%   rK   ™  rJ   rx   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 urX| |¡  qPqXdsPJ ‚qPt|jƒ|_	|S )Nc                 S   s   g | ]}d d„ |j D ƒ‘qS )c                 S   s   g | ]
}|j ‘qS r$   rÀ   rE   r$   r$   r%   rK   ¦  rJ   z/_PairSet_flatten.<locals>.<listcomp>.<listcomp>rÁ   r�   r$   r$   r%   rK   ¦  rJ   z$_PairSet_flatten.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r$   rÁ   r�   r$   r$   r%   rK   §  rJ   F)
r…   r©   r‡   r    r‰   rª   rh   r*   rd   rÇ   )r[   r"   r#   r‰   rŸ   rÉ   r_   rG   r$   r$   r%   Ú_PairSet_flatten   s     
þ


r  c                    sº   t dd„ | D ƒƒsJ 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Í   rv   r$   r$   r%   rK   ·  rJ   z<_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>rÏ   r   c                 S   s   g | ]
}|j ‘qS r$   rô   rv   r$   r$   r%   rK   ¼  rJ   r   c                 S   s   g | ]
}|j ‘qS r$   rõ   rv   r$   r$   r%   rK   ½  rJ   c                 S   s   g | ]}|j j‘qS r$   r¶   rE   r$   r$   r%   rK   Á  rJ   c                 S   s   g | ]
}|j ‘qS r$   rÒ   rE   r$   r$   r%   rK   Â  rJ   c                    s    g | ]}t d d„ |D ƒˆ ƒ‘qS )c                 S   s   g | ]}|d ur|‘qS r    r$   rE   r$   r$   r%   rK   Å  rJ   zG_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>.<listcomp>)r  )rF   r_   r!   r$   r%   rK   Å  s   ÿ)r   r…   r¨   r„   r‡   r   r»   r¼   rÑ   rÎ   r    r‰   rh   r©   rd   rÐ   )r[   r"   r#   r‰   rŸ   r$   r!   r%   Ú(_Lookup_PairPosFormat1_subtables_flatten¶  s     
þ
ÿr  c                 C   s  t dd„ | D ƒƒsJ 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ñ   rv   r$   r$   r%   rK   Ë  rJ   z<_Lookup_PairPosFormat2_subtables_flatten.<locals>.<listcomp>rÏ   r~   c                 S   s   g | ]
}|j ‘qS r$   rô   rv   r$   r$   r%   rK   Ð  rJ   r   c                 S   s   g | ]
}|j ‘qS r$   rõ   rv   r$   r$   r%   rK   Ñ  rJ   c                 S   s   g | ]}|j j‘qS r$   r¶   rE   r$   r$   r%   rK   Õ  rJ   T)rì   c                 s   s   | ]}|j V  qd S r    )r¯   r  r$   r$   r%   rI   à  rJ   z;_Lookup_PairPosFormat2_subtables_flatten.<locals>.<genexpr>c                 s   s   | ]}|d ur|V  qd S r    r$   )rF   Úcr$   r$   r%   rI   á  rJ   )r   r…   r¨   r„   r‡   r   r»   r¼   rÑ   rÎ   r    r‰   rð   r®   rh   r*   r¯   rl   rç   rè   )r[   r"   r#   r‰   r‚   rí   rî   ÚrowsÚrowÚcolsÚcolr$   r$   r%   Ú(_Lookup_PairPosFormat2_subtables_flattenÊ  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~   )rl   rd   r„   r  r  )r[   r"   rw   ri   r$   r$   r%   Ú&_Lookup_PairPos_subtables_canonicalizeæ  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¶   rE   r$   r$   r%   rK   ü  rJ   z7_Lookup_SinglePos_subtables_flatten.<locals>.<listcomp>r~   r   )r    rd   r…   r†   r„   rˆ   r‡   r‰   rŠ   r€   r¤   rê   rë   rg   )r[   r"   Zmin_inclusive_rec_formatr‰   r‚   Z
num_glyphsÚnewZ	singlePosZval_recÚgnameri   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äJ ‚|jd jj�s|j d¡ | jd8  _t|jƒdk�r0|jd jdk�s4J ‚|jd jj�s^|j d¡ | jd8  _tj t t!¡}|�rì|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$   )ÚSubTablerv   r$   r$   r%   rK     rJ   rx   r   Ú	Extensionc                 S   s   g | ]
}|j ‘qS r$   ©rW   ©rF   Ústr$   r$   r%   rK     rJ   c                 S   s   g | ]}|j j‘qS r$   )rW   r)   r  r$   r$   r%   rK     rJ   rL   c                 S   s   g | ]
}|j ‘qS r$   )ÚExtensionLookupTyper  r$   r$   r%   rK   !  rJ   c                 S   s   g | ]
}|j ‘qS r$   )ZExtSubTabler  r$   r$   r%   rK   $  rJ   c                    s   g | ]}t |ˆ jƒ‘qS r$   )r  r"   r  )r7   r$   r%   rK   /  rJ   c                 S   s   g | ]}t |ƒ‘qS r$   rc   r  r$   r$   r%   rK   3  rJ   c                    s   g | ]}|ˆ d  k‘qS rÌ   r$   )rF   Únums)ÚnumSubtablesr$   r%   rK   4  rJ   c                 S   s   g | ]}|D ]
}|j ‘qqS r$   r´   )rF   r  Útr$   r$   r%   rK   8  rJ   c                    s   g | ]}t |ˆ jˆƒ‘qS r$   )r  r"   r  )r7   Úmirfr$   r%   rK   <  s   TFr   rò   r~   Ú0zCompacting GPOS...c                 S   s   i | ]\}}||“qS r$   r$   )rF   r  Z	valRecordr$   r$   r%   rŽ   `  s   ÿzmerge.<locals>.<dictcomp>r  ÚSubTableCountrº   ))r¾   rl   rh   r  rW   r)   Ú
startswithr   r   r   Z
LookupTyper  rk   r…   r¨   r  r"   r†   rV   r   r   r  rj   rd   r&  r„   r‡   r‰   ÚpopÚosÚenvironr:   r   r   ÚlogÚinfor   r€   r   rœ   rb   )r7   r#   r[   r¥   rw   ÚstsZnew_stsZ	isPairPosZisSinglePosZvalueFormatListZ	flattenedÚmodeZsinglePosTabler‰   ZsinglePosMappingr$   )r7   r$  r"  r%   r(     st    "ý

ÿ&&


þc                   @   s   e Zd ZdZdd„ ZdS )ÚInstancerMergerzIA 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"   r0  r1  r$   r$   r%   r&   q  s    zInstancerMerger.__init__N©r)   rq   rr   Ú__doc__r&   r$   r$   r$   r%   r/  m  s   r/  c                 C   s>   |j dksJ ‚dd„ |D ƒ}| j}| j}t| ||¡ƒ|_d S )Nr   c                 S   s   g | ]
}|j ‘qS r$   ©Ú
Coordinate©rF   Úar$   r$   r%   rK   z  rJ   rx   )r„   r0  r2  r   Ú interpolateFromMastersAndScalarsr6  )r7   r#   r[   ZCoordsr0  r2  r$   r$   r%   r(   w  s
    c                 C   s^   |j dksJ ‚dd„ |D ƒ}dd„ |D ƒ}| j}| j}t| ||¡ƒ|_t| ||¡ƒ|_d S )Nr   c                 S   s   g | ]
}|j ‘qS r$   ©ÚXCoordinater7  r$   r$   r%   rK   ‚  rJ   rx   c                 S   s   g | ]
}|j ‘qS r$   ©ÚYCoordinater7  r$   r$   r%   rK   ƒ  rJ   )r„   r0  r2  r   r9  r;  r=  )r7   r#   r[   ZXCoordsZYCoordsr0  r2  r$   r$   r%   r(     s    c                    sd   | j }| j}dD ]N\‰ }t||ƒr&J ‚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Ì   rP   r7  ©Únamer$   r%   rK   –  rJ   rx   )r0  r2  rU   r   r9  r  )r7   r#   r[   r0  r2  Ú	tableNamer_   r^   r$   r?  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"   rC  rD  r$   r$   r%   r&   ¥  s    zMutatorMerger.__init__N)Tr3  r$   r$   r$   r%   rB  Ÿ  s   rB  c                 C   s€   |d j  ¡ |_ |jdkrd S | j}|j}| jr4|`|rp|jdksFJ ‚|jd> |j }t	|| ƒ}| j
|7  _
| jr|d|_d S )Nr   é   é €  é   r   )r4   rê   r„   rC  ÚDeviceTablerD  ÚDeltaFormatÚ	StartSizeÚEndSizer   r6  )r7   r#   r[   rC  Ú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 u rdq(|jdksrJ ‚|j	d> |j
 }t|| ƒ}|d }	t||	t||	ƒ| ƒ q(| jrºd|_d S )	Nr   rE  ZXYrH  rF  rG  r6  r   )r4   rê   r„   rC  rU   r9   rD  ÚdelattrrI  rJ  rK  r   r  )
r7   r#   r[   rC  rG   rA  rL  rM  rN  r.   r$   r$   r%   r(   À  s(    



c           	      C   sš   |d j  ¡ |_ | j}dD ]z\}}t||ƒs.qt||ƒ}| jrHt||ƒ |d u rRq|jdks`J ‚|jd> |j	 }t
|| ƒ}t||t||dƒ| ƒ qd S )Nr   r>  rF  rG  )r4   rê   rC  rU   r9   rD  rO  rI  rJ  rK  r   r  )	r7   r#   r[   rC  r@  rA  rL  rM  rN  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 )ÚVariationMergerzGA 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#   r0  ZaxisTagsr"   r$   r$   r%   r&     s    zVariationMerger.__init__c                 C   s   || _ | j |¡ d S r    )r0  rQ  rR  )r#   r0  r$   r$   r%   rR    s    zVariationMerger.setModelc                    sn   d }d |v rJt |ƒr,|d ur(t| |d�‚d S | j}| |¡\}}|  |¡ tt| ƒ ||¡ |rj|  |¡ d S )N)rN   )r   r   r0  ZgetSubModelrR  ÚsuperrP  rX   )r#   rZ   r[   ZmasterModelr0  r  r$   r%   rX   
  s    
zVariationMerger.mergeThings)r)   rq   rr   r4  r&   rR  rX   Ú__classcell__r$   r$   r  r%   rP  ý  s   rP  c                 C   s0   t |ƒr|d d fS |  |¡\}}|t |¡fS )Nr   )r   ZstoreMastersr   ÚbuildVarDevTable)rQ  Zmaster_valuesÚbaseZvarIdxr$   r$   r%   rU    s    rU  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$   r5  r7  r$   r$   r%   rK   %  rJ   rx   rE  ©r„   r   rU  rQ  r6  rH  ©r7   r#   r[   rH  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$   r5  r7  r$   r$   r%   rK   .  rJ   rx   rE  rW  rX  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$   r:  r7  r$   r$   r%   rK   7  rJ   rx   c                 S   s   g | ]
}|j ‘qS r$   r<  r7  r$   r$   r%   rK   8  rJ   rE  )r„   r   rU  rQ  r;  r=  ÚXDeviceTableÚYDeviceTable)r7   r#   r[   rY  rZ  r$   r$   r%   r(   3  s    
c                    sV   dD ]L\‰ }t |ˆ ƒrt| j‡ fdd„|D ƒƒ\}}t|ˆ |ƒ |rt|||ƒ qd S )Nr>  c                    s   g | ]}t |ˆ d ƒ‘qS rÌ   rP   r7  r?  r$   r%   rK   G  rJ   rx   )rU   rU  rQ  r  )r7   r#   r[   rA  r^   ZdeviceTabler$   r?  r%   r(   >  s    
ÿ)NN)N)N)F)rö   r÷   )Rr4  r)  rê   Úoperatorr   ÚloggingZfontTools.miscr   ZfontTools.misc.roundToolsr   ZfontTools.ttLib.tablesr   r…   r   Z#fontTools.ttLib.tables.DefaultTabler   ZfontTools.varLibr   r	   r
   ZfontTools.varLib.modelsr   r   r   r   ZfontTools.varLib.varStorer   Ú	functoolsr   ZfontTools.otlLib.builderr   ZfontTools.otlLib.optimize.gposr   r   r   Ú	getLoggerr+  Úerrorsr   r   r   r   r   r   r   r   r   Úobjectr   rt   r7   ZGDEFr(   rŒ   r    r¦   r³   r†   r©   rÔ   rÞ   rå   rð   ró   r¨   r  ZMarkBasePosZMarkMarkPosr  r  r  r  r  ZLookupr/  Z
CaretValuer  r¸   rB  rP  rU  Z	BaseCoordr$   r$   r$   r%   Ú<module>   s�   
0m

"

.

&


D

&
R





Z




	















