o
    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<dSd'd(Z=dTd*d+Z>d,d- Z?e12ej@d.d Z4dUd1d2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 )Vz4
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$   9/usr/lib/python3/dist-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rft tkr" f  fdd}|S )NzSubclass Merger instead.mergersc                    sn   | j dksJ g }D ])}||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)methodZdoneZclazzr'   attrattrscelfclazzesr$   r%   wrapper5   s   



zMerger.merger.<locals>.wrapper)r   __dict__r'   typestr)r0   r1   r/   r2   r$   r.   r%   merger,   s   
zMerger.mergerc                 C   sR   t |}|  D ]} t| dd }|d u r |S | j|d }|d ur&|  S q|S )Nr'   )r4   mrogetattrr'   get)r0   thingZ_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 s6t| dd |D d| |}|d| j	j
}z'D ]!  |v rMqFt| } fdd|D }| |}	|	| || qFW d S  ty }
 z	|
jd	    d }
~
ww )
NensureDecompiledc                 3   s$    | ]} t t| kV  qd S r    sortedvarskeys.0vrB   r$   r%   	<genexpr>Z   s   " z&Merger.mergeObjects.<locals>.<genexpr>c                 S   s   g | ]
}t t| qS r$   r?   rC   r$   r$   r%   
<listcomp>\       z'Merger.mergeObjects.<locals>.<listcomp>expectedgot*c                    s   g | ]}t | qS r$   r8   )rD   tablekeyr$   r%   rH   d       .)hasattrr>   r@   rA   rB   allr   r=   r9   	__class__mergeThingsr8   r   stackr*   )r#   outlstexcludeitemr'   ZdefaultMergervaluevalues
mergerFuncer$   )rQ   rB   r%   mergeObjectsS   s4   




zMerger.mergeObjectsc                 C   s   t ||tst| t|dd |D dtt|t| D ]#\}\}}z| || W q ty@ } z	|jd|   d }~ww d S )Nc                 S      g | ]}t |qS r$   lenrD   xr$   r$   r%   rH   m       z%Merger.mergeLists.<locals>.<listcomp>rJ   z[%d])	r   rd   r   	enumerateziprW   r   rX   r*   )r#   rY   rZ   ir]   r^   r`   r$   r$   r%   
mergeListsk   s   zMerger.mergeListsc                 C   s   t ||tst| t|jdd |D d| |d d }|d ur*|| || d S t|dr7| || d S t|t	rD| 
|| d S t ||sPt| ||dd S )Nc                 S   s   g | ]}t |jqS r$   )r4   r)   re   r$   r$   r%   rH   y   rR   z&Merger.mergeThings.<locals>.<listcomp>rJ   r3   )r   r4   r   r)   r=   r9   rT   ra   
isinstancelistrk   r   )r#   rY   rZ   r_   r$   r$   r%   rW   u   s   


zMerger.mergeThingsc                    st   |D ]5  |vr	qz fdd|D | _ | |   fdd|D  W q ty7 } z|j   d }~ww d S )Nc                    s   g | ]} |v r|qS r$   r$   rD   r<   tagr$   r%   rH          z&Merger.mergeTables.<locals>.<listcomp>c                    s    g | ]} |v r|  nd qS r    r$   rn   ro   r$   r%   rH          )ZttfsrW   r   rX   r*   )r#   r"   Zmaster_ttfsZ	tableTagsr`   r$   ro   r%   mergeTables   s   
zMerger.mergeTables)r    )r$   )r)   
__module____qualname__r&   classmethodr6   r=   ra   rk   rW   rs   r$   r$   r$   r%   r   '   s    


