a
    èÝEb„<  ã                   @   s”  d 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
 ddlmZ ddlmZmZmZ ddlmZ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ZddlZ ddl!Z!ddl"m#Z# e! $d¡Z%i Z&g d¢Z'e(e)e'dd… e'dd… ƒdd�D ] \Z*\Z+Z,e+e, d Z-e*e&e-< qüdd„ Z.dd„ Z/dd„ Z0d"dd„Z1d#dd „Z2e3d!k�r�ddl4Z4e5e4j6ƒdk�rxe4 7e2ƒ ¡ ddl8Z8e4 7e8 9¡ j:¡ dS )$zn
Instantiate a variation font.  Run, eg:

$ fonttools varLib.mutator ./NotoSansArabic-VF.ttf wght=140 wdth=85
é    )ÚfloatToFixedToFloatÚfloatToFixed)ÚotRound)Ú	BoundsPen)ÚTTFontÚnewTable)Ú	ttProgram)ÚGlyphCoordinatesÚflagOverlapSimpleÚOVERLAP_COMPOUND)ÚsupportScalarÚnormalizeLocationÚpiecewiseLinearMap)ÚMutatorMerger)ÚVarStoreInstancer)ÚMVAR_ENTRIES)Ú	iup_deltaN)ÚBytesIOzfontTools.varlib.mutator)	g      I@g     @O@g     ÀR@g     àU@g      Y@g      \@g     @_@g     Àb@g      i@éÿÿÿÿé   )Ústarté   c              
   C   sØ   d}d}| j D ]Ä}|j}t|dƒr(|jnd}|j ¡ D ]š\}}||v rzt|tƒrz|||dd … ƒ}	t|d |	 ƒ|j|< q6||v r6t|d tƒr6d}	t	|ƒD ]2\}
}|	t|||dd … ƒƒ7 }	|d |	 ||
< qœq6qd S )N)Z
BlueValuesZ
OtherBluesZFamilyBluesZFamilyOtherBluesZ	StemSnapHZ	StemSnapV)Z	BlueScaleZ	BlueShiftZBlueFuzzZStdHWZStdVWÚvsindexr   r   )
ZFDArrayZPrivateÚhasattrr   ÚrawDictÚitemsÚ
isinstanceÚlistr   Ú	enumerate)ÚtopDictÚinterpolateFromDeltasZpd_blend_listsZpd_blend_valuesZfontDictÚpdr   ÚkeyÚvalueÚdeltaÚiZval_list© r&   úX/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/varLib/mutator.pyÚinterpolate_cff2_PrivateDict%   s     

ÿr(   c                 C   sN  | j }|D �]<}|| }g }d}d}t|jƒD ]ö\}	}
|
dkrv|j|	d  }|dkrl| |j||	d … ¡ |	d }q.|
dkr.| |¡}d| }|j|	d  }|	|| d  }||  }}||k �r|| }|j||… }|||ƒ}|j|  t|ƒ7  < |}|d7 }qº| |j||… ¡ |	d }q.|dkr
| |j|d … ¡ ||_q
d S )Nr   r   r   Úblend)ÚCharStringsr   ÚprogramÚextendZgetNumRegionsr   )r   r    Ú
glyphOrderÚcharstringsÚgnameÚ
charstringZnew_programr   Zlast_ir%   ÚtokenZnum_regionsZ
numMastersÚnum_argsZargiZend_argsZtupleiZnext_tiÚdeltasr$   r&   r&   r'   Úinterpolate_cff2_charstrings?   s<    






r4   c                 C   s  |j }t|ƒ}| d }d}d| v rD| d j}| d }t|j|j|ƒ}	t|ƒD ]º\}
}t|| ƒ}|rŠ|jrx|jj	| }n|
}t
|	| ƒ}nd}| ¡  || }| |¡ |jdu r¸d}nt
|jd ƒ}|d | }|sÚ|rL|rî|d  |7  < |rú||d< t|ƒ||< qLdS )a;  Unlike TrueType glyphs, neither advance width nor bounding box
	info is stored in a CFF2 charstring. The width data exists only in
	the hmtx and HVAR tables. Since LSB data cannot be interpolated
	reliably from the master LSB values in the hmtx table, we traverse
	the charstring to determine the actual bound box. ÚhmtxNÚHVARÚfvarr   r   )r*   r   Útabler   ÚVarStoreÚaxesr   r   ZAdvWidthMapÚmappingr   ÚinitZdrawZboundsÚtuple)Úvarfontr   r-   Úlocr.   Z	boundsPenr5   Z
