o
    Ae                     @   sl  d Z ddlZddlZddlZddlmZ ddlZddlmZm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZmZ ddlmZm Z m!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z, e-dZ.ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: G dd de;Z<G dd de<Z=e=>ej?ddd Z@dd ZAdgdd ZBe=>ejCd!d Z@e=>ejDd"d Z@d#d$ ZEd%d& ZFe=>ejGd'd Z@e=>ejHd(d Z@d)d* ZIdhd+d,ZJdhd-d.ZKdid0d1ZLd2d3 ZMe=>ejNd4d Z@djd7d8ZOe=>ejPd9d Z@e=>ejQd:d Z@d;d< ZRd=d> ZSd?d@ ZTdAdB ZUdCdD ZVe=>ejWdEd Z@e=>ejXdFd Z@e=>ejYdGd Z@G dHdI dIe=ZZeZ>ej[dJd Z@eZ>ejDdKd Z@eZ>ejCdLd Z@G dMdN dNe=Z\e\>ej[dOd Z@e\>ejDdPd Z@e\>ejCdQd Z@G dRdS dSe=Z]dTdU Z^e]>ej_dVd Z@e]>ej[dWd Z@e]>ejDdXd Z@e]>ejCdYd Z@G dZd[ d[e]Z`e`>ejad\d Z@e`>ejbd]d Z@d^d_ Zcd`da Zde`>ejeejffdbd Z@e`>ejgejhfdcd Z@e`>ejiddd Z@e`>ejjdedfd Z@dS )kz4
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+   X/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/fontTools/varLib/merger.py__init__.   s   
zMerger.__init__r'   c                    s^   t ksJ ddjvri _tttjfv 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)methoddoneZclazzr.   attrattrscelfclazzesr+   r,   wrapper=   s    


zMerger.merger.<locals>.wrapper)r&   __dict__r.   typeenumEnumMetastr)r8   r9   r7   r:   r+   r6   r,   merger3   s   
zMerger.mergerc                 C   sR   t |}|  D ]} t| dd }|d u r |S | j|d }|d ur&|  S q|S )Nr.   )r<   mrogetattrr.   get)r8   thing_defaulttypr.   mr+   r+   r,   
mergersForO   s   zMerger.mergersForr+   c              
      s  t |dr|jdd |D ]}t |dr|jdd qtt| tfdd|D s:t| dd |D d| |}|d	| j	j
}z'D ]!  |v rQqJt| } fd
d|D }| |}	|	| || qJW d S  ty }
 z	|
jd    d }
~
ww )NensureDecompiledF)recursec                 3   s$    | ]} t t| kV  qd S r'   sortedvarskeys.0vrN   r+   r,   	<genexpr>e   s   " z&Merger.mergeObjects.<locals>.<genexpr>c                 S   s   g | ]
}t t| qS r+   rK   rO   r+   r+   r,   
<listcomp>g       z'Merger.mergeObjects.<locals>.<listcomp>expectedgot*c                       g | ]}t | qS r+   rB   rP   tablekeyr+   r,   rT   p       .)hasattrrI   rL   rM   rN   allr    rH   rC   	__class__mergeThingsrB   r%   stackr1   )r*   outlstexcludeitemr.   ZdefaultMergervaluevalues
mergerFuncer+   )r_   rN   r,   mergeObjects^   s6   



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rP   xr+   r+   r,   rT   y       z%Merger.mergeLists.<locals>.<listcomp>rV   z[%d])	r   rr   r   	enumeratezipre   r%   rf   r1   )r*   rg   rh   irk   rl   rn   r+   r+   r,   
mergeListsw   s   zMerger.mergeListsc                 C   s   t ||tst| t|jdd |D d| |d d }|d ur*|| || d S t|tjr>t ||s<t	| ||dd S t
|drK| || d S t|trX| || d S t ||sdt	| ||dd S )Nc                 S   s   g | ]}t |jqS r+   )r<   r0   rs   r+   r+   r,   rT      r`   z&Merger.mergeThings.<locals>.<listcomp>rV   r;   )r   r<   r   r0   rH   rC   
isinstancer=   Enumr   rb   ro   listry   )r*   rg   rh   rm   r+   r+   r,   re      s$   



zMerger.mergeThingsc                    sf   |D ].  |vr	qz|| _ | |   fdd|D  W q ty0 } z|j   d }~ww d S )Nc                       g | ]}|  qS r+   rC   rP   rG   tagr+   r,   rT      r`   z&Merger.mergeTables.<locals>.<listcomp>)r)   re   r%   rf   r1   )r*   r(   master_ttfs	tableTagsrn   r+   r   r,   mergeTables   s   "zMerger.mergeTables)r'   )r+   )r0   
__module____qualname__r-   classmethodr@   rH   ro   ry   re   r   r+   r+   r+   r,   r&   -   s    


r&   c                   @   s   e Zd ZdS )AligningMergerN)r0   r   r   r+   r+   r+   r,   r      s    r   ZGlyphClassDefc                    s   |d 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 )
NrV   c                 S      g | ]}|j qS r+   )	classDefsrP   lr+   r+   r,   rT          merge.<locals>.<listcomp>c                 S      g | ]}|  qS r+   rR   r   r+   r+   r,   rT      ru   c                 3   s    | ]}|  V  qd S r'   r~   r   kr+   r,   rS          merge.<locals>.<genexpr>r   ra   )rW   rX   rf   )r   r   r   setupdater   r   r   )r@   r*   rh   ZallKeysZ	allValuesr+   r   r,   r/      s&   
r/   c                    sT    j dkr S t }d|_  j|_ j|_ fdd|jjD |_t|j|_|S )N   c                    s   g | ]} j qS r+   ValuerP   _r*   r+   r,   rT      r   z._SinglePosUpgradeToFormat2.<locals>.<listcomp>)	Formatot	SinglePosCoverageValueFormatglyphsr   rr   
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 )
aT  Takes font and list of glyph lists (must be sorted by glyph id), and returns
    two things:
    - Combined glyph list,
    - If values_lst is None, return input glyph lists, but padded with None when a glyph
      was missing in a list.  Otherwise, return values_lst list-of-list, padded with None
      to match combined glyph lists.
    Nc                 S   rp   r+   )r   r   r+   r+   r,   rT      ru   z&_merge_GlyphOrders.<locals>.<listcomp>c                 S   s$   g | ]\}}d d t ||D qS )c                 S      i | ]\}}||qS r+   r+   )rP   grQ   r+   r+   r,   
