B
    Sc                 @   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*   6lib/python3.7/site-packages/fontTools/varLib/merger.py__init__.   s    zMerger.__init__Nc                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                sv   | j dkstg }x^D ]V}||kr&q|| j|i }x. D ]&}||ksbtd|j |f | ||< qDW qW d S )Nmergez=Oops, class '%s' has merge function for '%s' defined already.)__name__AssertionErrorappendr.   
setdefault)methodZdoneZclazzr.   attr)attrscelfclazzesr*   r+   wrapper<   s    
 


zMerger.merger.<locals>.wrapper)r&   r1   __dict__r.   typeenumEnumMetastr)r7   r8   r6   r9   r*   )r6   r7   r8   r+   merger3   s    
zMerger.mergerc             C   sN   t |}x@|  D ]4} t| dd }|d kr,P | j|d }|d k	r|S qW |S )Nr.   )r;   mrogetattrr.   get)r7   thingZ_defaulttypr.   mr*   r*   r+   
mergersForJ   s    zMerger.mergersForr*   c          
      s  t |dr|jdd x"|D ]}t |dr|jdd qW tt| tfdd|D sxt| dd |D d| |}|d	| j	j
}yPxJD ]B  |krqt| } fd
d|D }| |}	|	| || qW W n6 tk
r }
 z|
