U
    »mœd-d  ã                   @   sr  d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
mZmZ d dlm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mZ d d
lmZ d dlm Z  ddl!m"Z"m#Z#m$Z$m%Z% e"Z&e#Z'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dZ,dd„ Z-dd„ Z.dd„ Z/dd„ Z0edd ƒZ1d!d"„ Z2d#d$„ Z3d%d&„ Z4d'd(„ Z5G d)d*„ d*eƒZ6G d+d,„ d,e6ƒZ7G d-d.„ d.eƒZ8d/S )0é    )Ú
namedtuple)
ÚmaxStackLimitÚTopDictIndexÚ
buildOrderÚtopDictOperatorsÚtopDictOperators2ÚprivateDictOperatorsÚprivateDictOperators2ÚFDArrayIndexÚFontDictÚVarStoreData)ÚBytesIO)ÚspecializeCommandsÚcommandsToProgram)ÚnewTable)ÚvarLib)ÚallEqual)Ú	roundFunc)ÚT2CharStringÚT2OutlineExtractor)ÚT2CharStringPen)Úpartialé   )ÚVarLibCFFDictMergeErrorÚVarLibCFFPointTypeMergeErrorÚVarLibCFFHintTypeMergeErrorÚVarLibMergeErrorc                 C   sˆ   | d }dd„ |j D ƒ}tj ||¡}tj ||¡}| d jjd }t|d�|_|j	d j
d kr„|j	}	|	D ]}
t|
dƒrj|j|
j_
qjd S )NZfvarc                 S   s   g | ]
}|j ‘qS © )ZaxisTag)Ú.0Zaxisr   r   úM/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/fontTools/varLib/cff.pyÚ
<listcomp>'   s     z"addCFFVarStore.<locals>.<listcomp>ÚCFF2r   )Z
otVarStoreÚPrivate)Zaxesr   ÚbuilderZbuildVarRegionListZbuildVarStoreÚcffÚtopDictIndexr   ZVarStoreÚFDArrayZvstoreÚhasattrr"   )ÚvarFontZvarModelÚvarDataListÚmasterSupportsZ	fvarTableZaxisKeysZvarTupleListZvarStoreCFFVÚtopDictÚfdArrayÚfontDictr   r   r   ÚaddCFFVarStore%   s    
r.   c                 C   sH  | j j}td |d ƒ}| jj|_|| _|d }t|dƒr>|j}nd }ttƒ}||_	||_
t|dƒ�stƒ  }|_d |_|j|_||j_|j}|jrš||j_n||_tƒ }	|	 d¡ | |	¡ ||	_ttƒ}
|d k	�rÆtD ]:}|d }||
krÖ||jkrü|j|= t||ƒrÖt||ƒ qÖn²|j}ttƒ}
|D ]ž}	|	 d¡ t|	j ¡ ƒD ]0}||	j	k�rB|	j|= t|	|ƒ�rBt|	|ƒ �qB|	j}tD ]B}|d }||
k�r~||jk�r¨|j|= t||ƒ�r~t||ƒ �q~�q&tD ]B}|d }||k�rÊ||jk�rô|j|= t||ƒ�rÊt||ƒ �qÊd| _tƒ }| j||dd� |  d¡ | j!||dd� d S )Nr   r"   r&   Tr   é   )ZisCFF2)"ÚotFontÚgetGlyphOrderr   r%   Úitemsr'   r"   r   r   ÚorderÚcff2GetGlyphOrderr
   r&   ÚstringsZGlobalSubrsr,   ÚCharStringsZcharStringsAreIndexedZcharStringsIndexr   ZsetCFF2Úappendr	   r   ÚrawDictÚdelattrÚlistÚkeysr   Úmajorr   ÚcompileÚseekZ	decompile)r$   r0   r4   ZtopDictDatar+   ZprivateDictZopOrderr,   ZcharStringsr-   ZprivateOpOrderÚentryÚkeyÚfiler   r   r   Úlib_convertCFFToCFF24   s|    











rB   c                 C   s6   | d }t |j| ƒ tdƒ}|j|_|| d< | d= d S ©NzCFF r!   )rB   r$   r   )r(   ZcffTableZnewCFF2r   r   r   ÚconvertCFFtoCFF2ƒ   s    rD   c                 C   s   t | tƒr|  ¡ rt| ƒS | S ©N)Ú
isinstanceÚfloatÚ
is_integerÚint)Únumr   r   r   Úconv_to_int�   s    rK   )Z
BlueValuesZ
OtherBluesZFamilyBluesZFamilyOtherBluesZ	BlueScaleZ	BlueShiftZBlueFuzzZStdHWZStdVWZ	StemSnapHZ	StemSnapVc                 C   s4   | | }|| }||kr,|| }|| j }nd }|S rE   )r"   )ÚregionFDArraysÚfd_indexÚriÚfd_mapZregion_fdArrayZregion_fd_mapZregion_fdIndexÚprivater   r   r   Úget_private¢   s    rQ   c              
      s´  | d }| dd… }t |d dƒr2dd„ |D ƒ}ndd„ |D ƒ}t|jƒD �]b\}}|j}	t|	ddƒ}