<dictcomp>   r`   z1_merge_GlyphOrders.<locals>.<listcomp>.<dictcomp>)rw   )rP   r   vsr+   r+   r,   rT         $ r^   c                 3   s     | ]}t | d |kV  qdS )r^   N)rL   rP   r   )sortKeyr+   r,   rS          z%_merge_GlyphOrders.<locals>.<genexpr>c                        g | ]  fd dD qS )c                    s   g | ]
}|v r
|n qS r+   r+   rP   glyphdefaultdict_setr+   r,   rT      rU   1_merge_GlyphOrders.<locals>.<listcomp>.<listcomp>r+   rP   r   orderr   r,   rT          c                    r   )c                    s    g | ]}|v r| n qS r+   r+   r   r   r+   r,   rT      s     r   r+   r   r   r   r,   rT      r   )	rw   r   r   getReverseGlyphMap__getitem__rL   rc   r!   rr   )r(   rh   Z
values_lstr   Z	dict_setscombinedZpaddedValuespaddedr+   )r   r   r   r,   _merge_GlyphOrders   s*   


r   c                 C       |d j  |_ | || d S Nr   r;   copyro   r@   r*   rh   r+   r+   r,   r/         c                 C   r   r   r   r   r+   r+   r,   r/      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)	r<   r   r   r   r   r   r   indexr$   )r@   	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   )r<   r   PairPosr   r   r   PairSetr   PairValueRecordSecondGlyph	ClassDef1r   rC   	ClassDef2Class1RecordClass2Recordr$   )
r@   r   Z
firstGlyphZsecondGlyphr*   pspvrrecZklass1Zklass2r+   r+   r,   (_Lookup_PairPos_get_effective_value_pair  s0   



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 rYt fd
d	|D rYt	
|j|_dkrQ| |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   r   r+   r   r   r+   r+   r,   rT   5  r   r   r   r   ir   r   c                 s   s    | ]}|j d kV  qdS )r   Nr   rO   r+   r+   r,   rS   ;  r   r   c                 3   s    | ]	} |j jkV  qd S r'   r   r   rO   )coverageGlyphsr+   r,   rS   ;  s    
c                 S   s$   g | ]}|j d ur|j nt qS r'   )r   r	   ValueRecordrO   r+   r+   r,   rT   E  r   r   c                 S   rp   r+   )r   rO   r+   r+   r,   rT   L  ru   c                 S      g | ]}|j jqS r+   r   rO   r+   r+   r,   rT   P  ru   c                 S   r   r+   r   rO   r+   r+   r,   rT   P  r   c                    s   g | ]}t  qS r+   )r	   r   r   )valueFormatr+   r,   rT   T  r`   )r   r   r   r   r   ri   c                 S   r   r+   )ZgetEffectiveFormatrO   r+   r+   r,   rT   m  ru   )r   int__or__r   rr   r$   r   r   rc   r	   r   r   re   	getFormatr   r   r(   r   rv   r   lookup_subtablesry   ro   )
r@   r*   rh   r   r   rx   rl   jr   rQ   r+   )r   r   r,   r/   3  sR   


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   r   r+   r   rO   r+   r+   r,   rT   v  r   z$merge.<locals>.<listcomp>.<listcomp>r   r   r+   r+   r,   rT   v  rU   r   c                 S   r   r+   r   r   r+   r+   r,   rT   w  r   NNValue1Value2)src)r   r(   r   r   r   valueFormat1r	   r   r   valueFormat2r   r1   rr   PairValueCountrv   r   r   _firstGlyphrB   ry   )r@   r*   rh   r   r   pvrsr   r   rx   rl   r   rQ   Zvpairv1v2r+   r+   r,   r/   q  sP   



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   ValueFormat2r   r+   r+   r,   rT     rU   z)_PairPosFormat1_merge.<locals>.<listcomp>Report bug against fonttools.)r   r   PairSetCountValueFormat1r   r   r   c                 S   r   r+   r   rO   r+   r+   r,   rT     ru   c                 S   r   r+   r   rO   r+   r+   r,   rT     r   r   c                 S   s   g | ]}t  qS r+   )r   r   r   r+   r+   r,   rT     ru   )r   ro   r   r   r   r   r   r(   r   r   rr   r   rw   r   ry   )r*   rh   r@   emptyr   r   r   r   r+   r+   r,   _PairPosFormat1_merge  s2   
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   )rz   dictr   maxrl   ranger1   r   itemsaddintersection_updatedifference_update)
r*   	allGlyphsr   rG   r   r   r   rQ   Zclass0sr+   r+   r,   _ClassDef_invert  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   ClassDefr   rr   r   
Classifierrw   r  r   Z
getClassesinsertr   rv   )rh   ZallGlyphsesr*   r   ZallGlyphsesWasNoneZ
classifierZclassDefr  Zsetsclassesrx   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   r   r+   )r   r   r+   r+   r,   rT      r   z2_PairPosFormat2_align_matrices.<locals>.<listcomp>c                 S   r   r+   )r   r   r+   r+   r,   rT     r   c                 S   r   r+   r   r   r+   r+   r,   rT     ru   r   c                 S   r   r+   )r   r   r+   r+   r,   rT   3  r   )r  r   rr   Class1Countrw   r   r   r   r   nextiterr   r   r   r   Class2Countr   r	   r   r   r   r   r1   rC   r   r   deepcopy)r*   rh   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  sx   





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   r   r+   r+   r,   rT   O  rU   z)_PairPosFormat2_merge.<locals>.<listcomp>r   )r   r   r  r   r  r   r   r   r   c                 S   r   r+   r   rO   r+   r+   r,   rT   b  ru   r   )r   ro   r   r(   r   r   rw   r   r  r|   r   ry   )r*   rh   r@   r   r   r   r   r  r+   r+   r,   _PairPosFormat2_mergeM  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   r   r+   r   r   r+   r+   r,   rT   y  r   r   r   c                 S   r   r+   r   r   r+   r+   r,   rT   |  r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r  r$   r   r   rB   r   r   r   )r@   r*   rh   Zvf1Zvf2ZpairSetZpairValueRecordZpv1Zpv2Zclass1RecordZclass2Recordr+   r+   r,   r/   v  sN   








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'   )
ClassCountr   r+   r+   r,   rS         z,_MarkBasePosFormat1_merge.<locals>.<genexpr>c                       g | ]
}t | d  jqS r   rB   r   r   r  r+   r,   rT     rU   z-_MarkBasePosFormat1_merge.<locals>.<listcomp>c                    r!  )Array)rB   
MarkRecordr   r$  r+   r,   rT     rU   r   c                    r!  r"  r#  r   r  r+   r,   rT     rU   c                    s$   g | ]}t t | d   d qS )r%  Recordr[   r   r'  r+   r,   rT     r   c                 S   s   g | ]	}|d ur|j qS r'   )ClassrP   rr+   r+   r,   rT     s    r   rV   c                 S   s   g | ]}|d u r
d n|j qS r'   )
MarkAnchorr*  r+   r+   r,   rT     s    r   r%  r(  Anchorc                    s&   g | ]}|d u r
g nt | d qS )Nr-  r[   r*  r'  r+   r,   rT     s    ZCount)r   r  r   r(   rB   r   rw   r   r   r   r&  r)  r   r-  r   re   r,  r1   Z	MarkArrayrr   Z	MarkCountsetattrextend)r*   rh   r@   r  r  ZMarkCoverageGlyphsZMarkRecordsZBaseCoverageGlyphsZBaseRecordsrecordsr   ZglyphRecordsZ
allClassesr   Z
allAnchorsanchorarrayanchorsZglyphAnchorsr   r+   )r  r  r,   _MarkBasePosFormat1_merge  sp   