r   c                   @   s   e Zd ZdS )AligningMergerN)r)   rt   ru   r$   r$   r$   r%   rw      s    rw   ZGlyphClassDefc                    s   |d u rt |st| d |dd S dd |D }i |_|j}t }|jdd |D   |D ]+ t fdd|D }t|sKt| |d |d  gd	|sRd | < q-|d | < q-d S )
NrJ   c                 S      g | ]}|j qS r$   )	classDefsrD   lr$   r$   r%   rH          merge.<locals>.<listcomp>c                 S      g | ]}|  qS r$   rF   rz   r$   r$   r%   rH      rg   c                 3   s    | ]}|  V  qd S r    )r9   rz   kr$   r%   rG          merge.<locals>.<genexpr>r   rS   )rK   rL   rX   )r   ZNotANonery   setupdater   r   r   )r6   r#   rZ   ZallKeysZ	allValuesr$   r   r%   r(      s"   
r(   c                    sT    j dkr S t }d|_  j|_ j|_ fdd|jjD |_t|j|_|S )N   c                    s   g | ]} j qS r$   ValuerD   _r#   r$   r%   rH      r|   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 s7t ~d}|du rL fdd|D }|fS t|t|ksVJ  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   rb   r$   )r   rz   r$   r$   r%   rH      rg   z&_merge_GlyphOrders.<locals>.<listcomp>c                 S   s$   g | ]\}}d d t ||D qS )c                 S      i | ]\}}||qS r$   r$   )rD   grE   r$   r$   r%   
<dictcomp>   rR   z1_merge_GlyphOrders.<locals>.<listcomp>.<dictcomp>)ri   )rD   r{   vsr$   r$   r%   rH         $ rP   c                 3   s     | ]}t | d |kV  qdS )rP   N)r@   rD   r   )sortKeyr$   r%   rG      s    z%_merge_GlyphOrders.<locals>.<genexpr>c                        g | ]  fd dD qS )c                    s   g | ]
}|v r
|n qS r$   r$   rD   glyphdefaultdict_setr$   r%   rH      s    1_merge_GlyphOrders.<locals>.<listcomp>.<listcomp>r$   rD   r   orderr   r%   rH      
    
c                    r   )c                    s    g | ]}|v r| n qS r$   r$   r   r   r$   r%   rH      rr   r   r$   r   r   r   r%   rH      r   )	ri   r   r   getReverseGlyphMap__getitem__r@   rU   r   rd   )r"   rZ   Z
values_lstr   Z	dict_setsZcombinedZpaddedValuespaddedr$   )r   r   r   r%   _merge_GlyphOrders   s*   

r   c                 C   s|   |D ]9}|d u st |tjks|jd u s||jjvrq|jdkr%|j  S |jdkr6|j|jj|   S t| ddd S )Nr   r   single positioning lookupsubtable)	r4   r   r   r   r   r   r   indexr   )r6   	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rq|jdkr>|j|jj| }|j}|D ]}|j	|kr<|    S q/q|jdkr]|j
j|d}|jj|d}	|j| j|	   S t| ddd S )Nr   r   r   pair positioning lookupr   )r4   r   PairPosr   r   r   PairSetr   PairValueRecordSecondGlyph	ClassDef1ry   r9   	ClassDef2Class1RecordClass2Recordr   )
r6   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s!d@ dks!t| dd|jj tdd	 |D rSt fd
d	|D rSt	
|_| |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 ]!\}}|| d urqt| | j| |}	|	d u rt	
}	|	||< qq| |j| | j||dd t tjdd |jD d|_d S )Nc                 S   rx   r$   r   rz   r$   r$   r%   rH     r|   r}   r   r   ir   r   c                 s   s    | ]}|j d kV  qdS )r   Nr   rC   r$   r$   r%   rG   	  r   r   c                 3   s    | ]	} |j jkV  qd S r    r   r   rC   )coverageGlyphsr$   r%   rG   	      c                 S   rx   r$   r   rC   r$   r$   r%   rH     r|   r   c                 S   rb   r$   )r   rC   r$   r$   r%   rH     rg   c                 S      g | ]}|j jqS r$   r   rC   r$   r$   r%   rH     rg   c                 S   rx   r$   r   rC   r$   r$   r%   rH     r|   c                    s   g | ]}t  qS r$   )r   ValueRecordr   )valueFormatr$   r%   rH     rR   )r   r   r   r   r[   c                 S   r~   r$   )ZgetEffectiveFormatrC   r$   r$   r%   rH   -  rg   )r   int__or__r   rd   r   r   r   rU   r   r   r   rW   	getFormatr   r   r"   r   rh   r   lookup_subtablesrk   ra   )
r6   r#   rZ   r   r   rj   r^   jr   rE   r$   )r   r   r%   r(     s>   (

 c                 C   sl  t | jdd |D dd |D \}}g  |_}|D ]&}t }||_| jr,t| jnd |_| j	r8t| j	nd |_
