a
    Df
f                     @   st  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" Z2d1d$d%Z3d&d' Z4d(d) Z5G d*d+ d+eZ6G d,d- d-e6Z7G d.d/ d/eZ8d0S )2    )
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 u r|j	}	|	D ]}
t|
drj|j|
j_
qjd S )NZfvarc                 S   s   g | ]
}|j qS  )ZaxisTag).0Zaxisr   r   a/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/fontTools/varLib/cff.py
<listcomp>'       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 urtD ]:}|d }||
vr||jv r|j|= t||rt|| qn|j}tt}
|D ]}	|	d t|	j D ]0}||	j	vrB|	j|= t|	|rBt|	| qB|	j}tD ]B}|d }||
vr~||jv r|j|= t||r~t|| q~q&tD ]B}|d }||vr||jv r|j|= t||rt|| qd| _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seek	decompile)r%   r1   r5   ZtopDictDatar,   ZprivateDictZopOrderr-   ZcharStringsr.   ZprivateOpOrderentrykeyfiler   r   r   lib_convertCFFToCFF24   s|    











rD   c                 C   s6   | d }t |j|  td}|j|_|| d< | d= d S NzCFF r"   )rD   r%   r   )r)   ZcffTableZnewCFF2r   r   r   convertCFFtoCFF2   s    rF   c                 C   s   t | tr|  rt| S | S N)
isinstancefloat
is_integerint)numr   r   r   conv_to_int   s    rM   )Z
BlueValuesZ
OtherBluesZFamilyBluesZFamilyOtherBluesZ	BlueScaleZ	BlueShiftZBlueFuzzZStdHWZStdVWZ	StemSnapHZ	StemSnapVc                 C   s4   | | }|| }||v r,|| }|| j }nd }|S rG   )r#   )regionFDArraysfd_indexrifd_mapZregion_fdArrayZregion_fd_mapZregion_fdIndexprivater   r   r   get_private   s    rS   c              
      s  | d }| dd }t |d dr2dd |D }ndd |D }t|jD ]^\}}|j}	t|	dd}
||
 \}}g }|jdd D ]}|j|d }|| q|	g}|	}|D ].}t||||}|du r|}n|}|| qt	|}|	j
 D ]\ }g } tvrqt|trz fd	d|D }W n( tyX   td
j d Y qY n0 zt| }W n  ty   t ||Y n0 dg| d}|D ]T}fddt|D }|st|sd}|||}|d |d< || q|s6dd |D }n0 fdd|D }t|s.||}n|d }t|trt|D ]H\}}t|trt|D ]\}}t||| |< qfnt|||< qJnt|}||	j
 < qqJd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       r!   z&merge_PrivateDicts.<locals>.<listcomp>c                 S   s   g | ]
}|gqS r   r   rT   r   r   r   r       r!   vsindexc                    s   g | ]}|j   qS r   r9   r   pdrB   r   r   r       r!   z\Warning: {key} in default font Private dict is missing from another font, and was discarded.rY   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      r!   c                    s   g | ]}|j   qS r   rV   rW   rY   r   r   r      r!   )r(   	enumerater'   r#   getattr	locationsindexr8   rS   lenr9   r3   pd_blend_fieldsrH   r;   KeyErrorprintformatzip
IndexErrorr   r   	getDeltasrM   )	top_dictsvsindex_dict	var_modelrQ   r,   Zregion_top_dictsrN   rO   Z	font_dictZprivate_dictrU   Z	sub_model_Zmaster_indiceslocrZ   ZpdsZlast_pdrP   rX   num_mastersvalueZdataListvaluesZany_points_differval_listrel_listdeltasitemjZjtemr   )rB   r\   r   merge_PrivateDicts   s    





rx   c                 C   s   d| v r| d S | d S rE   r   )fontr   r   r   _cff_or_cff2!  s    rz   c                 C   s"  i }|d }|dd }t |}t|jjd }t|dsTdd t|D |d< |S i }|j}| }	t|D ]$\}
}|||	|
 < ||vrni ||< qnt|D ]\}}| }t|jjd }t|ds||d  }d|| |< q|j}t|D ],\}
}|||
  }|| }||vr|||< qq|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   rP   r   r   r   
<dictcomp>7  r!   zgetfd_map.<locals>.<dictcomp>)	rc   rz   r%   r&   r(   ranger{   r2   r_   )r)   Z
fonts_listrQ   Zdefault_fontZregion_fontsZnum_regionsr,   Zgname_mappingZdefault_fdSelect
glyphOrdergidZfdIndexrP   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]   )rz   r%   r&   )r   ZttFontr   r   r   r    W  s   z&merge_region_fonts.<locals>.<listcomp>r   )r%   r&   rc   mappingmerge_charstringsr   rx   rl   r/   r*   r+   )	r)   modelZordered_fonts_listr~   r,   rk   rp   cvDatarQ   r   r   r   merge_region_fontsU  s    