jd    W d d }
~
X Y nX d S )NensureDecompiledF)Zrecursec             3   s"   | ]} t t| kV  qd S )N)sortedvarskeys).0v)rJ   r*   r+   	<genexpr>a   s    z&Merger.mergeObjects.<locals>.<genexpr>c             S   s   g | ]}t t| qS r*   )rH   rI   rJ   )rK   rL   r*   r*   r+   
<listcomp>c   s    z'Merger.mergeObjects.<locals>.<listcomp>)expectedgot*c                s   g | ]}t | qS r*   )rA   )rK   table)keyr*   r+   rN   k   s    .)hasattrrG   rH   rI   rJ   allr    rF   rB   	__class__mergeThingsrA   r%   stackr2   )r)   outlstexcludeitemr.   ZdefaultMergervaluevalues
mergerFuncer*   )rS   rJ   r+   mergeObjectsZ   s,    




 
zMerger.mergeObjectsc             C   s   t ||ts(t| t|dd |D dxhtt|t| D ]R\}\}}y| || W q< tk
r } z|jd|   W d d }~X Y q<X q<W d S )Nc             S   s   g | ]}t |qS r*   )len)rK   xr*   r*   r+   rN   t   s    z%Merger.mergeLists.<locals>.<listcomp>)rO   rP   z[%d])	r   rc   r   	enumerateziprX   r%   rY   r2   )r)   rZ   r[   ir^   r_   ra   r*   r*   r+   
mergeListsr   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 ||st	| ||dnHt
|dr| || n0t|tr| || nt ||st	| ||dd S )Nc             S   s   g | ]}t |jqS r*   )r;   r0   )rK   rd   r*   r*   r+   rN      s    z&Merger.mergeThings.<locals>.<listcomp>)rO   rP   r:   )r   r;   r   r0   rF   rB   
isinstancer<   Enumr   rU   rb   listrh   )r)   rZ   r[   r`   r*   r*   r+   rX   |   s     



zMerger.mergeThingsc                sv   xp|D ]h  |krqy(|| _ | |   fdd|D  W q tk
rl } z|j   W d d }~X Y qX qW d S )Nc                s   g | ]}|  qS r*   )rB   )rK   rE   )tagr*   r+   rN      s    z&Merger.mergeTables.<locals>.<listcomp>)r(   rX   r%   rY   r2   )r)   r'   master_ttfs	tableTagsra   r*   )rl   r+   mergeTables   s    
 "zMerger.mergeTables)N)r-   )r*   )r0   
__module____qualname__r,   classmethodr?   rF   rb   rh   rX   ro   r*   r*   r*   r+   r&   ,   s   


r&   c               @   s   e Zd ZdS )AligningMergerN)r0   rp   rq   r*   r*   r*   r+   rs      s   rs   ZGlyphClassDefc                s   |d kr"t |st| d |dd S dd |D }i |_|j}t }|jdd |D   x^|D ]V t fdd|D }t|st| |d |d  gd	|sd | < q\|d | < q\W d S )
N)rO   rP   c             S   s   g | ]
}|j qS r*   )	classDefs)rK   lr*   r*   r+   rN      s    zmerge.<locals>.<listcomp>c             S   s   g | ]}|  qS r*   )rJ   )rK   ru   r*   r*   r+   rN      s    c             3   s   | ]}|  V  qd S )N)rB   )rK   ru   )kr*   r+   rM      s    zmerge.<locals>.<genexpr>r   rT   )rO   rP   rY   )r   r   rt   setupdater   r   r   )r?   r)   r[   ZallKeysZ	allValuesr*   )rv   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)rK   _)r)   r*   r+   rN      s    z._SinglePosUpgradeToFormat2.<locals>.<listcomp>)	Formatot	SinglePosCoverageValueFormatglyphsrz   rc   
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st	 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*   )rw   )rK   ru   r*   r*   r+   rN      s    z&_merge_GlyphOrders.<locals>.<listcomp>c             S   s$   g | ]\}}d d t ||D qS )c             S   s   i | ]\}}||qS r*   r*   )rK   grL   r*   r*   r+   
<dictcomp>   s    z1_merge_GlyphOrders.<locals>.<listcomp>.<dictcomp>)rf   )rK   ru   vsr*   r*   r+   rN      s    )rS   c             3   s   | ]}t | d |kV  qdS ))rS   N)rH   )rK   r   )sortKeyr*   r+   rM      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*   )rK   glyph)defaultdict_setr*   r+   rN      s   z1_merge_GlyphOrders.<locals>.<listcomp>.<listcomp>r*   )rK   )r   order)r   r+   rN      s   c                s    g | ]  fd dD qS )c                s    g | ]}|kr| n qS r*   r*   )rK   r   )r   r   r*   r+   rN      s   z1_merge_GlyphOrders.<locals>.<listcomp>.<listcomp>r*   )rK   )r   r   )r   r+   rN      s   )
rf   rw   rx   getReverseGlyphMap__getitem__rH   rV   r!   rc   r1   )r'   r[   Z
values_lstr   Z	dict_setsZcombinedZpaddedValuespaddedr*   )r   r   r   r+   _merge_GlyphOrders   s$    


r   c             C   s    |d j  |_ | || d S )Nr   )r:   copyrb   )r?   r)   r[   r*   r*   r+   r/      s    c             C   s    |d j  |_ | || d S )Nr   )r:   r   rb   )r?   r)   r[   r*   r*   r+   r/      s    c             C   sz   xt|D ]l}|d kst |tjks|jd ks||jjkr8q|jdkrH|jS |jdkrf|j|jj| S t| ddqW d S )Nr   ry   zsingle positioning lookup)subtable)	r;   r}   r~   r   r   r|   rz   indexr$   )r?   	subtablesr   r)   r*   r*   r+   %_Lookup_SinglePos_get_effective_value   s    



r   c       
      C   s   x|D ]}|d kst |tjks|jd ks||jjkr8q|jdkr||j|jj| }|j}x|D ]}|j	|krb|S qbW qq|jdkr|j
j|d}|jj|d}	|j| j|	 S t| ddqW d S )Nr   ry   r   zpair positioning lookup)r   )r;   r}   PairPosr   r   r|   PairSetr   PairValueRecordSecondGlyph	ClassDef1rt   rB   	ClassDef2Class1RecordClass2Recordr$   )
r?   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 rt fd
d	|D rt	
|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|_xnt|D ]b\}}xVt|D ]J\}}|| d k	rJq0t| | j| |}	|	d krpt	
}	|	||< q0W qW | |j| | j||dd t tjdd |jD d|_d S )Nc             S   s   g | ]
}|j qS r*   )r   )rK   ru   r*   r*   r+   rN     s    zmerge.<locals>.<listcomp>r   r   izsingle positioning lookup)r   c             s   s   | ]}|j d kV  qdS )r   N)r|   )rK   rL   r*   r*   r+   rM   "  s    zmerge.<locals>.<genexpr>c             3   s   | ]} |j jkV  qd S )N)r   r   )rK   rL   )coverageGlyphsr*   r+   rM   "  s    c             S   s   g | ]
}|j qS r*   )rz   )rK   rL   r*   r*   r+   rN   %  s    ry   c             S   s   g | ]}t |qS r*   )r   )rK   rL   r*   r*   r+   rN   +  s    c             S   s   g | ]}|j jqS r*   )r   r   )rK   rL   r*   r*   r+   rN   /  s    c             S   s   g | ]
}|j qS r*   )rz   )rK   rL   r*   r*   r+   rN   0  s    c                s   g | ]}t  qS r*   )r	   ValueRecord)rK   r{   )valueFormatr*   r+   rN   3  s    )r|   r   rz   r   r   )r\   c             S   s   g | ]}|  qS r*   )ZgetEffectiveFormat)rK   rL   r*   r*   r+   rN   G  s    )r   int__or__r   rc   r$   r   r   rV   r	   r   rz   rX   	getFormatr|   r   r'   r   re   r   lookup_subtablesrh   rb   )
r?   r)   r[   r   r   rg   r_   jr   rL   r*   )r   r   r+   r/     s<    ( 

c             C   s~  t | jdd |D dd |D \}}g  |_}xT|D ]L}t }||_| jrZt| jnd |_| j	rrt| j	nd |_
|| q6W t|j|_xt|D ]\}}	xt|D ]\}
}t }||_|	|
 d k	r|	|
 }nt| | j| |j|}|d krd\}}nt|dd }t|dd }| jr4tj| j|dnd |_| j	rRtj| j	|dnd |_
||	|
< qW qW |`| |j| d S )Nc             S   s   g | ]}d d |j D qS )c             S   s   g | ]
}|j qS r*   )r   )rK   rL   r*   r*   r+   rN   M  s    z$merge.<locals>.<listcomp>.<listcomp>)r   )rK   r   r*   r*   r+   rN   M  s    zmerge.<locals>.<listcomp>c             S   s   g | ]
}|j qS r*   )r   )rK   r   r*   r*   r+   rN   N  s    )NNValue1Value2)src)r   r'   r   r}   r   valueFormat1r	   r   r   valueFormat2r   r2   rc   PairValueCountre   r   r   _firstGlyphrA   rh   )r?   r)   r[   r   r   pvrsr   r   rg   r_   r   rL   ZvpairZv1Zv2r*   r*   r+   r/   I  s8    




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| _xt|| jD ]\}}||_qW || j| d S )Nc             S   s   g | ]}|j r|jd kqS )r   )r   ValueFormat2)rK   ru   r*   r*   r+   rN   q  s    z)_PairPosFormat1_merge.<locals>.<listcomp>zReport bug against fonttools.)r   r   PairSetCountValueFormat1r   )r\   r   c             S   s   g | ]}|j jqS r*   )r   r   )rK   rL   r*   r*   r+   rN     s    c             S   s   g | ]
}|j qS r*   )r   )rK   rL   r*   r*   r+   rN     s    )r   c             S   s   g | ]}t  qS r*   )r}   r   )rK   r{   r*   r*   r+   rN     s    )r   r1   rb   r}   r   r   r   r   r'   r   r   rc   r   rf   r   rh   )r)   r[   r?   emptyr   r   r   r   r*   r*   r+   _PairPosFormat1_mergep  s     
r   c       
      C   s   t | tr| }n| r | jr | jni }|r4t| nd}g }x t|d D ]}|t  qJW x"| D ]\}}|| 	| qhW |d krd |d< n:t| |d< }x(|dd  D ]}	|	