|| qt|j|_t|D ]_\}}	t|D ]V\}
}t }||_|	|
 d uri|	|
 }nt| | j| |j|}|d u r}d\}}nt|dd }t|dd }| jrtj| j|dnd |_| j	rtj| j	|dnd |_
||	|
< qSqK|`| |j| d S )Nc                 S      g | ]
}d d |j D qS )c                 S   rx   r$   r   rC   r$   r$   r%   rH   3  r|   z$merge.<locals>.<listcomp>.<listcomp>r   r   r$   r$   r%   rH   3  rI   r}   c                 S   rx   r$   r   r   r$   r$   r%   rH   4  r|   NNValue1Value2)src)r   r"   r   r   r   valueFormat1r   r   r   valueFormat2r   r*   rd   PairValueCountrh   r   r   _firstGlyphr8   rk   )r6   r#   rZ   r   r   pvrsr   r   rj   r^   r   rE   ZvpairZv1Z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 ]\}}||_qL|| j| d S )Nc                 S      g | ]
}|j r|jd kqS r   r   ValueFormat2rz   r$   r$   r%   rH   W  rI   z)_PairPosFormat1_merge.<locals>.<listcomp>Report bug against fonttools.)r   r   PairSetCountValueFormat1r   r   r   c                 S   r   r$   r   rC   r$   r$   r%   rH   e  rg   c                 S   rx   r$   r   rC   r$   r$   r%   rH   f  r|   )r   c                 S   s   g | ]}t  qS r$   )r   r   r   r$   r$   r%   rH   j  rg   )r   ra   r   r   r   r   r   r"   r   r   rd   r   ri   r   rk   )r#   rZ   r6   emptyr   r   r   r   r$   r$   r%   _PairPosFormat1_mergeV  s$   
r   c           
      C   s   t | tr| }n
| r| jr| jni }|rt| nd}g }t|d D ]}|t  q$| D ]\}}|| 	| q1|d u rGd |d< |S t| |d< }|dd  D ]}	|	
| ||	 qU|S )Nr   r   )rl   dictry   maxr^   ranger*   r   itemsaddintersection_updatedifference_update)
r#   	allGlyphsry   r<   r   r   r   rE   Zclass0sr$   r$   r%   _ClassDef_invertq  s"   
	
r   c                 C   s   t  }i  |_}|d u }|rd gt|  }t }t| |D ]\}}t||}|d u r2|dd  }|| q|	 }	|rE|	
dt  t|	D ]\}
}|
dkrRqI|D ]}|
||< qTqI||	fS )Nr   r   )r   ZClassDefry   rd   r   Z
Classifierri   r   r   Z
getClassesinsertr   rh   )rZ   ZallGlyphsesr#   ry   ZallGlyphsesWasNoneZ
classifierZclassDefr   Zsetsclassesrj   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 ]u\}}d }	t|jj}
|jj}g }|D ][}t	t
|}||
vrd }	|	d u rt }	g  }|	_t|jD ](}|r`d }nt }| jrmt| jnd |_| jryt| jnd |_|| qY|	}n
||d}|| }|| q9|| q%|}~t dd |D \| _}t|| _g }t||D ]I\}}|jj}g }|D ]7}|j}t }g  }|_|D ]!}|s|d }nt	t
|}||d}|| }|t| q|| q|| q|}~|S )Nc                 S   rx   r$   )r   rz   r$   r$   r%   rH     r|   z2_PairPosFormat2_align_matrices.<locals>.<listcomp>c                 S   rx   r$   )r   rz   r$   r$   r%   rH     r|   c                 S   r   r$   r   rz   r$   r$   r%   rH     rg   r   c                 S   rx   r$   )r   rz   r$   r$   r%   rH     r|   )r   r   rd   Class1Countri   r   r   r   ry   nextiterr   r   r   r   Class2Countr   r   r   r   r   r   r*   r9   r   copydeepcopy)r#   rZ   r"   transparentmatricesr   Znew_matricesr{   matrixZnullRowZcoverageZ	classDef1Zclass1Recordsr   ZexemplarGlyphZclass2recordsr   Zrec2Zrec1klassZ	classDef2Zrec1oldZoldClass2RecordsZrec1newZclass2Recordsr$   r$   r%   _PairPosFormat2_align_matrices  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r>||d ks>J q,t| ||j}t	|d | _
|| j
| d S )	Nc                 S   r   r   r   r   rz   r$   r$   r%   rH     rI   z)_PairPosFormat2_merge.<locals>.<listcomp>r   )r   r   r   r   r   r   r   r   r   c                 S   r   r$   r   rC   r$   r$   r%   rH     rg   r   )r   ra   r   r"   r   r   ri   r   r   rm   r   rk   )r#   rZ   r6   r   r   r{   r   r   r$   r$   r%   _PairPosFormat2_merge  s   	r   c                 C   sb  t tjdd |D d | _|_t tjdd |D d | _|_|jdkr,t|||  n|jdkr8t	|||  nt
| dd| `| `d}d}|jdkrx|jD ](}|jD ]"}t|d	d }|d ure|| O }t|d
d }|d uru|| O }qSqNn1|jdkr|jD ](}	|	jD ]"}
t|
d	d }|d ur|| O }t|
d
d }|d ur|| O }qq||_||_d S )Nc                 S   rx   r$   r   rz   r$   r$   r%   rH     r|   r}   r   c                 S   rx   r$   r   rz   r$   r$   r%   rH     r|   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r   r   r   )r6   r#   rZ   Zvf1Zvf2ZpairSetZpairValueRecordZpv1Zpv2Zclass1RecordZclass2Recordr$   r$   r%   r(   
  sF     








