L i JdZddlmZddlmZddlmZmZddlm Z ddl m Z m Z ddlmZmZddlmZmZdd lmZmZmZdd lmZdd lmZdd lmZdd lm Z ddl!m"Z"m#Z#m$Z$ddl%m&Z&m'Z'ddl(m)Z)ddl*m+Z+ddl,m-Z-ddl.m/Z/m0Z0ddl1m2Z2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9ddl:m;Z;ddlZ>m?Z?ddl@ZAddlBZBddlCmDZDddlEmFZFddlGmHZHddlImJZJmKZKeBjd ZMd!ZNd"ee0fd#ZOd$ZPd%ZQe?d&gd'ZRdhd)ZSd*ZTd+ZUd,eVfd-ZWd.ZXe?d/gd0ZYeYd1d2d3d4d5dd0ZZeYd6d7d8d9d:d;d0Z[d<Z\d=Z]d>Z^d?Z_d@Z`dAZadBZbdCZce?dDgdEZddFZedidGZfdid(dHdIZgddJdKdLdMdNdOdPdQdR ZhdSZidTed,ejfdUZkdVgd(dWd(dXfdYe/fdZZld[gd(d(dXfd\Zmd]fd^Znd_fd`ZoGdadbepZqdcZrdjdXdddeZsdkdfZteudgk(r`ddlvZvewevjdkDrevjetddlzZzevjezjjyy)la Module for dealing with 'gvar'-style font variations, also known as run-time interpolation. The ideas here are very similar to MutatorMath. There is even code to read MutatorMath .designspace files in the varLib.designspace module. For now, if you run this file on a designspace file, it tries to find ttf-interpolatable files for the masters and build a variable-font from them. Such ttf-interpolatable and designspace files can be generated from a Glyphs source, eg., using noto-source as an example: .. code-block:: sh $ fontmake -o ttf-interpolatable -g NotoSansArabic-MM.glyphs Then you can make a variable-font this way: .. code-block:: sh $ fonttools varLib master_ufo/NotoSansArabic.designspace API *will* change in near future. )List)Vector)noRoundotRound) floatToFixed)Tagtostr)TTFontnewTable)Axis NamedInstance)GlyphCoordinatesdropImpliedOnCurvePointsUSE_MY_METRICS)Program)TupleVariation)otTables) OTTableWriter)buildermodelsvarStore)VariationMergerCOLRVariationMerger) MVAR_ENTRIES)iup_delta_optimize)addFeatureVariations)DesignSpaceDocumentInstanceDescriptor)splitInterpolablesplitVariableFonts)buildVFStatTable) buildColrV1) unbuildColrV1)partial) OrderedDict defaultdict namedtupleN)deepcopy)pformat) fullmatch) VarLibErrorVarLibValidationErrorzfontTools.varLibz1com.github.fonttools.varLib.featureVarsFeatureTag instancesc |sJt|tsJtjdt d}|d}t dt |ddD}d}|rd|z}|jD]}t}t|j|_ |j|j|jc|_|_|_|j%|j&|d | |_t+|j,|_|j0j3||j0Dcic]}|j|j } }|D]} | j4j7D cic] \} } | |vs | | } } } d | j8vrI| j:st=d | d t?| j8}tA| j:|d <n | j8}| jB}tE}| j7Dcic]'\}}||j||jG|)c}}|_$|jK|d|}|dvr|jH| k(r||_&n|j%|d|d |_&|#tA|}|jO|||_(|jRj3|d|vsJ||d<|Scc}wcc} } wcc}}w)z Add 'fvar' table to font. axes is an ordered dictionary of DesignspaceAxis objects. instances is list of dictionary objects with 'location', 'stylename', and possibly 'postscriptfontname' entries. zGenerating fvarfvarnamec3:K|]}|jdk(ywr+N) platformID).0nrs _/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/varLib/__init__.py z_add_fvar..^sP"2==A%Psnames))r+i ))r+rr) minNameIDmacenzInstance at location 'z' must have a default English style name ('stylename' attribute on the instance element or a stylename element with an 'xml:lang="en"' attribute).T)windowsr>>)r@r>r=) platforms)* isinstancer%loginfor anygetattrvaluesr rtagaxisTagminimumdefaultmaximumminValue defaultValuemaxValueaddMultilingualName labelNames axisNameIDinthiddenflagsaxesappendlocationitemslocalisedStyleName styleNamer-dictr postScriptFontNamer map_backward coordinatesfindMultilingualNamesubfamilyNameIDaddNamepostscriptNameIDr.)fontrXr.r0 nameTablemacNamesrCaaxisdefault_coordinatesinstancer1valuerar\psnameinstkvrcs r7 _add_fvarrrJs  K4 dK (( (HH  F DV IP 7B0OPPH!I 9, [[] v155z  II II II 8 t($- $77 LL$#88 ]   HLyyQt4<<):)::QQ)$,4+<+<+B+B+D 'D%PT D%K   x22 2%%+,[M:NN "&h&A&A!B ',X-?-?'@ t $!)!Q*Q$3D #,#@#@"Dh#$A$D   6]F$-$5$5f $5$RD ! d#S)$V   DL KaR & s6K(9 K-K-,K3c\ |sJt|tsJtjdt d}d}i}|j D]kddddx}|j j<jjjf}tfd|D} | |j<jsvtj} | D cgc]} | d  } } | D cgc]} | d  } } jt| k7r&td j d jd jt#| k7r&td j djdj| vr&td j djdt%t'| t%| k7rtd j dt| | k7rtd j d| Dcgc]}t)j*||} }| Dcgc]}t)j*|| } }t-dt/| | Dr#d}|j1t/| | d|vr|ddk(sJd|vs |ddk(sJd|vrb|ddk(rlJ|rd}|Dcgc]a}|j2j5Dcic]9\}}||jt)j*||||j;c}}c}}}}|Dcgc]a}|j6j5Dcic]9\}}||jt)j*||||j;c}}c}}}}t%|t%|k(sJt9d|Ds$|j;d i|j;d it)j<||}t?j@|}|jC|i|D]x}g}t/||D]N\}}||vr|jEd |||jG|d z }|jEtI|dP|jK|d |<z|jM}|jO}j5Dcic] \}}||| c}}tQjRfd|D}d|_*tWjX|_-||jZ_.||jZ_/d|vsJ|stjdd}|S||d<|Scc} wcc} wcc}wcc}wcc}}wcc}}}wcc}}wcc}}}wcc}}w)za Add 'avar' table to font. axes is an ordered dictionary of AxisDescriptor objects. zGenerating avaravarF?)rurvrwc3@K|]}j|ywN) map_forward)r5rqrjs r7r8z_add_avar..sEAD,,Q/Esrr+zAxis 'z6': there must be a mapping for the axis minimum value z/ and it must be the lowest input mapping value.z6': there must be a mapping for the axis maximum value z0 and it must be the highest input mapping value.z6': there must be a mapping for the axis default value .zO': All axis mapping input='...' values must be unique, but we found duplicates.z4': mapping output values must be in ascending order.c3,K|] \}}||k(ywryr:r5rprqs r7r8z_add_avar..s2$!QqAv2Tc3\K|]$}td|jD&yw)c3,K|] \}}|dk(ywrNr:r}s r7r8z&_add_avar... s6$!QqAv6r~N)allr[)r5locs r7r8z_add_avar.. s!Q336#))+66Qs*,c3(K|] }| ywryr:)r5tvarIdxess r7r8z_add_avar.."s1P!(1+1PrAzNo need for avarN)0rDr%rErFr rIsegmentsrJrLrMrNtuplemapsortedminr-r1maxlensetrnormalizeValuerzipupdate inputLocationr[outputLocationrGinsertVariationModelrOnlineVarStoreBuildersetModelrYgetfl2fi storeMastersfinishoptimizerbuildDeltaSetIndexMap majorVersionotrttable VarIdxMapVarStore)rfrXmappingsaxisTagsrt interesting vals_triplescurve keys_triple vals_tripler[itemkeysvalsrqmappingr1inputLocationsoutputLocationsmodel storeBuilderrJ masterValuesvovistore optimizedrjrm varIdxMaprs ` @r7 _add_avarrs K4 dK (( (HH  F DKL >826Cc*JJ dhh'||T\\4<<@ EEE !, TXXxx txx $)*DQ**$)*DQ** <<3t9 $' $&UW  <<3t9 $' $&VX  <SY &' $33  $<4 ' #WX @DD!%%a5DD?CD!%%a5DD 2#dD/2 2   St_%e|c c 1115 E$K4$7775 E$K4$777}>8B $    '44::< D!T  5 5ad4jnn9U VV   $    '55;;= D!T  5 5ad4jnn9U VV   >"c/&::::Q.QQ  ! !!R (  " "1b )%%nh?55h? e$ GCLo~> 2Bb= ''*sGbffS!n,##E!RL1  2 )55lCAFHSM G##%NN$ >Fnn>NO{tUD)E**O111Px1PP WWY ( #      #$ KV KO+*@ED"    <PsN U:. U?V3V "V)>V'V7"V!>VV!V(VV!cd|vryddlm}|d}|jDcgc]#}t|j|j %}}|||ycc}w)NSTATrA)buildStatTabler0)rJr1)otlLib.builderrrXr^rKrT)rfr fvarTablerirXs r7 _add_statr3sP ~/V I.}s/a16/) tolerance)' ValueErrorrErFr reverseMappingrrrHr getGlyphOrderdebugr_getCoordinatesAndControlsrrnumberOfContours getSubModelrallEqualwarning variations getDeltasr$r __round__rsupportsrendPts enumeraterrarrayrrrrcompilerY) rf masterModel master_ttfsrrrrdefaultMasterIndexm master_datasglyphallDatadr allCoords allControlscontroldeltasr origCoordsrideltasupportvar delta_optvar_opt axis_tags tupleDataauxDataunoptimized_len optimized_lens r7 _add_gvarrEsU1}ABBHH    "6**D4< / 0%8"  FF - -eQZZ L  % &q ) : :a ? !]qt'<'<'AtKG %009w#*+aQqT+ +%,-qt- -a.{+ KKEM N  "$ W%5%?%?uM! >>6{c(m+++AY #,SXab\-J#K / Aw/5;;// %0C.:v 9$,Wi@G & !I*-Y)?&Iw&))ns7|&CO)0)C&Iw$' NS\$AM$6% OOE " ) )# .1 /M>/ ,-s>L8L$L) L. L3cdD] }||vs||= |d}dD]}t||dd|_|djy)N)cvarcvt fpgmprepmaxp)maxTwilightPoints maxStoragemaxFunctionDefsmaxInstructionDefsmaxStackElementsmaxSizeOfInstructionsrr+r)setattrmaxZones removeHinting)rfrJrattrs r7_remove_TTHintingr sb/ $;S  .s33sh3rz:Masters have incompatible %s tables, hinting is discarded.rc3.K|] }|s|k7ywryr:rs r7r8z#_merge_TTHinting..s:3csh:s zMMasters have incompatible glyph programs in glyph '%s', hinting is discarded.rc32K|]}t|ywry)r)r5cs r7r8z#_merge_TTHinting..s7a3q67sz;Masters have incompatible cvt tables, hinting is discarded.rr+c3&K|] }|dk( ywrr:rs r7r8z#_merge_TTHinting..s%!qAv%r)rErFr rHrrGrr glyphsr[expandrrIrnonNonergetDeltasAndSupportsrrrrrrYr versionr)rfrrrJrall_pgms font_glyf master_glyfsr1rrall_cvs nonNone_cvsrrrrrrrrrs @r7_merge_TTHintingr sHH !"     ,7Dq3!8AcFNNDD 488C=)T: 3(3 3 KKLsR  d #  V I'23!AfI3L3 ''--/  eIUVGDHHTNIt<VV8}  Y5)T2 :(: : KK_  d #  "KVVQ6Q;vai&&'D@VGV..)K  ??7;7 7 QR$J"77u8FH )VABZ!")FG E7 %u% % We,# &v..tF| $oE4V Ws I6I6& I;#J&%Jreturnc|j|}|g|jrWt|j|k(r?|D]:\}}|j|}|j|k7ry|j t zr:yy)NTF)r isCompositer components glyphNamerWr) master_glyf glyph_nameflagged_componentsexpected_num_components master_glyphr base_glyphcomps r7%_has_inconsistent_use_my_metrics_flagr-s??:.L   $ $ &  '' (,C C/ MAz**1-D~~+ JJ/   r c  |d}|Dcgc] }d|vs|d}}|sy|jD] | }|jst|jDcgc]&\}}|jt zr||j f(c}} sdt|j t fd|Ds D cgc]\}} |  } }} tjd t| dkDrdndt| dkDr| n| d D],\}}|j|xjt zc_.ycc}wcc}}wcc} }w) aBClear USE_MY_METRICS on composite components if inconsistent across masters. If a composite glyph's component has USE_MY_METRICS set differently among the masters, the flag is removed from the variable font's glyf table so that advance widths are not determined by that single component's phantom points. rNc3:K|]}t|ywry)r-)r5r&r)r(r's r7r8z;_unset_inconsistent_use_my_metrics_flags..%s+  2Z);=T  sznComposite glyph '%s' has inconsistent USE_MY_METRICS flags across masters; clearing the flag on component%s %sr+sr) rr#rr$rWrr%rrGrErF)vf master_fontsrrrrrr,_r1 comp_namesr)r(r's @@@r7(_unset_inconsistent_use_my_metrics_flagsr6sg f:D'3C!v{AfICLC iik#= Z   "  %U%5%56 4 ^+   "  #&e&6&6"7   ,   /AA71d$AJA HH?:*!*o1 z!}  + =1  #))n_<) =E#= D &Bs EE%+E  E_MetricsFields)tableTag metricsTagsb1sb2 advMapping vOrigMapping phantomIndexHVARrLsbMapRsbMap AdvWidthMapVVARrTsbMapBsbMap AdvHeightMapVOrgMapcXtt||||t}t||t|yry)r$_get_advance_metrics HVAR_FIELDS _add_VHVARrfrrrgetAdvanceMetricss r7 _add_HVARrNY+dKh tX{,=>r cXtt||||t}t||t|yry)r$rI VVAR_FIELDSrKrLs r7 _add_VVARrR`rOr c |j}||vsJ|j}tjd|zt |}t t |}|x}|_d|_|\} } | rd} n*tjd| jD} d} | rtt| jddd} tj| |}t!t#t%| }tj&|gd}|D]}|j)| |dt*!|j-tj.||g} | j1t3j4|}i}|D]5}| |\}} |j7| |j9|t*||<7| r.vs& BqtH& sr+rrr)use_NO_VARIATION_INDEX)(r8rrErFr rHrrVersionrrrInextiterrbuildVarRegionListlistranger buildVarDataaddItemrr buildVarStore prune_regionsrr setSupports storeDeltasrbuildVarIdxMaprr getAllDatarrr<r=r:r;) rfr tableFieldsrMr8 glyphOrderVHVAR tableClassvhvarvhAdvanceDeltasAndSupportsvOrigDeltasAndSupports singleModel directStorer varTupleListvarTupleIndexesvarDatar%rr<rvOrigMap indirectStoremapping2gadvanceMapping useDirectr=writer directSize indirectSize metricsStores r7rKrKgs##H 4  ##%JHH]X %& X EX&J$,&EEKEM9J9L6 6 oo& 8??A&  K7>>@AB1EabI11(HE uS]34&&UK# UI OO6yA!DGO T U++L7)D !!#11(;LJP 5i@  * , 8 8w 8 O 9P # RI5i@ FH  $ $X .".":":6":"QHY  R !'')M%%U%CH3=>a(:a=)>J>++J CN3=>aHXa[)>>ILFD)**,- fd+vt,6,,./ - " $ !"11(JGL!EN E;))>:{//> E;??D) E;??D)DN M??s +M<Nc|j}|j}|j}|Dcgc]}||j} }|dk(rUd|dvrN|Dcgc]}|dj} }|Dcgc]}|dj } }t t| | } nd} i} i} d}|D]B}| Dcgc]}||vr||d|k7r||dnd}}|j|t| |<D| r>|D]9}| Dcgc]\}}||vr||n|}}}|j|t| |<;| | fScc}wcc}wcc}wcc}wcc}}w)NrCVORGrir) r8rr9rVOriginRecordsdefaultVertOriginYr]rrr)rfrrrrgr8rhr9r advMetricsesvOrigMetricses defaultYOrigsrlrmsparse_advancerr vhAdvances defaultVOrigvOrigss r7rIrIs##H##%J''J3>?aAjM))?L?6f A6z_add_MVAR..s QSTUQVr )keyrz %s: %s.%s %sMVARrTc|jSry)ValueTag)rs r7rz_add_MVAR..As r )rErFrrrrr[rHrYrrrrrrrMetricsValueRecordrVarIdxrrr rrrYReservedrValueRecordSizerValueRecordCount ValueRecord)rfrrr store_builderrecords lastTableTag fontTabletables specialTagsrJr8itemNamemasterrr master_valuesbasevarIdxrecrrrmvars r7 _add_MVARrsnHH 228,>,@FV%W'! !h | #!% %FY4 N )8Fv-{*#F8$4h?;sCSS d+ fX&678!, 7 7 ? v&&u-#L > @FFe1F F ??= )(+T&D(55mDLD& 8T* >  #x=I##%  sO'R   $$&.." -C ,CJ -'v..tF|GGI%tz!     #G !'/CD!Gs.Ictjdt|||}|j||dg|jj }|sy|dj }|jdk(sJd|_||_y)NzGenerating BASEBASErTi) rErFr mergeTablesrrrrYr)rfrrrmergerrrs r7 _add_BASErDszHH  [(D 9F t[6(3  ' ' )E  <  D <<: %% %DLDMr cgd}tfd|Dsytjdt||}|j |||j j }|sy dj}|jdksJ d|_||_|j'} |j)| dvrdjj)| yy#t$r_tdd<tdx}d<tjx}|_d|_ d|_d|_d|_d|_YwxYw)N)GSUBGDEFGPOSc3&K|]}|v ywryr:)r5rJrfs r7r8z_merge_OTL..Us/ssd{/szMerging OpenType Layout tablesriir)rGrErFrrrrrrYKeyErrorr rr GlyphClassDef AttachList LigCaretListMarkAttachClassDefMarkGlyphSetsDefrrremap_device_varidxes) rfrr3rotl_tagsrrr GDEFTable varidx_maps ` r7 _merge_OTLrSsA'H /h/ /HH -. UHd 3F t\84  ' ' )E  %F|!!||z)))DLDM!Jz* ~ V 00<! %'V #+F#33 DL!#*y! "& $%s. C""A%E  E cfd}tjd|jDcic]\}}||j}}}g} |D]} g} | jD]U} i} | D];}|d}|d |||d}nd}|d |||d}nd}||}||f| |<=| j | W| j Dcic]\}}|| }}}| j | |ft|| |ycc}}wcc}}w)Nc:tj||i|Sry)rnormalizeLocation)r1rminternal_axis_supportss r7 normalizez/_add_GSUB_feature_variations..normalizeys ''u 7MNtTTr z!Generating GSUB FeatureVariationsr1rLrurNrw)rErFr[rJ conditionSetsrYsubsr)rfrXrrules featureTagsrr1rjrconditional_subsruleregion conditionsspace condition axis_namerLrNrJrprqrs ` r7_add_GSUB_feature_variationsrvs?UHH 0126**,?JD$txx?I?0,, !JE' 0 %f- Y'3' 9Y3GHG"GY'3' 9Y3GHG!G *%w/c  0 MM%  ! "&+A1++/)0,/=3@*,s C8 C>_DesignSpaceData) rX axisMappingsrbase_idxnormalized_master_locsmastersr.rrulesProcessingLastlibcddlm}|j}d|vrddlm}|||j ||j }|||||y)Nr+)merge_region_fontsCFF2r)convertCFFToCFF2)cffrrfontTools.cffLib.CFFToCFF2rreorderMastersr)varFontrr3rrhrordered_fonts_lists r7 _add_CFF2rsN'&&(J W?!--lE||}}|rtjd't!|d}t|D]5\}}tAd(|j#Ds'| t d)|}7|r | t d*|rtjd+|tC|| ||||||jD|jF|jH Scc} wcc}wcc}wcc}w),Nsourcesz*Designspace must have at least one source.weightwghtr?WeightwidthwdthWidthslantslntSlantopticalopszz Optical SizeitalicitalItalicz(Designspace must have at least one axis.zAxis at index z needs a tag.rr+zAxes: %sz Mappings: %sr1zSource or instance 'z' has no location.zLocation axis 'z' unknown for 'z'.z&' has out-of-range location for axis 'z': is mapped to z but must be in mapped range [z..z'] (NOTE: all values are in user-space).zInternal master locations: %szInternal axis supports: %szNormalized master locations: %sc3&K|] }|dk( ywrr:rs r7r8z#load_designspace../s*!qAv*rz/More than one base master found in Designspace.z5Base master not found; no master at default location?zIndex of base master: %s)%hasattrrfromfilerr-r.r%rXrr1rJrSrr rErFr)rIasdictrr]getFullDesignLocationdesignLocationrr[r`rLrNrMrzrrrrrrr) designspace log_enabledrdsrr.standard_axis_maprX axis_indexrjrrobjobj_namerrqointernal_master_locsrtriplerrrrs r7load_designspacers{I&  ) )+ 6jjGw#$PQQ I$ x 01 2 vg/ 0 vg/ 0 $!78 9 x 01 2   77#&NPP =D%bgg. DII 88+nZL ,VWW$(HH ,I ) )xx,Y7:??&&'8'CA'FG88+nZL ,VWW??(-i(8%Y%& g&Ot{{}&OPQ??L  ',"78"882s}}2''+  ;'&xj0BC  I$+%i[zL  $zz| OIt!!#i.1ALLA55+*8*5!!* +;A3?%%)\\N"T\\NC11 2BIIAA33B7II 17;O3PQ  R,, dll;JP,QQT-=-=a-@,Qtyy)R .8N0OP&    $:; 3W=S5TUH011 *qxxz* *#+EH 8+# C   +X6       G'P@J-Rs,R9R"0R'?R,rAr;r ) 2g@O@KgU@dg \@}c Ld|vrd|vrTttdt|dd}|dj|k7r tj d|||d_d|vrntt|ddd}tt j|t}|dj|k7r tj d |||d_ d |vrRd |vrMtd t|d d }|d j|k7r!tj d|||d _ yyyy)NzOS/2rr+izSetting OS/2.usWeightClass = %srr rzSetting OS/2.usWidthClass = %srpostiZzSetting post.italicAngle = %s) rrr usWeightClassrErFrpiecewiseLinearMapWDTH_VALUE_TO_OS2_WIDTH_CLASS usWidthClass italicAngle)rfrZ weight_class widthValue widthClassrs r7set_default_weight_width_slantrXs% ~ X "3q#hv.>*E#FGLF|))\9:LI-9V * X S&!126.s%Uq :d ::Us&(zSkipping variable TTF font: excluderrdrop_implied_oncurvesr) formatTuplerGrXlocationLabelsrr rErbuildr!)r master_finderr/rskip_vfrr0resdoBuildStatFromDSv5 _locationsubDocr1vfDocr2s r7 build_manyr;s. C g  # #v -  UKDTDTU U *)) /{; 6-f5 KD%t} 8?@!!1&; B# [$7CI  Jr c|Sryr:r&s r7rrr'r c t|drntj|}t|}tj dtj dt ||}g}|D]2} |j| jjj4|r/d||jvrt|} tj d| t||j} d| vr| d=d| vr t| |t!| |j"|j$} d|vr t'| |j(D cgc]=} | j+Dcic]\}}|j"|j,|!c}}?}}} }| j"Dcgc]}|j.}}t1j2|| }d |j4|jk(sJtj d d |vr"t7| |j"|j8|d |vrd | vrt;| |||d|vrt=| |||d|vrt?| |||d|vrd| vrtA| |||d|vsd|vrtC| |||d|vrd| vrtE| |||d|vrd| vr tG| ||d|vrD|jHr8tK|}tM| |j"|jN|jH|d|vrBd| vsd| vr:tQ| ||d| vr)| d}|jRdk7rd|_)g|_*i|_d|vr%d| vr!| djVd kDrtY| ||||t[| | dj"Dcic]}|j.|j\c}|D] }|| vs| |= | ||fS#t$r|jdYewxYwcc}}wcc}}} wcc}wcc}w)z Build variation font from a designspace file. If master_finder is set, it should be a callable that takes master filename as found in designspace file and map it to master font binary as to be opened (eg. .ttf or .otf). rzBuilding variable fontzLoading master fontsNrzADropped %s on-curve points from simple glyphs in the 'glyf' tableDSIGr) axisOrderrzBuilding variations tablesrtrrr?rCrrrrrWrrrzCFF rg@rr0)rZ)/rrrrrErF load_mastersrYreaderfiler1AttributeErrorrr$r(r6rrrXr.rrr[rJrKrrrrrrrrNrRrrr r_feature_variations_tagsrrr formatType extraNamesrrrrP)rr4r/rrr0rr3rr drop_countr2r0rrprqrrjrrrrrJs r7r3r3s{I& )22;? + &BHH %&HH #$ ];LK% %   v}}1166 7% < +D!D0,?   O  ,r{{+ ,B | vJ|0\B R",, /D W" @B?X?X8;syy{3tq! 3*.3 3H3  ! !"8H ME  bkk* ** *HH )* W"bggr9 W2"e\84 W"e\84 W"e\84 W2"e\84 Wg 52ulH5 W2"e\H= W2UL1 W.r2 $ 22BHHk W&B,&B,"e\* R<f:D#%"%"$!  W2"V*2D2Dq2H"e\85EF" "V*//R$dllD$5$55R "93 uk !!_ %   t $ %6 44RSs6,/N0=O$O9OO6O# 0O OOc|Sryr:r&s r7rrEsQr cddlm}tjj |}||}|||}||}|dvrt }|j ||S|dvr t |}|Std|z)Nr) guessFileType)TTXOTX)TTFOTFWOFFWOFF2zInvalid master path: %r) fontTools.ttxrJospathnormpathr importXMLr-)rSr4rJ master_pathtprfs r7 _open_fontrXEs,''""4(K { #B z#K0 ; ' ^x {# K . .k" K$$= $KLLr c|Sryr:r&s r7rr[sar c|jD]8}|js|jtd|jxsdd|j t |S)aEnsure that all SourceDescriptor.font attributes have an appropriate TTFont object loaded, or else open TTFont objects from the SourceDescriptor.path attributes. The paths can point to either an OpenType font, a TTX file, or a UFO. In the latter case, use the provided master_finder callable to map from UFO paths to the respective master font binaries (e.g. .ttf, .otf or .ttx). Return list of master TTFont objects in the same order they are listed in the DesignSpaceDocument. zDesignspace source 'z zV' specified a layer name but lacks the required TTFont object in the 'font' attribute.)r4)r layerNamerfr-r1loadSourceFontsrX)rr4rs r7r@r@[sn%%    3'&v{{'Ak&BC    & &z & OOr ceZdZdZdZy) MasterFinderc||_yry)template)selfr`s r7__init__zMasterFinder.__init__us   r cFtjj|}tjj|\}}tjj |\}}|j j |||||}tjj|S)N)fullnamedirnamebasenamestemext)rRrSabspathsplitsplitextr`formatrT)rasrc_pathrdrerfrgrhrSs r7__call__zMasterFinder.__call__xs77??8,GGMM(3GG$$X. c}}## $ ww%%r N)__name__ __module__ __qualname__rbrnr:r r7r^r^ts ! &r r^c|jjt|jrdnd}t |j dDchc]}|j c}Scc}w)Nrcltrvrn,)rrFEAVAR_FEATURETAG_LIB_KEYrrrjstrip)rraw_tagsrs r7rDrDsNvvzz!((fH hnnS&9:1779: ;;:sA%rct||}|jsy|s t|}t||j|j |j|y)aAdd GSUB FeatureVariations table to variable font, based on DesignSpace rules. Args: vf: A TTFont object representing the variable font. designspace: A DesignSpaceDocument object. featureTags: Optional feature tag(s) to use for the FeatureVariations records. If unset, the key 'com.github.fonttools.varLib.featureVarsFeatureTag' is looked up in the DS and used; otherwise the default is 'rclt' if the attribute is set, else 'rvrn'. See log_enabled: If True, log info about DS axes and sources. Default is False, as the same info may have already been logged as part of varLib.build. ryN)rrrDrrXr)r2rrrrs r7addGSUBFeatureVariationsr{sH +; ?B 88 .r2   BGGR..+r cddlm}ddlm}|dtj }|j d|j}|j ddd d d |j d ddd d|j ddddgd|j dddd|j dddd|j d d!d"#|j d$d%d&'|j d(d)d*d+,|jd-.}|j d/d0d!d1#|j d2d3d!d4#|j|}||jrd5n|jrd6nd78|j}tj|}|j} | s|jd9|j g} | D]4} t#|j$| j&s$| j)| 6| s|jd:|j$|j*t-| d;kDr|jd<|j.} | t0j j3|} i} t-| d;k(r)|j*|j*| | dj&<n[| D]V} | j4 | j4n| j&d=z}t0j j7| || | j&<Xt9|j:}t=|||j>|j@|jB|jD>}|jGD]\}} | jHd?k(rd@ndA}| |jK|B}t0j j3|} | rt1jL| dCDtNjQdE|| jS|y )Fz8Build variable fonts from a designspace file and mastersr)ArgumentParser) configLoggervarLib)prog descriptionrz-o OUTPUTFILEoutfileNz output file)metavardestrMhelpz-dz --output-dir OUTPUTDIRz4output dir (default: same as input designspace file))rrMrz-xTAGr/rYz exclude table)rractionrMrz --disable-iupr store_falsezdo not perform IUP optimization)rrrz--no-colr-layer-reuserz?do not rebuild variable COLR table to optimize COLR layer reusez--drop-implied-oncurves store_truez|drop on-curve points that can be implied when exactly in the middle of two off-curve points (only applies to TrueType fonts))rrz--master-finderz$master_ttf_interpolatable/{stem}.ttfatemplated string used for finding binary font files given the source file names defined in the designspace document. The following special strings are defined: {fullname} is the absolute source file name; {basename} is the file name without its directory; {stem} is the basename without the file extension; {ext} is the source file extension; {dirname} is the directory of the absolute file name. The default value is "%(default)s".)rMrz--variable-fontsz.*VF_NAMEawFilter the list of variable fonts produced from the input Designspace v5 file. By default all listed variable fonts are generated. To generate a specific variable font (or variable fonts) that match a given "name" attribute, you can pass as argument the full name or a regular expression. E.g.: --variable-fonts "MyFontVF_WeightOnly"; or --variable-fonts "MyFontVFItalic_.*".)rMrrF)requiredz-vz --verbosezRun more verbosely.z-qz--quietzTurn verbosity off.DEBUGERRORINFO)levelz'No variable fonts in given designspace zNo variable fonts matching r+zwcan't specify -o because there are multiple VFs to build; use --output-dir, or select a single VF with --variable-fontsz.{ext}r.OTTOotfttf)rhT)exist_okzSaving variation font %s)*argparser} fontToolsr~main__doc__ add_argumentadd_mutually_exclusive_group parse_argsverbosequietrrrgetVariableFontserrorrSr*variable_fontsr1rYrr output_dirrRrefilenamejoinr^r4r;r/rrr0r[ sfntVersionrlmakedirsrErFsave)argsr}r~parser output_group logging_groupoptionsdesignspace_filenamervf_descriptors vfs_to_buildr2rvf_name_to_output_pathrfindervfsr)rh output_paths r7rrs'& t|| DF  &668L lD}  C         .     N   ! D  6 8   N  777GM k,5J i 3H%G!//w'--wV#..%../CDK 113N  >{?O?O>RSTL //9 B   273I3I2LMN"s<'81'<  L ##JWW__%9:  <A'//"=7>|A334 QB&(kk&=r{{277XCUH.0ggll:x.P "277 + Q'// 0F !! 11%;;  Cyy{ ~~/eU,W5<<<E WW__[1  KK T 2 +[9  r __main__)g?T)T)r:ry)}rtypingrfontTools.misc.vectorrfontTools.misc.roundToolsrrfontTools.misc.fixedToolsrrfontTools.misc.textToolsrr fontTools.ttLibr r fontTools.ttLib.tables._f_v_a_rr r fontTools.ttLib.tables._g_l_y_frrr fontTools.ttLib.tables.ttProgramr%fontTools.ttLib.tables.TupleVariationrfontTools.ttLib.tablesrrfontTools.ttLib.tables.otBaserfontTools.varLibrrrfontTools.varLib.mergerrrfontTools.varLib.mvarrfontTools.varLib.iuprfontTools.varLib.featureVarsrfontTools.designspaceLibrrfontTools.designspaceLib.splitrr fontTools.varLib.statr!fontTools.colorLib.builderr"fontTools.colorLib.unbuilderr# functoolsr$ collectionsr%r&r'os.pathrRloggingcopyr(pprintr)rer*errorsr,r- getLoggerrErvrrrrrrr r boolr-r6r7rJrQrNrRrKrIrrrrrrrrrrrUr$r;r3rXr@objectr^rDr{rrosysrargvexitdoctesttestmodfailedr:r r7rs2(6;/,? 5@1766H.3=LP226<<6g*+ PZT*<%=ZzIX (HI O/d!&C%L (0=f     ??X v1>hKE\  =F!>H " G CtH   !32%&%S%T   !8$8z   n"b$/,-8P2&6&$<U0L^ z 388}q CHH_W__  % %&r