a
    —ÆàgÞj  ã                   @   s�  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Zd dlZd d	lmZ g d
¢Ze d¡Zg d¢Zg d¢Zedd„ eddƒD ƒƒZg d¢ZdZdd„ Zdd„ Zdd„ Z dd„ Z!dd„ Z"d>dd„Z#d?d d!„Z$d@d"d#„Z%d$d%„ Z&d&d'„ Z'd(d)„ Z(dAd*d+„Z)dBd-d.„Z*dCd/d0„Z+dDd1d2„Z,dEd3d4„Z-d5d6„ Z.d7d8„ Z/dFd9d:„Z0dGd;d<„Z1e2d=k�rŒd dl3Z3e3 4e1ƒ ¡ dS )Hé    )ÚnewTable)ÚAxis)ÚAreaPen)ÚNullPen)ÚStatisticsPen)ÚpiecewiseLinearMapÚnormalizeValue)ÚmakeOutputFileNameN)Úpformat)ÚplanWeightAxisÚplanWidthAxisÚplanSlantAxisÚplanOpticalSizeAxisÚplanAxisÚsanitizeWeightÚsanitizeWidthÚsanitizeSlantÚmeasureWeightÚmeasureWidthÚmeasureSlantÚnormalizeLinearÚnormalizeLogÚnormalizeDegreesÚinterpolateLinearÚinterpolateLogÚprocessAxisÚmakeDesignspaceSnippetÚaddEmptyAvarÚmainzfontTools.varLib.avarPlanner)é2   éd   é–   éÈ   éú   i,  i^  i�  iÂ  iô  i&  iX  iŠ  i¼  iî  i   iR  i„  i¶  )g      9@g     ÀB@g      I@g     @O@g     ÀR@g     àU@g      Y@g      \@g     @_@g     0a@g     Àb@g     Pd@g     àe@g     pg@g      i@c                 c   s"   | ]}t  t  |d  ¡¡V  qdS )g      4@N)ÚmathÚdegreesÚatan©Ú.0Úd© r*   úU/var/www/sistema_ama/venv/lib/python3.9/site-packages/fontTools/varLib/avarPlanner.pyÚ	<genexpr>M   ó    r,   iìÿÿÿé   )é   é   é   é   é	   é
   é   é   é   é   é   é   é$   é0   é<   éH   é`   éx   é�   éÀ   éð   i   r2   c                 C   s   | | ||  S )zOLinearly normalize value in [rangeMin, rangeMax] to [0, 1], with extrapolation.r*   )ÚvalueÚrangeMinÚrangeMaxr*   r*   r+   r   l   s    r   c                 C   s   || ||   S )zALinear interpolation between a and b, with t typically in [0, 1].r*   )ÚtÚaÚbr*   r*   r+   r   q   s    r   c                 C   s*   t  |¡}t  |¡}t  | ¡| ||  S )zVLogarithmically normalize value in [rangeMin, rangeMax] to [0, 1], with extrapolation.)r$   Úlog)rD   rE   rF   ÚlogMinÚlogMaxr*   r*   r+   r   v   s    

r   c                 C   s*   t  |¡}t  |¡}t  || ||   ¡S )zFLogarithmic interpolation between a and b, with t typically in [0, 1].)r$   rJ   Úexp)rG   rH   rI   ZlogAZlogBr*   r*   r+   r   }   s    

r   c                 C   s<   t  t  |¡¡}t  t  |¡¡}t  t  | ¡¡| ||  S )zPAngularly normalize value in [rangeMin, rangeMax] to [0, 1], with extrapolation.)r$   ÚtanÚradians)rD   rE   rF   ZtanMinZtanMaxr*   r*   r+   r   „   s    r   c           
      C   sœ   t |tƒr|}ndd„ |D ƒ}d }}|D ]h}|durN| |d¡}|dkrRq*nd}| | }t| d�}| |¡ |j| }	||	t|jƒ 7 }||	7 }q*|| S )z:Measure the perceptual average weight of the given glyphs.c                 S   s   i | ]
}|d “qS ©é   r*   ©r(   Úgr*   r*   r+   Ú
<dictcomp>�   r-   z!measureWeight.<locals>.<dictcomp>r   NrQ   ©Úglyphset)Ú
isinstanceÚdictÚgetr   ÚdrawÚwidthÚabsrD   )
rV   ÚglyphsÚfrequenciesZwght_sumÚwdth_sumÚ
glyph_nameÚ	frequencyÚglyphÚpenÚmultr*   r*   r+   r   ‹   s"    




r   c           	      C   sŠ   t |tƒr|}ndd„ |D ƒ}d}d}|D ]V}|durN| |d¡}|dkrRq*nd}| | }tƒ }| |¡ ||j| 7 }||7 }q*|| S )z.Measure the average width of the given glyphs.c                 S   s   i | ]
}|d “qS rP   r*   rR   r*   r*   r+   rT   ¬   r-   z measureWidth.<locals>.<dictcomp>r   NrQ   )rW   rX   rY   r   rZ   r[   )	rV   r]   r^   r_   Úfreq_sumr`   ra   rb   rc   r*   r*   r+   r   §   s"    