r4  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   r   r+   r+   r,   rS     r   r   zmark-to-base positioning lookupc                 S   r   r+   r   r   r+   r+   r,   rT     r   r   r   rW   rX   r   r   r   r   r#   r4  r$   r   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   r   r+   r+   r,   rS   	  r   r   zmark-to-mark positioning lookupc                 S   r   r+   r   r   r+   r+   r,   rT     r   r   r5  r   ZMark1ZMark2r   r6  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||  q<q,J q(t|j|_	|S )Nc                 S   r   )c                 S   r   r+   r   rO   r+   r+   r,   rT     r   z/_PairSet_flatten.<locals>.<listcomp>.<listcomp>r   r   r+   r+   r,   rT     rU   z$_PairSet_flatten.<locals>.<listcomp>c                 S   r   r+   r   r   r+   r+   r,   rT     r   )
r   r   r   r   r   r   rw   r1   rr   r   )rh   r(   r*   r   r   r   rl   rQ   r+   r+   r,   _PairSet_flatten  s&   


r7  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   r   r+   r+   r,   rT   1  rU   z<_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>r   r   c                 S   r   r+   r  r   r+   r+   r,   rT   7  r   r   c                 S   r   r+   r  r   r+   r+   r,   rT   8  r   c                 S   r   r+   r   rO   r+   r+   r,   rT   <  ru   c                 S   r   r+   r   rO   r+   r+   r,   rT   <  r   c                    s    g | ]}t d d |D  qS )c                 S   s   g | ]}|d ur|qS r'   r+   rO   r+   r+   r,   rT   A      zG_Lookup_PairPosFormat1_subtables_flatten.<locals>.<listcomp>.<listcomp>)r7  )rP   rl   r(   r+   r,   rT   @  r   )r   r   r   r   r   r   r   r   r   r   r   r   rw   r   rr   r   )rh   r(   r*   r   r   r+   r9  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  r   r+   r+   r,   rT   J  rU   z<_Lookup_PairPosFormat2_subtables_flatten.<locals>.<listcomp>r   r   c                 S   r   r+   r  r   r+   r+   r,   rT   P  r   r   c                 S   r   r+   r  r   r+   r+   r,   rT   Q  r   c                 S   r   r+   r   rO   r+   r+   r,   rT   T  ru   T)r  c                 s   r  r'   )r   r*  r+   r+   r,   rS   _  r   z;_Lookup_PairPosFormat2_subtables_flatten.<locals>.<genexpr>c                 s   s    | ]	}|d ur|V  qd S r'   r+   rP   cr+   r+   r,   rS   `  s    )r   r   r   r   r   r   r   r   r   r   r   r   r  r   rw   r1   r   r|   r  r  )rh   r(   r*   r   r   r  r  rowsrowcolscolr+   r+   r,   (_Lookup_PairPosFormat2_subtables_flattenH  s0   


