B
    Sc4                 @   s  d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	T d dl
Z
e
dZdd	 Zd
d Zdd Zdd Zdd Zdd Zdd edej_dd dd dej_edd dej_eedej_eedej_eedej_eeedej_eeed ej_e eed!ej!_d"eiej"_eed#ej#_ee$d$ ej%_ ej&_ ej'_ ej(_ ej)_ej*_e+e ed% e,d&_ e,d'_ e,d(_ e,d)_ e,d*_e,d+_ee,d'd,d- Z-eej.ej/ej0ej1ej2ej3ej4ej5ej6ej7ej8d.d/ Z9eej:ej;ej<ej=d0d1 Z>eej:ej;ej<ej=d2d/ Z9eej?ej@d3d/ Z9eejAd4d/ Z9eejd5d/ Z9eejAd6d7 ZBeejd8d7 ZBeejCd9d/ Z9eejd:d/ Z9eejDejEd;d< ZFeejGd=d< ZFeejd>d< ZFd?d@ ZHdAdB ZIdS )C    )ttLib)DefaultTable)otTables)
add_methodmergeObjects)*NzfontTools.mergec             C   s   t | S )N)sumLists)lst r
   5lib/python3.7/site-packages/fontTools/merge/layout.pymergeLookupLists   s    r   c             C   s:   | st t }d |_tdd | D |_t|j|_|S )Nc             S   s   g | ]}|j r|j qS r
   )LookupListIndex).0lr
   r
   r   
<listcomp>   s    z!mergeFeatures.<locals>.<listcomp>)AssertionErrorr   FeatureFeatureParamsr   r   lenLookupCount)r	   selfr
   r
   r   mergeFeatures   s    r   c             C   s   i }x@| D ]8}x2|D ]*}|j }||kr.g ||< || |j qW q
W g }x:t| D ]*}t }||_ t|| |_|| qXW |S )N)
FeatureTagappendr   sortedkeysr   FeatureRecordr   )r	   dr   ftagretrecr
   r
   r   mergeFeatureLists   s    

r"   c             C   sV   | st tdd | D st t }d |_d|_tdd | D |_t|j|_	|S )Nc             s   s   | ]}|j d kV  qdS )i  N)ReqFeatureIndex)r   r   r
   r
   r   	<genexpr>0   s    z!mergeLangSyses.<locals>.<genexpr>i  c             S   s   g | ]}|j r|j qS r
   )FeatureIndex)r   r   r
   r
   r   r   5   s    z"mergeLangSyses.<locals>.<listcomp>)
r   allr   LangSysZLookupOrderr#   r"   r%   r   FeatureCount)r	   r   r
   r
   r   mergeLangSyses,   s    r)   c       	      C   s   | st t| dkr| d S i }xB| D ]:}x4|jD ]*}|j|krJg ||j< ||j |j q2W q&W g }x:t| D ]*\}}t }t	||_||_|| qvW t
 }||_t||_dd | D }|rt	||_nd |_|S )N   r   c             S   s   g | ]}|j r|j qS r
   )DefaultLangSys)r   sr
   r
   r   r   N   s    z mergeScripts.<locals>.<listcomp>)r   r   LangSysRecordZ
LangSysTagr   r'   r   itemsr   r)   ScriptZLangSysCountr+   )	r	   Z	langSysessrZlsrZ	lsrecordsr   ZlangSys_listr   ZdfltLangSysesr
   r
   r   mergeScripts9   s.    




r1   c             C   s   i }x@| D ]8}x2|D ]*}|j }||kr.g ||< || |j qW q
W g }x:t| D ]*}t }||_ t|| |_|| qXW |S )N)	ScriptTagr   r/   r   r   r   ScriptRecordr1   )r	   r   r   r,   r   r    r!   r
   r
   r   mergeScriptRecordsU   s    

r4   c             C   s   d S )Nr
   )r	   r
   r
   r   <lambda>f       r5   )ZScriptCountr3   c             C   s   d S )Nr
   )r	   r
   r
   r   r5   j   r6   c             C   s   t t| dd dS )Nc             S   s   | j S )N)ZBaseScriptTag)r,   r
   r
   r   r5   l   r6   z<lambda>.<locals>.<lambda>)key)r   r   )r	   r
   r
   r   r5   l   r6   )ZBaseScriptCountZBaseScriptRecordc             C   s   t t| dd dS )Nc             S   s   | j S )N)r   )r,   r
   r
   r   r5   q   r6   z<lambda>.<locals>.<lambda>)r7   )r   r   )r	   r
   r
   r   r5   q   r6   )r(   r   )r   Lookup)FormatZglyphs)r9   Z	classDefs)CoverageZLigGlyphCountZLigGlyph)r:   Z