||
 \}}g }|jdd… D ]}|j |¡d }| |¡ q„|	g}|	}|D ].}t||||ƒ}|dkrÒ|}n|}| |¡ q²t	|ƒ}|	j
 ¡ D �]¶\‰ }g }ˆ tk�rqôt|tƒ�r
z‡ fd	d„|D ƒ}W n* tk
�rZ   td
jˆ d�ƒ Y qôY nX zt|Ž }W n" tk
�rŠ   tˆ ||ƒ‚Y nX dg| ‰d}|D ]T}‡fdd„t|ƒD ƒ}|�sÌt|ƒ�sÌd}|‰| |¡}|d |d< | |¡ �qž|�s:dd„ |D ƒ}n0‡ fdd„|D ƒ}t|ƒ�s2| |¡}n|d }t|tƒ�ršt|ƒD ]H\}}t|tƒ�rˆt|ƒD ]\}}t|ƒ|| |< �qjnt|ƒ||< �qNnt|ƒ}||	j
ˆ < qôqJdS )a¡  
    I step through the FontDicts in the FDArray of the varfont TopDict.
    For each varfont FontDict:

    * step through each key in FontDict.Private.
    * For each key, step through each relevant source font Private dict, and
            build a list of values to blend.

    The 'relevant' source fonts are selected by first getting the right
    submodel using ``vsindex_dict[vsindex]``. The indices of the
    ``subModel.locations`` are mapped to source font list indices by
    assuming the latter order is the same as the order of the
    ``var_model.locations``. I can then get the index of each subModel
    location in the list of ``var_model.locations``.
    r   r   Nr&   c                 S   s   g | ]
}|j ‘qS r   )r&   ©r   Z	fdTopDictr   r   r   r    Á   s     z&merge_PrivateDicts.<locals>.<listcomp>c                 S   s   g | ]
}|g‘qS r   r   rR   r   r   r   r    Ã   s     Úvsindexc                    s   g | ]}|j ˆ  ‘qS r   ©r8   ©r   Úpd©r@   r   r   r    á   s     z\Warning: {key} in default font Private dict is missing from another font, and was discarded.rW   Fc                    s   g | ]\}}|ˆ |  ‘qS r   r   )r   ÚiÚval)Úprev_val_listr   r   r    ý   s    Tc                 S   s   g | ]}|d  ‘qS ©r   r   )r   Údatar   r   r   r      s     c                    s   g | ]}|j ˆ  ‘qS r   rT   rU   rW   r   r   r      s     )r'   Ú	enumerater&   r"   ÚgetattrÚ	locationsÚindexr7   rQ   Úlenr8   r2   Úpd_blend_fieldsrF   r:   ÚKeyErrorÚprintÚformatÚzipÚ
IndexErrorr   r   Ú	getDeltasrK   )Ú	top_dictsÚvsindex_dictÚ	var_modelrO   r+   Zregion_top_dictsrL   rM   Z	font_dictZprivate_dictrS   Z	sub_modelÚ_Zmaster_indicesÚlocrX   ZpdsZlast_pdrN   rV   Únum_mastersÚvalueZdataListÚvaluesZany_points_differZval_listÚrel_listÚdeltasÚitemÚjZjtemr   )r@   rZ   r   Úmerge_PrivateDicts­   s„    
þÿ


ÿ