rA  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   )r|   rr   r   r:  rA  )rh   r(   r   rx   r+   r+   r,   &_Lookup_PairPos_subtables_canonicalizef  s   rB  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   rO   r+   r+   r,   rT   |  ru   z7_Lookup_SinglePos_subtables_flatten.<locals>.<listcomp>r   r   )r   rr   r   r   r   r   r   r   r   r   r   r   r  rv   )rh   r(   Zmin_inclusive_rec_formatr   r   Z
num_glyphsnewZ	singlePosZval_recgnamerx   r   r+   r+   r,   #_Lookup_SinglePos_subtables_flatten{  s.   





rE  c                 C   s   t | jdd |D dd |D \}}d|_t |_||j_g |_|D ]}t }t |_d|j_t |_	d|j	_|j
| q$| |j| t|j|_d S )Nc                 S   r   r+   r   r   r+   r+   r,   rT     ru   r   c                 S   r   r+   )EntryExitRecordr   r+   r+   r,   rT     r   r   )r   r(   r   r   r   r   rF  r-  EntryAnchor
ExitAnchorr1   ry   rr   ZEntryExitCount)r@   r*   rh   r   r   r   r   r+   r+   r,   r/     s$   


c                 C   s@   t dd |D rd |_t dd |D rd |_| || d S )Nc                 s       | ]}|j d u V  qd S r'   )rG  rP   Zmasterr+   r+   r,   rS     r   r   c                 s   rI  r'   )rH  rJ  r+   r+   r,   rS     r   )rc   rG  rH  ro   r   r+   r+   r,   r/     s
   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  _ jjjdt d}|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   r   r+   )SubTabler   r+   r+   r,   rT     r   r   r   Z	Extensionc                 S   r   r+   rd   rP   str+   r+   r,   rT     r   c                 S   r   r+   )rd   r0   rM  r+   r+   r,   rT     ru   rV   c                 S   r   r+   )ExtensionLookupTyperM  r+   r+   r,   rT     r   c                 S   r   r+   )ZExtSubTablerM  r+   r+   r,   rT     r   c                    s   g | ]}t | jqS r+   )rB  r(   rM  r@   r+   r,   rT     s    c                 S   rp   r+   rq   rM  r+   r+   r,   rT     ru   c                    s   g | ]}| d  kqS r   r+   )rP   nums)numSubtablesr+   r,   rT     r8  c                 S   s   g | ]
}|D ]}|j qqS r+   r   )rP   rN  tr+   r+   r,   rT     rU   c                    s   g | ]	}t | jqS r+   )rE  r(   rM  )r@   mirfr+   r,   rT     s    TFr   r  r   z0fontTools.otlLib.optimize.gpos:COMPRESSION_LEVELr   zCompacting GPOS...c                 S   r   r+   r+   )rP   rD  Z	valRecordr+   r+   r,   r     s    
merge.<locals>.<dictcomp>rK  SubTableCountr   )'r   r|   rw   rK  rd   r0   
startswithr   r"   rO  Z
LookupTyper/  rz   r   r   rB  r(   r   rc   r   r   rE  ry   rr   rV  r   r   r   popcfgrC   r   loginfor   r   r   r   ro   )r@   r*   rh   r   r   stsZnew_stsZ	isPairPosZisSinglePosZvalueFormatListZ	flattenedlevelZsinglePosTabler   ZsinglePosMappingr+   )r@   rT  rR  r,   r/     s   "