MarkBasec                    sj  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 |D }t|sit||d
 |dt	
 }|d
 |_dd |D }t|rd }nt	 }d|_||| ||_|	| qQt	 }|	|_
t|	|_t| d | g }	t|t| D ]]\}
}t|rd }nMtt	 d  }g }t| d |  fdd|D }|D ]}|d g| jt|   qt| D ]}t|rd }nt	 }d|_||| || q|	| qtt	 d  }t| d |	 t| d t|	 t|  d | d S )Nc                 s       | ]}|j V  qd S r    )
ClassCountrz   r$   r$   r%   rG   2      z,_MarkBasePosFormat1_merge.<locals>.<genexpr>c                       g | ]
}t | d  jqS r   r8   r   rz   r   r$   r%   rH   6  rI   z-_MarkBasePosFormat1_merge.<locals>.<listcomp>c                    r  )Array)r8   
MarkRecordrz   r  r$   r%   rH   7  rI   r   c                    r  r  r  rz   r  r$   r%   rH   <  rI   c                    s$   g | ]}t t | d   d qS )r	  RecordrN   rz   r  r$   r%   rH   =  r   c                 S   s   g | ]	}|d ur|j qS r    )ClassrD   rr$   r$   r%   rH   C  s    r   rJ   c                 S   s   g | ]}|d u r
d n|j qS r    )
MarkAnchorr  r$   r$   r%   rH   Z  s    r   r	  r  Anchorc                    s&   g | ]}|d u r
g nt | d qS )Nr  rN   r  r  r$   r%   rH   q  s    ZCount)r   r  r   r"   r8   r   ri   r   r   r   r
  r  r   r  r   rW   r  r*   Z	MarkArrayrd   Z	MarkCountsetattrextend)r#   rZ   r6   r   r  ZMarkCoverageGlyphsZMarkRecordsZBaseCoverageGlyphsZBaseRecordsZrecordsr   ZglyphRecordsZ