r   c           
      C   s¦   t |tƒr|}ndd„ |D ƒ}d}d}|D ]d}|durN| |d¡}|dkrRq*nd}| | }t| d�}| |¡ |j| }	||	|j 7 }||	7 }q*t t 	|| ¡¡ S )z?Measure the perceptual average slant angle of the given glyphs.c                 S   s   i | ]
}|d “qS rP   r*   rR   r*   r*   r+   rT   È   r-   z measureSlant.<locals>.<dictcomp>r   NrQ   rU   )
rW   rX   rY   r   rZ   r[   Zslantr$   r%   r&   )
rV   r]   r^   Zslnt_sumre   r`   ra   rb   rc   rd   r*   r*   r+   r   Ã   s$    




r   c           	      C   sÞ   ||d  ||d  ||d    }}}| d ||  }| d ||  }t jdg| ¢R Ž  t  d|| d |¡ t|| d  ƒ| d  dks¦t|| d  ƒ| d  dkrÚt  d¡ t jdg| ¢R Ž  t  d	|| d |¡ d
S dS )zSanitize the width axis limits.r   rQ   é   z$Original width axis limits: %g:%g:%gz&Calculated width axis limits: %g:%g:%gçš™™™™™©?z6Calculated width axis min/max do not match user input.z%  Current width axis limits: %g:%g:%gz'  Suggested width axis limits: %g:%g:%gFT©rJ   Úinfor\   Úwarning)	Ú
userTripleÚdesignTripleÚpinsÚmeasurementsÚminValÚ
defaultValÚmaxValÚcalculatedMinValÚcalculatedMaxValr*   r*   r+   r   à   s>    


ý
üÿþ
ÿþür   c                 C   s4  t t| ƒƒdk rdS ||d  ||d  ||d    }}}t |¡}t |¡}t |¡}	| d | d  | d | d   }
t ||
|	|   ¡}|| ||  }
| d |
| d | d    }tjdg| ¢R Ž  t d| d || d ¡ t|| d  ƒ| d  dk�r0t d	¡ tjd
g| ¢R Ž  t d| d || d ¡ | d | d  | d | d   }
t ||
||   ¡}|| ||  }
| d |
| d | d    }t d| d | d |¡ | d | d  | d | d   }
t |	|
||	   ¡}|| ||  }
| d |
| d | d    }t d|| d | d ¡ dS dS )z Sanitize the weight axis limits.é   Tr   rQ   rf   z%Original weight axis limits: %g:%g:%gz'Calculated weight axis limits: %g:%g:%grg   z9Calculated weight axis default does not match user input.z&  Current weight axis limits: %g:%g:%gz:  Suggested weight axis limits, changing default: %g:%g:%gz:  Suggested weight axis limits, changing maximum: %g:%g:%gz:  Suggested weight axis limits, changing minimum: %g:%g:%gF)ÚlenÚsetr$   rJ   rM   ri   r\   rj   )rk   rl   rm   rn   ro   rp   rq   rK   Z
logDefaultrL   rG   ÚyZcalculatedDefaultValrs   rr   r*   r*   r+   r   	  sn    


ý



 ü
ÿþü ü ür   c                 C   sÚ   t jdg| ¢R Ž  t  d||d  ||d  ||d  ¡ t||d  | d  ƒdksŽt||d  | d  ƒdksŽt||d  | d  ƒdkrÖt  d¡ t jdg| ¢R Ž  t  d||d  ||d  ||d  ¡ d	S d
S )zSanitize the slant axis limits.z$Original slant axis limits: %g:%g:%gz&Calculated slant axis limits: %g:%g:%gr   rQ   rf   z>Calculated slant axis min/default/max do not match user input.z%  Current slant axis limits: %g:%g:%gz'  Suggested slant axis limits: %g:%g:%gFTrh   )rk   rl   rm   rn   r*   r*   r+   r   P  s6    


üÿþý
ÿþ


ür   c           $   	      s   t |tƒr|j|j|jf}|\}}}|du r0t}|du rD|i ƒ ¡ }|
du rRi }
n|
 ¡ }
t 	d|||¡ |||f}|	dur�tj	dg|	¢R Ž  n|}	|
r¬t 	dt
|
 ¡ ƒ¡ |
 ||	d ||	d ||	d i¡ i }i }i }t
|||ht|
 ¡ ƒB ƒD ](}|||id�}|
| }| ||ƒ||< qô|du�rBt 	d	|¡ |||	|
|ƒ t d
t|ƒ¡ ttt
|
 ¡ ƒƒdd… tt
|
 ¡ ƒƒdd… ƒD �]À\\‰}\‰ }‡ ‡fdd„|D ƒ}|�s´�q„tˆ|ƒ}tˆ |ƒ}t||	ƒ}t||	ƒ}t 	dt
|ƒ¡ t 	d|ˆˆ ¡ | ¡ }td|d ƒD ]P}ˆˆ ˆ | |d   }t d|¡ |||id�}t||
ƒ}| ||ƒ||< �qt dt|ƒ¡ i }t
|ƒD ]}|||| < �q€||ˆ< |||< t
|ƒD ]†}||ˆˆ ƒ} || || || ƒ}!t|!|ƒ}"t d||"f ¡ |"||< ||ˆ ˆ ˆ  ||   }#||"| ||  ||   ||#< �q¬||ˆ < |||< �q„t 	d|t|ƒ¡ t 	d|t|ƒ¡ tdd„ | ¡ D ƒƒ�r˜t 	d|¡ i }i }||fS )a@  Plan an axis.

    measureFunc: callable that takes a glyphset and an optional
    list of glyphnames, and returns the glyphset-wide measurement
    to be used for the axis.

    normalizeFunc: callable that takes a measurement and a minimum
    and maximum, and normalizes the measurement into the range 0..1,
    possibly extrapolating too.

    interpolateFunc: callable that takes a normalized t value, and a
    minimum and maximum, and returns the interpolated value,
    possibly extrapolating too.

    glyphSetFunc: callable that takes a variations "location" dictionary,
    and returns a glyphset.

    axisTag: the axis tag string.

    axisLimits: a triple of minimum, default, and maximum values for
    the axis. Or an `fvar` Axis object.

    values: a list of output values to map for this axis.

    samples: the number of samples to use when sampling. Default 8.

    glyphs: a list of glyph names to use when sampling. Defaults to None,
    which will process all glyphs.

    designLimits: an optional triple of minimum, default, and maximum values
    represenging the "design" limits for the axis. If not provided, the
    axisLimits will be used.

    pins: an optional dictionary of before/after mapping entries to pin in
    the output.

    sanitizeFunc: an optional callable to call to sanitize the axis limits.
    Nz(Axis limits min %g / default %g / max %gz/Axis design-limits min %g / default %g / max %gzPins %sr   rQ   rf   )Úlocationz/Sanitizing axis limit values for the `%s` axis.zCalculated average value:
%séÿÿÿÿc                    s(   h | ] }ˆ|  k rˆ k rn q|’qS r*   r*   ©r(   Úw©rF   rE   r*   r+   Ú	<setcomp>Ú  r-   zplanAxis.<locals>.<setcomp>zPlanning target values %s.z"Sampling %u points in range %g,%g.zSampling value %g.zSampled average value:
%szPlanned mapping value %g to %g.z%Planned mapping for the `%s` axis:
%sz0Planned normalized mapping for the `%s` axis:
%sc                 s   s"   | ]\}}t || ƒd k V  qdS )g{®Gáz„?N)r\   )r(   ÚkÚvr*   r*   r+   r,     r-   zplanAxis.<locals>.<genexpr>z6Detected identity mapping for the `%s` axis. Dropping.)rW   ÚfvarAxisÚminValueÚdefaultValueÚmaxValueÚSAMPLESÚkeysÚcopyrJ   ri   ÚsortedÚitemsÚupdaterv   Údebugr
   ÚzipÚlistr   Úranger   Úall)$ZmeasureFuncZnormalizeFuncZinterpolateFuncÚglyphSetFuncÚaxisTagÚ
axisLimitsÚvaluesÚsamplesr]   ÚdesignLimitsrm   ÚsanitizeFuncr�   r‚   rƒ   ZtripleÚoutZoutNormalizedZaxisMeasurementsrD   rV   ZdesignValueZ	targetMinZ	targetMaxZtargetValuesZnormalizedMinZnormalizedMaxZnormalizedTargetMinZnormalizedTargetMaxZvalueMeasurementsÚsampleZmeasurementValuerG   ZtargetMeasurementZtargetValueZvalueNormalizedr*   r|   r+   r   q  s¼    5

ÿ
ýÿ
þ




ÿ
ÿþþþýr   Fc                 C   s4   |du rt }tttt| d|||||||r,tndd�S )a  Plan a weight (`wght`) axis.

    weights: A list of weight values to plan for. If None, the default
    values are used.

    This function simply calls planAxis with values=weights, and the appropriate
    arguments. See documenation for planAxis for more information.
    NÚwght©r’   r“   r]   r”   rm   r•   )ÚWEIGHTSr   r   r   r   r   )r�   r‘   Úweightsr“   r]   r”   rm   Úsanitizer*   r*   r+   r     s     
ôr   c                 C   s4   |du rt }tttt| d|||||||r,tndd�S )a  Plan a width (`wdth`) axis.

    widths: A list of width values (percentages) to plan for. If None, the default
    values are used.

    This function simply calls planAxis with values=widths, and the appropriate
    arguments. See documenation for planAxis for more information.
    NÚwdthr™   )ÚWIDTHSr   r   r   r   r   )r�   r‘   Úwidthsr“   r]   r”   rm   rœ   r*   r*   r+   r   :  s     
ôr   c                 C   s4   |du rt }tttt| d|||||||r,tndd�S )a  Plan a slant (`slnt`) axis.

    slants: A list slant angles to plan for. If None, the default
    values are used.

    This function simply calls planAxis with values=slants, and the appropriate
    arguments. See documenation for planAxis for more information.
    NÚslntr™   )ÚSLANTSr   r   r   r   r   )r�   r‘   Úslantsr“   r]   r”   rm   rœ   r*   r*   r+   r   `  s     