| ||	 qW |S )Nr   r   )ri   dictrt   maxr_   ranger2   rw   itemsaddintersection_updatedifference_update)
r)   	allGlyphsrt   rE   r   r{   rv   rL   Zclass0sr*   r*   r+   _ClassDef_invert  s     


r   c             C   s   t  }i  |_}|d k}|r,d gt|  }t }x>t| |D ]0\}}t||}|d krf|dd  }|| q@W |	 }	|r|	
dt  x4t|	D ](\}
}|
dkrqx|D ]}|
||< qW qW ||	fS )Nr   r   )r}   ZClassDefrt   rc   r   Z
Classifierrf   r   rx   Z
getClassesinsertrw   re   )r[   ZallGlyphsesr)   rt   ZallGlyphsesWasNoneZ
classifierZclassDefr   Zsetsclassesrg   classSetr   r*   r*   r+   _ClassDef_merge_classify  s(    


r   Fc             C   s0  dd |D }t dd |D dd |D \| _}t|| _g }xt||D ]\}}d }	t|jj}
|jj}g }x|D ]}t	t
|}||
krd }	|	d krt }	g  }|	_x^t|jD ]P}|rd }n8t }| jrt| jnd |_| jrt| jnd |_|| qW |	}n||d}|| }|| qxW || qNW |}~t dd |D \| _}t|| _g }xt||D ]\}}|jj}g }x|D ]x}|j}t }g  }|_xN|D ]F}|s|d }n t	t
|}||d}|| }|t| qW || qW || qW |}~|S )Nc             S   s   g | ]
}|j qS r*   )r   )rK   ru   r*   r*   r+   rN     s    z2_PairPosFormat2_align_matrices.<locals>.<listcomp>c             S   s   g | ]
}|j qS r*   )r   )rK   ru   r*   r*   r+   rN     s    c             S   s   g | ]}|j jqS r*   )r   r   )rK   ru   r*   r*   r+   rN     s    r   c             S   s   g | ]
}|j qS r*   )r   )rK   ru   r*   r*   r+   rN     s    )r   r   rc   Class1Countrf   rw   r   r   rt   nextiterr}   r   r   r   Class2Countr   r	   r   r   r   r   r2   rB   r   r   deepcopy)r)   r[   r'   transparentmatricesr   Znew_matricesru   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td|j| |dd t|jdd |D \}}|| j_x4t||jD ]$\}}|jj|krZ||d ksZtqZW t	| ||j}t
|d | _|| j| d S )	Nc             S   s   g | ]}|j r|jd kqS )r   )r   r   )rK   ru   r*   r*   r+   rN     s    z)_PairPosFormat2_merge.<locals>.<listcomp>zReport bug against fonttools.)r   r   r   r   r   r   r   r   )r\   c             S   s   g | ]}|j jqS r*   )r   r   )rK   rL   r*   r*   r+   rN     s    r   )r   r1   rb   r   r'   r   r   rf   r   r   rk   r   rh   )r)   r[   r?   r   r{   ru   r   r   r*   r*   r+   _PairPosFormat2_merge  s    	r   c             C   s|  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rx|jD ]T}xN|jD ]D}t|d	d }|d k	r|| O }t|d
d }|d k	r|| O }qW qW nt|jdkrlxf|jD ]\}	xT|	jD ]J}
t|
d	d }|d k	r>|| O }t|
d
d }|d k	r|| O }qW qW ||_||_d S )Nc             S   s   g | ]
}|j qS r*   )r   )rK   ru   r*   r*   r+   rN   &  s    zmerge.<locals>.<listcomp>r   c             S   s   g | ]
}|j qS r*   )r   )rK   ru   r*   r*   r+   rN   '  s    r   ry   zpair positioning lookup)r   r   r   )r   r   r   r   r   r   r   r|   r   r   r$   r   r   rA   r   r   r   )r?   r)   r[   Zvf1Zvf2ZpairSetZpairValueRecordZpv1Zpv2Zclass1RecordZclass2Recordr*   r*   r+   r/   $  s<      




