L i ddlmZddlmZmZmZmZddlmZddl m Z m Z m Z ddl mZddlmZddlmZddlmZdd lmZdd lmZmZdd lmZmZdd lmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.dd l/m0Z0ddl1m2Z2ddl3m4Z4ddl5m6Z6ddl7m8Z8ddl9m:Z:m;Z;ddlZ>ddl?Z?ddl@mAZAddlBZBddlCZCddlDZDeBjeFZGddZH ddZIGddeJZKy))sstruct)Tagtostr binary2numsafeEval)FeatureLibError)LookupDebugInfoLOOKUP_DEBUG_INFO_KEYLOOKUP_DEBUG_ENV_VAR)Parser) FeatureFile)VariableScalar)builder) maxCtxFont)newTablegetTableModule)otBaseotTables)AlternateSubstBuilderChainContextPosBuilderChainContextSubstBuilderLigatureSubstBuilderMultipleSubstBuilderCursivePosBuilderMarkBasePosBuilderMarkLigPosBuilderMarkMarkPosBuilderReverseChainSingleSubstBuilderSingleSubstBuilderClassPairPosSubtableBuilderPairPosBuilderSinglePosBuilderChainContextualRuleAnySubstBuilder)OpenTypeLibError) VarLibError)OnlineVarStoreBuilder)buildVarDevTable)addFeatureVariationsRaw)normalizeValuepiecewiseLinearMap) defaultdictN)StringIOcBt||}|j||y)aAdd features from a file to a font. Note that this replaces any features currently present. Args: font (feaLib.ttLib.TTFont): The font object. featurefile: Either a path or file object (in which case we parse it into an AST), or a pre-parsed AST instance. tables: If passed, restrict the set of affected tables to those in the list. debug: Whether to add source debugging information to the font in the ``Debg`` table tablesdebugN)Builderbuild)font featurefiler0r1rs ^/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/feaLib/builder.pyaddOpenTypeFeaturesr74s dK(G MMuM-c\tt|}|r||_t||||y)aeAdd features from a string to a font. Note that this replaces any features currently present. Args: font (feaLib.ttLib.TTFont): The font object. features: A string containing feature code. filename: The directory containing ``filename`` is used as the root of relative ``include()`` paths; if ``None`` is provided, the current directory is assumed. tables: If passed, restrict the set of affected tables to those in the list. debug: Whether to add source debugging information to the font in the ``Debg`` table r/N)r-rnamer7)r4featuresfilenamer0r1r5s r6addOpenTypeFeaturesFromStringr=Fs+&5?+K# k&Fr8c eZdZeddDZdZd_dZdZdZd`dZ d Z d Z d Z d Z d ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ d Z!d!Z"d"Z#d#Z$d$Z%dad%Z&d&Z'dad'Z(d(Z)d)Z*d*Z+d+Z,d,Z-d-Z.d.Z/d/Z0d0Z1d1Z2d2Z3d3Z4d4Z5d5Z6d6Z7gfd7Z8d8Z9d9Z:d:Z; dad;Zd>Z?d?Z@d@ZAdAZBdBZCdCZDdDZEdEZFdFZGdGZHdHZIdIZJdJZKdKZLdLZMdMZNdNZOdOZPdPZQdQZRdRZSdSZTdTZUdUZVdVZWdWZXdXZYdYZZdZZ[e\jDcic]4\}}}}|jd[s|d\j|d]dz||f6c}}}}Z`d^Zaycc}}}}w)br2c#2K|]}t|ywN)r).0tags r6 zBuilder.`s   C s) BASEGDEFGPOSGSUBOS/2headhhear:vheaSTATc||_t|tr|dc|_|_nd|c|_|_|j |_d|_d|vrF|dj|_t|jDcgc]}|jc}|_t|_ d|_ d|_d|_d|_t|_d|_i|_d|_d|_d|_g|_iid|_i|_i|_i|_g|_d|_i|_d|_t|_ i|_!t|_"i|_#i|_$tKtL|_'d|_(d|_)g|_*d|_+d|_,i|_-i|_.i|_/i|_0i|_1i|_2i|_3i|_4i|_5i|_6i|_7i|_8i|_9ycc}w)NfvarrF)rGrF):r4 isinstancer parseTreefilegetReverseGlyphMapglyphMapvarstorebuilderaxesr'axisTagsetdefault_language_systems_script_ lookupflag_lookupflag_markFilterSet_use_extension_language_systemsseen_non_DFLT_script_named_lookups_ cur_lookup_cur_lookup_name_cur_feature_name_lookups_lookup_locations features_required_features_feature_variations_aalt_features_aalt_location_aalt_alternates_aalt_use_extension_ featureNames_featureNames_ids_cv_parameters_cv_parameters_ids_cv_num_named_params_r,listcv_characters_size_parameters_ fontRevision_names_base_horiz_axis_base_vert_axis_ attachPoints_ligCaretCoords_ligCaretPoints_glyphClassDefs_ markAttach_markAttachClassID_markFilterSets_os2_hhea_vhea_stat_conditionsets_ model_cache)selfr4r5axs r6__init__zBuilder.__init__ps  k; /(3T %DNDI(,k %DNDI//1 # T>V ))DI#8&*ii00$D *-& )-&# #%*"  $!% )+R 8"$#%  " "#(  U!#!e"$$&!)$/ $! $#!!!"$!     {1s>HNcj3tjjj _jj | j }nEt|}|j z }|r)djt|}td|dd|vrjd|vrjd|vrjd|vrjd|vrjd |vrj!d |vrj#d D]}||vrj%|}j&rj)|||j*j,d kDs2|j.j0d kDs|j2j4d kDr"t7|x}j8|<||_|j8vsj8|=t=fd d Dr5d j8vr't?j8j8d _ d|vr=jC}|r|j8d<ndj8vr j8d=d|vr=jE} | r| j8d<ndj8vr j8d=|s#tFjHjKtLrjOyy)N, z9The following tables were requested but are unsupported: .rGrIrJrKr:rHrLrFrGrc3:K|]}|jvywr@)r4)rArBrs r6rCz Builder.build..s> !#DIIt}}=CCEDN T" >))Fv&F 4#7#77K%)YYvk/B%C")O)*!- V   $ $ & V  OO  V  OO  V  OO  V  OO  V  OO  V  OO # #C& NN3'E''**5#6  ,,q0$$11A5##//!3-5c]: DIIcN"'  !IIcN # <+;< <499AT-7 -BDIIf  * V >>#D$( &!499$IIf% V >>#D$( &!499$IIf% BJJNN#78 NN 9r8c||j|}|j|_|j|_|j |_|jj||Sr@) r4rZ lookupflagr[ markFilterSetr\ extensionrcappend)rlocation builder_classresults r6get_chained_lookup_zBuilder.get_chained_lookup_sStyy(3 ,,#==.. V$ r8c|jD]5\}}|||f}|jj|gj|7yr@)r]re setdefaultr)rlookup feature_namescriptlangkeys r6add_lookup_to_feature_zBuilder.add_lookup_to_feature_sF 11 >LFD4.C NN % %c2 . 5 5f = >r8cb|jrt|j|k(rm|jj|jk(rJ|jj|j k(r'|jj |r |jS|jr|jr td|||j||_|j|j_|j |j_|j|j_ |jj|j|jr#|j|j|j<|jr&|j!|j|j|jS)NOWithin a named lookup block, all rules must be of the same lookup type and flag)r`typerrZrr[can_add_mappingrarr4r\rrcrr_rbr)rrrmappings r6 get_lookup_zBuilder.get_lookup_sY   T%%&-7  ++t/?/??  ..$2P2PP  009## #  T%5%5!0  )H=&*&6&6#)-)G)G&%)%8%8" T--.  9=9I9ID   5 5 6  ! !  ' '(8(8$:P:P Qr8c ||js |jsy|jjDcic]\}}|t|}}}|jdgzD]\}}|jjD cgc]\\}}}} ||k(r|||| fc} }}}}|s!|dk7rt j |d|dg|D]z\}}}} | D]n} t| ts| g} | D]T} | jjD]1\} } |j| gjfd| D3Vp||jD cic]\} }t|dk(s| |d}} }|jD cic]\} }t|dkDs| |}} }|s|sy|jjD cic]\\}}}} |dk7r|||f| c} }}}|_|j}g|_ |j|jd|j|r|j!t"}||_|r|j!t&}||_|j+|jj|ycc}}wcc} }}}wcc}} wcc}} wcc} }}}w)NNaaltrz : Feature z has not been definedc3,K|] }|vs| ywr@)rAgalts_for_glyphs r6rCz.Builder.build_feature_aalt_..=s2&'1N3J2 r)rhrjitemsrqrewarningswarnrOgetAlternateGlyphsrextendlenrc start_featurerirkrrrr alternates end_feature)rrarrr:rrfeaturelookups lookuplistrglyphaltsreplsinglemulti old_lookups single_lookup multi_lookuprs @r6rzBuilder.build_feature_aalt_$s""4+@+@  .2-B-B-H-H-JKTQaajK K"11^4DD NHd9=8L8L8N4+VT7Wd?w0G tv~ xQUVW29 .gw")J%j$7&0\ ",+1+D+D+F+L+L+NKE4-7-B-B5"-MN*112+/2  */9.>.>.@ *udCIQRNE47N  1;0@0@0BTc$iRSmTTe 59NN4H4H4J  0'w& T7 #W ,  mm   4..8P8PQ  ,,X7IJM$*M ! ++H6KLL&+L #  [)UL& U s)JJ" J*3J*J0(J0J6 c|jsy|jjd}|sRtdx}|jd<|j d|jd|_d|_dx|_|_|j|_ y)NrIs6g?i<_le) rtr4rr decompile tableVersion magicNumbercreatedmodified fontRevisionrrs r6rzBuilder.build_headWsy!!  f%(0(8 8EDIIf% OOJ 2!$E  *E -7 7EMEN!//r8c|jsy|jjd}|s=tdx}|jd<|j d|jd|_d|jvr|jd|_d|jvr|jd|_d|jvr|jd|_d|jvr|jd|_ yy)NrJ$ caretoffsetascender descenderlinegap) rr4rrrr caretOffsetascentdescentlineGaprs r6rzBuilder.build_hheacszz  f%(0(8 8EDIIf% OOJ 2!+E  DJJ & $ = 9E   #::j1EL $** $ JJ{3EM  " JJy1EM #r8c|jsy|jjd}|s=tdx}|jd<|j d|jd|_d|jvr|jd|_d|jvr|jd|_d|jvr|jd|_yy)NrKriverttypoascenderverttypodescenderverttypolinegap) rr4rrrrrrrrs r6rzBuilder.build_vheatszz  f%(0(8 8EDIIf% OOJ 2!+E   +::&89EL $** , JJ':;EM  * JJ'89EM +r8c|jDcgc]}|j}}tddD] }||vs|cSycc}w)Ni)namesnameIDrange)rrr:nameIDs user_name_ids r6get_user_name_idzBuilder.get_user_name_idsF+0;;744;;77!#u- $L7*## $8s>cd}|dk(rftj}|j\|_|_|_|_||jvr|j||_|Sd|_|S||jvrP|js |S||jvsJtj}d|_ |j||_ |S||jvrtj}d|_|j j#|dfd|_|j j#|dfd|_|j j#|dfd|_|j*j#|d|_|j j#|dfd|_t1|j2||_|j2||_|S)NsizerFeatUILabelNameIDFeatUITooltipTextNameIDSampleTextNameIDParamUILabelNameID_0)rFeatureParamsSizers DesignSize SubfamilyID RangeStartRangeEndrmSubfamilyNameIDrlFeatureParamsStylisticSetVersionUINameIDrnFeatureParamsCharacterVariantsFormatrorrrrrpNumNamedParametersFirstParamUILabelNameIDrrr CharCount Character)rrBparamss r6buildFeatureParamszBuilder.buildFeatureParamss &=//1F %%  !"!d,,,)-)?)?)D&< 9*+&8 7D&& &))0 -d44444!;;=!""&"8"8"=& %D'' '<<>FFM'+'>'>'B'B)*A(F $.2-D-D-H-H/0!.F *'+&=&=&A&A()1'F #)-(A(A(E(Ec1(MF %-1-D-D-H-H,-q.F * #4#6#6s#;.checkattr s' ,ud+E4+ ,r8)ulCodePageRange1ulCodePageRange2)sxHeight sCapHeight usDefaultChar usBreakCharr)usLowerOpticalPointSizeusUpperOpticalPointSize))rr4rrrcalcsizer OS2_format_0rfsTypePanose bFamilyType bSerifStylebWeight bProportion bContrastbStrokeVariation bArmStyle bLetterFormbMidlinebXHeightr& sTypoAscendersTypoDescender sTypoLineGap usWinAscent usWinDescentr achVendID usWeightClass usWidthClasssetUnicodeRangesbuild_codepages_r=r>r?r@rCrDmaxversion)rrdatar^r&pagesr<s r6rzBuilder.build_OS_2s3yy  f%(0(8 8EDIIf%7++N6,B,O,OPPD OOD$)) , tyy 99X.EL tyy #F+224F (# """ ' "!EL TYY &"&))N";E  dii '#'99_#=E DII %!%=!9E  $)) # $ + 6E  499 $!%.6sFaeeFz$DesignAxis already defined for tag "z".c34K|]}|jywr@) axisOrderrks r6rCz(Builder.addDesignAxis..;s#RAAKK#Rrmz+DesignAxis already defined for axis number r)rrBrror)r designAxisrs r6 addDesignAxiszBuilder.addDesignAxis3s tzz )')DJJ| $ >>FTZZ -EF F!6z~~6FbI    #RL9Q#R R!=j>R>R=SSTU  < '' 3r8c\d|jvrg|jd<|jdD]}|jDchc]}|jc}|jDchc]}|jc}k(sU|jDchc]}|jc}|jDchc]}|jc}k(s|j|jk(st d||jdj |ycc}wcc}wcc}wcc}w)NAxisValueRecordsz8An AxisValueRecord with these values is already defined.)rrasFea locationsflagsrr)raxisValueRecordrrecord_ns r6addAxisValueRecordzBuilder.addAxisValueRecordBs TZZ /-/DJJ) *zz"45 G$+MM2q2'6'<'<=!AGGI=>(/(9(9:1QWWY:'6'@'@A!AGGIABMM_%:%::%N  %&--o>3=:AsD%DD$7D)c |jsy|jjd}|s tdd|jjd}i}g}|D]}g||j<|q|D]k}i}|jdkDr|j|d<t |j dk(r|j d}|j} t | dk(r!|j| d|jdt | dk(r%|j| d| d|jd t | d k(r&| \} } } |j| | | |jd ||jj| |j|j D cic]} | j| jdc} |jd |j|n|Dcgc]4}|j|j|j||jd 6}}|jjd}|s!tdx}|jd<g|_ d|jvr2|jd}|j|}|s-td|ddd|jvr|jd}tj |j||ycc} wcc}w)NrizDesignAxes not definedrsrrvr)rer:r2)re linkedValuer:) nominalValue rangeMinValue rangeMaxValuer:)rr:)orderingrBr:valuesr:rczElidedFallbackNameID z; points to a nameID that does not exist in the "name" tablerb)ruelidedFallbackName)rrrrBrvrrurupdaterrror4r getDebugNameotlbuildStatTable)rrUaxisValueRecords axisValuesformat4_locationsrBavr valuesDictrrnominalminValmaxValir designAxes nameTablerr:s r6rzBuilder.build_STATTszz zz~~l+!":DA A::>>*<=  %C"$Jsww  %  ''# 9 99q=*-))Jw's}}%*"}}Q/H%__F6{a'"))F1Isyy*QR6{a'")))//5ay(+ 6{a'28/"))071717(+ x||,33J?%%EH]](S );(S$'II &,,Z8G# 9X  KKuu$QUU+    IIMM&) ,4V,< ?)iai`i_i^i]i\iYiWiTiiiiRi 10)rrr)rr` pages2bitspbitsrjs r6r\zBuilder.build_codepages_s  !  !   !   !  !  !   !   !   !                  "  !  " #  $?  B(-@!Z 1 @@q $A LL 1r6AER<0 $9!HOH!HOH  $ $.33 1TrT7#33A4s CC>Cc|js |jsytj}d|_|j |j|_|j |j|_td}||_ |S)NrrD) rvrwrrDr buildBASEAxis HorizAxisVertAxisrr)rrrs r6rzBuilder.buildBASEsn$$T-A-A}}! ++D,A,AB**4+?+?@ &!  r8cJtj}d|_||_|SNr)r BaseCoordr Coordinate)rccoords r6buildBASECoordzBuilder.buildBASECoords$""$  r8c|sy|\}}}tj}tj|_||j_t ||j_tj |_g|j _t ||j _t|D]F}|Dcgc]}|d|dk(s|dd}}tj}|d|_ tj|_ tj|j_ |j|d|jj_g|jj_t |d|jj_g|j_|dD]@}|jjjj%|j'|B|D]\} } } tj(} |j'| | _|j'| | _d| _| dk(r| |j_etj"} | | _| | _|jj"j%| t |jj"|j_|j jj%|I|Scc}w)Nrrr2dflt)rAxis BaseTagList BaselineTagr BaseTagCountBaseScriptListBaseScriptRecordBaseScriptCountr BaseScriptTag BaseScript BaseValuesindex DefaultIndexrBaseCoordCountBaseLangSysRecordrrMinMaxMinCoordMaxCoordFeatMinMaxCount DefaultMinMaxBaseLangSysTagBaseLangSysCount)raxisbasesscriptsminmaxrrecordminmax_for_scriptrlanguage min_coord max_coord minmax_record lang_records r6rzBuilder.buildBASEAxiss !%w}}#//1',$(+E %&557/1,.1'l+Wo @F)/!%6!9q 3Iqr ! !..0F#)!9F ( 3 3 5F +3+>+>+@F   (8= F1I8NF   ( ( 557F   ( ( 2:=fQi.F   ( ( 724F   /AY V!!,,66==d>Q>QRS>TU V2C L.)Y ( 1 )-)<)K19K.)6K&%%77>>{K L25!!332F   .    0 0 7 7 ?= @> =!s 9K= K=ctj}|j|_t j |j |j|_t j|j|j|j|_ |j|_|j|_|j rdnd|_|j$r|j$j'}|red|_||_|j+}|j-|d|j.vr(|j.dj0j-||j2j5t7|j|j|j|j|j fs t9|drt;d}||_|Sy)NirirFVarStorerE)rrEbuildGDEFGlyphClassDef_ GlyphClassDefrbuildAttachListrxrS AttachListbuildLigCaretListryrz LigCaretListbuildGDEFMarkAttachClassDef_MarkAttachClassDefbuildGDEFMarkGlyphSetsDef_MarkGlyphSetsDefrrTfinishroptimizeremap_device_varidxesr4rrclearrr8r)rrstore varidx_maprs r6rzBuilder.buildGDEFs{}}!99;--d.@.@$--P11  $"6"6  #'"C"C"E $ ? ? A%)%:%:z    ((//1E) % "^^- **:6TYY&IIf%++AA*M    " " $ ""!!''%%   T: &f%FFLMr8c|jr3|jjDcic] \}\}}|| }}}}ni}|jD]!}|j|j #|j j jD]-}|jD]}|jD]}d||< /|rtj} || _ | Sycc}}}w)Nr}) r{rrcrinferGlyphClassesrP markClassesr definitionsglyphSetrr classDefs) rrr_classesr markClass markClassDefrrs r6rzBuilder.buildGDEFGlyphClassDef_8s   /3/C/C/I/I/KLL FQq!tLGLG-- ;v779: ;!^^77>>@ + $-$9$9+L!-!6!6!8+)*++ + ++-F&F MMsC&c|jjDcic] \}\}}|| }}}}|sytj}||_|Scc}}}wr@)r|rrrr)rrrrrrs r6rz$Builder.buildGDEFMarkAttachClassDef_JsZ+/+;+;+A+A+CDDia!QQTD D,,.$ EsAcg}t|jjdD]\}}|j|t j ||j S)Nc |dSrr)items r6z4Builder.buildGDEFMarkGlyphSetsDef_..Us 47r8r)rr~rrrbuildMarkGlyphSetsDefrS)rsetsglyphsid_s r6rz"Builder.buildGDEFMarkGlyphSetsDef_Rs[!  & & (.B  KFC KK  ((t}}==r8cd|jvr,td|jd<i|jd_|j|jdjt<y)NDebg)r4rr_rdr rs r6rzBuilder.buildDebgZsR  " ( 0DIIf %'DIIf  "8<8M8M &45r8c:|dvsJ||jD] }d|_ g}|jD]}|j|k7r|j|}|j |du}|t d|j |D]g}t||_tt|j |d|j|t|j<|j|ig}|D]"} |j|j$|S#t$r%}t t||j |d}~wt$rJ}|j|t|jj } t t|| |d}~wwxYw)Nr)is_named_lookupr)rr:r)rc lookup_indexrget_lookup_name_promote_lookup_typerrrr strrdrr3r% Exception) rrBrrr:resolvedl otLookupsers r6 buildLookups_zBuilder.buildLookups_`s&&++&mm 'F"&F  'mm "F||s"((0D11$dBR1SH%4OO  "&)'l#GV 1 H%%c*3v/B/B+CD q! " "&  ?A ?  + ? $ A%c!fajj9q@ ?005c!..6IJSS%c!fh7Q> ?s%8D F$ E FAFFc& tt|d}d|_tj|_g|j_tj |_g|j _tj|_|j||j_ i}i}i}d}t|jj|D]\}}|\} } } ttjd|D} t!| } |dk(xr| dk(}|j#| |}t%| dk(r|s|sn| D]G} |j&|t)|j+||j&|t)|<I| | f}|j3|}|t%|j j }tj }| |_tj6|_|j9| |j6_t=| |j6_t%| |j6_ |j j jC||||<|jE| ijE| gjC||jFj3| | f| k(s||| | f<t|jD]\} }tj}| |_$tjJ|_%d|jJ_&g|jJ_'t|jD]\} }tjN}tjP|_(d|jP_)|j3| | f}|d |jP_*n||jP_*|Dcgc] }||k7s | c}|jP_+t%|jPjV|jP_,| d k(r|jP|jJ_&| |_-|jJjNjC|t%|jJjN|jJ_.|jjjC|t%|jj|j_/t%|j j |j _,t%|jj|j_ |S#t,$rt/j0d YAwxYwcc}w) Nrc8|dd|dd|dd|dfS)Nrr2rr)fs r6rz#Builder.makeTable..s+AaDGQqT!Wad1gqt#Dr8rc3NK|]}|j|jywr@)r)rArs r6rCz$Builder.makeTable..s"'(q~~7QANNs%%rFrr)rzWfeaLib.Builder subclass needs upgrading to stash debug information. See fonttools#2065.ir)0getattrrrr ScriptRecordr FeatureRecordrrLookuprrertupledictfromkeysrany_feature_variationsrrdr_replaceKeyErrorrrr FeatureTagFeaturer FeatureParamsrqLookupListIndexrrrrf ScriptTagScriptDefaultLangSys LangSysRecordLangSys LookupOrderReqFeatureIndex FeatureIndexr LangSysTag LangSysCountr)rrBrfeature_indicesrequired_feature_indicesrsortFeatureTagrrrr feature_taglookup_indices lookup_key size_feature force_featureix feature_key feature_indexfrec lang_featuressreclangrecreq_feature_indexrs r6rzBuilder.makeTables,#t,." #..0(*%$002*,'#..0"&"4"4S"9#% E"4>>#7#7#9~N1 ILC(+ %FD+# ,3N#>2J&=B[F-BL 77 SIM>"a' ]$ :>:O:OPS:TB;hsh+))#.s2w7 ' 3K+//  (!!//66t:kI;H(&$8c1 Ih&,GMMO%< 7 !FM((*D#DN"//+DK)-DKK &(*DKK %)/ 0C0C0E)F >%o"002"*"2"2"4.2+$<$@$@&$$P!$,618DKK.)-G&KK--44W=) >*(+4;;+D+D'EDKK $    ) ) 0 0 69 7<(+5+;+;+H+H'I$),U->->-L-L)M&'*5+;+;+B+B'C$ q MMGP0s AU)( V3V)V  V ci}d}|jjD]\\}}}}g||<|jD]n\}} |j|} g} | D]=} | j|k7r| jJ| j | jd}?||j | | fp|r1|jD]\}} t |j|| |yy)NFT)rgrrrrrr)r4)rr table_tag feature_varshas_any_variationsrr8 variations conditionsetbuildersraw_conditionsetindicesbconditions_and_lookupss r6rzBuilder.makeFeatureVariationss "/3/G/G/M/M/O N + Q;(*L %*4*:*:*< N& h#'#6#6|#D !.Aww)+ >>555NN1>>2)-& . [)002BG1LM N N 7C7I7I7K 3 3'IIu&\\}}}}||k7r|jD]\}}tfd|Dsy@y)Nc3<K|]}|jk(ywr@)r)rArNrFs r6rCz1Builder.any_feature_variations..s>qww)+>sTF)rgrr)rr8rFrrrIrJrKs ` r6r$zBuilder.any_feature_variationssj+/+C+C+I+I+K 'OQ7Z+%*4*:*:*< & h>X>>  r8c||jjDcic]\}}|| }}}||vr||Sycc}}wr@)r_r)rrkvrevs r6rzBuilder.get_lookup_name_ sE $ 3 3 9 9 ;<1q!t<< S=v; =s 8cH|dk(r|dk(r|jr td||dk(r|jrtd|d|_||f|jvr/td|jd|jd||jj ||fy) NDFLTrz_If "languagesystem DFLT dflt" is present, it must be the first of the languagesystem statementszRlanguagesystems using the "DFLT" script tag must precede all other languagesystemsTz"languagesystem  z" has already been specified)rXrr^stripadd)rrrrs r6add_language_systemzBuilder.add_language_systems V F 2t7U7U!=  V ))%8 *.D & H !?!? ?!<<>8>>#35  &&**FH+=>r8c\|jrt|jStdhS)N)rWr)rXrr s r6get_default_language_systems_z%Builder.get_default_language_systems_+s-  ) )T;;< <./0 0r8c|r|dk7r td||j|_d|_d|_||_d|_d|_||_|dk(r||_ ||_ yy)NrzL'useExtension' keyword for feature blocks is allowed only for 'aalt' featurerWr) rr]r]rYr`rbrZr[r\rirkrrr: use_extensions r6rzBuilder.start_feature6s| TV^!^ !% B B D !%)-&+ 6>"*D '4D $ r8ct|jJd|_d|_d|_d|_d|_d|_y)NrF)rbr]r`rZr[r\r s r6rzBuilder.end_featureGsD%%111!% $)-&#r8c||jvrtd|z||jdk(r td|||_d|j|<d|_||_|jd|_d|_yy)Nz$Lookup "%s" has already been definedrzpLookup blocks cannot be placed inside 'aalt' features; move it out, and then refer to it with a lookup statementr)r_rrbrar`r\rZr[r_s r6start_lookup_blockzBuilder.start_lookup_blockPs 4&& &!6=x   ! !V +!L  !%$(D!+  ! ! ) D -1D * *r8c|jJd|_d|_d|_|jd|_d|_yy)NFr)rar`r\rbrZr[r s r6end_lookup_blockzBuilder.end_lookup_blockcsM$$000 $#  ! ! ) D -1D * *r8c||jvsJ|d|_|j|}||j||jyyr@)r_r`rrb)r lookup_namers r6add_lookup_callzBuilder.add_lookup_calllsTd111>;>1$$[1    ' '0F0F G r8c||_yr@)rt)rrrevisions r6set_font_revisionzBuilder.set_font_revisionss %r8c @t|dk(sJ|jdvrtd|jz||j td|d|_|j||jf}|j j |dd|df}|dk(s|r|r|dd|j |<n>|j j |g}|Dcgc] }||vs| c}|j |<t|j|fg|_|r|j|f}||jvrWtd|jd |jjd |j|jd ||j|j|<yycc}w) Nrrrz7Language statements are not allowed within "feature %s"zCLanguage statements are not allowed within standalone lookup blocksrrr2z Language z (script z ) has already specified feature z as its required feature) rrbrr`rYrerrr]rfrY) rrrinclude_defaultrequiredrr cur_lookupsxs r6 set_languagezBuilder.set_languagevs8}!!!  ! !%5 5!&(,(>(>?   ! ! )!2   ||Xt'='=>..$$c!ffc!f%=>  /w")!*DNN3 ..,,S"5K.9"NQg=M1"NDNN3  )DLL(+C*D E <<*Cd---%!( **,//4::<   ,0+A+AD # #C ( #Os  FFc<t|}|jj|}||St|jdz}||j|<|D]E}||jvr$|j|\}}t d|d||||f|j|<G|S)NrGlyph z3 already has been assigned a MarkAttachmentType at )rr}rrr|r)rrrr rrlocs r6getMarkAttachClass_zBuilder.getMarkAttachClass_s6"%%))&1 ?J$))*Q.*-' 6E((())%03%493@ (+HoD  U # 6 r8ct|}|jj|}||St|j}||j|<|Sr@)rr~rr)rrrr s r6getMarkFilterSet_zBuilder.getMarkFilterSet_sQ6"""&&v. ?J$&&''*V$ r8c|dz}||j||}||dzz}|&|j||}|dz}||_||_yd|_||_y)Nrr)rvrxr[rZ)rrre markAttach markFiltermarkAttachClassrs r6set_lookup_flagzBuilder.set_lookup_flagsw   !"66xLO_12E  ! 228ZHMDLE-:D *!.2D * r8c |jdvrtd|jz||j td||j|dfhk(ryd|_||_d|_d|_|j|dddy) Nrmz5Script statements are not allowed within "feature %s"zAScript statements are not allowed within standalone lookup blocksrrTF)rnro)rbrr]r`rYrZr[rr)rrrs r6 set_scriptzBuilder.set_scripts  ! !%5 5!&(,(>(>?   ! ! )!V   ff%5$6 6  )-& (FD5Qr8c g}|D]X}|C|j|Dcgc]'}|jj|j)c}H|jdZ|Scc}w)zHelper for building chain contextual substitutions Given a list of lookup names, finds the LookupBuilder for each name. If an input name is None, it gets mapped to a None LookupBuilder. N)rr_rr:)rrlookup_buildersrrs r6find_lookup_builders_zBuilder.find_lookup_builders_sm ! -J%&&>HIT((,,QVV4I &&t,  - Js,A" cx|D]5}|jj|tj|7yr@)rxrrWr)rrr contourPointsrs r6add_attach_pointszBuilder.add_attach_pointss6 NE    ) )% 7 > >} M Nr8ct|jdk7r td||jj||fy)Nrz9Feature references are only allowed inside "feature aalt")rbrrhr)rr featureNames r6add_feature_referencezBuilder.add_feature_references=  ! !V +!KX  ""Hk#:;r8c:|jj|yr@)rlrZrrBs r6add_featureNamezBuilder.add_featureNames s#r8c:|jj|yr@)rnrZrs r6add_cv_parameterzBuilder.add_cv_parameters $r8cn||jvr|j|xxdz cc<yd|j|<y)zbAdds new items to ``self.cv_num_named_params_`` or increments the count of existing items.rN)rprs r6add_to_cv_num_named_paramsz"Builder.add_to_cv_num_named_paramss8 $++ +  % %c *a / *-.D % %c *r8c@|j|j|yr@)rrr)r characterrBs r6add_cv_characterzBuilder.add_cv_character s C '' 2r8c2|r |||f|_y|||f|_yr@)rwrv)rrrverticalrs r6 set_base_axiszBuilder.set_base_axis s# $)7F#;D %*GV$(>?  ",[*h O 11 /LFD4!7!78C NN % %c2 . /r8cl|j|t|}|jD]\}}||jvrg||j|k(r7tj ddj |dj ||ntddj |z|||j|<y)N)rz7Removing duplicate substitution from "%s" to "%s" at %srz%Already defined substitution for "%s")rr$rrloginforr)rrrrrres r6add_any_subst_zBuilder.add_any_subst_"s!!(OW!M!--/ (JCfnn$FNN3//HHQ # %( *?$))C.P #(FNN3  (r8c f|jdk(rK|jD]7\}}|jj|g}||vs'|j |9y|s|s|r|j ||||y|j ||jD cic] \} } | f| f c} } ycc} } wr)rbrrjrradd_single_subst_chained_r) rrprefixsuffixr forceChain from_glyphto_glyphrrres r6add_single_substzBuilder.add_single_subst5s  ! !V +(/  *$ H,,77 BG4'KK) *  Vz  * *8VVW M   07  @*#ucVeX  @ @sB- cx|s|s|r|j|||||y|j||ft|iyr@)add_multi_subst_chained_rr!)rrrrr replacementsrs r6add_multiple_substzBuilder.add_multiple_substFsD Vz  ) )(FE6< X   Xu\* + r8c|jdk(r7|jj|gjfd|Dy|s|rW|j |t }|j |t}|jjt||hg||gn|j |t}||jvrtd|z|||j|<y)Nrc3,K|] }|vs| ywr@r)rArrs r6rCz.Builder.add_alternate_subst..Us@a!4-@rz)Already defined alternates for glyph "%s") rbrjrrrrrrrulesrr#rr) rrrrr replacementchainrrs @r6add_alternate_substzBuilder.add_alternate_substRs  ! !V +((33E2>D KK@;@ @  V$$X/GHE--h8MNF KK  26UG9fvhW X%%h0EFF F%% %!;eCX $/% r8c|s|s|r|j|||||yt|s td||j|t j |Dcic]}||fc}ycc}wNz!Empty glyph class in substitution)add_ligature_subst_chained_allrr itertoolsproduct)rrrrrrrrs r6add_ligature_substzBuilder.add_ligature_substest Vz  , ,&&&+  6{!"ExP P  (1(9(96(B C1Q  C Cs A' c t|rt|r t|s td||j|t}|jj t ||||j|yN,Empty glyph class in contextual substitution)rrrrrrr#rrrrrrrrs r6add_chain_context_substzBuilder.add_chain_context_subst{sj6{#f+S[!> !!(,DE  (B(B7(K  r8c |rt|r t|s td||j|t}|j |t }||j |t }|jj||jjt|t|jg||gyr)rrrrfind_chainable_substrrrrrrr#rqkeys)rrrrrrsubs r6rz!Builder.add_single_subst_chained_sc&kV!>    +CD((2DE ;**85GHC 7#  glln)=(> N r8cFt|r t|s td||j|t}|j ||it }||j |t }||j|<|jjt||hg||gyr) rrrrrrrrrrr#)rrrrrrrrs r6rz Builder.add_multi_subst_chained_s6{#f+!>   +CD((%)>@TU ;**85IJC) E .vy&3%PQr8c t|r t|s td||j|t}|j ||}||j |t }tj|D]H}|jj||} | |k7rtd|d| d|d|||j|<J|jjt||||gy)Nrz!Conflicting ligature sub rules: 'z ' maps to 'z' and '')rrrrfind_chainable_ligature_substrrrr ligaturesrrrr#) rrrrrrrrrexistings r6rz#Builder.add_ligature_subst_chained_s6{#f+!>   +CD11&+F ;**85IJC""F+ +A}}((K8H;&%7s+hZwWbVccde +CMM!  +  .vvvuMNr8c|s td||j|t}|jj |||fyr)rrrrr)rr old_prefix old_suffixrrs r6add_reverse_chain_single_substz&Builder.add_reverse_chain_single_substs?!"ExP P!!(,JK ZW=>r8cV|s|s|r|j||||y|j|t}|D]B\}}|s td||j ||d} |D]} |j || | Dy#t $r%} tt| | j| d} ~ wwxYw)N%Empty glyph class in positioning ruleFpairPosContext) add_single_pos_chained_rr"rmakeOpenTypeValueRecordadd_posr%rr) rrrrposrrrre otValueRecordrrs r6add_single_poszBuilder.add_single_poss Vz  ( (663 G%%h0@AF!$ I )?!% < <eE!=! $IEIx FI I,I-c!fajjAqHIs"A:: B( B##B(c>|r|s td||j|t}|j||d}|j||d}t t t |} t t t |} |j|| || |yNrTr)rrr!rr!rrW addClassPair) rr glyphclass1value1 glyphclass2value2rv1v2cls1cls2s r6add_class_pair_poszBuilder.add_class_pair_poss+!"I8T T!!(N;  ) )(F4 ) P  ) )(F4 ) PVC ,-.VC ,-.HdBb9r8c|r|s td||j|t}|j||d}|j||d}|j |||||yr)rrr!r addGlyphPair) rrglyph1rglyph2rrrrs r6add_specific_pair_poszBuilder.add_specific_pair_posskV!"I8T T!!(N;  ) )(F4 ) P  ) )(F4 ) PHfb&"=r8c |s td||j|t}|j|||j |||j ||yNr)rrradd_attachmentmakeOpenTypeAnchor)rr glyphclass entryAnchor exitAnchorrs r6add_cursive_poszBuilder.add_cursive_possZ!"I8T T!!(,=>    # #Hk :  # #Hj 9  r8c |j|t}|j||||s td||D]G\}}|j ||}|D]+}||j j |i|j<-Iyr)rr add_marks_rrrrr:) rrrmarksr baseAnchorr otBaseAnchorrs r6add_mark_base_poszBuilder.add_mark_base_poss""8-?@ '51!"I8T T%* R !J 228ZHL REQ ((r29>>B R Rr8c(|j|t}g}|s td||D]Q}i}|j||||D]$\}} |j |||| j <&|j |S|D]} ||j| <yr)rrrrrr:rr) rrr componentsrcomponentAnchorsranchors ligAnchorrrs r6add_mark_lig_poszBuilder.add_mark_lig_poss""8->?!"I8T T -EG OOHgu 5(- W$ 9*.*A*A(I*V ' W  # #G ,  -  8E'7G  e $ 8r8c |j|t}|j||||s td||D]G\}}|j ||}|D]+}||j j |i|j<-Iyr)rrrrr baseMarksrr:) rrrrrrrrbaseMarks r6add_mark_mark_poszBuilder.add_mark_mark_poss""8-?@ '51!"I8T T%* ! !J 228ZHL% !!!!,,Xr:NN ! !r8c t|rt|r t|s td||j|t}|jj t ||||j|y)N0Empty glyph class in contextual positioning rule)rrrrrrr#rrs r6add_chain_context_poszBuilder.add_chain_context_pos!sj6{#f+S[!BH !!(,BC  (B(B7(K  r8c |rt|r t|s td||j|t}g}|jD]\}}}}|j |g} |D]\} } | | j d|j|| d} |j|| | } | '|j|t} |j | | D]}| j||| | j | t|t| k(s J|| f|jj t||Dcgc]\}}| c}}|| ycc}}w)NrFr)rrrrrrrrfind_chainable_single_posrr"rrr#)rrrrrrtargetsrrsubsrreotValuerrrrTs r6rzBuilder.add_single_pos_chained_-se#f+S[!BH   +AB %  $ Aq!W NN7 # $ MFE} D!22%3G11'67KC{..x9IJs# 6 HeW5 6 KK  3x3t9$1sDk1$  s(;tq!(;VT J (;s? Ec |D]\}}|jD]}|jjD]}||jvrK|j |t j |j}|j|f|j|<\|j|d} |j| k7s~td|d| d|j|y)z)Helper for add_mark_{base,liga,mark}_pos.rrtz cannot be in both @z and @N) rrrrrcopydeepcopyanchorr:r) rr lookupBuilderrrrrmark otMarkAnchorexistingMarkClasss r6rzBuilder.add_marks_Ks! LAy ) 5 5  (//88: D=#6#66'+'>'>$dmmL4G4G&H( 6?^^\4R ++D1,9,?,?,Ea,H)$>>->>"1#'):INN!L (#   r8c:|jj|yr@)r`add_subtable_break)rrs r6r zBuilder.add_subtable_break^s ++H5r8c|jj|d\}}|r||k7rtd|d||||f|j|<y)NNNrtz& was assigned to a different class at )r{rr)rrr glyphClassoldClass oldLocations r6setGlyphClass_zBuilder.setGlyphClass_asZ $ 4 4 8 8 M+ J.!+'  (28&<U#r8c|D]}|j||d|D]}|j||d|D]}|j||d|D]}|j||dy)Nrr2r}r)r)rr baseGlyphsligatureGlyphs markGlyphscomponentGlyphsrs r6add_glyphClassDefzBuilder.add_glyphClassDefks  4E   % 3 4# 4E   % 3 4 4E   % 3 4$ 4E   % 3 4r8cN|D] }||jvs||j|<"yr@)rz)rrrcaretsrs r6add_ligatureCaretByIndex_z!Builder.add_ligatureCaretByIndex_ws/ 5ED000.4$$U+ 5r8c`t|ts|S|j||\}}|||fS|Sr@)rOrmakeVariablePos)rrcaretdefaultdevices r6 makeLigCaretzBuilder.makeLigCaret|s=%0L..x?  V$ $r8c|Dcgc]}|j||}}|D] }||jvs||j|<"ycc}wr@)r"ry)rrrrrrs r6add_ligatureCaretByPos_zBuilder.add_ligatureCaretByPos_sUBHI$##He4II 5ED000.4$$U+ 5JsAcD|jj|||||gyr@)rur)rrrrr r!r"s r6add_name_recordzBuilder.add_name_records FJ 66JKr8c"||j|<yr@)rrrres r6 add_os2_fieldzBuilder.add_os2_fields #r8c"||j|<yr@)rr(s r6add_hhea_fieldzBuilder.add_hhea_field 3r8c"||j|<yr@)rr(s r6add_vhea_fieldzBuilder.add_vhea_fieldr,r8c L d|jvr td||jDcic]0}|j|j|j |j f2}}|jDcic]'\}\}}|t|||t|||f)}}}}d|jvrP|jdj |jD cic]\} t fd| D}}} ||j|<ycc}wcc}}}wcc} }w)NrNz?Cannot add feature variations to a font without an 'fvar' tableavarc3HK|]}vrt|n|ywr@)r+)rArTrrs r6rCz+Builder.add_conditionset..s2=AGO&q'$-8QRRs") r4rrUrVminValue defaultValuemaxValuerr*segmentsr!r) rrrreraxisMaprBbottomtopcondition_rangers ` @r6add_conditionsetzBuilder.add_conditionsetsI  "!Q    LL4==$*;*;T]]K K  ',kkm   #]fc vws|4sGCL1    TYY ii'00G .3[[]  *D/ e,E$)C 5  s5D6,D! D c||js td||j|_|js|jdfS |j |j|j |jjd\}}d}||dk7r t|}||fS#t$r}td||d}~wwxYw)Nz5Can't define a variable scalar in a non-variable fontr0z,Failed to compute deltas for variable scalarl) rTrrU does_varyr add_to_variation_storerr4rr&r()rr varscalarr rrr!s r6rzBuilder.makeVariablePoss##!G  ""$$d* * &==$$d&6&6 f8MNGU  *!4%e,F !>  sAB B;) B66B;cd}t|ts$|tjt |}||fS|j ||\}}|| t d|||fS)N4Can't define a device coordinate and variable scalar)rOrr buildDevicer"rr)rr> deviceTablerr!r s r6 makeAnchorPoszBuilder.makeAnchorPosst)^4&k):;f$ $..xC  +"9!F r8c|yd\}}|j(tjt|j}|j(tjt|j}|j |j |j|\}}|j |j|j|\}}tj|||j||}|S)zast.Anchor --> otTables.AnchorNr) xDeviceTablerrAr" yDeviceTablerCrqy buildAnchor contourpoint)rrrdeviceXdeviceYrqrG otlanchors r6rzBuilder.makeOpenTypeAnchors >%    *ood6+>+>&?@G    *ood6+>+>&?@G''&2E2ExP 7''&2E2ExP 7OOAq&*=*=wP r8Reservedrrc|syi}|jjD]\}\}}t||d}|s|r"tjt |||<=t |trZ|dddz} | dj| ddz} t|| r td||j||\||<} | | || <|||<|r|s|jrddinddi}tj|} | S) z&ast.ValueRecord --> otBase.ValueRecordNrrDevicerr@YAdvanceXAdvance) _VALUEREC_ATTRSrrrrAr"rOrlowerrrr buildValue) rrrTrvrastNameotNameisDeviceval otDeviceName feaDeviceNamer!valRecs r6rzBuilder.makeOpenTypeValueRecords +/+?+?+E+E+G ! 'G'fh!Wd+C __T#Y76 C0%a{X5 ,Q 5 5 7,qr:J J 1m,)NPX&*%9%9(C%H"6 F%'-B|$ 6 # !& "$%JJ*aZOB# r8NFr@)F)b__name__ __module__ __qualname__rrrr3rrrrrrrrrrrrgrqrzrr\rrrrrrrrrrrr$rr[r]rrrcrerhrkrrrvrxr~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr rrrr"r$r&r)r+r.r:rrCrrvalueRecordFormat startswithrSrRr)rArr:rXs0000r6r2r2_sY    O JX<|>  :1*f 02" :$)V4RUh( 4?$S j+4Z  *X"H$>N !FgR. ?2 15"$2&2H&+BZ$ !R* N<$%/3>@= / (& $IN  /& ,   RO4?I(:>  R 8 !   <&6= 45 5 L  ")H2   %+$<$< AtXqz* Q $qr("T8$44O  s29E5 r2r])NNF)LfontTools.miscrfontTools.misc.textToolsrrrrfontTools.feaLib.errorr fontTools.feaLib.lookupDebugInfor r r fontTools.feaLib.parserr fontTools.feaLib.astr fontTools.feaLib.variableScalarrfontTools.otlLibrrfontTools.otlLib.maxContextCalcrfontTools.ttLibrrfontTools.ttLib.tablesrrfontTools.otlLib.builderrrrrrrrrrrrr r!r"r#r$fontTools.otlLib.errorr%fontTools.varLib.errorsr&fontTools.varLib.varStorer'fontTools.varLib.builderr(fontTools.varLib.featureVarsr)fontTools.varLib.modelsr*r+ collectionsr,rrior-loggingrr getLoggerr^rr7r=objectr2rr8r6rzs"EE2 +,:+643$4/;5@F#  g!.&7<G2qfqr8