a
    —ÆàguY  ã                   @   s€  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 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*edƒdd„ ƒZ+dd„ Z,dZ-dd„ Z.dd„ Z/dd„ Z0dd„ Z1edd ƒZ2d!d"„ Z3d1d$d%„Z4d&d'„ Z5d(d)„ Z6G d*d+„ d+eƒZ7G d,d-„ d-e7ƒZ8G d.d/„ d/e ƒZ9d0S )2é    )Ú
namedtuple)
ÚmaxStackLimitÚTopDictIndexÚ
buildOrderÚtopDictOperatorsÚtopDictOperators2ÚprivateDictOperatorsÚprivateDictOperators2ÚFDArrayIndexÚFontDictÚVarStoreData)ÚBytesIO)ÚspecializeCommandsÚcommandsToProgram)ÚnewTable)ÚvarLib)ÚallEqual)ÚdeprecateFunction)Ú	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   úM/var/www/sistema_ama/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ÚtopDictZfdArrayZfontDictr   r   r    ÚaddCFFVarStore&   s    
r.   z8Use fontTools.cffLib.CFFToCFF2.convertCFFToCFF2 instead.c                 C   s   ddl m} || ƒS )Nr   )ÚconvertCFFToCFF2)ZfontTools.cffLib.CFFToCFF2r/   )r*   r/   r   r   r    ÚconvertCFFtoCFF25   s    r0   c                 C   s   t | tƒr|  ¡ rt| ƒS | S ©N)Ú
isinstanceÚfloatÚ
is_integerÚint)Únumr   r   r    Úconv_to_int<   s    r7   )Z
BlueValuesZ
OtherBluesZFamilyBluesZFamilyOtherBluesZ	BlueScaleZ	BlueShiftZBlueFuzzZStdHWZStdVWZ	StemSnapHZ	StemSnapVc                 C   s4   | | }|| }||v r,|| }|| j }nd }|S r1   )r$   )ÚregionFDArraysÚfd_indexÚriÚfd_mapZregion_fdArrayZregion_fd_mapZregion_fdIndexÚprivater   r   r    Úget_privateQ   s    r=   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|}| |¡ q²t	|ƒ}|	j
 ¡ D �]²\‰ }g }ˆ tv�rqôt|tƒ�rz‡ fd	d„|D ƒ}W n( t�yX   td
jˆ d�ƒ Y qôY n0 zt|Ž }W n  t�y†   tˆ ||ƒ‚Y n0 dg| ‰d}|D ]T}‡fdd„t|ƒD ƒ}|�sÈt|ƒ�sÈd}|‰| |¡}|d |d< | |¡ �qš|�s6dd„ |D ƒ}n0‡ fdd„|D ƒ}t|ƒ�s.| |¡}n|d }t|tƒ�r–t|ƒD ]H\}}t|tƒ�r„t|ƒD ]\}}t|ƒ|| |< �qfnt|ƒ||< �qJn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!   p   r"   z&merge_PrivateDicts.<locals>.<listcomp>c                 S   s   g | ]
}|g‘qS r   r   r>   r   r   r    r!   r   r"   Úvsindexc                    s   g | ]}|j ˆ  ‘qS r   ©ÚrawDict©r   Úpd©Úkeyr   r    r!   �   r"   z\Warning: {key} in default font Private dict is missing from another font, and was discarded.rD   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   r@   rB   rD   r   r    r!   ¼   r"   )r)   Ú	enumerater(   r$   ÚgetattrÚ	locationsÚindexÚappendr=   ÚlenrA   ÚitemsÚpd_blend_fieldsr2   ÚlistÚKeyErrorÚprintÚformatÚzipÚ
IndexErrorr   r   Ú	getDeltasr7   )Ú	top_dictsÚvsindex_dictÚ	var_modelr;   r-   Zregion_top_dictsr8   r9   Z	font_dictZprivate_dictr?   Z	sub_modelÚ_Zmaster_indicesÚlocrF   ZpdsZlast_pdr:   rC   Únum_mastersÚvalueZdataListÚvaluesZany_points_differÚval_listÚrel_listÚdeltasÚitemÚjZjtemr   )rE   rH   r    Úmerge_PrivateDicts\   s„    
þÿ


ÿ

rg   c                 C   s   d| v r| d S | d S )NzCFF r#   r   )Úfontr   r   r    Ú_cff_or_cff2Ð   s    ri   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î|||< 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 rI   r   )r   r:   r   r   r    Ú
<dictcomp>æ   r"   zgetfd_map.<locals>.<dictcomp>)	rP   ri   r&   r'   r)   Úrangerj   ZgetGlyphOrderrK   )r*   Z
fonts_listr;   Zdefault_fontZregion_fontsZnum_regionsr-   Zgname_mappingZdefault_fdSelectÚ
glyphOrderÚgidZfdIndexr:   Zregion_fontZregion_glyphOrderZregion_topDictZdefault_fdIndexZregion_fdSelectZ
region_mapr   r   r    Ú	getfd_mapÖ   s8    