MarkBasec                s  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 }	xt|t| D ]\}
}d	d |D }t|st||d
 |dnPt	
 }|d
 |_dd |D }t|rd }nt	 }d|_||| ||_|	| qW t	 }|	|_
t|	|_t| d | g }	xt|t| D ]\}
}t|rd }ntt	 d  }g }t| d |  fdd|D }x(|D ] }|d g| jt|   qW xFt| D ]:}t|rd }nt	 }d|_||| || qW |	| qpW tt	 d  }t| d |	 t| d t|	 t|  d | d S )Nc             s   s   | ]}|j V  qd S )N)
ClassCount)rK   ru   r*   r*   r+   rM   L  s    z,_MarkBasePosFormat1_merge.<locals>.<genexpr>c                s   g | ]}t | d  jqS )r   )rA   r   )rK   ru   )r   r*   r+   rN   P  s    z-_MarkBasePosFormat1_merge.<locals>.<listcomp>c                s   g | ]}t | d  jqS )Array)rA   
MarkRecord)rK   ru   )r   r*   r+   rN   Q  s    r   c                s   g | ]}t | d  jqS )r   )rA   r   )rK   ru   )r   r*   r+   rN   V  s    c                s$   g | ]}t t | d   d qS )r   Record)rA   )rK   ru   )r   r*   r+   rN   W  s    c             S   s   g | ]}|d k	r|j qS )N)Class)rK   rr*   r*   r+   rN   ]  s    r   )rO   rP   c             S   s   g | ]}|d krd n|j qS )N)
MarkAnchor)rK   r   r*   r*   r+   rN   t  s    r   r   r   Anchorc                s&   g | ]}|d krg nt | d qS )Nr   )rA   )rK   r   )r   r*   r+   rN     s   ZCount)r   r   r   r'   rA   r   rf   r   r   r}   r   r   r   r   r|   rX   r   r2   Z	MarkArrayrc   Z	MarkCountsetattrextend)r)   r[   r?   r   r   ZMarkCoverageGlyphsZMarkRecordsZBaseCoverageGlyphsZBaseRecordsZrecordsr   ZglyphRecordsZ
allClassesr   Z
allAnchorsZanchorZarrayZanchorsZglyphAnchorsru   r*   )r   r   r+   _MarkBasePosFormat1_mergeK  sf    





 
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 )N)r|   )rK   ru   r*   r*   r+   rM     s    zmerge.<locals>.<genexpr>zmark-to-base positioning lookupc             S   s   g | ]
}|j qS r*   )r|   )rK   ru   r*   r*   r+   rN     s    zmerge.<locals>.<listcomp>)r   rO   rP   r   )r   )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 )N)r|   )rK   ru   r*   r*   r+   rM     s    zmerge.<locals>.<genexpr>zmark-to-mark positioning lookupc             S   s   g | ]
}|j qS r*   )r|   )rK   ru   r*   r*   r+   rN     s    zmerge.<locals>.<listcomp>)r   rO   rP   r   ZMark1ZMark2)r   )r   r|   r#   r   r$   )r?   r)   r[   r*   r*   r+   r/     s    
c             C   s   t  }t  |_t|dd | D dd | D \}}||j_g  |_}x:t| D ].}x(|D ]}|d k	r\|| P q\W dsRtqRW t	|j|_
|S )Nc             S   s   g | ]}d d |j D qS )c             S   s   g | ]
}|j qS r*   )r   )rK   rL   r*   r*   r+   rN     s    z/_PairSet_flatten.<locals>.<listcomp>.<listcomp>)r   )rK   r   r*   r*   r+   rN     s    z$_PairSet_flatten.<locals>.<listcomp>c             S   s   g | ]
}|j qS r*   )r   )rK   r   r*   r*   r+   rN     s    F)r}   r   r   r   r   r   rf   r2   r1   rc   r   )r[   r'   r)   r   r   r   r_   rL   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   )rK   ru   r*   r*   r+   rN     s    z<_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>zReport bug against fonttools.r   c             S   s   g | ]
}|j qS r*   )r   )rK   ru   r*   r*   r+   rN     s    r   c             S   s   g | ]
}|j qS r*   )r   )rK   ru   r*   r*   r+   rN     s    c             S   s   g | ]}|j jqS r*   )r   r   )rK   rL   r*   r*   r+   rN     s    c             S   s   g | ]
}|j qS r*   )r   )rK   rL   r*   r*   r+   rN     s    c                s    g | ]}t d d |D  qS )c             S   s   g | ]}|d k	r|qS )Nr*   )rK   rL   r*   r*   r+   rN     s    zG_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>.<listcomp>)r   )rK   r_   )r'   r*   r+   rN     s   )r   r1   r}   r   r|   r   r   r   r   r   r   r   r   rf   r   rc   r   )r[   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  }|_xnt| D ]b}t }|| g |_|j}x>ttdd |D  D ]$}	ttdd |	D }
||
 qW qW |S )Nc             S   s   g | ]}|j r|jd kqS )r   )r   r   )rK   ru   r*   r*   r+   rN     s    z<_Lookup_PairPosFormat2_subtables_flatten.<locals>.<listcomp>zReport bug against fonttools.ry   c             S   s   g | ]
}|j qS r*   )r   )rK   ru   r*   r*   r+   rN     s    r   c             S   s   g | ]
}|j qS r*   )r   )rK   ru   r*   r*   r+   rN     s    c             S   s   g | ]}|j jqS r*   )r   r   )rK   rL   r*   r*   r+   rN     s    T)r   c             s   s   | ]}|j V  qd S )N)r   )rK   r   r*   r*   r+   rM     s    z;_Lookup_PairPosFormat2_subtables_flatten.<locals>.<genexpr>c             s   s   | ]}|d k	r|V  qd S )Nr*   )rK   cr*   r*   r+   rM     s    )r   r1   r}   r   r|   r   r   r   r   r   r   r   r   r   r   rf   r2   r   rk   r   r   )r[   r'   r)   r   r{   r   r   ZrowsrowZcolscolr*   r*   r+   (_Lookup_PairPosFormat2_subtables_flatten  s(    


r   c             C   s   t | } t| }d}x"||k r6| | jdkr6|d7 }qW t| d| |g| d|< t| }|}x&|dkr| |d  jdkr|d8 }qbW t| |d |g| |d< | S )zMerge 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   Nry   )rk   rc   r|   r   r   )r[   r'   ru   rg   r*   r*   r+   &_Lookup_PairPos_subtables_canonicalize  s    r   c             C   s   t |dd | D d \}}t|}t }d|_||_t |_||j_||_d g| |_	x| D ]}|jdkr|j	}xt|jjD ]}	|
|	}
t||j	|
< q~W q`|jdkr`x<t|jjD ],\}}	|j	| }|
|	}
t||j	|
< qW q`W |gS )Nc             S   s   g | ]}|j jqS r*   )r   r   )rK   rL   r*   r*   r+   rN     s    z7_Lookup_SinglePos_subtables_flatten.<locals>.<listcomp>ry   r   )r   rc   r}   r~   r|   r   r   r   r   rz   r   r   r   re   )r[   r'   Zmin_inclusive_rec_formatr   r{   Z
num_glyphsnewZ	singlePosZval_recgnamerg   r   r*   r*   r+   #_Lookup_SinglePos_subtables_flatten  s,    






r   c                s  dd |D  } _ xtt||||jfg D ]\}}|s>q0|d jjdr0tdd |D szt ddd |D dtdd |D st |d j	|_
d	d |D }|d d = || q0W |jot|jd tj}|rt|j j|_ fd
d|D  } _ n|jo&t|jd tj}|rdd |D tfddD sdd |D }	tt|	t|j j|_ fdd|D  } _ d}
nd}
 |j| t|j|_|rt|jdkr|jd jdkst|jd jjs|jd | jd8  _t|jdkr4|jd jdks8t|jd jjsb|jd | jd8  _ jjjdt  d}|dkrt!"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*   )SubTable)rK   ru   r*   r*   r+   rN   -  s    zmerge.<locals>.<listcomp>r   Z	Extensionc             S   s   g | ]
}|j qS r*   )rW   )rK   str*   r*   r+   rN   4  s    c             S   s   g | ]}|j jqS r*   )rW   r0   )rK   r   r*   r*   r+   rN   8  s    )rO   rP   c             S   s   g | ]
}|j qS r*   )ExtensionLookupType)rK   r   r*   r*   r+   rN   :  s    c             S   s   g | ]
}|j qS r*   )ZExtSubTable)rK   r   r*   r*   r+   rN   =  s    c                s   g | ]}t | jqS r*   )r   r'   )rK   r   )r?   r*   r+   rN   H  s    c             S   s   g | ]}t |qS r*   )rc   )rK   r   r*   r*   r+   rN   L  s    c                s   g | ]}| d  kqS )r   r*   )rK   Znums)numSubtablesr*   r+   rN   M  s    c             S   s   g | ]}|D ]
}|j qqS r*   )r   )rK   r   tr*   r*   r+   rN   Q  s    c                s   g | ]}t | jqS r*   )r   r'   )rK   r   )r?   mirfr*   r+   rN   V  s    TFr   r   ry   z0fontTools.otlLib.optimize.gpos:COMPRESSION_LEVEL)r   zCompacting GPOS...c             S   s   i | ]\}}||qS r*   r*   )rK   r   Z	valRecordr*   r*   r+   r   }  s   zmerge.<locals>.<dictcomp>r   SubTableCount)r\   )(r   rk   rf   r   rW   r0   
startswithr   r"   r   Z
LookupTyper   ri   r}   r   r   r'   r~   rV   r   r   r   rh   rc   r   r|   r1   r   r   popZcfgrB   r   loginfor   rz   r   r   rb   )r?   r)   r[   r   ru   stsZnew_stsZ	isPairPosZisSinglePosZvalueFormatListZ	flattenedlevelZsinglePosTabler   ZsinglePosMappingr*   )r?   r   r   r+   r/   +  sp    $

&&



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 )N)r&   r,   modellocationZ
getScalarsscalars)r)   r'   r   r   r*   r*   r+   r,     s    zInstancerMerger.__init__N)r0   rp   rq   __doc__r,   r*   r*   r*   r+   r     s   r   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)rK   ar*   r*   r+   rN     s    zmerge.<locals>.<listcomp>)r|   r1   r   r   r    interpolateFromMastersAndScalarsr   )r?   r)   r[   ZCoordsr   r   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*   )XCoordinate)rK   r   r*   r*   r+   rN     s    zmerge.<locals>.<listcomp>c             S   s   g | ]
}|j qS r*   )YCoordinate)rK   r   r*   r*   r+   rN     s    )r|   r1   r   r   r   r   r   r   )r?   r)   r[   ZXCoordsZYCoordsr   r   r*   r*   r+   r/     s    c                sh   | j }| j}xVdD ]N\ }t||r(tt| r fdd|D }t|||}t| | qW d S )N))XAdvance
XAdvDevice)YAdvance
YAdvDevice)
XPlacement
XPlaDevice)
YPlacement
YPlaDevicec                s   g | ]}t | d qS )r   )rA   )rK   r   )namer*   r+   rN     s    zmerge.<locals>.<listcomp>)r   r   rU   r1   r   r   r   )r?   r)   r[   r   r   	tableNamer_   r^   r*   )r  r+   r/     s    
c               @   s   e Zd ZdZdddZdS )MutatorMergerzA 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 )N)r&   r,   	instancerdeleteVariations)r)   r'   r
  r  r*   r*   r+   r,     s    zMutatorMerger.__init__N)T)r0   rp   rq   r   r,   r*   r*   r*   r+   r	    s   r	  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      i      r   )r:   r   r|   r
  DeviceTabler  DeltaFormatr1   	StartSizeEndSizer   r   )r?   r)   r[   r
  devvaridxdeltar*   r*   r+   r/     s    
c       
      C   s   |d j  |_ |jdkrd S | j}xdD ]}|d }t||sBq*t||}| jr\t|| |d krfq*|jdkstt	|j
d> |j }t|| }|d }	t||	t||	|  q*W | jrd|_d S )	Nr   r  ZXYr  i   r  r   r   )r:   r   r|   r
  rU   rA   r  delattrr  r1   r  r  r   r   )
r?   r)   r[   r
  rL   r  r  r  r  r5   r*   r*   r+   r/     s(    




c       	      C   s   |d j  |_ | j}xdD ]z\}}t||s0qt||}| jrJt|| |d krTq|jdksbt|j	d> |j
 }t|| }t||t||d|  qW d S )Nr   ))r   r   )r  r  )r  r  )r  r  i   r  )r:   r   r
  rU   rA   r  r  r  r1   r  r  r   r   )	r?   r)   r[   r
  r  r  r  r  r  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 )N)r&   r,   r   ZOnlineVarStoreBuilderstore_buildersetModel)r)   r   axisTagsr'   r*   r*   r+   r,     s    zVariationMerger.__init__c             C   s   || _ | j| d S )N)r   r  r  )r)   r   r*   r*   r+   r  #  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)rP   c             S   s   g | ]}|d k	qS )Nr*   )rK   rL   r*   r*   r+   rN   4  s    z/VariationMerger.mergeThings.<locals>.<listcomp>)
r   r   r(   r   r   ZgetSubModelr  superr  rX   )r)   rZ   r[   ZmasterModelZorigTTFsr   )rW   r*   r+   rX   '  s$    

zVariationMerger.mergeThings)r0   rp   rq   r   r,   r  rX   __classcell__r*   r*   )rW   r+   r    s   r  c             C   s0   t |r|d d fS | |\}}|t|fS )Nr   )r   storeMastersr   buildVarDevTable)r  master_valuesbasevarIdxr*   r*   r+   r  B  s    r  c             C   sF   |j dkrt| ddt| jdd |D \|_}|rBd|_ ||_d S )Nr   za baseline coordinate)r   c             S   s   g | ]
}|j qS r*   )r   )rK   r   r*   r*   r+   rN   L  s    zmerge.<locals>.<listcomp>r  )r|   r$   r  r  r   r  )r?   r)   r[   r  r*   r*   r+   r/   H  s    
c             C   sF   |j dkrt| ddt| jdd |D \|_}|rBd|_ ||_d S )Nr   za caret)r   c             S   s   g | ]
}|j qS r*   )r   )rK   r   r*   r*   r+   rN   U  s    zmerge.<locals>.<listcomp>r  )r|   r$   r  r  r   r  )r?   r)   r[   r  r*   r*   r+   r/   Q  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 anchor)r   c             S   s   g | ]
}|j qS r*   )r   )rK   r   r*   r*   r+   rN   ^  s    zmerge.<locals>.<listcomp>c             S   s   g | ]
}|j qS r*   )r   )rK   r   r*   r*   r+   rN   _  s    r  )r|   r$   r  r  r   r   XDeviceTableYDeviceTable)r?   r)   r[   r!  r"  r*   r*   r+   r/   Z  s    
c                sZ   xTdD ]L\ }t | rt| j fdd|D \}}t| | |rt||| qW d S )N))r   r   )r  r  )r  r  )r  r  c                s   g | ]}t | d qS )r   )rA   )rK   r   )r  r*   r+   rN   n  s    zmerge.<locals>.<listcomp>)rU   r  r  r   )r?   r)   r[   r  r^   ZdeviceTabler*   )r  r+   r/   e  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)
r  r,   varIndexCachevarIdxesrw   varTableIdslayerslayerReuseCacher   _doneBaseGlyphs)r)   r   r  r'   ZallowLayerReuser*   r*   r+   r,     s    zCOLRVariationMerger.__init__COLRc             C   s4   d|kr d|kr |  |d j t| ||| d S )Nr+  )expandPaintColrLayersrR   r  ro   )r)   r'   rm   rn   r*   r*   r+   ro     s    	zCOLRVariationMerger.mergeTablesc             C   s   dS )NTr*   )r{   r*   r*   r+   <lambda>      zCOLRVariationMerger.<lambda>c       
   	   C   s   |j }|j}d}y||}W n tk
r0   Y n
X ||}|sRt| t|j|d|}g }xD|D ]<}	t|	dd }y||}W n tk
r   Y nX || q`W t||st	| t|j||d|S )NF)r   r^   r|   )r   rO   rP   )
r|   
formatEnum
ValueErrorr$   r;   r0   rA   r2   r   r#   )
r)   rZ   r[   Zvalidatefmtr/  okrO   rP   rL   r*   r*   r+   checkFormatEnum  s6    

z#COLRVariationMerger.checkFormatEnumc                sr   xl|  D ]` y"| |   fdd|D  W q
 tk
rh } z|jd d  W d d }~X Y q
X q
W d S )Nc                s   g | ]}|  qS r*   )rB   )rK   rL   )rv   r*   r+   rN     s    z7COLRVariationMerger.mergeSparseDict.<locals>.<listcomp>[])rJ   rX   r%   rY   r2   )r)   rZ   r[   ra   r*   )rv   r+   mergeSparseDict  s    "z#COLRVariationMerger.mergeSparseDictc                sv   xp|D ]h t | } fdd|D }y| || W q tk
rl } z|jd    W d d }~X Y qX qW d S )Nc                s   g | ]}t | qS r*   )rA   )rK   r]   )r5   r*   r+   rN     s    z2COLRVariationMerger.mergeAttrs.<locals>.<listcomp>rT   )rA   rX   r%   rY   r2   )r)   rZ   r[   r6   r^   r_   ra   r*   )r5   r+   
mergeAttrs  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*   )rA   )rK   r]   )r5   r*   r+   rN     s    z;COLRVariationMerger.storeMastersForAttr.<locals>.<listcomp>FTc                s   g | ]}  |qS r*   )ZtoInt)rK   rL   )convr*   r+   rN     s    r   )	ZgetConverterByNameri   r
   r}   NO_VARIATION_INDEXr   r  r  ZfromInt)r)   rZ   r[   r5   r  Zis_fixed_size_float	baseValuer   r*   )r5   r8  r+   storeMastersForAttr  s    


