a
    ׶ar                     @   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Z1e12ej3ddd Z4dd Z5dRddZ6dd Z7dd  Z8e12ej9d!d Z4e12ej:d"d Z4d#d$ Z;dSd%d&Z<dTd'd(Z=dUd*d+Z>d,d- Z?e12ej@d.d Z4dVd1d2ZAe12ejBd3d Z4e12ejCd4d Z4d5d6 ZDd7d8 ZEd9d: ZFd;d< ZGd=d> ZHe12ejId?d Z4G d@dA dAe1ZJeJ2ejKdBd Z4eJ2ejLdCd Z4eJ2ejMdDd Z4G dEdF dFe1ZNeN2ejKdGd Z4eN2ejLdHd Z4eN2ejMdId Z4G dJdK dKe1ZOdLdM ZPeO2ejQdNd Z4eO2ejKdOd Z4eO2ejLdPd Z4eO2e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$   g/Users/vegardjervell/Documents/master/model/venv/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 rqt| } fdd|D }| |}	|	| || qW 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 ||st| ||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|st| |d |d  gd	|sd | < 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sJ  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_setsZ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 rt fd
d	|D rt	
|_| |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r:q t| | j| |}	|	d u r`t	
}	|	||< 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   ir   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\   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 rd\}}nt|dd }t|dd }| jr*tj| j|dnd |_| j	rHtj| j	|dnd |_
||	|
< qq|`| |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   3  rJ   z$merge.<locals>.<listcomp>.<listcomp>r   r   r$   r$   r%   rK   3  rJ   rx   c                 S   s   g | ]
}|j qS r$   r   r   r$   r$   r%   rK   4  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(   /  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   W  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   e  rJ   c                 S   s   g | ]
}|j qS r$   r   rE   r$   r$   r%   rK   f  rJ   )r   c                 S   s   g | ]}t  qS r$   )r   r   r   r$   r$   r%   rK   j  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_mergeV  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 rd |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_invertq  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rq|D ]}|
||< qq||	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}|rd }n8t }| jrt| jnd |_| jrt| 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 }qqnl|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|st||d
 |dnPt	
 }|d
 |_dd |D }t|rd }nt	 }d|_||| ||_|	| qt	 }|	|_
t|	|_t| d | g }	t|t| D ]\}
}t|rd }ntt	 d  }g }t| d |  fdd|D }|D ] }|d g| jt|   qt| D ]:}t|rd }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   2  rJ   z,_MarkBasePosFormat1_merge.<locals>.<genexpr>c                    s   g | ]}t | d  jqS r   r9   r   rv   r   r$   r%   rK   6  rJ   z-_MarkBasePosFormat1_merge.<locals>.<listcomp>c                    s   g | ]}t | d  jqS )Array)r9   
MarkRecordrv   r   r$   r%   rK   7  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   C  rJ   r   rL   c                 S   s   g | ]}|d u rd n|j qS r    )
MarkAnchorr   r$   r$   r%   rK   Z  rJ   r   r   r   Anchorc                    s&   g | ]}|d u rg nt | d qS )Nr  rP   r   r   r$   r%   rK   q  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arrayZanchorsZglyphAnchorsrw   r$   )r   r   r%   _MarkBasePosFormat1_merge1  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 }
||
 qq|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 )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   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	|
< qq^|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 st |d j	|_
d	d |D }|d d = || q.|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sJ |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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$   )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   2  rJ   c                    s   g | ]}| d  kqS r   r$   )rF   nums)numSubtablesr$   r%   rK   3  rJ   c                 S   s   g | ]}|D ]
}|j qqS r$   r   )rF   r  tr$   r$   r%   rK   7  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"   r.  r/  r$   r$   r%   r&   p  s    zInstancerMerger.__init__Nr)   rq   rr   __doc__r&   r$   r$   r$   r%   r-  l  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   y  rJ   rx   )r   r.  r0  r    interpolateFromMastersAndScalarsr4  )r7   r#   r[   ZCoordsr.  r0  r$   r$   r%   r(   v  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$   XCoordinater5  r$   r$   r%   rK     rJ   rx   c                 S   s   g | ]
}|j qS r$   YCoordinater5  r$   r$   r%   rK     rJ   )r   r.  r0  r   r7  r9  r;  )r7   r#   r[   ZXCoordsZYCoordsr.  r0  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   r5  namer$   r%   rK     rJ   rx   )r.  r0  rU   r   r7  r  )r7   r#   r[   r.  r0  	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 r    )r   r&   	instancerdeleteVariations)r#   r"   rA  rB  r$   r$   r%   r&     s    zMutatorMerger.__init__N)Tr1  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sFJ |jd> |j }t	|| }| j
|7  _
| jr|d|_d S )Nr            r   )r4   r   r   rA  DeviceTablerB  DeltaFormat	StartSizeEndSizer   r4  )r7   r#   r[   rA  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rd|_d S )	Nr   rC  ZXYrF  rD  rE  r4  r   )r4   r   r   rA  rU   r9   rB  delattrrG  rH  rI  r   r  )
r7   r#   r[   rA  rG   r?  rJ  rK  rL  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<  rD  rE  )r4   r   rA  rU   r9   rB  rM  rG  rH  rI  r   r  )	r7   r#   r[   rA  r>  r?  rJ  rK  rL  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#   r.  ZaxisTagsr"   r$   r$   r%   r&      s    zVariationMerger.__init__c                 C   s   || _ | j| d S r    )r.  rO  rP  )r#   r.  r$   r$   r%   rP    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   r.  ZgetSubModelrP  superrN  rX   )r#   rZ   r[   ZmasterModelr.  r  r$   r%   rX   	  s    
zVariationMerger.mergeThings)r)   rq   rr   r2  r&   rP  rX   __classcell__r$   r$   r  r%   rN    s   rN  c                 C   s0   t |r|d d fS | |\}}|t|fS )Nr   )r   ZstoreMastersr   buildVarDevTable)rO  Zmaster_valuesbaseZvarIdxr$   r$   r%   rS    s    rS  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$   r3  r5  r$   r$   r%   rK   $  rJ   rx   rC  r   r   rS  rO  r4  rF  r7   r#   r[   rF  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$   r3  r5  r$   r$   r%   rK   -  rJ   rx   rC  rU  rV  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$   r8  r5  r$   r$   r%   rK   6  rJ   rx   c                 S   s   g | ]
}|j qS r$   r:  r5  r$   r$   r%   rK   7  rJ   rC  )r   r   rS  rO  r9  r;  XDeviceTableYDeviceTable)r7   r#   r[   rW  rX  r$   r$   r%   r(   2  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   r5  r=  r$   r%   rK   F  rJ   rx   )rU   rS  rO  r  )r7   r#   r[   r?  r^   ZdeviceTabler$   r=  r%   r(   =  s    
)NN)N)N)F)r   r   )Rr2  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   r@  rN  rS  Z	BaseCoordr$   r$   r$   r%   <module>   s   
0m

"

-

&


D

&
R





Z

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


