a
    èÝEb¹S  ã                   @   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 u r„|j	}	|	D ]}
t|
dƒrj|j|
j_
qjd S )NZfvarc                 S   s   g | ]
}|j ‘qS © )ZaxisTag)Ú.0Zaxisr   r   úT/home/ja/django-apps/lartica_env/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�rÆtD ]:}|d }||
vrÖ||jv rü|j|= t||ƒrÖt||ƒ qÖn²|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||ƒ�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%   r1   r5   ZtopDictDatar,   ZprivateDictZopOrderr-   ZcharStringsr.   ZprivateOpOrderÚentryÚkeyÚfiler   r   r   Úlib_convertCFFToCFF22   s|    











rC   c                 C   s6   | d }t |j| ƒ tdƒ}|j|_|| d< | d= d S ©NzCFF r"   )rC   r%   r   )r)   ZcffTableZnewCFF2r   r   r   ÚconvertCFFtoCFF2�   s    rE   c                 C   s   t | tƒr|  ¡ rt| ƒS | S ©N)Ú
isinstanceÚfloatÚ
is_integerÚint)Únumr   r   r   Úconv_to_int‹   s    rL   )Z
BlueValuesZ
OtherBluesZFamilyBluesZFamilyOtherBluesZ	BlueScaleZ	BlueShiftZBlueFuzzZStdHWZStdVWZ	StemSnapHZ	StemSnapVc                 C   s4   | | }|| }||v r,|| }|| j }nd }|S rF   )r#   )ÚregionFDArraysÚfd_indexÚriÚfd_mapZregion_fdArrayZregion_fd_mapZregion_fdIndexÚprivater   r   r   Úget_private—   s    rR   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 )aw  
	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   rS   r   r   r   r    ¸   r!   Úvsindexc                    s   g | ]}|j ˆ  ‘qS r   ©r9   ©r   Úpd©rA   r   r   r    Ö   r!   z\Warning: {key} in default font Private dict is missing from another font, and was discarded.rX   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   rU   rV   rX   r   r   r       r!   )r(   Ú	enumerater'   r#   ÚgetattrÚ	locationsÚindexr8   rR   Úlenr9   r3   Úpd_blend_fieldsrG   r;   ÚKeyErrorÚprintÚformatÚzipÚ
IndexErrorr   r   Ú	getDeltasrL   )Ú	top_dictsÚvsindex_dictÚ	var_modelrP   r,   Zregion_top_dictsrM   rN   Z	font_dictZprivate_dictrT   Z	sub_modelÚ_Zmaster_indicesÚlocrY   ZpdsZlast_pdrO   rW   Únum_mastersÚvalueZdataListÚvaluesZany_points_differZval_listÚrel_listÚdeltasÚitemÚjZjtemr   )rA   r[   r   Úmerge_PrivateDicts¢   s„    
þÿ


ÿ

rv   c                 C   s   d| v r| d S | d S rD   r   )Úfontr   r   r   Ú_cff_or_cff2  s    rx   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 r\   r   )r   rO   r   r   r   Ú
<dictcomp>*  r!   zgetfd_map.<locals>.<dictcomp>)	rb   rx   r%   r&   r(   Úrangery   r2   r^   )r)   Z
fonts_listrP   Zdefault_fontZregion_fontsZnum_regionsr,   Zgname_mappingZdefault_fdSelectÚ
glyphOrderÚgidZfdIndexrO   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\   )rx   r%   r&   )r   ZttFontr   r   r   r    H  s   ÿz&merge_region_fonts.<locals>.<listcomp>r   )r%   r&   rb   ÚmappingÚmerge_charstringsr~   rv   rk   r/   r*   r+   )	r)   ÚmodelZordered_fonts_listr|   r,   rj   ro   ÚcvDatarP   r   r   r   Úmerge_region_fontsF  s    

þ