"&




c                   @   s   e Zd ZdZdd ZdS )InstancerMergerzLA merger that takes multiple master fonts, and instantiates
    an instance.c                 C   s(   t | | || _|| _||| _d S r'   )r&   r-   modellocationZ
getScalarsscalars)r*   r(   r_  r`  r+   r+   r,   r-   "  s   zInstancerMerger.__init__Nr0   r   r   __doc__r-   r+   r+   r+   r,   r^    s    r^  c                 C   s>   |j dksJ dd |D }| j}| j}t||||_d S )Nr   c                 S   r   r+   
CoordinaterP   ar+   r+   r,   rT   ,  r   r   )r   r_  ra  r    interpolateFromMastersAndScalarsre  )r@   r*   rh   ZCoordsr_  ra  r+   r+   r,   r/   )  s
   c                 C   s^   |j dksJ dd |D }dd |D }| j}| j}t||||_t||||_d S )Nr   c                 S   r   r+   XCoordinaterf  r+   r+   r,   rT   5  r   r   c                 S   r   r+   YCoordinaterf  r+   r+   r,   rT   6  r   )r   r_  ra  r   rh  rj  rl  )r@   r*   rh   ZXCoordsZYCoordsr_  ra  r+   r+   r,   r/   2  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   r[   rf  namer+   r,   rT   K  r8  r   )r_  ra  rb   r   rh  r.  )r@   r*   rh   r_  ra  	tableNamerl   rk   r+   ro  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(   rs  rt  r+   r+   r,   r-   [  s   
zMutatorMerger.__init__NTrb  r+   r+   r+   r,   rr  U  s    rr  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   )r;   r   r   rs  DeviceTablert  DeltaFormat	StartSizeEndSizer   re  )r@   r*   rh   rs  devvaridxdeltar+   r+   r,   r/   a  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   rv  ZXYry  rw  rx  re  r   )r;   r   r   rs  rb   rB   rt  delattrrz  r{  r|  r   r.  )
r@   r*   rh   rs  rQ   rq  r}  r~  r  r5   r+   r+   r,   r/   w  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   rm  rw  rx  )r;   r   rs  rb   rB   rt  r  rz  r{  r|  r   r.  )	r@   r*   rh   rs  rp  rq  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 )VariationMergerzJA merger that takes multiple master fonts, and builds a
    variable font.c                 C   s&   t | | t|| _| | d S r'   )r&   r-   r   ZOnlineVarStoreBuilderstore_buildersetModel)r*   r_  axisTagsr(   r+   r+   r,   r-     s   zVariationMerger.__init__c                 C   s   || _ | j| d S r'   )r_  r  r  )r*   r_  r+   r+   r,   r    s   zVariationMerger.setModelc                    s   d }d }d |v r9t |r|d urt| |dd S | j}| jr*tdd |D | j| _| j}||\}}| | tt| 	|| |rI| | |rP|| _d S d S )N)rX   c                 S   s   g | ]}|d uqS r'   r+   rO   r+   r+   r,   rT     ru   z/VariationMerger.mergeThings.<locals>.<listcomp>)
r   r   r)   r   r_  ZgetSubModelr  superr  re   )r*   rg   rh   ZmasterModelZorigTTFsr_  rL  r+   r,   re     s&   


zVariationMerger.mergeThings)r0   r   r   rc  r-   r  re   __classcell__r+   r+   rL  r,   r    s
    r  c                 C   s0   t |r
|d d fS | |\}}|t|fS r   )r   storeMastersr   buildVarDevTable)r  master_valuesbase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   r   r+   rd  rf  r+   r+   r,   rT     r   r   rv  r   r$   r  r  re  ry  r@   r*   rh   ry  r+   r+   r,   r/        


c                 C   r  )Nr   za caretr   c                 S   r   r+   rd  rf  r+   r+   r,   rT     r   r   rv  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   r   r+   ri  rf  r+   r+   r,   rT     r   r   c                 S   r   r+   rk  rf  r+   r+   r,   rT     r   rv  )r   r$   r  r  rj  rl  XDeviceTableYDeviceTable)r@   r*   rh   r  r  r+   r+   r,   r/     s   



c                    sV   dD ]&\ }t | r(t| j fdd|D \}}t| | |r(t||| qd S )Nrm  c                    rn  r   r[   rf  ro  r+   r,   rT     r8  r   )rb   r  r  r.  )r@   r*   rh   rq  rk   ZdeviceTabler+   ro  r,   r/     s   
c                   @   s   e Zd ZdZdddZdddZdd	 fd
dZdd Zdd Zdd Z	de
fddZde
f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varIdxesr   varTableIdslayerslayerReuseCacher   _doneBaseGlyphs)r*   r_  r  r(   ZallowLayerReuser+   r+   r,   r-   (  s   
zCOLRVariationMerger.__init__COLRc                 C   s4   d|v rd|v r|  |d j t| ||| d S )Nr  )expandPaintColrLayersr]   r  r   )r*   r(   r   r   r+   r+   r,   r   :  s   	zCOLRVariationMerger.mergeTablesc                 C   s   dS )NTr+   )r   r+   r+   r,   <lambda>G  s    zCOLRVariationMerger.<lambda>c           
   	   C   s   |j }|j}d}z||}W n	 ty   Y nw ||}|s(t| t|j|d|}g }|D ]}	t|	dd }z||}W n	 tyE   Y nw || q.t||s\t	| t|j||d|S )NF)r   rk   r   r5  )
r   
formatEnum
ValueErrorr$   r<   r0   rB   r1   r   r#   )
r*   rg   rh   validatefmtr  okrW   rX   rQ   r+   r+   r,   checkFormatEnumG  s:   
z#COLRVariationMerger.checkFormatEnumc                    sb   |  D ]* z| |   fdd|D  W q ty. } z|jd d  d }~ww d S )Nc                    r}   r+   r~   rO   r   r+   r,   rT   h  r`   z7COLRVariationMerger.mergeSparseDict.<locals>.<listcomp>[])rN   re   r%   rf   r1   )r*   rg   rh   rn   r+   r   r,   mergeSparseDicte  s   "z#COLRVariationMerger.mergeSparseDictc                    sf   |D ]. t | } fdd|D }z| || W q ty0 } z
|jd    d }~ww d S )Nc                    rZ   r+   r[   rP   rj   r5   r+   r,   rT   p  r`   z2COLRVariationMerger.mergeAttrs.<locals>.<listcomp>ra   )rB   re   r%   rf   r1   )r*   rg   rh   r7   rk   rl   rn   r+   r  r,   
mergeAttrsm  s   
zCOLRVariationMerger.mergeAttrsc                    s|    fdd|D }d}|  ttr d}fdd|D }|d }tj}t|s3| j|\}}|r:|}||fS )Nc                    rZ   r+   r[   r  r  r+   r,   rT   x  r`   z;COLRVariationMerger.storeMastersForAttr.<locals>.<listcomp>FTc                    s   g | ]}  |qS r+   )ZtoIntrO   )convr+   r,   rT     r`   r   )	ZgetConverterByNamerz   r
   r   NO_VARIATION_INDEXr   r  r  ZfromInt)r*   rg   rh   r5   r  Zis_fixed_size_float	baseValuer  r+   )r5   r  r,   storeMastersForAttrw  s   


z'COLRVariationMerger.storeMastersForAttrreturnc                 C   s  t |}| j|}|d u r4tt| jt| d D ]}| j||t|  |kr3| | j|< } q4q|d u rktt|d ddD ](}| j| d  |d | krjt| j| }|| j|< | j||d    qkqB|d u rt| j | j|< }| j| |S )Nr   r   r  )tupler  rC   r   rr   r  r/  )r*   r  r_   varIndexBaserx   nr+   r+   r,   storeVariationIndices  s(   
z)COLRVariationMerger.storeVariationIndicesc           	      C   s\   t j}g }|D ]}| |||\}}t||| || qtdd |D r,| |}|S )Nc                 s   s    | ]}|t jkV  qd S r'   )r   r  rO   r+   r+   r,   rS     r   z9COLRVariationMerger.mergeVariableAttrs.<locals>.<genexpr>)r   r  r  r.  r1   anyr  )	r*   rg   rh   r7   r  r  r5   r  r  r+   r+   r,   mergeVariableAttrs  s   
z&COLRVariationMerger.mergeVariableAttrsc                 C   s   t |ddd dD ]7}|d }|j}t|j}| }|j|j |  |d j}|jd ur9|t||j	|j< q	t
||j	| q	d S )NTc                 S   s   t t| d jdd d uS )Nr  VarType)rB   r<   rk   )pathr+   r+   r,   r    s   z?COLRVariationMerger.convertSubTablesToVarType.<locals>.<lambda>)Z	skip_root	predicater  )r   rk   r<   r  r;   r   ZpopulateDefaultsr   rB   rp  r.  )clsr]   r  rN  ZsubTablevarTypeZnewSubTableparentr+   r+   r,   convertSubTablesToVarType  s    



z-COLRVariationMerger.convertSubTablesToVarTypec           	      C   s  | j sdS t }g }| jjD ]a}|jg}|ro| }|jtjj	kr"q|jtjj
kratt|| }t|}|D ]!}t||v rKt|}t||vsKJ || |t| q6||_t||_n|| }|t| |sqt|t|kszJ || j _t|| j _dS )a  Rebuild LayerList without PaintColrLayers reuse.

        Each base paint graph is fully DFS-traversed (with exception of PaintColrGlyph
        which are irrelevant for this); any layers referenced via PaintColrLayers are
        collected into a new LayerList and duplicated when reuse is detected, to ensure
        that all paints are distinct objects at the end of the process.
        PaintColrLayers's FirstLayerIndex/NumLayers are updated so that no overlap
        is left. Also, any consecutively nested PaintColrLayers are flattened.
        The COLR table's LayerList is replaced with the new unique layers.
        A side effect is also that any layer from the old LayerList which is not
        referenced by any PaintColrLayers is dropped.
        N)	LayerListr   BaseGlyphListBaseGlyphPaintRecordPaintrX  r   r   PaintFormatZPaintColrGlyphPaintColrLayersr|   _flatten_layersrr   idr   r  r1   r  FirstLayerIndex	NumLayersgetChildrenr/  reversed
LayerCount)	colrZuniqueLayerIDsZnewLayerListr   ZfrontierpaintchildrenZfirst_layer_indexlayerr+   r+   r,   r    s8   


z)COLRVariationMerger.expandPaintColrLayersNru  )r  )r0   r   r   rc  r-   r   r  r  r  r  r   r  r  r   r  staticmethodr  r+   r+   r+   r,   r    s    




r  c                    s   dd |j D }dd |D }t| D ]4\} z| |   fdd|D  W q tyI } z|jd| d d |jd	<  d }~ww d
| _d S )Nc                 S      i | ]}|j |qS r+   Z	BaseGlyphrP   r   r+   r+   r,   r     ru   rU  c                 S   r   )c                 S   r  r+   r  r  r+   r+   r,   r      ru   z$merge.<locals>.<listcomp>.<dictcomp>)r  r   r+   r+   r,   rT      rU   r   c                    r}   r+   r~   rO   r   r+   r,   rT     r`   z.BaseGlyphPaintRecord[r  zbase glyph r`  T)	r  rv   rN   re   r%   rf   r1   causer  )r@   r*   rh   rg   Zmastersrx   rn   r+   r  r,   r/     s   "
c                 C   s&   | j sJ dt| j|_| j|_d S )Nz-BaseGlyphList must be merged before LayerList)r  rr   r  r  r  r   r+   r+   r,   r/     s   c                 c   sN    | j tjjks
J | |D ]}|j tjjkr!t||E d H  q|V  qd S r'   )r   r   r  r  r  r  )rootr  r  r+   r+   r,   r    s   r  c              
      sT  t t|jd j}tjtksJ fddttD }z|| W n ty? } z|j	
d  d }~ww jd urK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|_d S t||_tj|_j| jd ur|sj||j d S d S d S )Nr  c                    s*   g | ]}t t | j| d  jqS r  )r|   r  r)   r]   )rP   rx   )rh   r*   r+   r,   rT   *  s    z*_merge_PaintColrLayers.<locals>.<listcomp>z.Layers)r  c                    sr   t | tr7 fdd| D }t } ttjj| _t|| _	tj
| _j
| jd ur7j|| j | S )Nc                       g | ]} |qS r+   r+   r   listToColrLayersr+   r,   rT   F  ru   zD_merge_PaintColrLayers.<locals>.listToColrLayers.<locals>.<listcomp>)rz   r|   r   r  r   r  r  r   rr   r  r  r  r/  r  r  )r  r  )r  r*   r+   r,   r  D  s   


z0_merge_PaintColrLayers.<locals>.listToColrLayersc                    r  r+   r+   r   r  r+   r,   rT   P  ru   r   r   )r|   r  r(   r]   rr   r)   r   ry   r%   rf   r1   r  Z	try_reuser   r   r   r   r  r  r  r  r  r/  r  )r*   rg   rh   Z
out_layersZmaster_layersesrn   Zis_treer+   )r  rh   r*   r,   _merge_PaintColrLayers!  s6   

	
r  c           	         s     ||dd }|tjju rt || d S | }d|d ur)tt||fdd|	 D } 
|||  ||}dd | D }|tjkpZt fdd|D }|rvrb||_|ri | |d usoJ t||_d S d S )	Nc                 S   s
   |    S r'   )Zis_variable)r  r+   r+   r,   r  g  s   
 zmerge.<locals>.<lambda>r+   c                 3        | ]}|j  vr|j V  qd S r'   ro  r;  varAttrsr+   r,   rS   r  r   r   c                 S   r   r+   )rk   rM  r+   r+   r,   rT   x  r   r   c                 3       | ]
}t | jv V  qd S r'   r  r  r\   rP  r+   r,   rS   {  s    
)r  r   r  r  r  Zas_variabler	   getVariableAttrsr<   getConvertersr  r  ZiterSubTablesr  r  VarIndexBaser  r   r   )	r@   r*   rh   r  Z	varFormatstaticAttrsr  Z	subTablesZ
isVariabler+   )r@   r  r,   r/   e  s.   
c                    sn   t |j}t|  fdd| D }| ||| | || }|tjkr5||_	| j
t| d S d S )Nc                 3   r  r'   ro  r;  r  r+   r,   rS     r   r   )r<   r  r	   r  r  r  r  r   r  r  r  r  r  )r@   r*   rh   r  r  r  r+   r  r,   r/     s   


c                    sV     ||dd | D  t fdd|jD r) |  jt| d S d S )Nc                 s   r  r'   ro  r;  r+   r+   r,   rS     r   r   c                 3   r  r'   r  )rP   stoprP  r+   r,   rS     s    )r  r  r  	ColorStopr  r  r  r  r   r+   rP  r,   r/     s
   
Zclipsc                 C   s   |  || d S r'   )r  r   r+   r+   r,   r/     s   r   r'   )F)r  r  )krc  osr   r=   operatorr   loggingZfontTools.colorLib.builderr   r   ZfontTools.miscr   ZfontTools.misc.roundToolsr   ZfontTools.misc.treeToolsr   ZfontTools.ttLib.tablesr   r   r	   Z#fontTools.ttLib.tables.otConvertersr
   Z!fontTools.ttLib.tables.otTraverser   Z#fontTools.ttLib.tables.DefaultTabler   ZfontTools.varLibr   r   r   ZfontTools.varLib.modelsr   r   r   r   r   ZfontTools.varLib.varStorer   	functoolsr   ZfontTools.otlLib.builderr   ZfontTools.otlLib.optimize.gposr   r   	getLoggerrZ  errorsr   r   r   r   r   r    r!   r"   r#   r$   r%   objectr&   r   r@   ZGDEFr/   r   r   r   r-  r   r   r   r   r   r  r  r  r  r   r4  ZMarkBasePosZMarkMarkPosr7  r:  rA  rB  rE  Z
CursivePosrF  ZLookupr^  Z
CaretValuerr  r  r  Z	BaseCoordr  r  r  r  r  r  ZClipBoxZ	Affine2x3r  Z	ColorLineZClipListr+   r+   r+   r,   <module>   s    
4x


%





=
5
!

N
)

+
V








i






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