ru   c                 C   s   d| kr| d S | d S rC   r   )Zfontr   r   r   Ú_cff_or_cff2!  s    rv   c                 C   s"  i }|d }|dd… }t |ƒ}t|ƒjjd }t|dƒsTdd„ t|ƒD ƒ|d< |S i }|j}| ¡ }	t|ƒD ]$\}
}|||	|
 < ||krni ||< qnt|ƒD ]€\}}| ¡ }t|ƒjjd }t|dƒsà||d  }d|| |< qœ|j}t|ƒD ],\}
}|||
  }|| }||krî|||< qîqœ|S )a×  Since a subset source font may have fewer FontDicts in their
    FDArray than the default font, we have to match up the FontDicts in
    the different fonts . We do this with the FDSelect array, and by
    assuming that the same glyph will reference  matching FontDicts in
    each source font. We return a mapping from fdIndex in the default
    font to a dictionary which maps each master list index of each
    region font to the equivalent fdIndex in the region font.r   r   NÚFDSelectc                 S   s   i | ]
}|d “qS r[   r   )r   rN   r   r   r   Ú
<dictcomp>7  s      zgetfd_map.<locals>.<dictcomp>)	ra   rv   r$   r%   r'   Úrangerw   r1   r]   )r(   Z
fonts_listrO   Zdefault_fontZregion_fontsZnum_regionsr+   Zgname_mappingZdefault_fdSelectÚ
glyphOrderÚgidZfdIndexrN   Zregion_fontZregion_glyphOrderZregion_topDictZdefault_fdIndexZregion_fdSelectZ
region_mapr   r   r   Ú	getfd_map'  s8    