ôr   c                 C   s*   |du rt }tttt| d||||||d�S )a  Plan a optical-size (`opsz`) axis.

    sizes: A list of optical size values to plan for. If None, the default
    values are used.

    This function simply calls planAxis with values=sizes, and the appropriate
    arguments. See documenation for planAxis for more information.
    NÚopsz)r’   r“   r]   r”   rm   )ÚSIZESr   r   r   r   )r�   r‘   Úsizesr“   r]   r”   rm   rœ   r*   r*   r+   r   †  s    õr   c                 C   sX   d| |f|  }|r|d7 }n|d7 }|  ¡ D ]\}}|d||f 7 }q.|rT|d7 }|S )z-Make a designspace snippet for a single axis.zC    <axis tag="%s" name="%s" minimum="%g" default="%g" maximum="%g"z>
z/>z$      <map input="%g" output="%g"/>
z    </axis>)rˆ   )r�   ÚaxisNameZ	axisLimitÚmappingÚdesignspaceSnippetÚkeyrD   r*   r*   r+   r   «  s    
ÿÿ
r   c                 C   s,   t dƒ | d< }tjD ]}i |j|j< qdS )z&Add an empty `avar` table to the font.ÚavarN)r   ÚfvarÚaxesÚsegmentsr�   )Úfontrª   Úaxisr*   r*   r+   r   À  s    
r   c              
      s  d}| d j D ]}|j|kr|} q&q|du r2dS |j|j|jf}t d|¡ d| v rt| d j| }i | d j|< nd}|durœt|t	ƒrœdd„ | 