ÿr„   c                 C   s   || vrd S | | S rF   r   )ZcharstringsÚ	glyphNamer   r   r   Ú_get_csT  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   ra   r   r$   ZbuildVarDatarb   )
r‚   rA   r+   rk   Úvsindex_by_keyr*   ZvarTupleIndexesZsupportZvar_datarT   r   r   r   Ú_add_new_vsindexY  s    

rˆ   c                    sŠ  i }i }g }g }|d j }t| ƒD �]2\}	‰ ‡ 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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"|�sxd| }t||||||ƒ t|||d�}|S )Nr   c                    s   g | ]}t |jˆ ƒ‘qS r   )r†   r7   )r   Útd©Úgnamer   r   r    o  s   ÿz%merge_charstrings.<locals>.<listcomp>c                 S   s   g | ]}|d ur|‘qS rF   r   )r   Úgsr   r   r   r    r  r!   r   )ÚstartT)rQ   ÚglobalSubrsrl   ÚoptimizeÚblendc                 s   s   | ]}|d uV  qd S rF   r   )r   Úvr   r   r   Ú	<genexpr>–  r!   z$merge_charstrings.<locals>.<genexpr>rT   )T)r*   r+   rk   )r7   r^   rb   ZgetSubModelÚCFF2CharStringMergePenÚMergeOutlineExtractorZoutlineExtractorZdrawÚrestartÚgetCharStringrQ   rŽ   Úseen_movetoÚprogramÚtuplerd   rˆ   r   )r|   ro   rj   ZmasterModelrk   r‡   r*   r+   Zdefault_charstringsr}   Zall_csr‚   Zmodel_csZdefault_charstringZvar_penZ	region_csÚ
region_idxZregion_charstringZnew_csrA   rT   rƒ   r   rŠ   r   r�   g  s^    

þ

ý
ÿ

ÿÿ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 )Nr0   r   )ZpopallZgotWidthrb   Ú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 rF   )ÚsuperÚ__init__)rž   ÚpenZ
localSubrsrŽ   ZnominalWidthXrœ   rQ   ©Ú	__class__r   r   r¦   Â  s    
ÿzMergeOutlineExtractor.__init__c                 C   s    |   ¡ }| jt|ƒd  | _|S )Nr0   )r    Ú	hintCountrb   )rž   rŸ   r   r   r   Ú
countHintsÇ  s    z MergeOutlineExtractor.countHintsc                 C   s   | j  ||¡ d S rF   )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ž   ra   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ž   ra   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ž   ra   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)N)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.
	ç      à?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_indexro   Úprev_move_idxr—   r…   r   rÆ   )rž   Zdefault_commandsr…   ro   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   rb   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È   r8   rÇ   r   rb   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   Ú_moveTo1  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 rF   r   ©rž   r   r   r   Ú
_closePathC  s    z!CFF2CharStringMergePen._closePathc                 C   s   d S rF   r   rÙ   r   r   r   Ú_endPathF  s    zCFF2CharStringMergePen._endPathc                 C   s   d| _ || _d| _d S )Nr   )r   r   )rÇ   rÉ   Z_p0)rž   rš   r   r   r   r•   I  s    zCFF2CharStringMergePen.restartc                 C   s   | j S rF   )rÈ   rÙ   r   r   r   ÚgetCommandsN  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< n^|d }	g }
|	D ]D}t|ƒrž|
 |d ¡ q‚||ƒdd… }|d g| }|
 |¡ 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.)rg   r;   r   r   r8   )rž   ÚcommandsZget_delta_funcrÍ   rŸ   Zm_argsZlastOpÚopZcoordZcoordsZ
new_coordsrs   r   r   r   Úreorder_blend_argsQ  s.    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˜   rQ   rŽ   )	rÈ   rß   r   ri   rÆ   r   r   r   r   )rž   rQ   rŽ   rl   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"    þ	7  þ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/   rC   rE   rL   rc   rR   rv   rx   r~   r   r„   r†   rˆ   r�   r›   r”   r“   r   r   r   r   Ú<module>   s<   0O
r+
H7