allClassesr   Z
allAnchorsZanchorZarrayZanchorsZglyphAnchorsr{   r$   )r  r   r%   _MarkBasePosFormat1_merge1  sp   


r  c                 C   sX   t |jdd |D st| d|jdd |D d|jdkr&t|||  d S t| dd)	Nc                 s   r  r    r   rz   r$   r$   r%   rG     r  r   zmark-to-base positioning lookupc                 S   rx   r$   r   rz   r$   r$   r%   rH     r|   r}   r   rK   rL   r   r   r   r   ZInconsistentFormatsr  r   r6   r#   rZ   r$   r$   r%   r(     s   
c                 C   s\   t |jdd |D st| d|jdd |D d|jdkr(t||| dd	 d S t| dd
)Nc                 s   r  r    r   rz   r$   r$   r%   rG     r  r   zmark-to-mark positioning lookupc                 S   rx   r$   r   rz   r$   r$   r%   rH     r|   r}   r  r   ZMark1ZMark2r   r  r  r$   r$   r%   r(     s   
c                 C   s   t  }t  |_t|dd | D dd | D \}}||j_g  |_}t| D ]}|D ]}|d ur9||  nq,J q(t|j|_	|S )Nc                 S   r   )c                 S   rx   r$   r   rC   r$   r$   r%   rH     r|   z/_PairSet_flatten.<locals>.<listcomp>.<listcomp>r   r   r$   r$   r%   rH     rI   z$_PairSet_flatten.<locals>.<listcomp>c                 S   rx   r$   r   r   r$   r$   r%   rH     r|   )
r   r   r   r   r   r   ri   r*   rd   r   )rZ   r"   r#   r   r   r   r^   rE   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   r   r   r   rz   r$   r$   r%   rH     rI   z<_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>r   r   c                 S   rx   r$   r   rz   r$   r$   r%   rH     r|   r   c                 S   rx   r$   r   rz   r$   r$   r%   rH     r|   c                 S   r   r$   r   rC   r$   r$   r%   rH     rg   c                 S   rx   r$   r   rC   r$   r$   r%   rH     r|   c                    s    g | ]}t d d |D  qS )c                 S   s   g | ]}|d ur|qS r    r$   rC   r$   r$   r%   rH     rq   zG_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>.<listcomp>)r  )rD   r^   r!   r$   r%   rH     rr   )r   r   r   r   r   r   r   r   r   r   r   r   ri   r   rd   r   )rZ   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 }
||
 qpqT|S )Nc                 S   r   r   r   rz   r$   r$   r%   rH     rI   z<_Lookup_PairPosFormat2_subtables_flatten.<locals>.<listcomp>r   r   c                 S   rx   r$   r   rz   r$   r$   r%   rH     r|   r   c                 S   rx   r$   r   rz   r$   r$   r%   rH     r|   c                 S   r   r$   r   rC   r$   r$   r%   rH     rg   T)r   c                 s   r  r    )r   r  r$   r$   r%   rG     r  z;_Lookup_PairPosFormat2_subtables_flatten.<locals>.<genexpr>c                 s   s    | ]	}|d ur|V  qd S r    r$   )rD   cr$   r$   r%   rG     r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   ri   r*   r   rm   r   r   )rZ   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}||k r$| | jdkr$|d7 }||k r$| | jdkst| d| |g| d|< t| }|}|dkrV| |d  jdkrV|d8 }|dkrV| |d  jdksEt| |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   )rm   rd   r   r  r  )rZ   r"   r{   rj   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 ]A}|jdkrN|j	}|jjD ]}	|
|	}
t||j	|
< q=q/|jdkrpt|jjD ]\}}	|j	| }|
|	}
t||j	|
< qYq/|gS )Nc                 S   r   r$   r   rC   r$   r$   r%   rH     rg   z7_Lookup_SinglePos_subtables_flatten.<locals>.<listcomp>r   r   )r   rd   r   r   r   r   r   r   r   r   r   r   r   rh   )rZ   r"   Zmin_inclusive_rec_formatr   r   Z
num_glyphsnewZ	singlePosZval_recgnamerj   r   r$   r$   r%   #_Lookup_SinglePos_subtables_flatten  s2   