¡ D ƒ}|durøt|t	ƒrødd„ tj 
d	¡D ƒ}t|ƒd
krò|d |d   krð|d ksün J ‚nd}|du�rJt|t	ƒ�rJi }| 
¡ D ]$}| 
d	¡\}}t|ƒ|t|ƒ< �q|}~|| j|||||||	d�\}‰ |
�r¤ddlm} | tˆ ƒ‡ fdd„tˆ ƒD ƒ¡ | ¡  |du�rÀt d|t|ƒ¡ |�rèd| v�rØt| ƒ ˆ | d j|< nd| v �r i | d j|< t||||ƒ}|S )zProcess a single axis.Nr«   Ú zPlanning %s axis.rª   c                 S   s   g | ]}t |ƒ‘qS r*   ©Úfloatrz   r*   r*   r+   Ú
<listcomp>è  r-   zprocessAxis.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r*   r±   r'   r*   r*   r+   r³   ë  r-   ú:rt   r   rQ   rf   )r“   r]   r”   rm   rœ   )Úpyplotc                    s   g | ]}ˆ | ‘qS r*   r*   )r(   r~   ©ZmappingNormalizedr*   r+   r³     r-   zExisting %s mapping:
%s)r¬   r�   r�   r‚   rƒ   rJ   ri   r­   rW   ÚstrÚsplitÚoptionsr”   ru   r²   ZgetGlyphSetZ
matplotlibrµ   Úplotr‡   Úshowr
   r   r   )r®   ZplanFuncr�   r¦   r’   r“   r]   r”   rm   rœ   rº   r‘   r¯   ZexistingMappingZnewPinsZpinÚbeforeÚafterr§   rµ   r¨   r*   r¶   r+   r   Ç  s~    