r   Fc                 C   sv   || vrd S | | }|rr|   |jg kr.d S t|jdkrr|jd dkrrt|jdksnt|jd ttfv rrd S |S )Nr0   endcharr   r   )r@   programrc   typerK   rI   )Zcharstrings	glyphNameZfilterEmptycsr   r   r   _get_csa  s"    
r   c           
      C   sv   g }| j dd  D ]&}||vr(|| ||| qtj|d d}t|}	|	||< | |gf||	< || |	S )Nr   F)Zsupportsr8   rb   r   r$   ZbuildVarDatarc   )
r   rB   r+   rl   vsindex_by_keyr*   ZvarTupleIndexesZsupportZvar_datarU   r   r   r   _add_new_vsindext  s    

r   c                    s|  i }i }g }g }|d j }t| D ]$\}	  fddt|D }
||
\}}|d }tg  |d}t|_|| |dd  }t|ddD ]"\}}|| t|_|| q|j|j	|j
|dd}|| < |sq"|jr"d|jvrq"td	d
 |
D }z|| }W n& ty,   t||||||}Y n0 |dkr"|dg|jd d< q"|sjd| }t|||||| t|||d}|S )Nr   c                    s"   g | ]\}}t |j |d kqS r]   )r   r7   )r   rZ   tdgnamer   r   r      s   z%merge_charstrings.<locals>.<listcomp>r   )startT)rR   globalSubrsrm   optimizeZblendc                 s   s   | ]}|d uV  qd S rG   r   )r   vr   r   r   	<genexpr>  r!   z$merge_charstrings.<locals>.<genexpr>rU   )T)r*   r+   rl   )r7   r_   ZgetSubModelCFF2CharStringMergePenMergeOutlineExtractorZoutlineExtractorZdrawrestartgetCharStringrR   r   seen_movetor   tuplere   r   r   )r~   rp   rk   ZmasterModelrl   r   r*   r+   Zdefault_charstringsr   Zall_csr   Zmodel_csZdefault_charstringZvar_penZ	region_cs
region_idxZregion_charstringZnew_csrB   rU   r   r   r   r   r     sd    




r   c                   @   s   e Zd ZdZdddZdS )CFFToCFF2OutlineExtractorzThis 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 )Nr0   r   )ZpopallZgotWidthrc   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   zUsed 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 rG   )super__init__)r   penZ
localSubrsr   ZnominalWidthXr   rR   Zblender	__class__r   r   r     s    
zMergeOutlineExtractor.__init__c                 C   s    |   }| jt|d  | _|S )Nr0   )r   	hintCountrc   )r   r   r   r   r   
countHints  s    z MergeOutlineExtractor.countHintsc                 C   s   | j || d S rG   )r   add_hint)r   r   r   r   r   r   _hint_op  s    zMergeOutlineExtractor._hint_opc                 C   s   |   }| d| d S )NZhstemr   r   r   rb   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         r   )hintMaskBytesr   r   r   ZcallingStackZgetBytes)r   rb   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   rb   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.{Gz?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_indexrp   prev_move_idxr   r   r   r   )r   Zdefault_commandsr   rp   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   r8   r   r   rc   r   )r   Z
point_type	pt_coordscmdr   r   r   	add_point5  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   r8   r   r   rc   r   )r   	hint_typer   r   r   r   r   r   A  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   M  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   _moveTo`  s
    
zCFF2CharStringMergePen._moveToc                 C   s   |  |}| d| d S )NZrlinetor   r   r   r   r   r   _lineToi  s    
zCFF2CharStringMergePen._lineToc                 C   s.   | j }|||| || }| d| d S )NZ	rrcurvetor   )r   Zpt1Zpt2Zpt3r   r   r   r   r   _curveToOnem  s    z"CFF2CharStringMergePen._curveToOnec                 C   s   d S rG   r   r   r   r   r   
_closePathr  s    z!CFF2CharStringMergePen._closePathc                 C   s   d S rG   r   r   r   r   r   _endPathu  s    zCFF2CharStringMergePen._endPathc                 C   s   d| _ || _d| _d S )Nr   )r   r   )r   r   Z_p0)r   r   r   r   r   r   x  s    zCFF2CharStringMergePen.restartc                 C   s   | j S rG   )r   r   r   r   r   getCommands}  s    z"CFF2CharStringMergePen.getCommandsc                 C   s   |D ] }|d }t | }t||d< qd}|D ]}|d }|dv 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.)rh   r;   r   r   r8   )r   commandsZget_delta_funcr   r   Zm_argsZlastOpopZcoordZcoordsZ
new_coordsru   r   r   r   reorder_blend_args  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   rR   r   )	r   r   r   rj   r   r   r   r   r   )r   rR   r   rm   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)F)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/   rD   rF   rM   rd   rS   rx   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s<   0	O
t+

P?