r!  c                    s  dd |D  } _ tt||||jfg D ]I\}}|sq|d jjdr`tdd |D s<t ddd |D dtdd |D sIt |d j	|_
d	d |D }|d d = || q|jolt|jd tj}|rt|j j|_ fd
d|D  } _ nG|jot|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|_|rMt|jdkr|jd jdksJ |jd jjs|jd | jd8  _t|jdkr|jd jdksJ |jd jjs)|jd | jd8  _tjt t!}|rL|dkrLt"#d t$ j||j|_t|j|_n#|rp|
rp|jd }|jj}dd t||j%D }t&| j' |_ j(||ddgd  ` d S )Nc                 S   rx   r$   )SubTablerz   r$   r$   r%   rH     r|   r}   r   Z	Extensionc                 S   rx   r$   rV   rD   str$   r$   r%   rH     r|   c                 S   r   r$   )rV   r)   r$  r$   r$   r%   rH     rg   rJ   c                 S   rx   r$   )ExtensionLookupTyper$  r$   r$   r%   rH      r|   c                 S   rx   r$   )ZExtSubTabler$  r$   r$   r%   rH   #  r|   c                    s   g | ]}t | jqS r$   )r  r"   r$  )r6   r$   r%   rH   .  rq   c                 S   rb   r$   rc   r$  r$   r$   r%   rH   2  rg   c                    s   g | ]}| d  kqS r   r$   )rD   Znums)numSubtablesr$   r%   rH   3  rq   c                 S   s   g | ]
}|D ]}|j qqS r$   r   )rD   r%  tr$   r$   r%   rH   7  rI   c                    s   g | ]	}t | jqS r$   )r!  r"   r$  )r6   mirfr$   r%   rH   ;  s    TFr   r   r   0zCompacting GPOS...c                 S   r   r$   r$   )rD   r   Z	valRecordr$   r$   r%   r   _  s    zmerge.<locals>.<dictcomp>r"  SubTableCountr   ))r   rm   ri   r"  rV   r)   
startswithr   r   r&  Z
LookupTyper  rl   r   r   r  r"   r   rU   r   r   r!  rk   rd   r+  r   r   r   poposenvironr9   r   r   loginfor   r   r   r   ra   )r6   r#   rZ   r   r{   stsZnew_stsZ	isPairPosZisSinglePosZvalueFormatListZ	flattenedmodeZsinglePosTabler   ZsinglePosMappingr$   )r6   r)  r'  r%   r(     sx   "