ÿþþø
þ


ür   c                 C   sŠ  | du rddl }|jdd… } ddlm} ddlm} ddl}|jddd�}|jd	d
dd� |jddt	dd� |jdt	dd� |jdt	dd� |jdt	dd� |jdt	dd� |jdt
dd� |jddddd� |jd d!t	d"d� |jd#t	d$d� |jd%t	d&d� |jd't	d(d� |jd)t	d*d� |jd+t	d,d� |jd-t	d.d� |jd/t	d0d� |jd1t	d2d� |jd3d4dd5d� |jd6d7�}|jd8d9dd:d� |jd;d<dd=d� | | ¡}||j�r¼d>n|j�rÈd?nd@dA� ||jƒ}dB|v�ròt dC¡ dS |jdu�rZ|j ¡ }	dD|jv �r^i }	|j ¡ D ]4}
dD|
v �rL|
 dD¡\}}t|ƒ|	|< ndE|	|
< �q"nd}	g }| t|tdFdG|j|j|	|j|j|j|jdH�¡ | t|tdIdJ|j|j|	|j |j!|j|jdH�¡ | t|t"dKdL|j#|j|	|j$|j%|j|jdH�¡ | t|t&dMdN|j'|j|	|j(|j)|j|jdH�¡ t *dO¡ |D ]}|�r0t+|ƒ �q0|j,du �rdt-|jdPdQdR�}n|j,}|�r†t *dS|¡ | .|¡ dS )Tz3Plan the standard axis mappings for a variable fontNr   rQ   )ÚconfigLogger)ÚTTFontzfonttools varLib.avarPlannerz#Plan `avar` table for variable font)Údescriptionr®   zvarfont.ttfzVariable-font file.)ÚmetavarÚhelpz-oz--output-filezOutput font file name.)ÚtyperÂ   z	--weightsz+Space-separate list of weights to generate.z--widthsz*Space-separate list of widths to generate.z--slantsz*Space-separate list of slants to generate.z--sizesz1Space-separate list of optical-sizes to generate.z	--sampleszNumber of samples.z-sz
--sanitizeÚ
store_truezSanitize axis limits)ÚactionrÂ   z-gz--glyphsz2Space-separate list of glyphs to use for sampling.z--weight-design-limitsz4min:default:max in design units for the `wght` axis.z--width-design-limitsz4min:default:max in design units for the `wdth` axis.z--slant-design-limitsz4min:default:max in design units for the `slnt` axis.z--optical-size-design-limitsz4min:default:max in design units for the `opsz` axis.z--weight-pinsz=Space-separate list of before:after pins for the `wght` axis.z--width-pinsz=Space-separate list of before:after pins for the `wdth` axis.z--slant-pinsz=Space-separate list of before:after pins for the `slnt` axis.z--optical-size-pinsz=Space-separate list of before:after pins for the `opsz` axis.z-pz--plotzPlot the resulting mapping.F)Úrequiredz-vz	--verbosezRun more verbosely.z-qz--quietzTurn verbosity off.ÚDEBUGÚWARNINGÚINFO)Úlevelr«   zNot a variable font.r´   g      ð?r˜   ZWeight)r’   r“   r]   r”   rm   rœ   rº   r�   ZWidthr    ZSlantr£   ZOpticalSizezDesignspace snippet:Tz.avar)Z	overWriteÚsuffixz	Saving %s)/ÚsysÚargvZ	fontToolsr¾   ÚfontTools.ttLibr¿   ÚargparseÚArgumentParserÚadd_argumentr·   ÚintÚadd_mutually_exclusive_groupÚ
parse_argsÚverboseÚquietr®   rJ   Úerrorr]   r¸   r²   Úappendr   r   r›   r“   Zweight_design_limitsZweight_pinsrœ   rº   r   rŸ   Zwidth_design_limitsZ
width_pinsr   r¢   Zslant_design_limitsZ
slant_pinsr   r¥   Zoptical_size_design_limitsZoptical_size_pinsri   ÚprintZoutput_filer	   Úsave)ÚargsrÌ   r¾   r¿   rÏ   ÚparserZlogging_groupr¹   r®   r]   rS   rb   ra   ZdesignspaceSnippetsZsnippetÚoutfiler*   r*   r+   r   #  sd   þüÿÿÿÿÿüýýýýýýýýÿÿÿ
ÿ




õÿõÿõÿõÿ
r   Ú__main__)N)N)N)NNNNN)NNNNNF)NNNNNF)NNNNNF)NNNNNF)NNNNFF)N)5rÎ   r   ZfontTools.ttLib.tables._f_v_a_rr   r€   ZfontTools.pens.areaPenr   ZfontTools.pens.basePenr   ZfontTools.pens.statisticsPenr   ZfontTools.varLib.modelsr   r   ZfontTools.misc.cliToolsr	   r$   ÚloggingÚpprintr
   Ú__all__Ú	getLoggerrJ   rš   rž   rŒ   r�   r¡   r¤   r„   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú__name__rÌ   Úexitr*   r*   r*   r+   Ú<module>   s˜   



)G)     ô
 '      ø
)      ø
)      ø
)      ø
%      õ
\
 G