GlyphCountZAttachPoint)ZMarkSetTableFormatZMarkSetCountr:   r   )ZBaseTagCountZBaselineTag)r   Version)ZtableTagtableGDEFGSUBGPOSBASEJSTFMATHc             C   s@  t |t |jkstxtt||jD ]\}\}}|s>q*|d ksN|tkrftd|j| j	| q*d }d }x|j
jjD ]}|jdkrq|x|jjgdd |jjD  D ]r}	|	d krqdd |	jD }
t |
dkst|
r|
d }
nx|sBt }d|_t  }|_d |_d|_g |_|j
jj| |j
j jd7  _|}
|	j|
 |	jjd	d
 d |st }||_t }d|_ d|_!d|_"|g|_#|j
j$d krt$ |j
_$g |j
j$_d|j
j$_|j
j$j| |j
j$ jd7  _|
jjd d |gkr|g|
jjd d< |
j jd7  _qW q|W q*W t%&| || | S )Nz[Have non-identical duplicates to resolve for '%s' but no GSUB. Are duplicates intended?: %sZDFLTc             S   s   g | ]
}|j qS r
   )r'   )r   r   r
   r
   r   r      s    zmerge.<locals>.<listcomp>c             S   s   g | ]}|j d kr|qS )locl)r   )r   vr
   r
   r   r      s    r*   r   rC   c             S   s   | j S )N)r   )rD   r
   r
   r   r5      r6   zmerge.<locals>.<lambda>)r7   )'r   ZduplicateGlyphsPerFontr   	enumeratezipNotImplementedlogZwarningZfontsZ_merger__namer<   
ScriptListr3   r2   r/   r+   r-   r%   r   r   r   r   r   r   r   FeatureListr   r(   sortSingleSubstmappingr8   
LookupFlagZ
LookupTypeZSubTableCountSubTable
LookupListr   merge)r   mZtablesir<   ZdupsZsynthFeatureZsynthLookupZscriptZlangsysZfeaturer   Zsubtabler
   r
   r   rQ      sd    " 
 & 


rQ   c             C   s   d S )Nr
   )r   	lookupMapr
   r
   r   