hvar_tabler7   ÚvarStoreInstancerÚgidr/   ÚentryZ	width_idxZwidth_deltar0   Z	lsb_deltaZlsbr&   r&   r'   Úinterpolate_cff2_metricsi   s:    


rC   FTc           A   	      sd  |s&t ƒ }|  |¡ | d¡ t|ƒ} | d }dd„ |jD ƒ}t||ƒ}d| v rp| d j‰‡fdd„| ¡ D ƒ}dd„ | ¡ D ƒ}t 	d|¡ d	| v �r”t 	d
¡ | d	 }| d ‰| d j
}	t|  d¡ddƒ}
t|j ¡ ‡fdd„d�}|D ]¤}|j| }ˆ ||	|
¡\}}d\}}|D ]f}t||jƒ}|�s2�q|j}d|v �rl|du �r^ˆ ||	|
¡\}}t|||jƒ}|t|ƒ| 7 }�qˆ |||	|
¡ qìnd‰d| v �rDt 	d¡ | d }| d }i }|jD ]T}t||jƒ}|�sà�qÆt|jƒD ],\}}|du�rê| |d¡||  ||< �qê�qÆ| ¡ D ]\}}||  t|ƒ7  < �q$d| v �rÄt 	d¡ |  ¡ }| d }|jjd }t|jj|j|ƒ}|j}t ||ƒ | !¡  t"|||ƒ t#| |||ƒ |j$d= |`d| v �rZt 	d¡ | d j%} t| j|j|ƒ}!| j&}"|"D ]\}#|#j'}$|$t(v�r�qüt(|$ \}%}&t|!|#j) ƒ}|�s8�qüt*| |% |&t| |% |&ƒ| ƒ �qüt 	d¡ dD ]þ}%|%| v�rz�qh| |% j%}'t|'ddƒ�s–�qh|'j+}|j,D ]¼}(d})|(j-j.D ]h}*|*j/d k�r|*j0}+|j|+ j1},|*j2}-|*j3}.||, }/|-|/  k�r |.k�sn d!})nd!})|)�s² �q�q²|)�r¢|(j4j5d"k�s4J ‚|(j4j6D ]}#|#j7|'j8j9|#j: _7�q< �q`�q¢|'`+�qhd#| v �r | d# j%j5d$k�r t 	d%¡ | d# j%}0t|0j|j|ƒ}1t;| |1ƒ}2|2 <| | gd#d&g¡ |0`d'|0_5|0j=du �ræ|0`=d"|0_5|0j>�s |0j?�s |0j@�s |0jA�s |0j5d'k�r|0j=�s | d#= d!}3ˆ�rÌˆjB C¡ D ]:}4tD|4d(ƒ�r4|4jE F¡ }5tGd)d*„ |5D ƒƒ}3|3�r4 �qp�q4|�rÌˆ ¡ D ]L}6ˆ|6 }4|4 H¡ �rª|4jId  jJtKO  _Jn|4jLdk�r~|4jJd  tMO  < �q~|3�rÔt 	d+¡ g }7d,| v �rþ| d, }8|8jE F¡ }7ntNd,ƒ}8tO P¡ |8_E|8| d,< |7 Qd-¡ |7 Qd.¡ tRtS|ƒƒg}9|jD ] }:|9 QtRtT||:j1 d/ƒƒ¡ �q@|7 Qd0d1 U|9¡ ¡ |7 Qd2¡ |8jE V|7¡ d3| v �rÔ| d3 };t*|;d4d t|;d4dƒ ƒ t*|;d5tWtS|ƒt|;d5dƒƒƒ d6| v �rŒt 	d7¡ d8d9„ |jD ƒ‰ |jXD ]}ˆ  Y|jZ¡ ˆ  Y|j[¡ �qþd:| v �rf‡ fd;d<„| d6 j\D ƒ}<t]|<ƒt]t^tS| d: j_ƒƒƒk�rf| d:= ‡ fd=d<„| d6 j\D ƒ| d6 j\dd…< d>|v �r¾d?| v �r¾ttWd t`|d> d@ƒƒƒ| d? _adA|v �r|dA }=ttb ¡ ƒD ]$\}>}?|=|>k �rÜ|?| d? _c �q�qÜdB| d? _cdC|v �r:dD| v �r:tWdEt`|dC dFƒƒ| dD _dt 	dG¡ dHD ]}@|@| v �rH| |@= �qH| S )Ia   Generate a static instance from a variable TTFont and a dictionary
	defining the desired location along the variable font's axes.
	The location values must be specified as user-space coordinates, e.g.:

		{'wght': 400, 'wdth': 100}

	By default, a new TTFont object is returned. If ``inplace`` is True, the
	input varfont is modified and reduced to a static font.

	When the overlap parameter is defined as True,
	OVERLAP_SIMPLE and OVERLAP_COMPOUND bits are set to 1.  See
	https://docs.microsoft.com/en-us/typography/opentype/spec/glyf
	r   r7   c                 S   s    i | ]}|j |j|j|jf“qS r&   )ÚaxisTagZminValueÚdefaultValueZmaxValue©Ú.0Úar&   r&   r'   Ú