"&


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"   r5  r6  r$   r$   r%   r&   p  s   zInstancerMerger.__init__Nr)   rt   ru   __doc__r&   r$   r$   r$   r%   r4  l  s    r4  c                 C   s>   |j dksJ dd |D }| j}| j}t||||_d S )Nr   c                 S   rx   r$   
CoordinaterD   ar$   r$   r%   rH   y  r|   r}   )r   r5  r7  r    interpolateFromMastersAndScalarsr;  )r6   r#   rZ   ZCoordsr5  r7  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   rx   r$   XCoordinater<  r$   r$   r%   rH     r|   r}   c                 S   rx   r$   YCoordinater<  r$   r$   r%   rH     r|   )r   r5  r7  r   r>  r@  rB  )r6   r#   rZ   ZXCoordsZYCoordsr5  r7  r$   r$   r%   r(   ~  s   c                    sd   | j }| j}dD ]'\ }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                       g | ]}t | d qS r   rN   r<  namer$   r%   rH     rq   r}   )r5  r7  rT   r   r>  r  )r6   r#   rZ   r5  r7  	tableNamer^   r]   r$   rE  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"   rI  rJ  r$   r$   r%   r&     s   
zMutatorMerger.__init__N)Tr8  r$   r$   r$   r%   rH    s    rH  c                 C   s   |d j  |_ |jdkrd S | j}|j}| jr|`|r8|jdks#J |jd> |j }t	|| }| j
|7  _
| jr@d|_d S d S )Nr            r   )r3   r   r   rI  DeviceTablerJ  DeltaFormat	StartSizeEndSizer   r;  )r6   r#   rZ   rI  devvaridxdeltar$   r$   r%   r(     s   

c           
      C   s   |d j  |_ |jdkrd S | j}dD ]B}|d }t||s qt||}| jr-t|| |d u r2q|jdks9J |j	d> |j
 }t|| }|d }	t||	t||	|  q| jr_d|_d S d S )	Nr   rK  ZXYrN  rL  rM  r;  r   )r3   r   r   rI  rT   r8   rJ  delattrrO  rP  rQ  r   r  )
r6   r#   rZ   rI  rE   rG  rR  rS  rT  r-   r$   r$   r%   r(     s*   




c           	      C   s   |d j  |_ | j}dD ]=\}}t||sqt||}| jr$t|| |d u r)q|jdks0J |jd> |j	 }t
|| }t||t||d|  qd S )Nr   rC  rL  rM  )r3   r   rI  rT   r8   rJ  rU  rO  rP  rQ  r   r  )	r6   r#   rZ   rI  rF  rG  rR  rS  rT  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#   r5  ZaxisTagsr"   r$   r$   r%   r&      s   zVariationMerger.__init__c                 C   s   || _ | j| d S r    )r5  rW  rX  )r#   r5  r$   r$   r%   rX    s   zVariationMerger.setModelc                    sr   d }d |v r%t |r|d urt| |dd S | j}||\}}| | tt| || |r7| | d S d S )N)rL   )r   r   r5  ZgetSubModelrX  superrV  rW   )r#   rY   rZ   ZmasterModelr5  r#  r$   r%   rW   	  s   
zVariationMerger.mergeThings)r)   rt   ru   r9  r&   rX  rW   __classcell__r$   r$   r#  r%   rV    s
    rV  c                 C   s0   t |r
|d d fS | |\}}|t|fS )Nr   )r   ZstoreMastersr   buildVarDevTable)rW  Zmaster_valuesbaseZvarIdxr$   r$   r%   r[    s   r[  c                 C   J   |j dkrt| ddt| jdd |D \|_}|r#d|_ ||_d S d S )Nr   za baseline coordinater   c                 S   rx   r$   r:  r<  r$   r$   r%   rH   $  r|   r}   rK  r   r   r[  rW  r;  rN  r6   r#   rZ   rN  r$   r$   r%   r(         

c                 C   r]  )Nr   za caretr   c                 S   rx   r$   r:  r<  r$   r$   r%   rH   -  r|   r}   rK  r^  r_  r$   r$   r%   r(   )  r`  c                 C   sp   |j dkrt| ddt| jdd |D \|_}t| jdd |D \|_}|s+|r6d|_ ||_||_d S d S )Nr   z	an anchorr   c                 S   rx   r$   r?  r<  r$   r$   r%   rH   6  r|   r}   c                 S   rx   r$   rA  r<  r$   r$   r%   rH   7  r|   rK  )r   r   r[  rW  r@  rB  XDeviceTableYDeviceTable)r6   r#   rZ   ra  rb  r$   r$   r%   r(   2  s   

c                    sV   dD ]&\ }t | r(t| j fdd|D \}}t| | |r(t||| qd S )NrC  c                    rD  r   rN   r<  rE  r$   r%   rH   F  rq   r}   )rT   r[  rW  r  )r6   r#   rZ   rG  r]   ZdeviceTabler$   rE  r%   r(   =  s   
r   r    )F)r   r  )Rr9  r.  r   operatorr   Z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   Z	getLoggerr0  errorsr   r   r   r   r   r   r   r   r   objectr   rw   r6   ZGDEFr(   r   r   r   r   r   r   r   r   r   r   r   r   r  ZMarkBasePosZMarkMarkPosr  r  r  r  r!  ZLookupr4  Z
CaretValuer  r   rH  rV  r[  Z	BaseCoordr$   r$   r$   r%   <module>   s    
0m

"


-
&


D


&
R




Z


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