mapLookups   s    rU   c             C   sj   G dd dt }| jdkrd S t| jds2i | j_| j| jjkr\|| j| j}|| jj| j< | jj| j S )Nc               @   s   e Zd Zdd ZdS )z/__merge_classify_context.<locals>.ContextHelperc             S   s   |j drd}d}nd}d}|j dr0d}nd}|| }|| _|| _|| _|| _|d | _|dkr||d | _|d	 | _	n|d
kr|d | _|d | _	d S )NZSubstZSubZPosChain LookupRecordr*   RuleRuleSet   Z	ClassRuleZClassSet)
__name__endswith
startswithTypTyperV   ChainTyprX   rY   rZ   )r   klassr9   r_   r`   rV   ra   r
   r
   r   __init__  s(    


z8__merge_classify_context.<locals>.ContextHelper.__init__N)r\   
__module____qualname__rc   r
   r
   r
   r   ContextHelper  s   rf   )r*   r[      _merge__ContextHelpers)objectr9   hasattr	__class__rh   )r   rf   helperr
   r
   r   __merge_classify_context   s    
rm   c             C   s   |   }| jdkrtxt| |jD ]N}|s*q xBt||jD ]2}|sBq8x&t||jD ]}|sZqP||j |_qPW q8W q W nF| jdkrx:t| |jD ]}|sq||j |_qW ndstd| j d S )N)r*   r[   rg   r   zunknown format: %s)rm   r9   getattrrZ   rY   rX   r   r   )r   rT   cZrsrZllr
   r
   r   rU   ,  s$    
   
 c             C   s.   | j dkr| j| nds*td| j  d S )Nr*   r   zunknown format: %s)r9   ZExtSubTablerU   r   )r   rT   r
   r
   r   rU   B  s    
c             C   s$   x| j D ]}|sq|| qW d S )N)rO   rU   )r   rT   str
   r
   r   rU   J  s     c             C   s$   x| j D ]}|sq|| qW d S )N)r8   rU   )r   rT   r   r
   r
   r   rU   P  s     c             C   s   | j d@ r|| j | _d S )N   )rN   ZMarkFilteringSet)r   markFilteringSetMapr
   r
   r   mapMarkFilteringSetsV  s    
rt   c             C   s$   x| j D ]}|sq|| qW d S )N)r8   rt   )r   rs   r   r
   r
   r   rt   [  s     c                s    fdd| j D | _ d S )Nc                s   g | ]} | qS r
   r
   )r   rS   )rT   r
   r   r   c  s    zmapLookups.<locals>.<listcomp>)r   )r   rT   r
   )rT   r   rU   a  s    c             C   s,   x&| j D ]}|r|jsq|j| qW d S )N)r   r   rU   )r   rT   r   r
   r
   r   rU   e  s    
 c                s0    fdd| j D | _ | jdkr, | j | _d S )Nc                s   g | ]} | qS r
   r
   )r   rS   )
featureMapr
   r   r   n  s    zmapFeatures.<locals>.<listcomp>i  )r%   r#   )r   ru   r
   )ru   r   mapFeaturesk  s    
rv   c             C   s>   | j r| j | x&| jD ]}|r|js*q|j| qW d S )N)r+   rv   r-   r'   )r   ru   r   r
   r
   r   rv   r  s    
 c             C   s,   x&| j D ]}|r|jsq|j| qW d S )N)r3   r/   rv   )r   ru   r,   r
   r
   r   rv   z  s    
 c             C   s   |  d}|  d}|  d}x||gD ]}|s2q(|jjrdd t|jjjD }|jj| |jj| |r|jjdkrdd t|jjj	D }|jj
| |jjr(|jjr(dd t|jjjD }|jj| q(W d S )	Nr=   r>   r?   c             S   s   i | ]\}}||qS r
   r
   )r   rS   rD   r
   r
   r   
<dictcomp>  s    z"layoutPreMerge.<locals>.<dictcomp>i  c             S   s   i | ]\}}||qS r
   r
   )r   rS   rD   r
   r
   r   rw     s    c             S   s   i | ]\}}||qS r
   r
   )r   rS   rD   r
   r
   r   rw     s    )getr<   rP   rE   r8   rU   rJ   r;   MarkGlyphSetsDefr:   rt   rI   r   rv   )fontr=   r>   r?   trT   rs   ru   r
   r
   r   layoutPreMerge  s     


 r|   c                s  |  d}|  d}|  d}x||gD ]}|s6q*|jjr|jjrt|jjj}|jj| t|jjj}|jj| |j  fddt	|jjjD |jj_t
|jjj}|jj| t|jjj|jj_|jjr*t|jjj}|jj| |jj| t|jjj}|jj| |jj| |j  fddt	|jjjD |jj_t
|jjj}|jj| |jj| t|jjj|jj_|r*|jjdkr*t
|jjj}|jj| q*W d S )Nr=   r>   r?   c                s   g | ]\}}| kr|qS r
   r
   )r   rS   r   )usedIndicesr
   r   r     s    z#layoutPostMerge.<locals>.<listcomp>c                s   g | ]\}}| kr|qS r
   r
   )r   rS   r   )r}   r
   r   r     s    i  )rx   r<   rJ   rI   ZGregariousIdentityDictr   rv   ZAttendanceRecordingIdentityDictr,   rE   ZNonhashableDictr   r(   rP   r8   rU   r   r;   ry   r:   rt   )rz   r=   r>   r?   r{   ru   rT   rs   r
   )r}   r   layoutPostMerge  s@    


 ""r~   )JZ	fontToolsr   Z#fontTools.ttLib.tables.DefaultTabler   ZfontTools.ttLib.tablesr   ZfontTools.merge.baser   r   ZfontTools.merge.utilZloggingZ	getLoggerrH   r   r   r"   r)   r1   r4   rI   ZmergeMapZBaseScriptListsumrJ   r   rP   minr:   ZsumDictsZClassDefZLigCaretListZ
AttachListZequalry   ZAxisZBaseTagListmaxr=   r>   r?   r@   rA   rB   ZonlyExistingZgetTableClassrQ   rL   ZMultipleSubstZAlternateSubstZLigatureSubstZReverseChainSingleSubstZ	SinglePosZPairPosZ
CursivePosZMarkBasePosZ
MarkLigPosZMarkMarkPosrU   ZContextSubstZChainContextSubstZ
ContextPosZChainContextPosrm   ZExtensionSubstZExtensionPosr8   rt   r   r+   r'   rv   r/   r|   r~   r
   r
   r
   r   <module>   s   

4
L;)