L ijddlmZddlmZddlmZddlmZddl m Z ddl m Z m Z ddlmZddlZddlZdd lmZgd Zej*d Zgd Zgd ZededdDZgdZdZdZdZdZ dZ!dZ"d(dZ#d(dZ$d(dZ%dZ&dZ'dZ( d)dZ) d*dZ* d*d Z+ d*d!Z, d*d"Z-d#Z.d$Z/ d+d%Z0d(d&Z1e2d'k(rddl3Z3e3jhe1yy),)newTable)Axis)AreaPen)NullPen) StatisticsPen)piecewiseLinearMapnormalizeValue)makeOutputFileNameN)pformat)planWeightAxis planWidthAxis planSlantAxisplanOpticalSizeAxisplanAxissanitizeWeight sanitizeWidth sanitizeSlant measureWeight measureWidth measureSlantnormalizeLinear normalizeLognormalizeDegreesinterpolateLinearinterpolateLog processAxismakeDesignspaceSnippet addEmptyAvarmainzfontTools.varLib.avar.plan)2di,i^iiii&iXiiii iRii)g9@gB@gI@g@O@gR@gU@gY@g \@g@_@g0a@gb@gPd@ge@gpg@gi@c#rK|]/}tjtj|dz 1yw)g4@N)mathdegreesatan).0ds `/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/varLib/avar/plan.py r,Ms& HAdll499QX./ Hs57i) $0<H`xi r1c||z ||z z S)zOLinearly normalize value in [rangeMin, rangeMax] to [0, 1], with extrapolation.)valuerangeMinrangeMaxs r+rrls H H!4 55c||||z zzS)zALinear interpolation between a and b, with t typically in [0, 1].rD)tabs r+rrqs qAE{?rHctj|}tj|}tj||z ||z z S)zVLogarithmically normalize value in [rangeMin, rangeMax] to [0, 1], with extrapolation.)r&log)rErFrGlogMinlogMaxs r+rrvs: XXh F XXh F HHUOf $& 99rHctj|}tj|}tj||||z zzS)zFLogarithmic interpolation between a and b, with t typically in [0, 1].)r&rNexp)rJrKrLlogAlogBs r+rr}s9 88A;D 88A;D 88D1t ,, --rHctjtj|}tjtj|}tjtj||z ||z z S)zPAngularly normalize value in [rangeMin, rangeMax] to [0, 1], with extrapolation.)r&tanradians)rErFrGtanMintanMaxs r+rrsV XXdll8, -F XXdll8, -F HHT\\%( )F 2v GGrHcLt|tr|}n|Dcic]}|d}}dx}}|D]o}||j|d}|dk(rd}||}t|} |j | |j |z} || t | jzz }|| z }q||z Scc}w)z:Measure the perceptual average weight of the given glyphs.rglyphset) isinstancedictgetrdrawwidthabsrE) r]glyphs frequenciesgwght_sumwdth_sum glyph_name frequencyglyphpenmults r+rrs&$ %+,q!t, ,Hx  "# A6IA~I$x( 3{{Y&D3syy>))D" h )-s B!ct|tr|}n|Dcic]}|d}}d}d}|D]U}||j|d}|dk(rd}||}t} |j | ||j |zz }||z }W||z Scc}w)z.Measure the average width of the given glyphs.r[r)r^r_r`rrarb) r]rdrerfrhfreq_sumrirjrkrls r+rrs&$ %+,q!t, ,HH  "# A6IA~I$i 3EKK)++I h )-s Bct|tr|}n|Dcic]}|d}}d}d}|D]f}||j|d}|dk(rd}||}t|} |j | |j |z} || | j zz }|| z }htjtj||z  Scc}w)z?Measure the perceptual average slant angle of the given glyphs.r[rr\) r^r_r`rrarbslantr&r'r() r]rdrerfslnt_sumrorirjrkrlrms r+rrs&$ %+,q!t, ,HH  "# A6IA~I$X. 3{{Y&D399$$D" LL8h#67 8 88+-s B?c||d||d||d}}}|d||z z}|d||z z}tjdg|tjd||d|t||dz |dz dkDst||dz |dz dkDrGtjdtjdg|tjd ||d|y y ) zSanitize the width axis limits.rr[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:%gFTrNinforcwarning) userTriple designTriplepins measurementsminVal defaultValmaxValcalculatedMinValcalculatedMaxVals r+rrs \!_%\!_%\!_%JF "!}(;<!!}(;<HH 3AjAHH01   z!} ,- 1 =D *Q-/ 0:a= @4 G LM 3   5  qM    rHctt|dkry||d||d||d}}}tj|}tj|}tj|} |d|dz |d|dz z } tj|| | |z zz} | |z ||z z } |d| |d|dz zz} tj dg|tj d|d| |dt | |dz |dz dkDr.tjd tjd g|tjd |d| |d|d|dz |d|dz z } tj|| ||z zz} | |z ||z z } |d| |d|dz zz} tjd |d|d| |d|dz |d|dz z } tj| | || z zz} | |z ||z z } |d| |d|dz zz}tjd ||d|dyy)z Sanitize the weight axis limits.Trr[rtz%Original weight axis limits: %g:%g:%gz'Calculated weight axis limits: %g:%g:%gruz9Calculated 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)lensetr&rNrRrwrcrx)ryrzr{r|r}r~rrO logDefaultrPrJycalculatedDefaultValrrs r+rr s 3z?a \!_%\!_%\!_%JF XXf F*%J XXf F AA &:a=:a=+HIA !v//0A V(A%a=1 1 1 0M+NNHH 4BzBHH11 1  *Q- /0:a=@4G OP 4  H qM qM  ]Z] *z!}z!}/L M HHVa:#677 8 ZJ/ 0%a=1 1 1 0M+NN H qM qM   ]Z] *z!}z!}/L M HHVa:#677 8 ZJ/ 0%a=1 1 1 0M+NN H  qM qM   rHctjdg|tjd||d||d||dt||d|dz dkDs4t||d|dz dkDst||d|dz dkDrVtjdtjdg|tjd||d||d||dy y ) zSanitize the slant axis limits.z$Original slant axis limits: %g:%g:%gz&Calculated slant axis limits: %g:%g:%grr[rtz>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:%gFTrv)ryrzr{r|s r+rrPs HH 3AjAHH0\!_%\!_%\!_%  La )JqM 9:Q> |LO,z!}< = A |LO,z!}< = A TU 3   5 a ) a ) a )   rHc ^t|tr#|j|j|jf}|\} } }|t }||ij }| i} n| j} tjd| | || | |f}| tjdg| n|} | r-tjdt| j| j| | d| | d|| dii}i}i}t| | |ht| j zD]}|||i}| |}|||||< | !tjd || || | |tjd t|t!t#t| jdd t#t| jddD]\\}}\}}|Dchc]}||cxkr|ksnn|}}|s.t%||}t%||}t%|| }t%|| }tjd t|tjd ||||j} t'd|dzD]L}!|||z |!z|dzz z}tjd||||i}t)|| }|||| |<Ntjdt| i}"t| D] }||"| |< |||<|||<t|D]r}||||}#||#| || |}$t)|$|"}%tjd||%fz|%||<|||z ||z z ||z zz}&||%|z ||z z ||z zz||&<t|||<|||<tjd|t|tjd|t|t+d|jDrtjd|i}i}||fScc}w)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 %gzPins %srr[rt)locationz/Sanitizing axis limit values for the `%s` axis.zCalculated average value: %szPlanning target values %s.z"Sampling %u points in range %g,%g.zSampling value %g.zSampled average value: %szPlanned mapping value %g to %g.z%Planned mapping for the `%s` axis: %sz0Planned normalized mapping for the `%s` axis: %sc3DK|]\}}t||z dkyw)g{Gz?N)rc)r)kvs r+r,zplanAxis.. s! ?A3q1u:  ?s z6Detected identity mapping for the `%s` axis. Dropping.)r^fvarAxisminValue defaultValuemaxValueSAMPLESkeyscopyrNrwsorteditemsupdaterdebugr ziplistr rangerall)' measureFunc normalizeFuncinterpolateFunc glyphSetFuncaxisTag axisLimitsvaluessamplesrd designLimitsr{ sanitizeFuncrrrtripleout outNormalizedaxisMeasurementsrEr] designValuerF targetMinrG targetMaxw targetValues normalizedMin normalizedMaxnormalizedTargetMinnormalizedTargetMaxvalueMeasurementssamplemeasurementValuerJtargetMeasurement targetValuevalueNormalizeds' r+rrqsj*h' )):+B+BJDWDWX '1$HlH ~b!&&( |yy{HH2HlH h /F BR\R   F4::<01KK l1o ,q/ l1o  CM<:S=MMNF'5)9:5k (3Hf(E%F  BGLV\41ABII-w7G/HI8; VDJJL !"3B' VDJJL !"12&9-;494)$*EaX-DH-DE E &x8 &x8 ,Y E,Y E -vl/CD 5w(S,113Aw{+ KF8 3v=1MME II*E 2#gu-=>H,UD9K-86-J k *  K .8I0JK-. ?E9> .u5 6 ?"H ': m$L) VEeXx8A /$Y/1B91M! -->@PQK II75+:NN O$CJ+ux/?8#/./00O.Ai'Y&D(+>AT+TDV.VM/ * V"H ': m$[-;^HH 5w MHH;   ?)<)<)> ?? I7S  oFs *P*;P*cr|t}tttt|d|||||||r t  Sd S)aPlan 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. Nwghtrrrdrr{r)WEIGHTSrrrrr)rrweightsrrdrr{sanitizes r+r r sP& ! '/^  6:  rHcr|t}tttt|d|||||||r t  Sd S)aPlan 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. Nwdthr)WIDTHSrrrrr)rrwidthsrrdrr{rs r+r r :sP&~ ! &.]  59  rHcr|t}tttt|d|||||||r t  Sd 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. Nslntr)SLANTSrrrrr)rrslantsrrdrr{rs r+rr`sP&~ ! &.]  59  rHc V|t}tttt|d|||||| S)aPlan 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. opsz)rrrdrr{)SIZESrrrr)rrsizesrrdrr{rs r+rrs<& } !   rHcd||f|zz}|r|dz }n|dz }|jD]\}}|d||fzz }|r|dz }|S)z-Make a designspace snippet for a single axis.zC z/>z$ z )r)raxisName axisLimitmappingdesignspaceSnippetkeyrEs r+rrs N X  * ,e#d"mmoU UEe TTUm+ rHc~tdx|d<}|djD]}i|j|j<y)z&Add an empty `avar` table to the font.avarfvarN)raxessegmentsr)fontraxiss r+rrs@"6**DL4V !!)&( dll#)rHc d} |djD]} | j|k(s| } n| y| j| j| jf} t j d|d|vr%|dj|} i|dj|<nd} |6t|tr&|jDcgc] }t|}}|^t|trN|jdDcgc] }t|}}t|dk(r|d|d cxkr |d ksJJd}|Ut|trEi}|jD]-}|jd\}}t||t|</|}~||j| |||||| \}}| rKdd lm}|j!t#|t#|Dcgc]}|| c}|j%| t j d |t'| |r"d|vr t)|||dj|<nd|vri|dj|<t+||| |}|Scc}wcc}wcc}w)zProcess a single axis.NrzPlanning %s axis.r:rrr[rt)rrdrr{r)pyplotzExisting %s mapping: %s)rrrrrrNrwrr^strsplitfloatr getGlyphSet matplotlibrplotrshowr rr)rplanFuncrrrrrdrr{rrrrexistingMappingrr*newPinspinbeforeafterrmappingNormalizedrrrs r+rrsJV !! <<7 "J %%z'>'> @S@STJHH (+ ~v,//8)+V g& j5$*LLN3q%(33J|S$A*6*<*-/DL ! !' */  q4C@ Fs5I.I I" c> |ddl}|jdd}ddlm}ddlm}ddl}|jdd}|jd d d |jd dtd|jdtd|jdtd|jdtd|jdtd|jdtd|jdddd|jd d!td"|jd#td$|jd%td&|jd'td(|jd)td*|jd+td,|jd-td.|jd/td0|jd1td2|jd3d4dd5|jd67}|jd8d9dd:|jd;dn|jrd?nd@A||j}dB|vrt j#dCy|j$v|j$j'} dD|j$vrPi} |j$j'D].} dD| vr#| j'dD\} } t)| | | <*dE| | <0nd} g} | j+t-|t.dFdG|j0|j2| |j4|j6|j8|j:H | j+t-|t<dIdJ|j>|j2| |j@|jB|j8|j:H | j+t-|tDdKdL|jF|j2| |jH|jJ|j8|j:H | j+t-|tLdMdN|jN|j2| |jP|jR|j8|j:H t jUdO| D]}|stW||jXt[|jdPdQR}n |jX}|r(t jUdS||j]|yy)Tz3Plan the standard axis mappings for a variable fontNrr[) configLogger)TTFontzfonttools varLib.avar.planz#Plan `avar` table for variable font) descriptionrz varfont.ttfzVariable-font file.)metavarhelpz-oz --output-filezOutput font file name.)typerz --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 --sampleszNumber of samples.z-sz --sanitize store_truezSanitize axis limits)actionrz-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--plotzPlot the resulting mapping.F)requiredz-vz --verbosezRun more verbosely.z-qz--quietzTurn verbosity off.DEBUGWARNINGINFO)levelrzNot a variable font.rg?rWeight)rrrdrr{rrrWidthrSlantr OpticalSizezDesignspace snippet:Tz.avar) overWritesuffixz Saving %s)/sysargv fontToolsrfontTools.ttLibrargparseArgumentParser add_argumentrintadd_mutually_exclusive_group parse_argsverbosequietrrNerrorrdrrappendrr rrweight_design_limits weight_pinsrrr rwidth_design_limits width_pinsrrslant_design_limits slant_pinsrroptical_size_design_limitsoptical_size_pinsrwprint output_filer save)argsrrrrparser logging_groupoptionsrrdrfrkrjdesignspaceSnippetssnippetoutfiles r+rr#sI |xx|&&  $ $$9%F   ()~~!%%' '.. F^^))+ $!8'(wws|$E9$))$4F5M #F1I  $    ??OO 55$$%%     >>OO 44##%%     >>OO 44##%%     ==OO ;;**%%  HH #$&  'N"$W\\T'R%% g& 'rH__main__)N)NNNNN)NNNNNF)NNNNFF)5rrfontTools.ttLib.tables._f_v_a_rrrfontTools.pens.areaPenrfontTools.pens.basePenrfontTools.pens.statisticsPenrfontTools.varLib.modelsrr fontTools.misc.cliToolsr r&loggingpprintr __all__ getLoggerrNrrrrrrrrrrrrrrrrrrrr r rrrrrr__name__rexitrDrHr+r.s}$<**6F6  .g45 , $  HsB H H 4 6  :.H889:&RDNR   `L    #R    #R    #R    "J*)    YxCL z CHHTVrH