r|   ÚCVarDataz'varDataList masterSupports vsindex_dictc           	      C   st   | d j jd }|gdd„ |dd … D ƒ }t|jƒ}t||||ƒ}t| |ƒ}t||j||ƒ t| ||j	|j
ƒ d S )Nr!   r   c                 S   s   g | ]}t |ƒjjd  ‘qS r[   )rv   r$   r%   )r   ZttFontr   r   r   r    W  s    z&merge_region_fonts.<locals>.<listcomp>r   )r$   r%   ra   ÚmappingÚmerge_charstringsr|   ru   rj   r.   r)   r*   )	r(   ÚmodelZordered_fonts_listrz   r+   ri   rn   ÚcvDatarO   r   r   r   Úmerge_region_fontsU  s    

ÿ

r‚   c                 C   s   || krd S | | S rE   r   )ZcharstringsÚ	glyphNamer   r   r   Ú_get_csa  s    r„   c           
      C   sv   g }| j dd … D ]&}||kr(| |¡ | | |¡¡ qtj |d d¡}t|ƒ}	|	||< | |gf||	< | |¡ |	S )Nr   F)Zsupportsr7   r`   r   r#   ZbuildVarDatara   )
r€   r@   r*   rj   Úvsindex_by_keyr)   ZvarTupleIndexesZsupportZvar_datarS   r   r   r   Ú_add_new_vsindexg  s    

r†   c                    sŒ  i }i }g }g }|d j }t| ƒD �]4\}	‰ ‡ fdd„|D ƒ}
tdd„ |
D ƒƒdkrVq"| |
¡\}}|d }tg ˆ |dƒ}t|_| |¡ |dd … }t|dd�D ]"\}}| |¡ t|_| |¡ q¢|j	|j
|j|dd�}||ˆ < |jr"d	|jkröq"td
d„ |
D ƒƒ}z|| }W n( tk
�r<   t||||||ƒ}Y nX |dkr"|dg|jd d…< q"|�szd| }t||||||ƒ t|||d�}|S )Nr   c                    s   g | ]}t |jˆ ƒ‘qS r   )r„   r6   )r   Útd©Úgnamer   r   r      s     z%merge_charstrings.<locals>.<listcomp>c                 S   s   g | ]}|d k	r|‘qS rE   r   )r   Úgsr   r   r   r    €  s      r   )ÚstartT)rP   ÚglobalSubrsrk   ÚoptimizeÚblendc                 s   s   | ]}|d k	V  qd S rE   r   )r   Úvr   r   r   Ú	<genexpr>¦  s     z$merge_charstrings.<locals>.<genexpr>rS   )T)r)   r*   rj   )r6   r]   ra   ZgetSubModelÚCFF2CharStringMergePenÚMergeOutlineExtractorZoutlineExtractorZdrawÚrestartÚgetCharStringrP   rŒ   Úseen_movetoÚprogramÚtuplerc   r†   r}   )rz   rn   ri   ZmasterModelrj   r…   r)   r*   Zdefault_charstringsr{   Zall_csr€   Zmodel_csZdefault_charstringZvar_penZ	region_csÚ
region_idxZregion_charstringZnew_csr@   rS   r�   r   rˆ   r   r   w  st    


ü     ÿ
     ÿýr   c                   @   s   e Zd ZdZddd„ZdS )ÚCFFToCFF2OutlineExtractorz”This class is used to remove the initial width from the CFF
    charstring without trying to add the width to self.nominalWidthX,
    which is None.r   c                 C   s<   |   ¡ }| js8|t|ƒd A r*|dd … }| j| _d| _|S )Nr/   r   )ZpopallZgotWidthra   ÚdefaultWidthXÚwidth)ÚselfZevenOddÚargsr   r   r   ÚpopallWidthÉ  s    z%CFFToCFF2OutlineExtractor.popallWidthN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rž   r   r   r   r   r™   Ä  s   r™   c                       sj   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Z‡  ZS )r’   z²Used to extract the charstring commands - including hints - from a
    CFF charstring in order to merge it as another set of region data
    into a CFF2 variable font charstring.Nc              	      s   t ƒ  |||||||¡ d S rE   )ÚsuperÚ__init__)rœ   ÚpenZ
localSubrsrŒ   ZnominalWidthXrš   rP   Zblender©Ú	__class__r   r   r¤   Ø  s    
      ÿzMergeOutlineExtractor.__init__c                 C   s    |   ¡ }| jt|ƒd  | _|S )Nr/   )rž   Ú	hintCountra   )rœ   r�   r   r   r   Ú
countHintsæ  s    z MergeOutlineExtractor.countHintsc                 C   s   | j  ||¡ d S rE   )r¥   Úadd_hint)rœ   Útyper�   r   r   r   Ú_hint_opë  s    zMergeOutlineExtractor._hint_opc                 C   s   |   ¡ }|  d|¡ d S )NZhstem©r©   r¬   ©rœ   r`   r�   r   r   r   Úop_hstemî  s    zMergeOutlineExtractor.op_hstemc                 C   s   |   ¡ }|  d|¡ d S )NZvstemr­   r®   r   r   r   Úop_vstemò  s    zMergeOutlineExtractor.op_vstemc                 C   s   |   ¡ }|  d|¡ d S )NZhstemhmr­   r®   r   r   r   Ú
op_hstemhmö  s    z MergeOutlineExtractor.op_hstemhmc                 C   s   |   ¡ }|  d|¡ d S )NÚvstemhmr­   r®   r   r   r   Ú
op_vstemhmú  s    z MergeOutlineExtractor.op_vstemhmc                 C   sN   | j s.|  ¡ }|r|  d|¡ | jd d | _ | jd  || j ¡\}}||fS )Nr²   é   é   éÿÿÿÿ)ÚhintMaskBytesr©   r¬   r¨   ZcallingStackZgetBytes)rœ   r`   r�   r·   r   r   r   Ú_get_hintmaskþ  s    z#MergeOutlineExtractor._get_hintmaskc                 C   s&   |   |¡\}}| j d|g¡ ||fS )NÚhintmask©r¸   r¥   Úadd_hintmask©rœ   r`   r·   r   r   r   Úop_hintmask  s    z!MergeOutlineExtractor.op_hintmaskc                 C   s&   |   |¡\}}| j d|g¡ ||fS )NÚcntrmaskrº   r¼   r   r   r   Úop_cntrmask  s    z!MergeOutlineExtractor.op_cntrmask)NN)rŸ   r    r¡   r¢   r¤   r©   r¬   r¯   r°   r±   r³   r¸   r½   r¿   Ú__classcell__r   r   r¦   r   r’   Ó  s     ø	r’   c                       s„   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd dd„Z‡  ZS )!r‘   z Pen to merge Type 2 CharStrings.ç{®Gáz„?c                    sP   t ƒ jd d d|d� d| _|| _|| _|| _d| _d| _|| _t	|t
d�| _
d S )NT)r›   ZglyphSetr!   ÚroundTolerancer   F©Úround)r£   r¤   Úpt_indexÚ	_commandsÚm_indexrn   Úprev_move_idxr•   rƒ   r   rÄ   )rœ   Zdefault_commandsrƒ   rn   Z
master_idxrÂ   r¦   r   r   r¤     s       ÿzCFF2CharStringMergePen.__init__c                 C   sv   | j dkr| j ||gg¡ nF| j| j }|d |krVt|| jt|d ƒ|d | jƒ‚|d  |¡ |  jd7  _d S ©Nr   r   )rÇ   rÆ   r7   rÅ   r   ra   rƒ   )rœ   Z
point_typeÚ	pt_coordsÚcmdr   r   r   Ú	add_point%  s    
  
  ÿz CFF2CharStringMergePen.add_pointc                 C   sv   | j dkr| j ||gg¡ nF| j| j }|d |krVt|| jt|d ƒ|d | jƒ‚|d  |¡ |  jd7  _d S rÉ   ©rÇ   rÆ   r7   rÅ   r   ra   rƒ   )rœ   Ú	hint_typer�   rË   r   r   r   rª   1  s    
  
  ÿzCFF2CharStringMergePen.add_hintc                 C   s    | j dkr.| j |g g¡ | j d|gg¡ n`| j| j }|d |krft|| jt|d ƒ|d | jƒ‚|  jd7  _| j| j }|d  |¡ |  jd7  _d S )Nr   Ú r   rÍ   )rœ   rÎ   Zabs_argsrË   r   r   r   r»   =  s     
  
  ÿz#CFF2CharStringMergePen.add_hintmaskc                 C   s2   | j sd| _ |  |¡}|  d|¡ | jd | _d S )NTZrmovetor   )r•   Ú_prÌ   rÅ   rÈ   ©rœ   ÚptrÊ   r   r   r   Ú_moveToP  s
    
zCFF2CharStringMergePen._moveToc                 C   s   |   |¡}|  d|¡ d S )NZrlineto©rÐ   rÌ   rÑ   r   r   r   Ú_lineToY  s    
zCFF2CharStringMergePen._lineToc                 C   s.   | j }||ƒ||ƒ ||ƒ }|  d|¡ d S )NZ	rrcurvetorÔ   )rœ   Zpt1Zpt2Zpt3rÐ   rÊ   r   r   r   Ú_curveToOne]  s    z"CFF2CharStringMergePen._curveToOnec                 C   s   d S rE   r   ©rœ   r   r   r   Ú
_closePathb  s    z!CFF2CharStringMergePen._closePathc                 C   s   d S rE   r   r×   r   r   r   Ú_endPathe  s    zCFF2CharStringMergePen._endPathc                 C   s   d| _ || _d| _d S )Nr   )r   r   )rÅ   rÇ   Z_p0)rœ   r˜   r   r   r   r“   h  s    zCFF2CharStringMergePen.restartc                 C   s   | j S rE   )rÆ   r×   r   r   r   ÚgetCommandsm  s    z"CFF2CharStringMergePen.getCommandsc                 C   sä   |D ] }|d }t |Ž }t|ƒ|d< qd}|D ]°}|d }|dkrrt|d ƒ}t|ƒs^tdƒ‚|d d g|d< nh|d }	g }
|	D ]N}t|ƒrž|
 |d ¡ q‚||ƒdd… }|d g| }| d¡ |
 |¡ q‚|
|d< |}q.|S )a˜  
        We first re-order the master coordinate values.
        For a moveto to lineto, the args are now arranged as::

                [ [master_0 x,y], [master_1 x,y], [master_2 x,y] ]

        We re-arrange this to::

                [	[master_0 x, master_1 x, master_2 x],
                        [master_0 y, master_1 y, master_2 y]
                ]

        If the master values are all the same, we collapse the list to
        as single value instead of a list.

        We then convert this to::

                [ [master_0 x] + [x delta tuple] + [numBlends=1]
                  [master_0 y] + [y delta tuple] + [numBlends=1]
                ]
        r   Nr   )r¹   r¾   z3Hintmask values cannot differ between source fonts.)rf   r:   r   r   r7   )rœ   ÚcommandsZget_delta_funcrË   r�   Zm_argsZlastOpÚopZcoordZcoordsZ
new_coordsrr   r   r   r   Úreorder_blend_argsp  s4    ÿ
z)CFF2CharStringMergePen.reorder_blend_argsNTc                 C   sJ   | j }|  |t|j| jd�¡}|r0t|dtd�}t|ƒ}t|||d�}|S )NrÃ   F)ZgeneralizeFirstZmaxstack)r–   rP   rŒ   )	rÆ   rÝ   r   rh   rÄ   r   r   r   r   )rœ   rP   rŒ   rk   r�   rÛ   r–   Z
charStringr   r   r   r”   ©  s$     ÿ  ÿ  ÿz$CFF2CharStringMergePen.getCharString)rÁ   )NNNT)rŸ   r    r¡   r¢   r¤   rÌ   rª   r»   rÓ   rÕ   rÖ   rØ   rÙ   r“   rÚ   rÝ   r”   rÀ   r   r   r¦   r   r‘     s&    ÿ	:       ÿr‘   N)9Úcollectionsr   ZfontTools.cffLibr   r   r   r   r   r   r	   r
   r   r   Úior   ZfontTools.cffLib.specializerr   r   ZfontTools.ttLibr   Z	fontToolsr   ZfontTools.varLib.modelsr   ZfontTools.misc.roundToolsr   ZfontTools.misc.psCharStringsr   r   ZfontTools.pens.t2CharStringPenr   Ú	functoolsr   Úerrorsr   r   r   r   ZMergeDictErrorZMergeTypeErrorr.   rB   rD   rK   rb   rQ   ru   rv   r|   r}   r‚   r„   r†   r   r™   r’   r‘   r   r   r   r   Ú<module>   s<   0	O
t+
M?