z'COLRVariationMerger.storeMastersForAttr)returnc             C   s  t |}| j|}|d krjxLtt| jt| d D ].}| j||t|  |kr8| | j|< }P q8W |d krxftt|d ddD ]N}| j| d  |d | krt| j| }|| j|< | j||d   P qW |d krt| j | j|< }| j| |S )Nr   r   r   )tupler$  rB   r   rc   r%  r   )r)   r%  rS   varIndexBaserg   nr*   r*   r+   storeVariationIndices  s$     

z)COLRVariationMerger.storeVariationIndicesc       	      C   s`   t j}g }x4|D ],}| |||\}}t||| || qW tdd |D r\| |}|S )Nc             s   s   | ]}|t jkV  qd S )N)r}   r9  )rK   rL   r*   r*   r+   rM     s    z9COLRVariationMerger.mergeVariableAttrs.<locals>.<genexpr>)r}   r9  r;  r   r2   anyr@  )	r)   rZ   r[   r6   r>  r%  r5   r:  r   r*   r*   r+   mergeVariableAttrs  s    

z&COLRVariationMerger.mergeVariableAttrsc             C   s   xt |ddd dD ]n}|d }|j}t|j}| }|j|j |  |d j}|jd k	rt|t||j	|j< qt
||j	| qW d S )NTc             S   s   t t| d jdd d k	S )Nr   VarType)rA   r;   r^   )pathr*   r*   r+   r-    s    z?COLRVariationMerger.convertSubTablesToVarType.<locals>.<lambda>)Z	skip_rootZ	predicater   )r   r^   r;   rC  r:   rx   ZpopulateDefaultsr   rA   r  r   )clsrR   rD  r   ZsubTablevarTypeZnewSubTableparentr*   r*   r+   convertSubTablesToVarType  s    


z-COLRVariationMerger.convertSubTablesToVarTypec       	      C   s  | j s
dS t }g }x| jjD ]}|jg}x|r| }|jtjj	krJq,n|jtjj
krtt|| }t|}xJ|D ]B}t||krt|}t||kst|| |t| qtW ||_t||_n
|| }|t| q,W qW 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)	LayerListrw   BaseGlyphListBaseGlyphPaintRecordPaintr   r|   r}   PaintFormatZPaintColrGlyphPaintColrLayersrk   _flatten_layersrc   idr   r   r1   r2   r   FirstLayerIndex	NumLayersgetChildrenr   reversed
LayerCount)	colrZuniqueLayerIDsZnewLayerListr   ZfrontierpaintZchildrenZfirst_layer_indexZlayerr*   r*   r+   r,  %  s4    



z)COLRVariationMerger.expandPaintColrLayersN)T)r*  )r0   rp   rq   r   r,   ro   r3  r6  r7  r;  r   r@  rB  rr   rI  staticmethodr,  r*   r*   r*   r+   r#  t  s   	

 
r#  c                s   dd |j D }dd |D }xt| D ]t\} y"| |   fdd|D  W q, tk
r } z*|jd| d d |jd	<  W d d }~X Y q,X q,W d
| _d S )Nc             S   s   i | ]}||j qS r*   )	BaseGlyph)rK   r   r*   r*   r+   r   X  s    zmerge.<locals>.<dictcomp>c             S   s   g | ]}d d |j D qS )c             S   s   i | ]}||j qS r*   )rZ  )rK   r   r*   r*   r+   r   Y  s    z$merge.<locals>.<listcomp>.<dictcomp>)rL  )rK   rE   r*   r*   r+   rN   Y  s    zmerge.<locals>.<listcomp>c                s   g | ]}|  qS r*   )rB   )rK   rL   )r   r*   r+   rN   ^  s    z.BaseGlyphPaintRecord[r5  zbase glyph r   T)	rL  re   rJ   rX   r%   rY   r2   causer)  )r?   r)   r[   rZ   Zmastersrg   ra   r*   )r   r+   r/   U  s    "c             C   s&   | j stdt| j|_| j|_d S )Nz-BaseGlyphList must be merged before LayerList)r)  r1   rc   r'  rV  rM  )r?   r)   r[   r*   r*   r+   r/   g  s    c             c   sP   | j tjjkstx8| |D ]*}|j tjjkrBt||E d H  q|V  qW d S )N)r|   r}   rN  rO  r1   rT  rP  )rootrW  rX  r*   r*   r+   rP  q  s
    rP  c          
      s\  t t|jd j}tjtks,tfddttD }y|| W n0 t	k
r } z|j
d  W d 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 )r+  )rk   rP  r(   rR   )rK   rg   )r[   r)   r*   r+   rN     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*   )rK   ru   )listToColrLayersr*   r+   rN     s    zD_merge_PaintColrLayers.<locals>.listToColrLayers.<locals>.<listcomp>)ri   rk   r}   rM  r   rN  rO  r|   rc   rS  r'  rR  r   r(  r   )rX  r'  )r]  r)   r*   r+   r]    s    


z0_merge_PaintColrLayers.<locals>.listToColrLayersc                s   g | ]} |qS r*   r*   )rK   ru   )r]  r*   r+   rN     s    r   r   )rk   rP  r'   rR   rc   r(   r1   r   rh   r%   rY   r2   r(  Z	try_reuser   r   r|   r}   rN  rO  rS  rR  r'  r   r   )r)   rZ   r[   Z
out_layersZmaster_layersesra   Zis_treer*   )r]  r[   r)   r+   _merge_PaintColrLayersz  s.    
"
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pt fdd|D }|rr||_|r҈ | |d k	stt||_d S )	Nc             S   s
   |    S )N)Zis_variable)r1  r*   r*   r+   r-    r.  zmerge.<locals>.<lambda>r*   c             3   s   | ]}|j  kr|j V  qd S )N)r  )rK   r   )varAttrsr*   r+   rM     s    zmerge.<locals>.<genexpr>c             S   s   g | ]
}|j qS r*   )r^   )rK   r   r*   r*   r+   rN     s    zmerge.<locals>.<listcomp>c             3   s   | ]}t | jkV  qd S )N)rQ  r&  )rK   rR   )r?   r*   r+   rM     s    )r3  r}   rN  rO  r^  Zas_variabler	   getVariableAttrsr;   getConvertersr7  rB  ZiterSubTablesr9  rA  VarIndexBaserI  r1   r   r|   )	r?   r)   r[   r1  Z	varFormatstaticAttrsr>  Z	subTablesZ
isVariabler*   )r?   r_  r+   r/     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 )N)r  )rK   r   )r_  r*   r+   rM     s    zmerge.<locals>.<genexpr>)r;   rC  r	   r`  ra  r7  rB  r}   r9  rb  r&  r   rQ  )r?   r)   r[   rG  rc  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 )N)r  )rK   r   r*   r*   r+   rM     s    zmerge.<locals>.<genexpr>c             3   s   | ]}t | jkV  qd S )N)rQ  r&  )rK   stop)r?   r*   r+   rM     s    )r7  ra  rA  	ColorStoprI  r&  r   rQ  )r?   r)   r[   r*   )r?   r+   r/     s    
Zclipsc             C   s   |  || d S )N)r6  )r?   r)   r[   r*   r*   r+   r/     s    )NN)N)N)F)r   r   )ir   osr   r<   operatorr   Z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   Z	getLoggerr   errorsr   r   r   r   r   r    r!   r"   r#   r$   r%   objectr&   rs   r?   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Lookupr   Z
CaretValuer	  r  r  Z	BaseCoordr#  rK  rJ  rP  r^  rM  ZClipBoxZ	Affine2x3re  Z	ColorLineZClipListr*   r*   r*   r+   <module>   s   
4s
"/'


D'
R_

(		 b
	D*	