ro   Ú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 rI   )ri   r&   r'   )r   ZttFontr   r   r    r!     s   z&merge_region_fonts.<locals>.<listcomp>r   )r&   r'   rP   ÚmappingÚmerge_charstringsro   rg   r[   r.   r+   r,   )	r*   ÚmodelZordered_fonts_listrm   r-   rZ   r_   ÚcvDatar;   r   r   r    Úmerge_region_fonts  s    

ÿ

ru   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 )Né   éÿÿÿÿÚendcharr   r   )Z	decompileÚprogramrP   Útyper5   r3   )ZcharstringsÚ	glyphNameZfilterEmptyÚcsr   r   r    Ú_get_cs  s"    
ÿþýýr}   c           
      C   sv   g }| j dd … D ]&}||vr(| |¡ | | |¡¡ qtj |d d¡}t|ƒ}	|	||< | |gf||	< | |¡ |	S )Nr   F)ZsupportsrO   rN   r   r%   ZbuildVarDatarP   )
rs   rE   r,   r[   Úvsindex_by_keyr+   ZvarTupleIndexesZsupportZvar_datar?   r   r   r    Ú_add_new_vsindex#  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�}||ˆ < |sÖq"|jr"d|jvrèq"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 rI   )r}   ÚCharStrings)r   rF   Útd©Úgnamer   r    r!   ;  s   z%merge_charstrings.<locals>.<listcomp>r   )ÚstartT)r<   ÚglobalSubrsr\   ÚoptimizeZblendc                 s   s   | ]}|d uV  qd S r1   r   )r   Úvr   r   r    Ú	<genexpr>e  r"   z$merge_charstrings.<locals>.<genexpr>r?   )T)r+   r,   r[   )r€   rK   ZgetSubModelÚCFF2CharStringMergePenÚMergeOutlineExtractorZoutlineExtractorZdrawÚrestartÚgetCharStringr<   r…   Úseen_movetory   ÚtuplerT   r   rp   )rm   r_   rZ   ZmasterModelr[   r~   r+   r,   Zdefault_charstringsrn   Zall_csrs   Zmodel_csZdefault_charstringZvar_penZ	region_csÚ
region_idxZregion_charstringZnew_csrE   r?   rt   r   r‚   r    rr   3  sd    

ÿ

üÿ
ÿýrr   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 )Nrv   r   )ZpopallZgotWidthrP   Ú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 r1   )ÚsuperÚ__init__)r“   ÚpenZ
localSubrsr…   ZnominalWidthXr‘   r<   Zblender©Ú	__class__r   r    r›   —  s    
ÿzMergeOutlineExtractor.__init__c                 C   s    |   ¡ }| jt|ƒd  | _|S )Nrv   )r•   Ú	hintCountrP   )r“   r”   r   r   r    Ú
countHints¥  s    z MergeOutlineExtractor.countHintsc                 C   s   | j  ||¡ d S r1   )rœ   Úadd_hint)r“   rz   r”   r   r   r    Ú_hint_opª  s    zMergeOutlineExtractor._hint_opc                 C   s   |   ¡ }|  d|¡ d S )NZhstem©r    r¢   ©r“   rN   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¨   é   é   rw   )ÚhintMaskBytesr    r¢   rŸ   ZcallingStackZgetBytes)r“   rN   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“   rN   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_indexr_   Úprev_move_idxr�   r{   r   r¹   )r“   Zdefault_commandsr{   r_   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»   rO   rº   r   rP   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»   rO   rº   r   rP   r{   )r“   Ú	hint_typer”   rÀ   r   r   r    r¡   ð  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    Ú_moveTo  s
    
zCFF2CharStringMergePen._moveToc                 C   s   |   |¡}|  d|¡ d S )NZrlineto©rÅ   rÁ   rÆ   r   r   r    Ú_lineTo  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 r1   r   ©r“   r   r   r    Ú
_closePath!  s    z!CFF2CharStringMergePen._closePathc                 C   s   d S r1   r   rÌ   r   r   r    Ú_endPath$  s    zCFF2CharStringMergePen._endPathc                 C   s   d| _ || _d| _d S )Nr   )r   r   )rº   r¼   Z_p0)r“   r�   r   r   r    r‹   '  s    zCFF2CharStringMergePen.restartc                 C   s   | j S r1   )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.)rW   rS   r   r   rO   )r“   ÚcommandsZget_delta_funcrÀ   r”   Zm_argsZlastOpÚopZcoordZcoordsZ
new_coordsrd   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)ry   r<   r…   )	r»   rÒ   r   rY   r¹   r   r   r   r   )r“   r<   r…   r\   r†   rÐ   ry   Z
charStringr   r   r    rŒ   h  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):Ú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.loggingToolsr   ZfontTools.misc.roundToolsr   ZfontTools.misc.psCharStringsr   r   ZfontTools.pens.t2CharStringPenr   Ú	functoolsr   Úerrorsr   r   r   r   ZMergeDictErrorZMergeTypeErrorr.   r0   r7   rR   r=   rg   ri   ro   rp   ru   r}   r   rr   r�   rŠ   r‰   r   r   r   r    Ú<module>   s>   0	
t+

P?