<dictcomp>®   ó    z+instantiateVariableFont.<locals>.<dictcomp>Úavarc                    s    i | ]\}}|t |ˆ | ƒ“qS r&   )r   ©rG   ÚkÚv)Úmapsr&   r'   rI   ²   rJ   c                 S   s   i | ]\}}|t |d ƒ“qS )é   )r   rL   r&   r&   r'   rI   ´   rJ   zNormalized location: %sÚgvarzMutating glyf/gvar tablesÚglyfr5   ZvmtxÚmetricsNc                    s$   ˆ |    ¡ rˆ |   ˆ ¡jnd| fS )Nr   )ÚisCompositeZgetCompositeMaxpValuesZmaxComponentDepth)Úname)rR   r&   r'   Ú<lambda>Á   s
    
ÿýz)instantiateVariableFont.<locals>.<lambda>)r"   )NNÚcvarzMutating cvt/cvar tableszcvt ÚCFF2zMutating CFF2 tabler9   ÚMVARzMutating MVAR tablezMutating FeatureVariations)ZGSUBÚGPOSÚFeatureVariationsTr   Fi   ZGDEFi  zMutating GDEF/GPOS/GSUB tablesrZ   i  r+   c                 s   s   | ]}|  d ¡V  qdS )ZGETVARIATIONN)Ú
startswith)rG   Úopr&   r&   r'   Ú	<genexpr>=  rJ   z*instantiateVariableFont.<locals>.<genexpr>z1Adding IDEF to fpgm table for GETVARIATION opcodeÚfpgmzPUSHB[000] 145zIDEF[ ]rP   z
NPUSHW[ ] ú zENDF[ ]ÚmaxpZmaxInstructionDefsZmaxStackElementsrU   zPruning name tablec                 S   s   h | ]
}|j ’qS r&   )Z
axisNameIDrF   r&   r&   r'   Ú	<setcomp>d  rJ   z*instantiateVariableFont.<locals>.<setcomp>Últagc                    s0   g | ](}|j ˆ v r|jd kr|jdkr|j‘qS )r   iÿÿ  )ÚnameIDZ
platformIDZlangID©rG   Ún©Úexcluder&   r'   Ú
<listcomp>l  s   ÿz+instantiateVariableFont.<locals>.<listcomp>c                    s   g | ]}|j ˆ vr|‘qS r&   )rd   re   rg   r&   r'   ri   r  s   
ÿZwghtzOS/2iè  Úwdthé	   ZslntÚposti¦ÿÿÿéZ   zRemoving variable tables)rK   rW   r7   rQ   r6   rY   ZVVARZSTAT)er   ÚsaveÚseekr   r:   r   Úsegmentsr   ÚlogÚinforS   ÚgetattrÚgetÚsortedÚ
variationsÚkeysZ_getCoordinatesAndControlsr   Úcoordinatesr   ÚendPtsr	   Z_setCoordinatesr   r   ZgetGlyphOrderZcffZtopDictIndexr   r9   Z
otVarStorer    r(   Zdesubroutinizer4   rC   r   r8   ZValueRecordZValueTagr   ZVarIdxÚsetattrr[   ZFeatureVariationRecordZConditionSetZConditionTableZFormatZ	AxisIndexrD   ZFilterRangeMinValueZFilterRangeMaxValueZFeatureTableSubstitutionÚVersionZSubstitutionRecordZFeatureZFeatureListZFeatureRecordZFeatureIndexr   ZmergeTablesZMarkGlyphSetsDefZLigCaretListZMarkAttachClassDefZGlyphClassDefZ
AttachListZglyphsÚvaluesr   r+   ZgetAssemblyÚanyrT   Ú
componentsÚflagsr   ZnumberOfContoursr
   r   r   ZProgramÚappendÚstrÚlenr   ÚjoinZfromAssemblyÚmaxZ	instancesÚaddZsubfamilyNameIDZpostscriptNameIDÚnamesÚsetÚrangeÚtagsÚminZusWeightClassÚOS2_WIDTH_CLASS_VALUESZusWidthClassZitalicAngle)Ar>   ÚlocationÚinplaceÚoverlapÚstreamr7   r:   r?   rQ   ZhMetricsZvMetricsZ
glyphnamesZ	glyphnamerv   rx   Ú_Z
origCoordsry   ÚvarZscalarr$   ÚgrW   Úcvtr3   r%   Úcr-   rX   r   ZvsInstancerr    Zmvarr@   ÚrecordsZrecZmvarTagZtableTagZitemNamer8   ÚrecordZappliesÚ	conditionZaxisIdxrD   ZMinZMaxrN   ZgdefZ	instancerZmergerZaddidefZglyphZinstructionsZ
glyph_nameÚasmr_   ÚargsrH   ra   ZexcludedUnicodeLangIDsrj   ÚpercentZ
widthClassÚtagr&   )rh   rR   rO   r'   ÚinstantiateVariableFont˜   s�   







