Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 2jK@snddlmZddlmZmZmZmZddlmZddl m Z m Z m Z ddl mZddlmZddlmZddlmZdd lmZmZdd lmZmZdd lmZmZmZm 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,m-Z-dd l.m/Z/ddl0Z0ddl1m2Z2ddl3Z3ddl4Z4ddl5Z5e3j6e7Z8dddZ9dddZ:Gddde;ZDZ?ddZ@dS))sstruct)Tagtostr binary2numsafeEval)FeatureLibError)LookupDebugInfoLOOKUP_DEBUG_INFO_KEYLOOKUP_DEBUG_ENV_VAR)Parser) FeatureFile)builder) maxCtxFont)newTablegetTableModule)otBaseotTables)AlternateSubstBuilderChainContextPosBuilderChainContextSubstBuilderLigatureSubstBuilderMultipleSubstBuilderCursivePosBuilderMarkBasePosBuilderMarkLigPosBuilderMarkMarkPosBuilderReverseChainSingleSubstBuilderSingleSubstBuilderClassPairPosSubtableBuilderPairPosBuilderSinglePosBuilderChainContextualRule)OpenTypeLibError) defaultdictN)StringIOFcCst||}|j||ddS)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 featurefiler%r&r r+=/tmp/pip-build-_d5lkt3n/fonttools/fontTools/feaLib/builder.pyaddOpenTypeFeatures,s r-cCs*tt|}|r||_t||||ddS)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%r&N)r$rnamer-)r)featuresfilenamer%r&r*r+r+r,addOpenTypeFeaturesFromString>s r1c @seZdZedddDZd dZdddZddZddZddZ ddZ ddZ ddZ dd Z d!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Zd=d>Zd?d@ZdAdBZdCdDZdEdFZ dGdHZ!dIdJZ"dKdLZ#dMdNZ$dOdPZ%dQdRZ&dSdTZ'dUdVZ(dWdXZ)dYdZZ*d[d\Z+d]d^Z,d_d`Z-dadbZ.dcddZ/dedfZ0dgdhZ1didjZ2dkdlZ3dmdnZ4dodpZ5dqdrZ6dsdtZ7dudvZ8dwdxZ9dydzZ:dd{d|Z;d}d~ZddZ?ddZ@ddZAddZBddZCddZDddZEddZFddZGddZHddZIddZJddZKddZLddZMddZNddZOddZPdS)r'ccs|]}t|VqdS)N)r).0tagr+r+r, ZszBuilder.BASEGDEFGPOSGSUBOS/2headhhear.vheaSTATcCs8||_t|tr |d|_|_nd||_|_|j|_t|_d|_ d|_ d|_ t|_ d|_ i|_d|_d|_d|_g|_iid|_i|_i|_g|_d|_i|_t|_i|_t|_i|_i|_tt|_ d|_!d|_"g|_#d|_$d|_%i|_&i|_'i|_(i|_)i|_*i|_+i|_,i|_-i|_.i|_/i|_0dS)NrF)r8r7)1r) isinstancer parseTreefileZgetReverseGlyphMapglyphMapsetdefault_language_systems_script_ lookupflag_lookupflag_markFilterSet_language_systemsseen_non_DFLT_script_named_lookups_ cur_lookup_cur_lookup_name_cur_feature_name_lookups_lookup_locations features_required_features_aalt_features_aalt_location_aalt_alternates_ 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_)selfr)r*r+r+r,__init__isX    zBuilder.__init__NFc sjdkrtjjj_jj|dkr:j}n4t|}|j}|rndjt |}t d|dd|kr~j d|krj d|krj d|krjd|krjd |krΈjd |krވjxvdD]n}||krqj|}|jjd ks&|jjd ks&|jjd kr@t|}j|<||_q|jkrj|=qWtfd ddDrd jkrtjjd _d|krĈj}|r|jd<ndjkrĈjd=d|krj } | r| jd<ndjkrjd=|st!j"j#t$rj%dS)Nz, z9The following tables were requested but are unsupported: .r8r:r;r<r.zOS/2r=r7rc3s|]}|jkVqdS)N)r))r2r3)rkr+r,r4sz Builder.build..r6r5)r7r8)r7r8)&r?r r@rAparser(supportedTables frozensetjoinsortedNotImplementedErrorbuild_feature_aalt_ build_head build_hhea build_vhea build_name build_OS_2 build_STAT makeTable ScriptList ScriptCount FeatureList FeatureCount LookupList LookupCountrr)tableanyr usMaxContext buildGDEF buildBASEosenvirongetr buildDebg) rkr%r& unsupportedZunsupported_stringr3rZ fontTablegdefbaser+)rkr,r(sh       $      z Builder.buildcCs,||j|}|j|_|j|_|jj||S)N)r)rE lookupflagrF markFilterSetrMappend)rklocation builder_classresultr+r+r,get_chained_lookup_s   zBuilder.get_chained_lookup_cCs6x0|jD]&\}}|||f}|jj|gj|qWdS)N)rGrO setdefaultr)rklookupZ feature_namescriptlangkeyr+r+r,add_lookup_to_feature_s zBuilder.add_lookup_to_feature_cCs|jr6t|j|kr6|jj|jkr6|jj|jkr6|jS|jrL|jrLtd|||j||_|j|j_|j|j_|j j |j|jr|j|j |j<|j r|j |j|j |jS)NzOWithin a named lookup block, all rules must be of the same lookup type and flag)rJtyperrErrFrKrr)rMrrIrLr)rkrrr+r+r, get_lookup_s$   zBuilder.get_lookup_csj rj rdSddjjD}xjd gD]\}fddjjD}| rrdkrrtd|xn|D]f\}}}}xX|D]P}t|ts|g}x:|D]2}x,|jjD]\} } |j| t j | qWqWqWqxWq6Wdd|jD} fdd|jD} | r"| r"dSd djjD_j } g_ j j d| rjj|t}| |_| rj|t}| |_jj j| dS) NcSsi|]\}}t||qSr+)rB)r2gar+r+r, sz/Builder.build_feature_aalt_..aaltcs*g|]"\\}}}}|kr||||fqSr+r+)r2rrfeaturelookups)r.r+r, s z/Builder.build_feature_aalt_..zFeature %s has not been definedcSs*i|]"\}}t|dkrt|d|qS)r)lenrY)r2glyphreplr+r+r,rscs.i|]&\}}t|dkrt|jjd|qS)r)r)rrrr)Z getGlyphID)r2rr)rkr+r,r$scSs*i|]"\\}}}}|dkr||||fqS)rr+)r2rrrrr+r+r,r+s )Nr)rQrSitemsrOrr>rYZgetAlternateGlyphsrrBupdaterM start_featurerRrrmappingr alternates end_featureextend)rkrrrrrr lookuplistrraltsZsingleZmultiZ old_lookupsZ single_lookupZ multi_lookupr+)r.rkr,rt sF     (     zBuilder.build_feature_aalt_cCs\|js dS|jjd}|sPtd}|jd<|jdd|jd|_d|_|_|j|_dS)Nr:6g?le) r\r)rr decompile tableVersioncreatedmodifiedZ fontRevision)rkrr+r+r,ru<s  zBuilder.build_headcCs|js dS|jjd}|sDtd}|jd<|jdd|jd|_d|jkrZ|jd|_d|jkrp|jd|_d|jkr|jd|_d|jkr|jd|_ dS) Nr;r$iZ caretoffsetZascenderZ descenderZlinegap) rhr)rrrrZ caretOffsetascentdescentlineGap)rkrr+r+r,rvGs        zBuilder.build_hheacCs|js dS|jjd}|sDtd}|jd<|jdd|jd|_d|jkrZ|jd|_d|jkrp|jd|_d|jkr|jd|_dS)Nr<rriZverttypoascenderZverttypodescenderZverttypolinegap) rir)rrrrrrr)rkrr+r+r,rwXs      zBuilder.build_vheacCs4dd|jD}xtddD]}||kr|SqWdS)NcSsg|] }|jqSr+)nameID)r2r.r+r+r,risz,Builder.get_user_name_id..i)namesrange)rkrZnameIDsZ user_name_idr+r+r,get_user_name_idgszBuilder.get_user_name_idcCs d}|dkrJtj}|j\|_|_|_|_||jkrB|j||_nd|_n||j kr|js\n(||jksjt tj }d|_ |j||_ n||jkrtj}d|_|jj|dfd|_|jj|dfd|_|jj|dfd|_|jj|d|_|jj|dfd|_t|j||_|j||_|S)NsizerFeatUILabelNameIDFeatUITooltipTextNameIDSampleTextNameIDZParamUILabelNameID_0)rZFeatureParamsSizer[ DesignSize SubfamilyID RangeStartRangeEndrUZSubfamilyNameIDrTAssertionErrorZFeatureParamsStylisticSetVersionZUINameIDrVZFeatureParamsCharacterVariantsFormatrWrrrrrXZNumNamedParametersZFirstParamUILabelNameIDrrZZ CharCountZ Character)rkr3paramsr+r+r,buildFeatureParamsns:    zBuilder.buildFeatureParamsc Cs|js dS|jjd}|s2td}|jd<g|_x|jD]}|\}}}}}t|ts|}||jkr||jkr|j ||j|<|j|dk st |j|}nD|d|j kr||j kr|j ||j |<|j |dk st |j |}|j |||||q:WdS)Nr.r)r]r)rrrr>intrTrUrrrVrWsetName) rkrr.r platformID platEncIDlangIDstringr3r+r+r,rxs*        zBuilder.build_namec Cs|js dS|jjd}|sNtd}|jd<dtjtdj}|j||jd}d|jkrh|jd|_ d|jkrtdj }|jd\ |_ |_ |_ |_|_|_|_|_|_|_||_d|jkr|jd|_d|jkr|jd|_d|jkr|jd|_d |jkr|jd |_d |jkr(|jd |_d |jkrLtd |jd d |_d |jkrd|jd |_d|jkr||jd|_d|jkr|j|jdd|jkr|j |jd}|\|_!|_"d}d|jkr|jd|_#d}d|jkr|jd|_$d}d|jkr|jd|_%d}d|jkr4|jd|_&d}dd}t'||j(|_(|dkr^||d#|dkrr||d$|dkr||d%dS)&NzOS/2rrZfstypepanoseZ typoascenderZ typodescenderZ typolinegapZ winascentZ windescentvendorz'''Z weightclassZ widthclassZ unicoderangeZ codepagerangerZxheightZ capheightZ loweropsizeZ upperopsizecSs(x"|D]}t||st||dqWdS)Nr)hasattrsetattr)rattrsattrr+r+r, checkattrs  z%Builder.build_OS_2..checkattrulCodePageRange1ulCodePageRange2sxHeight sCapHeight usDefaultChar usBreakCharrusLowerOpticalPointSizeusUpperOpticalPointSize)rr)rrrrr)rr))rgr)rrrcalcsizerZ OS2_format_0rZfsTypeZPanoseZ bFamilyTypeZ bSerifStyleZbWeightZ bProportionZ bContrastZbStrokeVariationZ bArmStyleZ bLetterFormZbMidlineZbXHeightrZ sTypoAscenderZsTypoDescenderZ sTypoLineGapZ usWinAscentZ usWinDescentrZ achVendIDZ usWeightClassZ usWidthClassZsetUnicodeRangesbuild_codepages_rrrrrrmaxversion)rkrdatarrpagesrr+r+r,rys|     2                              zBuilder.build_OS_2cCs`x&dD]}||jkrt|d|qWt|tr>||jd<nt|trT||jd<nt|dS)NElidedFallbackNameElidedFallbackNameIDz is already set.)rr)rjrr>rrYr)rkvaluertokenr+r+r,setElidedFallbackNames       zBuilder.setElidedFallbackNamecCsd|jkrg|jd<|jdd|jdDkrBtd|jd||jdd|jdDkrptd|jd||jdj|dS) N DesignAxescss|] }|jVqdS)N)r3)r2rr+r+r,r4sz(Builder.addDesignAxis..z$DesignAxis already defined for tag "z".css|] }|jVqdS)N) axisOrder)r2rr+r+r,r4sz+DesignAxis already defined for axis number rm)rjr3rrr)rkZ designAxisrr+r+r, addDesignAxiss    zBuilder.addDesignAxiscCsd|jkrg|jd<xh|jdD]Z}dd|jDdd|jDkr dd|jDdd|jDkr |j|jkr td|q W|jdj|dS)NAxisValueRecordscSsh|] }|jqSr+)asFea)r2nr+r+r, +sz-Builder.addAxisValueRecord..cSsh|] }|jqSr+)r)r2rr+r+r,r,scSsh|] }|jqSr+)r)r2rr+r+r,r-scSsh|] }|jqSr+)r)r2rr+r+r,r.sz8An AxisValueRecord with these values is already defined.)rjr locationsflagsrr)rkZaxisValueRecordrZrecord_r+r+r,addAxisValueRecord%s    zBuilder.addAxisValueRecordcs|js dS|jjd}|s$tdd|jjd}ig}x|D]}g|j<q>W|dk rRx|D]}i}|jdkr||j|d<t|jdkr&|jd}|j}t|dkr|j|d|j dt|dkr|j|d|d|j d t|d kr|\} } } |j| | | |j d |jj |q`|jd d |jD|j d|j |q`Wfdd|D} |j jd} | st d} |j d<g| _ d|jkr|jd}| j |}|std|ddnd|jkr|jd}tj|j | ||ddS)NrzDesignAxes not definedrrrr)rr.r)rZ linkedValuer.)Z nominalValueZ rangeMinValueZ rangeMaxValuer.cSsi|]}|jd|jqS)r)valuesr3)r2ir+r+r,rcsz&Builder.build_STAT..)rr.cs&g|]}|j|j|j|jdqS))Zorderingr3r.r)rr3r)r2r) axisValuesr+r,rjsz&Builder.build_STAT..r.rzElidedFallbackNameID z; points to a nameID that does not exist in the "name" tabler)rZelidedFallbackName)rjrrr3rrrrrrrr)rZ getDebugNameotlZbuildStatTable)rkZaxesZaxisValueRecordsZformat4_locationsr3ZavrZ valuesDictrrZnominalZminValZmaxValZ designAxesZ nameTablerr.r+)rr,rz7sr                       zBuilder.build_STATc sddddddddd d d d d ddddddddddddddddddd fd!d"|D}g}xdtdD]X}|jd#xHt|d$|dd$D].}||kr||d%7<q||d&7<qWqdWd'd"|DS)(Nrrrrr012345r789:;<=>?)iiiiiiiiiijiiiiiQieibiai`i_i^i]i\iYiWiTiiiiRicsg|]}|kr|qSr+r+)r2p) pages2bitsr+r,rsz,Builder.build_codepages_.. 10cSsg|]}t|dddqS)Nr)r)r2rr+r+r,rs)rr)rkrbitsrjr+)rr,rsP zBuilder.build_codepages_cCsP|j r|j rdStj}d|_|j|j|_|j|j|_td}||_ |S)Nir5) r^r_rr5r buildBASEAxisZ HorizAxisZVertAxisrr)rkrrr+r+r,rszBuilder.buildBASEcCs|sdS|\}}tj}tj|_||j_t||j_tj|_g|j_t||j_xt |D]}tj}|d|_ tj |_ d|j _ tj |j _ |j|d|j j _g|j j _t|d|j j _x4|dD](}tj}d|_||_|j j jj|qW|jjj|q^W|S)Nrrr)rZAxisZ BaseTagListZ BaselineTagrZ BaseTagCountZBaseScriptListZBaseScriptRecordZBaseScriptCountrrZ BaseScriptTagZ BaseScriptZBaseLangSysCountZ BaseValuesindexZ DefaultIndexZ BaseCoordZBaseCoordCountrZ Coordinater)rkZaxisbasesscriptsrrecordcZcoordr+r+r,r!s4        zBuilder.buildBASEAxiscCstj}|j|_tj|j|j|_tj |j |j |j|_ |j |_|j|_|jrXdnd|_t|j|j|j |j|jfrtd}||_|SdSdS)Niir6)rr6buildGDEFGlyphClassDef_ GlyphClassDefrZbuildAttachListr`rAZ AttachListZbuildLigCaretListrarbZ LigCaretListbuildGDEFMarkAttachClassDef_MarkAttachClassDefbuildGDEFMarkGlyphSetsDef_ZMarkGlyphSetsDefrrrr)rkrrr+r+r,rs$    zBuilder.buildGDEFcCs|jrdd|jjD}nbi}x|jD]}|j|jq(Wx>|jjjD].}x(|jD]}x|j D] }d||<qfWqXWqLW|rt j }||_ |SdSdS)NcSsi|]\}\}}||qSr+r+)r2rr&_r+r+r,rsz3Builder.buildGDEFGlyphClassDef_..r) rcrrMrZinferGlyphClassesr?Z markClassesr definitionsglyphSetrr( classDefs)rkclassesr markClass markClassDefrrr+r+r,r's  zBuilder.buildGDEFGlyphClassDef_cCs.dd|jjD}|sdStj}||_|S)NcSsi|]\}\}}||qSr+r+)r2rr&r,r+r+r,r sz8Builder.buildGDEFMarkAttachClassDef_..)rdrrr*r/)rkr/rr+r+r,r) s z$Builder.buildGDEFMarkAttachClassDef_cCs@g}x,t|jjdddD]\}}|j|qWtj||jS)NcSs|dS)Nrr+)itemr+r+r,sz4Builder.buildGDEFMarkGlyphSetsDef_..)r)rrrfrrrZbuildMarkGlyphSetsDefrA)rkZsetsglyphsid_r+r+r,r+s z"Builder.buildGDEFMarkGlyphSetsDef_cCs:d|jkr$td|jd<i|jd_|j|jdjt<dS)NZDebg)r)rrrNr )rkr+r+r,rs  zBuilder.buildDebgcCs|dkst|x|jD] }d|_qWg}xX|jD]N}|j|krBq2t||_tt|j|j|dd|j |t|j<|j |q2Wydd|D}Wn4t k r}zt t||j|WYdd}~XnX|S)Nr7r8)rr.rcSsg|] }|jqSr+)r()r2lr+r+r,r2sz)Builder.buildLookups_..)r7r8) rrM lookup_indexrrrstrrget_lookup_name_rNrr"r)rkr3rrZ otLookupser+r+r, buildLookups_"s$     $zBuilder.buildLookups_c s$tt|d}d|_tj|_g|j_tj|_g|j_tj|_|j||j_ i}i}i}dd}xrt |j j |dD]Z\}}|\} } } t dd|D} |dko| dk} t| d kr| rqzxZ| D]R}y,|j|t|j|d |j|t|<Wqtk rtjd YqXqW| | f}|j|}|dkrt|jj}tj}| |_tj|_|j| |j_t| |j_t| |j_|jjj||||<|j| ij| gj||jj| | f| krz||| | f<qzWxt |j D]\} }tj}| |_ tj!|_!d|j!_"g|j!_#xt |j D]\} }tj#}tj$|_$d|j$_%|j| | fdkrnd |j$_&n|j$_&fd d|D|j$_'t|j$j'|j$_(| dkr|j$|j!_"n| |_)|j!j#j|q*Wt|j!j#|j!_*|jjj|qWt|jj|j_+t|jj|j_(t|jj |j_|S)NicSs(|dd|dd|dd|dfS)Nrrrr+)fr+r+r,r4Hsz#Builder.makeTable..)rcSsg|]}|jdk r|jqS)N)r8)r2r7r+r+r,rOsz%Builder.makeTable..r7rr)rzWfeaLib.Builder subclass needs upgrading to stash debug information. See fonttools#2065.icsg|]}|kr|qSr+r+)r2r)req_feature_indexr+r,rsdflt),getattrrrr|Z ScriptRecordr~Z FeatureRecordrr<ZLookuprrrOrtuplerrNr9_replaceKeyErrorwarningswarnrZ FeatureTagFeaturerZ FeatureParamsrYZLookupListIndexrrrrPZ ScriptTagZScriptZDefaultLangSysZ LangSysRecordZLangSysZ LookupOrderZReqFeatureIndexZ FeatureIndexrZ LangSysTagZ LangSysCountr})rkr3rZfeature_indicesZrequired_feature_indicesr$ZsortFeatureTagrrrrZ feature_tagZlookup_indicesZ size_featureixZ feature_keyZ feature_indexZfrecZ lang_featuresZsrecZlangrecr+)r>r,r{7s                   zBuilder.makeTablecCs(dd|jjD}||kr$||SdS)NcSsi|]\}}||qSr+r+)r2kvr+r+r,rsz,Builder.get_lookup_name_..)rIr)rkrrevr+r+r,r:szBuilder.get_lookup_name_cCs||dkr |dkr |jr td||dkr:|jr@td|nd|_||f|jkrhtd|j|jf||jj||fdS)NDFLTr?z_If "languagesystem DFLT dflt" is present, it must be the first of the languagesystem statementszRlanguagesystems using the "DFLT" script tag must precede all other languagesystemsTz1"languagesystem %s %s" has already been specified)rCrrHstripadd)rkrrlanguager+r+r,add_language_systems zBuilder.add_language_systemcCs|jrt|jStdhSdS)NrKr?)rKr?)rCrp)rkr+r+r,get_default_language_systems_s z%Builder.get_default_language_systems_cCs:|j|_d|_d|_||_d|_d|_|dkr6||_dS)NrKrr)rPrGrDrJrLrErFrR)rkrr.r+r+r,rs zBuilder.start_featurecCs0|jdk std|_d|_d|_d|_d|_dS)Nr)rLrrGrJrErF)rkr+r+r,rs zBuilder.end_featurecCs\||jkrtd|||jdkr,td|||_d|j|<d|_|jdkrXd|_d|_dS)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)rIrrLrKrJrErF)rkrr.r+r+r,start_lookup_blocks     zBuilder.start_lookup_blockcCs4|jdk std|_d|_|jdkr0d|_d|_dS)Nr)rKrrJrLrErF)rkr+r+r,end_lookup_blocks  zBuilder.end_lookup_blockcCs<||jkst|d|_|j|}|dk r8|j||jdS)N)rIrrJrrL)rk lookup_namerr+r+r,add_lookup_calls  zBuilder.add_lookup_callcCs ||_dS)N)r\)rkrrevisionr+r+r,set_font_revisionszBuilder.set_font_revisioncCst|dkst|jd kr*td|j||jdkr>td|d|_|j||jf}|jj|dd|df}|dksx|r|r|dd|j|<n g|j|<t|j|fg|_ |r|j|f}||j krtd |j |jj |j |j f||j|j |<dS) Nrrrz7Language statements are not allowed within "feature %s"zCLanguage statements are not allowed within standalone lookup blocksrr?rzPLanguage %s (script %s) has already specified feature %s as its required feature)rr) rrrLrrJrDrOrrprGrPrL)rkrrNinclude_defaultrequiredrrr+r+r, set_languages6     zBuilder.set_languagecCst|}|jj|}|dk r |St|jd}||j|<xD|D]<}||jkrl|j|\}}td||f|||f|j|<q>W|S)Nrz=Glyph %s already has been assigned a MarkAttachmentType at %s)rprerrrdr)rkrr5r6rr,locr+r+r,getMarkAttachClass_s    zBuilder.getMarkAttachClass_cCs8t|}|jj|}|dk r |St|j}||j|<|S)N)rprfrr)rkrr5r6r+r+r,getMarkFilterSet_.s   zBuilder.getMarkFilterSet_cCsT|d@}|r$|j||}||d>B}|rD|j||}|dB}||_nd|_||_dS)Nrr)r[r\rFrE)rkrrZ markAttachZ markFilterZmarkAttachClassrr+r+r,set_lookup_flag7s   zBuilder.set_lookup_flagcCsp|jd krtd|j||jdkr.td||j|dfhkrBdSd|_||_d|_d|_|j|dddd dS) Nrrz5Script statements are not allowed within "feature %s"zAScript statements are not allowed within standalone lookup blocksr?rTF)rWrX)rr)rLrrGrJrDrErFrY)rkrrr+r+r, set_scriptDs   zBuilder.set_scriptcsBg}x8|D]0}|dk r0|jfdd|Dq |jdq W|S)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. Ncsg|]}jj|jqSr+)rIrr.)r2r7)rkr+r,rcsz1Builder.find_lookup_builders_..)r)rkrZlookup_buildersrr+)rkr,find_lookup_builders_Ys zBuilder.find_lookup_builders_cCs(x"|D]}|jj|tj|qWdS)N)r`rrBr)rkrr5Z contourPointsrr+r+r,add_attach_pointsis zBuilder.add_attach_pointscCs,|j|t}|jjt||||j|dS)N)rrrulesrr!r`)rkrprefixr5suffixrrr+r+r,add_chain_context_posms zBuilder.add_chain_context_poscCs,|j|t}|jjt||||j|dS)N)rrrbrr!r`)rkrrcr5rdrrr+r+r,add_chain_context_substus zBuilder.add_chain_context_substc Cs|jdkr(|jj|t}|j|dS|s0|rf|j|t}|j|t}|j j t ||hg||gn |j|t}||j krt d||||j |<dS)Nrz)Already defined alternates for glyph "%s")rLrSrrBrrrrrrbrr!rr) rkrrcrrd replacementrchainrr+r+r,add_alternate_subst}s       zBuilder.add_alternate_substcCs(|jdkrtd||jj||fdS)Nrz9Feature references are only allowed inside "feature aalt")rLrrQr)rkrZ featureNamer+r+r,add_feature_references zBuilder.add_feature_referencecCs|jj|dS)N)rTrM)rkr3r+r+r,add_featureNameszBuilder.add_featureNamecCs|jj|dS)N)rVrM)rkr3r+r+r,add_cv_parameterszBuilder.add_cv_parametercCs,||jkr|j|d7<n d|j|<dS)zbAdds new items to ``self.cv_num_named_params_`` or increments the count of existing items.rN)rX)rkr3r+r+r,add_to_cv_num_named_paramss z"Builder.add_to_cv_num_named_paramscCs|j|j|dS)N)rZr)rk characterr3r+r+r,add_cv_characterszBuilder.add_cv_charactercCs|r||f|_n ||f|_dS)N)r_r^)rkr#r$verticalr+r+r, set_base_axiss zBuilder.set_base_axisc CsZ|jdkrtd|j|||||g|_x,|jD]"\}}|||jf}|jj|gq0WdS)Nrz9Parameters statements are not allowed within "feature %s")rLrr[rGrOr) rkrrrrrrrrr+r+r,set_size_parameterss  zBuilder.set_size_parametersc Csp|s |s |r>|j|t}|j|t}|jjt||||gn |j|t}x ttj |D]} ||j | <qZWdS)N) rrrrrbrr!rr itertoolsproduct ligatures) rkrrcr5rdrg forceChainrhrrr+r+r,add_ligature_substs    zBuilder.add_ligature_substc Cs|s |s |rN|j|t}|j|t}||j|<|jjt||hg||gdS|j|t} || jkr|| j|krtj d|||rd|ndnt d|||| j|<dS)Nz@Removing duplicate multiple substitution from glyph "%s" to %s%sz at rz+Already defined substitution for glyph "%s") rrrrrrbrr!loginfor) rkrrcrrd replacementsrvrhsubrr+r+r,add_multiple_substs"       zBuilder.add_multiple_substcCs"|j|t}|jj|||fdS)N)rrrbr)rkrZ old_prefixZ old_suffixrrr+r+r,add_reverse_chain_single_substs z&Builder.add_reverse_chain_single_substc Cs|jdkr>x.|jD]"\}}|jj|t}|j|qWdS|sJ|sJ|r^|j||||dS|j|t} x`|jD]T\}}|| j kr|| j |krt j d|||nt d|| j |f||| j |<qtWdS)NrzDRemoving duplicate single substitution from glyph "%s" to "%s" at %sz5Already defined rule for replacing glyph "%s" by "%s") rLrrSrrBrMadd_single_subst_chained_rrrrxryr) rkrrcrdrrvZ from_glyphZto_glyphrrr+r+r,add_single_substs,    zBuilder.add_single_substcCsd|j|t}|jt|j}|dkr2|j|t}|jj||j j t |t |jg||gdS)N) rrZfind_chainable_single_substrBkeysrrrrrbrr!rY)rkrrcrdrrhr{r+r+r,r~s   z!Builder.add_single_subst_chained_cCs(|j|t}|j||t|t|dS)N)rradd_attachmentmakeOpenTypeAnchor)rkrZ glyphclassZ entryAnchorZ exitAnchorrr+r+r,add_cursive_poss  zBuilder.add_cursive_posc Csx|D]\}}xv|jD]l}xf|jjD]X}||jkrPt|j}|j|f|j|<q&|j|d} |j| kr&td|| |jf|q&WqWqWdS)z)Helper for add_mark_{base,liga,mark}_pos.rz&Glyph %s cannot be in both @%s and @%sN)r-r5r.marksranchorr.r) rkrZ lookupBuilderrr,r1r2markZ otMarkAnchorZexistingMarkClassr+r+r, add_marks_s     zBuilder.add_marks_c CsZ|j|t}|j|||x:|D]2\}}t|}x |D]}||jj|i|j<q6Wq WdS)N)rrrrr#rr.) rkrr#rr baseAnchorr1 otBaseAnchorrr+r+r,add_mark_base_pos*s   zBuilder.add_mark_base_posc Csv|j|t}g}xH|D]@}i}|j|||x|D]\}} t||| j<q2W|j|qWx|D]} ||j| <q`WdS)N)rrrrr.rru) rkrru componentsr ZcomponentAnchorsrZanchorsZ ligAnchorr1rr+r+r,add_mark_lig_pos2s   zBuilder.add_mark_lig_posc CsZ|j|t}|j|||x:|D]2\}}t|}x |D]}||jj|i|j<q6Wq WdS)N)rrrr baseMarksrr.) rkrrrr rr1rZbaseMarkr+r+r,add_mark_mark_pos>s   zBuilder.add_mark_mark_posc Cs:|j|t}t|dd}t|dd}|j|||||dS)NT)pairPosContext)rrmakeOpenTypeValueRecordZ addClassPair) rkrZ glyphclass1value1Z glyphclass2value2rv1v2r+r+r,add_class_pair_posHs   zBuilder.add_class_pair_poscCs|jj|dS)N)rJadd_subtable_break)rkrr+r+r,rNszBuilder.add_subtable_breakc Cs:|j|t}t|dd}t|dd}|j|||||dS)NT)r)rrrZ addGlyphPair) rkrZglyph1rZglyph2rrrrr+r+r,add_specific_pair_posQs   zBuilder.add_specific_pair_posc Cs|s |s |r|j||||n|j|t}xr|D]j\}}t|dd} xT|D]L} y|j|| | WqJtk r} ztt| | j| WYdd} ~ XqJXqJWq0WdS)NF)r) add_single_pos_chained_rr radd_posr"rr9r) rkrrcrdposrvrr5rZ otValueRecordrr;r+r+r,add_single_posWs    zBuilder.add_single_poscCs|j|t}g}x |jD]\}}}}|j|qWg} x|D]z\} } | dkrX| jdq.) rrrbrrrZfind_chainable_single_posrr rrrr!)rkrrcrdrrhtargetsr,rsubsr5rZotValuer{rr+r+r,rds(      zBuilder.add_single_pos_chained_cCsB|jj|d\}}|r0||kr0td||f|||f|j|<dS)Nz0Glyph %s was assigned to a different class at %s)NN)rcrr)rkrrZ glyphClassZoldClassZ oldLocationr+r+r,setGlyphClass_|s zBuilder.setGlyphClass_cCstx|D]}|j||dqWx|D]}|j||dq"Wx|D]}|j||dq>Wx|D]}|j||dqZWdS)Nrrrr)r)rkrZ baseGlyphsZligatureGlyphsZ markGlyphsZcomponentGlyphsrr+r+r,add_glyphClassDefs    zBuilder.add_glyphClassDefcCs&x |D]}||jkr||j|<qWdS)N)rb)rkrr5caretsrr+r+r,add_ligatureCaretByIndex_s  z!Builder.add_ligatureCaretByIndex_cCs&x |D]}||jkr||j|<qWdS)N)ra)rkrr5rrr+r+r,add_ligatureCaretByPos_s  zBuilder.add_ligatureCaretByPos_cCs|jj|||||gdS)N)r]r)rkrrrrrrr+r+r,add_name_recordszBuilder.add_name_recordcCs||j|<dS)N)rg)rkrrr+r+r, add_os2_fieldszBuilder.add_os2_fieldcCs||j|<dS)N)rh)rkrrr+r+r,add_hhea_fieldszBuilder.add_hhea_fieldcCs||j|<dS)N)ri)rkrrr+r+r,add_vhea_fieldszBuilder.add_vhea_field) r5r6r7r8r9r:r;r.r<r=)NF)F)Q__name__ __module__ __qualname__rprorlr(rrrrtrurvrwrrrxryrrrrzrrr!rr'r)r+rr<r{r:rOrPrrrQrRrTrVrYr[r\r^r_r`rarerfrirjrkrlrmrorqrrrwr|r}rr~rrrrrrrrrrrrrrrrrrr+r+r+r,r'Ws = <3 +TU- ^  '          r'cCs`|dkr dSd\}}|jdk r.tjt|j}|jdk rHtjt|j}tj|j|j|j||S)zast.Anchor --> otTables.AnchorN)NN) Z xDeviceTabler buildDevicedictZ yDeviceTableZ buildAnchorxyZ contourpoint)rZdeviceXZdeviceYr+r+r,rs  rcCs<i|]4\}}}}|jds||f|dj|ddqS)ZReservedrrN) startswithlower)r2r,r.isDevicer+r+r,rs rcCs~|sdSi}xBtjD]6\}\}}t||d}|r|rDtjt|n|||<qW|rp| rp|jrhddinddi}tj|}|S)z&ast.ValueRecord --> otBase.ValueRecordNZYAdvancerZXAdvance)_VALUEREC_ATTRSrr@rrrrpZ buildValue)rIrZvrZastNameZotNamervalZvalRecr+r+r,rs   r)NF)NNF)AZfontTools.miscrZfontTools.misc.textToolsrrrrZfontTools.feaLib.errorrZ fontTools.feaLib.lookupDebugInforr r ZfontTools.feaLib.parserr ZfontTools.feaLib.astr ZfontTools.otlLibr rZfontTools.otlLib.maxContextCalcrZfontTools.ttLibrrZfontTools.ttLib.tablesrrZfontTools.otlLib.builderrrrrrrrrrrrrrr r!ZfontTools.otlLib.errorr" collectionsr#rsior$loggingrDr getLoggerrrxr-r1objectr'rZvalueRecordFormatrrr+r+r+r,sF      D      \