þ








 







ÿ








ÿþýüü















ÿ 
ÿÿ








rœ   c              
   C   s   ddl m} ddl}|jddd�}|jddd	d
� |jddddd� |jdddddd� |jdd�}|jddddd� |jddddd� |jdd d!d"d#� | | ¡}|j}|jsÄt	j
 |¡d d$ n|j}||jrÖd%n|jràd&nd'd(� i }|jD ]b}	z6|	 d)¡\}
}t|
ƒd*k�sJ ‚t|ƒ||
 d*¡< W qò ttf�yR   | d+|	 ¡ Y qò0 qòt d,|¡ t d-¡ t|ƒ}t||d.|jd/� t d0|¡ | |¡ dS )1zInstantiate a variation fontr   )ÚconfigLoggerNzfonttools varLib.mutatorzInstantiate a variable font)ÚdescriptionÚinputz	INPUT.ttfzInput variable TTF file.)ÚmetavarÚhelpÚlocargszAXIS=LOCÚ*z½List of space separated locations. A location consist in the name of a variation axis, followed by '=' and a number. E.g.:  wght=700 wdth=80. The default is the location of the base master.)r    Únargsr¡   z-oz--outputz
OUTPUT.ttfz7Output instance TTF file (default: INPUT-instance.ttf).)r    Údefaultr¡   F)Úrequiredz-vz	--verboseÚ
store_truezRun more verbosely.)Úactionr¡   z-qz--quietzTurn verbosity off.z--no-overlaprŽ   Ústore_falsez5Don't set OVERLAP_SIMPLE/OVERLAP_COMPOUND glyf flags.)Údestr¨   r¡   z-instance.ttfÚDEBUGÚERRORÚINFO)Úlevelú=é   z$invalid location argument format: %rzLocation: %szLoading variable fontT)r�   rŽ   zSaving instance font %s)Ú	fontToolsr�   ÚargparseÚArgumentParserÚadd_argumentÚadd_mutually_exclusive_groupÚ
parse_argsrŸ   ÚoutputÚosÚpathÚsplitextÚverboseÚquietr¢   Úsplitr‚   ÚfloatÚljustÚ
ValueErrorÚAssertionErrorÚerrorrq   rr   r   rœ   rŽ   rn   )r™   r�   r²   ÚparserZlogging_groupÚoptionsZvarfilenameÚoutfiler?   Úargr›   Úvalr>   r&   r&   r'   ÚmainŽ  sl    ÿÿþþÿÿü
ÿþ

ý

rÈ   Ú__main__)FT)N);Ú__doc__ZfontTools.misc.fixedToolsr   r   ZfontTools.misc.roundToolsr   ZfontTools.pens.boundsPenr   ZfontTools.ttLibr   r   ZfontTools.ttLib.tablesr   ZfontTools.ttLib.tables._g_l_y_fr	   r
   r   ZfontTools.varLib.modelsr   r   r   ZfontTools.varLib.mergerr   ZfontTools.varLib.varStorer   ZfontTools.varLib.mvarr   ZfontTools.varLib.iupr   ZfontTools.subset.cffr±   Úos.pathr¸   ÚloggingÚior   Ú	getLoggerrq   r‹   Úpercentsr   Úzipr%   ÚprevÚcurrZhalfr(   r4   rC   rœ   rÈ   Ú__name__Úsysr‚   ÚargvÚexitÚdoctestÚtestmodÚfailedr&   r&   r&   r'   Ú<module>   sB   
.
*/
 w
:
