)Ej7 dZddlZddlZddlZddlmZddlZddlmZm Z ddl m Z ddl m Z ddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZmZmZddlmZm Z m!Z!m"Z"m#Z#ddl$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+m,Z,ej-dZ.ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:Gdde;Z<Gdde<Z=e=>ej?ddZ@dZAdTdZBe=>ejCdZ@e=>ejDdZ@d ZEd!ZFe=>ejGd"Z@e=>ejHd#Z@d$ZIdUd%ZJdUd&ZKdVd(ZLd)ZMe=>ejNd*Z@dWd-ZOe=>ejPd.Z@e=>ejQd/Z@d0ZRd1ZSd2ZTd3ZUd4ZVe=>ejWd5Z@e=>ejXd6Z@e=>ejYd7Z@Gd8d9e=ZZeZ>ej[d:Z@eZ>ejDd;Z@eZ>ejCd<Z@Gd=d>e=Z\e\>ej[d?Z@e\>ejDd@Z@e\>ejCdAZ@GdBdCe=Z]dDZ^e]>ej_dEZ@e]>ej[dFZ@e]>ejDdGZ@e]>ejCdHZ@GdIdJe]Z`e`>ejadKZ@e`>ejbdLZ@dMZcdNZde`>ejeejffdOZ@e`>ejgejhfdPZ@e`>ejidQZ@e`>ejjdRdSZ@dS)Xz4 Merge OpenType Layout tables (GDEF / GPOS / GSUB). N)ior)MAX_PAINT_COLR_LAYER_COUNTLayerReuseCache) classifyTools)otRound)build_n_ary_tree)otTables)otBase)BaseFixedValue)dfs_base_table) DefaultTable)buildermodelsvarStore)nonNoneallNoneallEqual allEqualTosubList)VarStoreInstancer)reduce)buildSinglePos)_compression_level_from_envcompact_pair_poszfontTools.varLib.merger) ShouldBeConstant FoundANoneMismatchedTypesNotANone LengthsDiffer KeysDifferInconsistentGlyphOrderInconsistentExtensionsInconsistentFormatsUnsupportedFormatVarLibMergeErrorcbeZdZddZed dZeifdZd dZdZd Z d Z dS) MergerNc"||_d|_dSN)fontttfs)selfr+s IC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/varLib/merger.py__init__zMerger.__init__/s  r*ctks Jddjvri_tttjfvrftt krffd}|S)NzSubclass Merger instead.mergersc|jdksJg}D][}||vr||j|i}D]!}||vsJd|jd|d|||<"\dS)Nmergez Oops, class 'z' has merge function for 'z' defined already.)__name__appendr2 setdefault)methoddoneclazzr2attrattrscelfclazzess r.wrapperzMerger.merger..wrapper>s?g----D + +D== E""",11%<<!++Dw.... >>>4441/..%+GDMM + 4r0)r(__dict__r2typeenumEnumMetastr)r=r>r<r?s``` r.mergerz Merger.merger4sv~~~9~~~ DM ) )DL ==T4=1 1 1jG ;;#  HE        r0ct|}|D]8}t|dd}|n"|j|d}||cS9|S)Nr2)rAmrogetattrr2get)r=thing_defaulttypr2ms r. mergersForzMerger.mergersForPsp5kkHHJJ  DdIt44G   d++A}r0c t|dr|d|D](}t|dr|d)tt| t fd|Dst | d|D||}|d|j j } D]H |vrt| } fd|D}| |} | |||IdS#t$r#} | j d zd} ~ wwxYw) NensureDecompiledF)recursec3|K|]6}tt|kV7dSr*sortedvarskeys).0vrWs r. z&Merger.mergeObjects..fs>??a46$q'',,..111??????r0cjg|]0}tt|1SrOrTrXrYs r. z'Merger.mergeObjects..hs.)N)N)NQ&a*@*@)N)N)Nr0expectedgot*c0g|]}t|SrOrH)rXtablekeys r.r]z'Merger.mergeObjects..qs#???%'%--???r0.)hasattrrQrUrVrWallr!rNrI __class__ mergeThingsrHr&stackr6) r-outlstexcludeitemr2 defaultMergervaluevalues mergerFuncererWs @@r. mergeObjectszMerger.mergeObjects_s 3* + + 0   / / / 5 5Dt/00 5%%e%444d3iinn&&''????3????? t)N)N#)N)N)N //#&& C)CDD   0 0'>>S))????3???$[[m<<  4////  0 0     GNN39 % % %  s/A D<< E)E$$E)clt||ts)t|t|d|Dtt |t |D]O\}\}} ||| #t $r#}|jd|zd}~wwxYwdS)Nc,g|]}t|SrOlenrXxs r.r]z%Merger.mergeLists..zs=R=R=Rc!ff=R=R=Rr0r^z[%d]) rryr enumerateziprjr&rkr6)r-rlrmirqrrrts r. mergeListszMerger.mergeListsxs#sC(( Ts3xx=R=Rc=R=R=RSSS S"+CS#Y,?,?"@"@   Av   ////#   vz***   s-B B1B,,B1clt||ts.t|t|jd|D||dd}|||||dSt |tjr$t||st|||dSt|dr| ||dSt |tr| ||dSt||st|||dS)Nc6g|]}t|jSrO)rAr5rzs r.r]z&Merger.mergeThings..s!7V7V7VQQ8H7V7V7Vr0r^r@)rrArr5rNrI isinstancerBEnumrrgrulistr)r-rlrmrss r.rjzMerger.mergeThingssk#sD)) !tCyy17V7VRU7V7V7V __S))--dD99  ! JtS# & & & & & TY ' ' Dc3'' D&tcsCCCC D D S* % % D   c3 ' ' ' ' ' T " " D OOC % % % % %c3'' D&tcsCCCC D Dr0c|D]d|vr ||_||fd|D8#t$r }|jd}~wwxYwdS)Nc:g|]}|SrOrI)rXrMtags r.r]z&Merger.mergeTables..s#,M,M,MAQUU3ZZ,M,M,Mr0)r,rjr&rkr6)r-r+ master_ttfs tableTagsrtrs @r. mergeTableszMerger.mergeTabless  C$ '   c,M,M,M,M,M,M,MNNNN#   s###    s/< A&A!!A&)r*)rO) r5 __module__ __qualname__r/ classmethodrErNrurrjrrOr0r.r(r(.s [6)+   [ 2DDD*     r0r(ceZdZdS)AligningMergerN)r5rrrOr0r.rrsDr0r GlyphClassDefc|#t|st|d|dSd|D}i|_|j}t}|jd|D|D]\t fd|D}t |st||d|dzg|sd|<Q|d|<]dS)Nr^cg|] }|j SrO) classDefsrXls r.r]zmerge..s $ $ $11; $ $ $r0c6g|]}|SrO)rWrs r.r]zmerge..s +++!QVVXX+++r0c3BK|]}|VdSr*r)rXrks r.rZzmerge..s-22AEE!HH222222r0rrf)r_r`rk)rrrsetupdaterrr)rEr-rmallKeys allValuesrs @r.r4r4s |s|| ;6Dc::: : $ $ $ $ $CDN >DeeGGN++s+++,,  # #2222c22222  "" "13sQwi  #DGGlDGG # #r0cjdkrStj}d|_j|_j|_fd|jjD|_t|j|_|S)Ncg|] }j SrOValue)rX_r-s r.r]z._SinglePosUpgradeToFormat2..s999999r0) Formatot SinglePosCoverage ValueFormatglyphsrry ValueCount)r-rets` r._SinglePosUpgradeToFormat2rsn {a ,..CCJ=CL&CO9999S\%8999CI^^CN Jr0c | d|D}ndt||D}t}|j||j t | t fd|Dst~d}|fd|D}n1t|t|ksJfd|D}|fS)aTTakes font and list of glyph lists (must be sorted by glyph id), and returns two things: - Combined glyph list, - If values_lst is None, return input glyph lists, but padded with None when a glyph was missing in a list. Otherwise, return values_lst list-of-list, padded with None to match combined glyph lists. Nc,g|]}t|SrO)rrs r.r]z&_merge_GlyphOrders..s)))SVV)))r0cHg|]\}}dt||D S)ci|]\}}|| SrOrO)rXgrYs r. z1_merge_GlyphOrders...s222tq!a222r0)r})rXrvss r.r]z&_merge_GlyphOrders..s3UUUuq"22s1bzz222UUUr0rec3BK|]}t||kVdS)rN)rU)rXrsortKeys r.rZz%_merge_GlyphOrders..s5;;vbg&&&",;;;;;;r0c0g|]fdDS)c g|] }|vr|n SrOrOrXglyphdefaultdict_sets r.r]z1_merge_GlyphOrders...s' H H Hex''UUW H H Hr0rOrXrrorders @r.r]z&_merge_GlyphOrders..sB    I H H H H% H H H   r0c0g|]fdDS)c,g|]}|vr|nSrOrOrs r.r]z1_merge_GlyphOrders...s+ R R R5 1 1Xe__w R R Rr0rOrs @r.r]z&_merge_GlyphOrders..sB    S R R R RE R R R   r0) r}rrgetReverseGlyphMap __getitem__rUrhr"ry) r+rm values_lstr dict_setscombined paddedValuespaddedrrs ` @@r._merge_GlyphOrdersrsC))S))) UUC@T@TUUU uuHHOY%%''3G 8 ) ) )E ;;;;s;;; ; ;'$&&&L     %    3xx3z??****     %    &=r0cz|dj|_|||dSNrr@copyrurEr-rms r.r4r49FO((**DM c"""""r0cz|dj|_|||dSrrrs r.r4r4rr0c0|D]}|2t|tjks|j||jjvr7|jdkr |jcS|jdkr,|j|jj|cSt|ddS)Nrrsingle positioning lookupsubtable) rArrrrrrindexr%)rE subtablesrr-s r.%_Lookup_SinglePos_get_effective_valuers R R LDzzR\))}$DM000  ;!  :    [A  :dm288??@ @ @ @#F5PQQQ Q 4r0c |D]}|2t|tjks|j||jjvr7|jdkrH|j|jj|}|j}|D]}|j |kr|ccS|jdkrZ|j j |d}|j j |d} |j|j| cSt!|ddS)Nrrrpair positioning lookupr)rArPairPosrrrPairSetrPairValueRecord SecondGlyph ClassDef1rrI ClassDef2 Class1Record Class2Recordr%) rEr firstGlyph secondGlyphr-pspvrrecklass1klass2s r.(_Lookup_PairPos_get_effective_value_pairrs#PP LDzzRZ''}$!555  ;!  dm288DDEB$C  ?k11JJJJJ2  [A  ^-11*a@@F^-11+qAAF$V,9&A A A A#F5NOOO O 4r0c ttjd|Ddx|_ t |dks dzdkst |d|jj td|Drt fd|Drjtj |j |_ dkr%| |j d |D|j |_dSd |_d |D}t|jd |Dd |D\}}||j_ fd|D|_ t |j |_t%|D]Z\}}t%|D]E\}}||t'||j||} | tj } | ||<F[||j ||||dttjd|j Dd|_dS)Ncg|] }|j SrOrrs r.r]zmerge..6s8T8T8T18T8T8Tr0rrirrc3,K|]}|jdkVdS)rNrr\s r.rZzmerge..<s( & &Q18q= & & & & & &r0c38K|]}|jjkVdSr*rr)rXrYcoverageGlyphss r.rZzmerge..<s>//01!*++//////r0cPg|]#}|j|jntj$Sr*)rr ValueRecordr\s r.r]zmerge..Fs.WWWaAG/V5G5I5IWWWr0rc,g|]}t|SrO)rr\s r.r]zmerge..Ms! 6 6 6Q %a ( ( 6 6 6r0c&g|]}|jjSrOrr\s r.r]zmerge..Qs555Aaj'555r0cg|] }|j SrOrr\s r.r]zmerge..Qs7M7M7MA7M7M7Mr0c8g|]}tjSrO)r r)rXr valueFormats r.r]zmerge..Us$BBBa&$[11BBBr0)rrrrrrnc6g|]}|SrO)getEffectiveFormatr\s r.r]zmerge..ns$@@@Q))++@@@r0)rint__or__rryr%rrrhr rrrj getFormatrrr+rr|rlookup_subtablesrru) rEr-rmrrr~rrjrrYrrs @@r.r4r44s%+CJ8T8TPS8T8T8TVW%X%XXD{ HHMMkD0A551LMMMM])N & &# & & &&& 3////58///,, ' TZ@@ !      WWSVWWW    ://11DK 6 6# 6 6 6C( 555557M7M7M7M7MNFF"DMBBBB6BBBDJ$*ooDOv&&   6!&))  HAuay$ 6/2EAy&{33F1II  dj&)))  cW @@TZ@@@!Dr0ct|jd|Dd|D\}}gx|_}|D]}tj}||_|jrt j|jnd|_|j rt j|j nd|_ | |t|j|_ t|D]\}} t|D]\} }tj} || _| |  | | } n"t||j||j|} | d\} }n"t%| dd} t%| dd}|jrt j|j| nd| _|j rt j|j |nd| _ | | | <Ԍ|`||j|dS)Nc0g|]}d|jDS)cg|] }|j SrOrr\s r.r]z$merge...w 4 4 4A!- 4 4 4r0rrXrs r.r]zmerge..w*CCC 4 4!3 4 4 4CCCr0cg|] }|j SrOrrs r.r]zmerge..x*** ***r0NNValue1Value2)src)rr+rrr valueFormat1r rr  valueFormat2r r6ryPairValueCountr|rr _firstGlyphrHr)rEr-rmrrpvrsrrr~rrrrYvpairv1v2s r.r4r4rs7( CCsCCC**c***NFF #%$D4   ""7=7J TF v2 3 3 3PT 8>7J TF v2 3 3 3PT  Cd233Dv&& 6!&))  HAu"$$A!AMay$q @F3A68H%}#BBUHd33UHd33&"6#6B???? H&"6#6B???? H F1II3 4  d*F33333r0ctd|Ds Jd|||dtj}g|_d|_t |jd|Dd|D|\}}||j_ d |D|_t|j|_ t||jD] \}}||_ ||j|dS) Nc2g|]}|j |jdkSrr ValueFormat2rs r.r]z)_PairPosFormat1_merge..&777QY71 777r0Report bug against fonttools.)rr PairSetCount ValueFormat1rrrc&g|]}|jjSrOrr\s r.r]z)_PairPosFormat1_merge..(((q (((r0cg|] }|j SrOrr\s r.r]z)_PairPosFormat1_merge..s   q   r0rc4g|]}tjSrO)rr)rXrs r.r]z)_PairPosFormat1_merge..s111QBJLL111r0)rrurrrrrr+rrryrr}rr)r-rmrEemptyrrrrs r._PairPosFormat1_merger&s> 77c777  ''&''     W JLLEEE( ((C(((  C    NFF"DM11&111DLDL))D.. r dlF+++++r0c$t|tr|}n|r|jr|jni}|r!t|nd}g}t |dzD]#}|t$|D] \}}|| |!|d|d<nKt|x|d<}|ddD],} | || | -|S)Nrr) rdictrmaxrrranger6ritemsaddintersection_updatedifference_update) r- allGlyphsrrMrrrrYclass0ss r._ClassDef_invertr2s/$F &*Et~EDNN2 #,3I    !A C 1q5\\ 355!!1 A 1 Ai..(AQRR ( (A ! !& ) ) )  $ $Q ' ' ' ' Jr0ctj}ix|_}|du}|rdgt|z}t j}t ||D]6\}}t||}| |dd}||7| } |r"| dtt| D]\} } | dkr | D]} | || <|| fS)Nrr) rClassDefrryr Classifierr}r2r getClassesinsertrr|) rm allGlyphsesr-rallGlyphsesWasNone classifierclassDefr/setsclassesr~classSetrs r._ClassDef_merge_classifyr?s& ;==D!##DNY$,(fs3xx' )++J"3 44  ))44  8D$##%%G!q#%%    )) 8 66   AIaLL  =r0Fcd|D}td|Dd|D\|_}t||_g}t ||D]S\}}d} t |jj} |jj} g} |D] } tt| }|| vrd} | tj } gx}| _ t|jD]}}|rd}natj }|jrt#j|jnd|_|jrt#j|jnd|_||~| }n| |d}||}| | || U|}~td|D\|_}t||_g}t ||D]\}}|jj}g} |D]}|j }tj }gx}|_ |D]n} | s |d}n:tt| }||d}||}|t3j|o| ||| |}~|S)Ncg|] }|j SrO)rrs r.r]z2_PairPosFormat2_align_matrices..s,,,1,,,r0cg|] }|j SrO)rrs r.r]z2_PairPosFormat2_align_matrices..s""""""r0c&g|]}|jjSrOrrs r.r]z2_PairPosFormat2_align_matrices..s$D$D$D1QZ%6$D$D$Dr0rcg|] }|j SrO)rrs r.r]z2_PairPosFormat2_align_matrices..4s7Q7Q7Q 7Q7Q7Qr0)r?rry Class1Countr}rrrrnextiterrrrr* Class2Countrr rr rr r6rIrrdeepcopy)r-rmr+ transparentmatricesr= new_matricesrmatrixnullRowcoverage classDef1 class1Recordsr> exemplarGlyph class2recordsrrec2rec1klass classDef2rec1oldoldClass2Recordsrec1new class2Recordss r._PairPosFormat2_align_matricesr\s:,,,,,H7""c"""$D$D$D$D$DDNG7||DLh''&+&+ 6qz())K)   ' 'H h00MH,, ? o//G;==MG$8"1=1133& #'DD#%?#4#4D$(#4!* 243D E E E%)!K$(#4!* 243D E E E%)!K &,,T2222! mQ77e}   & & & &M****H77Q7QS7Q7Q7QRRDNG7||DLh''++ 6K)   * *G&3 o''G35 5MG0# : :3+A.DD$(h$8$8M%MM-;;E+E2D$$T]4%8%89999   ) ) ) )M****H Or0ctd|Ds Jd|||dt|jd|D\}}||j_t ||jD]#\}}|jj|kr||dksJ$t|||j}t|d|_ | |j |dS)Nc2g|]}|j |jdkSrrrrs r.r]z)_PairPosFormat2_merge..P&<<<Q^<1 <<.cs0P0P0Pq1B0P0P0Pr0r) rrurr+rrr}rr\rrr)r-rmrErrrrrKs r._PairPosFormat2_mergercNs$ <.z111Q^111r0rcg|] }|j SrOrrs r.r]zmerge..}rgr0rrrrr r )rrrrrrrrr&rcr%rrrHrrr) rEr-rmvf1vf2pairSetpairValueRecordpv1pv2 class1Record class2Records r.r4r4ws .4 11S1111//F$+/5 11S1111//F$+ {adC0000   dC00001JKKKKV0 C C {a| + +G#*#: + +ox>>?3==??*Cox>>?3==??*C  + +    - + +L , 9 + + lHd;;?3==??*ClHd;;?3==??*C  +DDr0MarkBasec td|D|_t|jfd|Dfd|D\}}|t |dz_t|jfd|Dfd|D\}}|t |dz_g} t |t |D]\} } d| D} t| st|| d| tj } | d| _ d | D}t|rd}n0tj }d |_||||| _| | tj}| |_ t'| |_t+|d z|g} t |t |D]\} } t| rd} nt td z} g}t+| dz|fd| D}|D]0}|dg|jt'|z z1t |D]Y}t|rd}n0tj }d |_|||||Z| |  t td z}t+|d z| t+|dzt'| t+|d z|dS)Nc3$K|] }|jV dSr*) ClassCountrs r.rZz,_MarkBasePosFormat1_merge..s$441!,444444r0c@g|]}t|dzjSrrHrrXrrrs r.r]z-_MarkBasePosFormat1_merge..+;;;!D:% & & -;;;r0c@g|]}t|dzjS)Array)rH MarkRecordrzs r.r]z-_MarkBasePosFormat1_merge..s*<<<1D7N # # .<<.r{r0c Xg|]&}tt|dzdz'S)r}Recordrcrs r.r]z-_MarkBasePosFormat1_merge..s5KKK!D7N++TH_ = =KKKr0c g|] }||j Sr*)ClassrXrs r.r]z-_MarkBasePosFormat1_merge..sEEE!q}ag}}}r0rr^c$g|] }|dn|jSr*) MarkAnchorrs r.r]z-_MarkBasePosFormat1_merge..s"TTT!!)$$TTTr0rr}rAnchorc>g|]}|gnt|dzS)Nrrc)rXrrss r.r]z-_MarkBasePosFormat1_merge..s<EFaiWQx%@%@r0Count)r)rvrr+rHrr}rrrr~rrrrrjrr6 MarkArrayry MarkCountsetattrextend)r-rmrErrrsMarkCoverageGlyphs MarkRecordsBaseCoverageGlyphs BaseRecordsrecordsr glyphRecords allClassesr allAnchorsanchorarrayanchors glyphAnchorsrs `` r._MarkBasePosFormat1_mergers4444444DO&8 ;;;;s;;;<<<<<<<''# /AGD$#$$+&8 ;;;;s;;;KKKKsKKK''# /AGD$#$$+G13 3DEE  <EE|EEE $ ## $"6JqMzRRR R-//C"1 CITT|TTTJz"" 7 ! ""6:666#CNs LNNEE'llEO D$.%(((G13 3DEE< <  'CC.'"dXo..00CG C' 2 2 2JVL" > >$4?SVV#;<====!<0 ' ' :&&;!FFY[[F$%FM&&vz:::v&&&&s 'GBw ' ' ) )E E4(?G,,, E4'>3w<<000 D$.%(((((r0ct|jd|Ds"t|d|jd|D|jdkrt|||dSt |d)Nc3$K|] }|jV dSr*rrs r.rZzmerge..$#:#:AH#:#:#:#:#:#:r0zmark-to-base positioning lookupcg|] }|j SrOrrs r.r]zmerge..'''a'''r0rr_r`rrrrr$rr%rs r.r4r4s dk#:#:c#:#:#: ; ; ! 6[''3'''      {a!$V444441RSSSSr0ct|jd|Ds"t|d|jd|D|jdkrt|||dddSt |d) Nc3$K|] }|jV dSr*rrs r.rZzmerge.. rr0zmark-to-mark positioning lookupcg|] }|j SrOrrs r.r]zmerge..rr0rrMark1Mark2rrrs r.r4r4s dk#:#:c#:#:#: ; ; ! 6[''3'''      {a!$VWgFFFFF1RSSSSr0c`tj}tj|_t|d|Dd|D\}}||j_gx|_}t |D]"}|D]}|||nJ#t|j|_ |S)Nc0g|]}d|jDS)cg|] }|j SrOrr\s r.r]z/_PairSet_flatten...rr0rrs r.r]z$_PairSet_flatten..rr0cg|] }|j SrOrrs r.r]z$_PairSet_flatten..r r0) rrrrrrr}r6ryr)rmr+r-rrrrrrYs r._PairSet_flattenrs :<.2rr0rrcg|] }|j SrOrfrs r.r]z<_Lookup_PairPosFormat1_subtables_flatten..8+H+H+HqAN+H+H+Hr0rcg|] }|j SrOrirs r.r]z<_Lookup_PairPosFormat1_subtables_flatten..9rr0c&g|]}|jjSrOrr\s r.r]z<_Lookup_PairPosFormat1_subtables_flatten..=s...Qqz ...r0cg|] }|j SrOr"r\s r.r]z<_Lookup_PairPosFormat1_subtables_flatten..=s0H0H0Hq0H0H0Hr0cDg|]}td|DS)cg|]}||Sr*rOr\s r.r]zG_Lookup_PairPosFormat1_subtables_flatten...Bs===q}!}}}r0)r)rXrrr+s r.r]z<_Lookup_PairPosFormat1_subtables_flatten..AsB  ==V===tDDr0)rrrrrrrrrrrrr}rryr)rmr+r-rrs ` r.(_Lookup_PairPosFormat1_subtables_flattenr0s5 77c777  ''&''  :<|S) Nc2g|]}|j |jdkSrr_rs r.r]z<_Lookup_PairPosFormat2_subtables_flatten..Kr`r0rrcg|] }|j SrOrfrs r.r]z<_Lookup_PairPosFormat2_subtables_flatten..Qrr0rcg|] }|j SrOrirs r.r]z<_Lookup_PairPosFormat2_subtables_flatten..Rrr0c&g|]}|jjSrOrr\s r.r]z<_Lookup_PairPosFormat2_subtables_flatten..U)I)I)I!**;)I)I)Ir0T)rJc3$K|] }|jV dSr*)rrs r.rZz;_Lookup_PairPosFormat2_subtables_flatten..`s$;;an;;;;;;r0c3K|]}||V dSr*rOrXcs r.rZz;_Lookup_PairPosFormat2_subtables_flatten..as"==!q}A}}}}==r0)rrrrrrrrrrrrr\rr}r6rrrFrG) rmr+r-rrrKrMrowsrowcolscols r.(_Lookup_PairPosFormat2_subtables_flattenrIs <>C JJsOOOO  Kr0ct|}t|}d}||kr-||jdkr|dz }||kr||jdkt|d||g|d|<t|}|}|dkr3||dz jdkr|dz}|dkr||dz jdkt ||d|g||d<|S)zMerge multiple Format1 subtables at the beginning of lst, and merge multiple consecutive Format2 subtables that have the same Class2 (ie. were split because of offset overflows). Returns new list.rrNr)rryrrr)rmr+rr~s r.&_Lookup_PairPos_subtables_canonicalizergs s))C CA A a%%CFMQ&& Q a%%CFMQ&&7BQBFFGCG CA A a%%CAJ%** Q a%%CAJ%**7ABBFFGCG Jr0ct|d|Dd\}}t|}tj}d|_||_tj|_||j_||_dg|z|_ |D]}|jdkrH|j }|jjD]3} | | } tj ||j | <4U|jdkr]t|jjD]C\} } |j | }| | } tj ||j | <D|gS)Nc&g|]}|jjSrOrr\s r.r]z7_Lookup_SinglePos_subtables_flatten..}rr0rr)rryrrrrrrrrrrrIr|) rmr+min_inclusive_rec_formatrr num_glyphsnew singlePosval_recgnamer~rs r.#_Lookup_SinglePos_subtables_flattenr|sI"4)I)IS)I)I)I4PPIFAVJ ,..CCJ.CO;==CL CLCN#CI 6 6  q oG"+2 6 6LL''#}W55 !  6  " "%i&8&?@@ 6 65#/!,LL''#}W55 ! 5Lr0c t|jd|Dd|D\}}d|_tj|_||j_g|_|D]w}tj}tj|_d|j_tj|_ d|j _|j |x| |j|t|j|_ dS)Nc&g|]}|jjSrOrrs r.r]zmerge..r r0cg|] }|j SrO)EntryExitRecordrs r.r]zmerge..s(((q (((r0r)rr+rrrrrr EntryAnchor ExitAnchorr6rryEntryExitCount)rEr-rmrrrrs r.r4r4s( ((C(((((C(((NFF DKKMMDM!DMD )) "")++!" ! ##C(((( d*F333d233Dr0ctd|Drd|_td|Drd|_|||dS)Nc3(K|] }|jduVdSr*)rrXmasters r.rZzmerge..s* 8 8&6  % 8 8 8 8 8 8r0c3(K|] }|jduVdSr*)rrs r.rZzmerge..s* 7 76  $ 7 7 7 7 7 7r0)rhrrrurs r.r4r4sk 8 8C 8 8 888  7 73 7 7 777 c"""""r0cxd|Dx}_tt||||jfgzD]\}}|s|djjdrtd|Dstdd|Dtd|Dst|dj |_ d|D}|dd=| ||jo$t|jdtj}|r5t|jj|_fd |Dx}_n|jo$t|jdtj}|rd |Dt%fd DsZd |D} t't(| t+|jj|_fd |Dx}_d} nd} |j|t/|j|_|rit/|jdkr|jdjdksJ|jdjjs*|jd|xjdzc_t/|jdkr|jdjdksJ|jdjjs*|jd|xjdzc_jjdt?} | dkrSt@!dtEj| |j|_t/|j|_nh|rf| rd|jd} | jj} dt| | j#D}tI|j%|_&||ddg`dS)Ncg|] }|j SrO)SubTablers r.r]zmerge..s*C*C*C!1:*C*C*Cr0r Extensioncg|] }|j SrOrirXsts r.r]zmerge..s888bR\888r0c&g|]}|jjSrO)rir5rs r.r]zmerge..s===2.===r0r^cg|] }|j SrO)ExtensionLookupTypers r.r]zmerge..sBBBR3BBBr0cg|] }|j SrO) ExtSubTablers r.r]zmerge..s444"r~444r0c:g|]}t|jSrO)rr+)rXrrEs r.r]zmerge..s3/ / / HJ 22v{ C C/ / / r0c,g|]}t|SrOrxrs r.r]zmerge..s888CGG888r0c(g|]}|dkSrrO)rXnums numSubtabless r.r]zmerge..s"IIID Q/IIIr0c&g|]}|D] }|j SrOr)rXrts r.r]zmerge..s'"Q"Q"QRb"Q"Q1="Q"Q"Q"Qr0c<g|]}t|jSrO)rr+)rXrrEmirfs r.r]zmerge..s77778FKNN777r0TFrrbrz0fontTools.otlLib.optimize.gpos:COMPRESSION_LEVELr#zCompacting GPOS...ci|]\}}|| SrOrO)rXr valRecords r.rzmerge..s+   !1 E9   r0r SubTableCountr)'rrr}rrir5 startswithrr#r LookupTyperrrrrr+rrhrrrrryrrrrpopcfgrIrloginforrrrru)rEr-rmrrstsnew_sts isPairPos isSinglePosvalueFormatList flattenedlevelsinglePosTablersinglePosMappingrrs` @@r.r4r4s*C*Cs*C*C*CCI's3 **++dm/D.EE  3   q6  $ / / < < 88C88899 ,(===== BBcBBBCC 5,V444q65AL44444GAAA JJw    J*T]1-=rz"J"JI"? M6;   / / / / NW/ / /  F++mR 4=3CR\(R(R  "88i888LIIIILIIIJJ "#R"Q9"Q"Q"Qc?33 CM6;!! 77777'777 F3! !  dmY///T]++D$ 4=!!Q&&4=+;+Ba+G+G+GG}Q(/ $ M  a   ! #  4=!!Q&&4=+<+Cq+H+H+HH}R )0 $ M  b ! ! !   ! #    ## >/11$   A:: HH) * * *,V[%OODM!$T]!3!3D      q)(/  58AU5V5V   ' fk<<>>    cJ+HIIIr0ceZdZdZdZdS)InstancerMergerzLA merger that takes multiple master fonts, and instantiates an instance.ct||||_||_|||_dSr*)r(r/modellocationgetMasterScalars masterScalars)r-r+r r s r.r/zInstancerMerger.__init__#s@d###   "33H==r0Nr5rr__doc__r/rOr0r.rrs->>>>>r0rc|jdksJd|D}|j}|j}t||||_dS)Nrcg|] }|j SrO CoordinaterXas r.r]zmerge..-s ( ( (qal ( ( (r0)rr r rinterpolateFromValuesAndScalarsr)rEr-rmCoordsr r s r.r4r4*s_ ;!     ( (C ( ( (F LE(M --fmDDDOOOr0c |jdksJd|D}d|D}|j}|j}t||||_t||||_dS)Nrcg|] }|j SrO XCoordinaters r.r]zmerge..8***q}***r0cg|] }|j SrO YCoordinaters r.r]zmerge..9rr0)rr r rrrr)rEr-rmXCoordsYCoordsr r s r.r4r45s ;!    **c***G**c***G LE(M --g}EED --g}EEDr0c|j}|j}dD]i\}t||rJt|rBfd|D}t|||}t ||jdS)N)XAdvance XAdvDevice)YAdvance YAdvDevice) XPlacement XPlaDevice) YPlacement YPlaDevicec2g|]}t|dSrrcrXrnames r.r]zmerge..Rs%777agaq))777r0)r r rgrrr) rEr-rmr r  tableNamerrrqr-s @r.r4r4Ds LE(M ' 'i 4+++++ 4   '77773777F55fmLLE D$ & & & ' 'r0ceZdZdZddZdS) MutatorMergerzA merger that takes a variable font, and instantiates an instance. While there's no "merging" to be done per se, the operation can benefit from many operations that the aligning merger does.TcXt||||_||_dSr*)r(r/ instancerdeleteVariations)r-r+r2r3s r.r/zMutatorMerger.__init__ds+d###" 0r0NTr rOr0r.r0r0^s2 111111r0r0cB|dj|_|jdkrdS|j}|j}|jr|`|rD|jdksJ|jdz|jz}t||}|xj |z c_ |jr d|_dSdS)Nrr) r@rrr2 DeviceTabler3 DeltaFormat StartSizeEndSizerr)rEr-rmr2devvaridxdeltas r.r4r4jsFO((**DM {a I  C    !&((((-2%4 &)** 5   r0c |dj|_|jdkrdS|j}dD]}|dz}t ||st ||}|jrt|||B|jdksJ|j dz|j z}t||}|dz} t|| t || |z|jr d|_dSdS) Nrr6XYr9r7r8rr) r@rrr2rgrHr3delattrr:r;r<rr) rEr-rmr2rYr.r=r>r?r;s r.r4r4sFO((**DM {a I 99 % tY''  dI&&  " % D) $ $ $ ; &((((-2%4 &)**<dGD$//%78888  r0c |dj|_|j}dD]\}}t||st ||}|jrt |||@|jdksJ|jdz|j z}t||}t||t ||d|zdS)Nrr"r7r8) r@rr2rgrHr3rBr:r;r<rr) rEr-rmr2r-r.r=r>r?s r.r4r4sFO((**DM I<<i tY''  dI&&  " % D) $ $ $ ; &((((-2%4 &)**dGD$22U:;;;;%<.s$@$@$@qQd]$@$@$@r0) rrr,rr  getSubModelrIsuperrErj)r-rlrm masterModelorigTTFsr ris r.rjzVariationMerger.mergeThingss  3;;s|| ?$Ts3333yHy M#$@$@C$@$@$@$)LL *K$0055JE3 MM%  ot$$00c:::  ' MM+ & & &  ! DIII ! !r0)r5rrrr/rIrj __classcell__rs@r.rErEs` +++!!!!!!!!!r0rEct|r |ddfS||\}}|tj|fSr)r storeMastersrbuildVarDevTable)rH master_valuesbasevarIdxs r.rUrUsO &Q%% --m<.999q|999r0r6rr%rUrHrr9rEr-rmr9s r.r4r4sy {a1HIIII#399S999$$ DO[' &''r0c|jdkrt|dt|jd|D\|_}|rd|_||_dSdS)Nrza caretrcg|] }|j SrOrrs r.r]zmerge..r[r0r6r\r]s r.r4r4sx {a;;;;#399S999$$ DO[' &''r0c|jdkrt|dt|jd|D\|_}t|jd|D\|_}|s|rd|_||_||_dSdS)Nrz an anchorrcg|] }|j SrOrrs r.r]zmerge.. :::q}:::r0cg|] }|j SrOrrs r.r]zmerge.. rbr0r6)rr%rUrHrr XDeviceTable YDeviceTable)rEr-rmrdres r.r4r4s {a====%5::c:::&&"Dl&6::c:::&&"Dl)|) (())r0cdD]]\}t|rHt|jfd|D\}}t|||rt|||^dS)Nr"c2g|]}t|dSrrcr,s r.r]zmerge..s%&H&H&Hqwq$':':&H&H&Hr0)rgrUrHr)rEr-rmr.rq deviceTabler-s @r.r4r4s 6 6i 4   6!1$&H&H&H&HC&H&H&H"" E; D$ & & & 6i555 6 6r0ceZdZdZddZddZdfdZdZd Zd Z d e fd Z d e fd Z e dZedZdS)COLRVariationMergeraA specialized VariationMerger that takes multiple master fonts containing COLRv1 tables, and builds a variable COLR font. COLR tables are special in that variable subtables can be associated with multiple delta-set indices (via VarIndexBase). They also contain tables that must change their type (not simply the Format) as they become variable (e.g. Affine2x3 -> VarAffine2x3) so this merger takes care of that too. Tct||||i|_g|_t |_g|_d|_|rt|_d|_ dS)NF) rEr/ varIndexCachevarIdxesr varTableIdslayerslayerReuseCacher_doneBaseGlyphs)r-r rJr+allowLayerReuses r.r/zCOLRVariationMerger.__init__1sn  uh===  55 #  5#2#4#4D $r0COLRcd|vr$d|vr ||djt||||dS)Nrt)expandPaintColrLayersrdrEr)r-r+rrs r.rzCOLRVariationMerger.mergeTablesCsR Y  6T>>  & &tF|'9 : : :##D$ YGGGGGr0cdS)NTrO)rs r.zCOLRVariationMerger.Ps4r0c|j}|j}d} ||}||}n#t$rYnwxYw|s$t|t |j||}g}|D]E} t | dd} ||}n#t$rYnwxYw||Ft||s%t|t |j|||S)NF)rrqrr) r formatEnum ValueErrorr%rAr5rHr6rr$) r-rlrmvalidatefmtrzokr_r`rYs r.checkFormatEnumz#COLRVariationMerger.checkFormatEnumPs7j^  *S//C#BB    D  R#D4993ESQQQ Q  A!Xt,,C  joo     JJsOOOO(C(( %c+!   s ) 669 B BBc|D]\ ||fd|D,#t$r$}|jddd}~wwxYwdS)Nc:g|]}|SrOr)rXrYrs r.r]z7COLRVariationMerger.mergeSparseDict..qs#)@)@)@q!%%(()@)@)@r0[])rWrjr&rkr6)r-rlrmrtrs @r.mergeSparseDictz#COLRVariationMerger.mergeSparseDictns  A   Q)@)@)@)@C)@)@)@AAAA#   z1zzz***   s(A A0 A++A0c|D]gt|}fd|D} |||8#t$r#}|jdd}~wwxYwdS)Nc0g|]}t|SrOrcrXror;s r.r]z2COLRVariationMerger.mergeAttrs..ys#:::dgdD)):::r0rf)rHrjr&rkr6)r-rlrmr<rqrrrtr;s @r. mergeAttrszCOLRVariationMerger.mergeAttrsvs  DC&&E::::c:::F   ////#   z4zz***    s< A)A$$A)cPfd|D}d}|ttrd}fd|D}|d}tj}t |s|j|\}}|r|}||fS)Nc0g|]}t|SrOrcrs r.r]z;COLRVariationMerger.storeMastersForAttr..s#===t,,===r0FTc:g|]}|SrO)toInt)rXrYconvs r.r]z;COLRVariationMerger.storeMastersForAttr..s#BBBqTZZ]]BBBr0r) getConverterByNamerr rNO_VARIATION_INDEXrrHrTfromInt) r-rlrmr;rVis_fixed_size_float baseValuerXrs ` @r.storeMastersForAttrz'COLRVariationMerger.storeMastersForAttrs======= $%%d++ dN + + C"& BBBBMBBBM!!$ & && O $ 2 ? ? N N Iv  0 Y//I&  r0returnct|}|j|}|htt |jt |z dzD]3}|j||t |z|kr|x|j|<}n4|tt |dz ddD]c}|j| d|d|krEt |j|z }||j|<|j||dnd|8t |jx|j|<}|j||S)Nrrrb)tuplerlrIr*ryrmr)r-rmre varIndexBaser~ns r.storeVariationIndicesz)COLRVariationMerger.storeVariationIndicessrHoo)--c22  3t}--H =ABB  =QX%6!678CC=>>D&s+lED  3x==1,a44  =!%"1"55#&t}#5#5#9L.:D&s+M((!""666E 6  585G5G GD s #l M  * * *r0ctj}g}|D]B}||||\}}t|||||Ct d|Dr||}|S)Nc36K|]}|tjkVdSr*)rrr\s r.rZz9COLRVariationMerger.mergeVariableAttrs..s*<.s)T"X^,,i>>dJr0) skip_root predicaterb) r rqrArr@rpopulateDefaultsrrHr-r)clsrdrrsubTablevarType newSubTableparents r.convertSubTablesToVarTypez-COLRVariationMerger.convertSubTablesToVarTypes"     6 6DbBxH8nn,G!'))K  ' '(9 : : :  ( ( * * *"X^Fx#5@((225555# 6 6r0c||jsdSt}g}|jjD]M}|jg}|r?|}|jtjj kr2|jtjj krtt||}t|}|D]q}t||vr'tj|}t||vsJ|||t|r||_t||_n||}|t/||?Ot|t|ksJ||j_t||j_dS)aRebuild LayerList without PaintColrLayers reuse. Each base paint graph is fully DFS-traversed (with exception of PaintColrGlyph which are irrelevant for this); any layers referenced via PaintColrLayers are collected into a new LayerList and duplicated when reuse is detected, to ensure that all paints are distinct objects at the end of the process. PaintColrLayers's FirstLayerIndex/NumLayers are updated so that no overlap is left. Also, any consecutively nested PaintColrLayers are flattened. The COLR table's LayerList is replaced with the new unique layers. A side effect is also that any layer from the old LayerList which is not referenced by any PaintColrLayers is dropped. N) LayerListr BaseGlyphListBaseGlyphPaintRecordPaintrrr PaintFormatPaintColrGlyphPaintColrLayersr_flatten_layersryidrrIr6r,FirstLayerIndex NumLayers getChildrenrreversed LayerCount) colruniqueLayerIDs newLayerListrfrontierpaintchildrenfirst_layer_indexlayers r.rvz)COLRVariationMerger.expandPaintColrLayerss~  F %: 4 4C {H 4 <2>#@@@\R^%CCC $OE4$@$@AAH(+L(9(9%!)66e9966$(M%$8$8E#%e99N#B#B#B#B$++E222&**2e995555,=E)&)(mmEOO$0066H 2 2333) 4,<  C$7$77777+$' $5$5!!!r0Nr4)rs)r5rrrr/rrrrrrrrrr staticmethodrvrOr0r.rjrj&s%%%%$ H H H H2@<!!!,: S    66[6(,6,6\,6,6,6r0rjcld|jD}d|D}t|D]l\} ||fd|D/#t$r1}|jd|dd|jd<d}~wwxYwd|_dS) Nci|] }|j| SrO BaseGlyphrXrs r.rzmerge..s C C C#3=# C C Cr0c0g|]}d|jDS)ci|] }|j| SrOrrs r.rz$merge... sEEEs sEEEr0)r)rXrMs r.r]zmerge.. s*SSS!EEa.DEEESSSr0c:g|]}|SrOr)rXrYrs r.r]zmerge..s#'B'B'BQa'B'B'Br0z.BaseGlyphPaintRecord[rz base glyph r T) rr|rWrjr&rkr6causerq)rEr-rmrlmastersr~rtrs @r.r4r4s D C)B C C CCSSsSSSG#((**%%1    s1v'B'B'B'B''B'B'B C C C C    GNN8A888 9 9 9"5"5"5AGJ    "Fs(A// B*9,B%%B*cr|js Jdt|j|_|j|_dS)Nz-BaseGlyphList must be merged before LayerList)rqryrorrrs r.r4r4s:  !RR#RRR !&-((DODJJJr0c#K|jtjjksJ||D]7}|jtjjkrt ||Ed{V3|V8dSr*)rrrrrr)rootrrs r.rr!s ;".8 8 8 8 8!!$'' <2>9 9 9&ud33 3 3 3 3 3 3 3 3KKKK r0ctt|jdj}t jt ksJfdt t D} ||n-#t$r }|j dd}~wwxYwj j |}t |tk}t|t}fdfd|D}t |dkrF|djt jjkr&|dj|_|dj|_dSt ||_t j|_j|j $|s$j ||jdSdSdS) Nrtc g|];}tt|j|dj.3sM  _SVTYq\&%9%? @ @AAr0z.Layers)rct|trfd|D}tj}t tjj|_t||_ tj |_ j |j j ||j |S)Nc&g|] }|SrOrOrXrlistToColrLayerss r.r]zD_merge_PaintColrLayers..listToColrLayers..Os%999a&&q))999r0)rrrrrrrrryrrorrrpr,)rrorr-s r.rz0_merge_PaintColrLayers..listToColrLayersMs eT " " H99995999FHJJEr~=>>EL!&kkEO$' $4$4E ! K  v & & &#/$((1FGGG r0c&g|] }|SrOrOrs r.r]z*_merge_PaintColrLayers..Ys%:::!""1%%:::r0rr)rrr+rdryr,r*rr&rkr6rp try_reuserrrrrrrrrorr,)r-rlrm out_layersmaster_layersesrtis_treers` ` @r._merge_PaintColrLayersr*soc49V+<+BCCDDJ ty>>SXX % % % %s3xxO   O4444  y!!!  ')33J?? *oo ::G!*0JKKKJ      ;:::z:::J :! 1 48V V V #1 / (m;J !$+.. :&&&   +G +  $ $Z1D E E E E E , + + +sB C#B>>Cc ||d}|tjjurt ||dS|}d |"t jt|| fd| D} ||| || }d| D}|tj kptfd|D}|r: r||_|r||Jt#||_dSdS)Nc,| Sr*) is_variable)r}s r.rxzmerge..psCOO.{1RRa16;Q;Q16;Q;Q;Q;QRRr0cg|] }|j SrO)rqrs r.r]zmerge..s999b999r0c3DK|]}t|jvVdSr*rrn)rXrdrEs r.rZzmerge..sB>>,15 V''>>>>>>r0)rrrrr as_variabler getVariableAttrsrA getConvertersrr iterSubTablesrr VarIndexBaserrr) rEr-rmr} varFormat staticAttrsr subTables isVariablers ` @r.r4r4ns  s,M,M N NC bn,,,vtS111!!IH*4::yAARRRR4#5#5#7#7RRRK dC---,,T3AAL99D$6$6$8$8999I!66#>>>>5>>>>;;J %  -!-D   3  , ,T 2 2 2$$$)nn  % %r0ctt|j}tj|fd|D}|||||||}|tjkr0||_ |j t|dSdS)Nc38K|]}|jv |jVdSr*rrs r.rZzmerge..rr0) rArr rrrrrrrrnr,r)rEr-rmrrrrs @r.r4r4s4jj G&w//HRRRR4#5#5#7#7RRRK dC---,,T3AALr,,,(r$xx(((((-,r0c*||d|Dtfd|jDr>|jt|dSdS)Nc3$K|] }|jV dSr*rrs r.rZzmerge..s$!G!GQ!&!G!G!G!G!G!Gr0c3DK|]}t|jvVdSr*r)rXstoprEs r.rZzmerge..s1 E Ed2d88v) ) E E E E E Er0)rrr ColorStoprrnr,rrs` r.r4r4s dC!G!G$2D2D2F2F!G!G!GHHH E E E Edn E E EEE)((...r$xx((((())r0clipsc2|||dSr*)rrs r.r4r4s  4%%%%%r0r r*)F)rrrs)krosrrBoperatorrloggingfontTools.colorLib.builderrrfontTools.miscrfontTools.misc.roundToolsrfontTools.misc.treeToolsrfontTools.ttLib.tablesr rr #fontTools.ttLib.tables.otConvertersr !fontTools.ttLib.tables.otTraverser #fontTools.ttLib.tables.DefaultTabler fontTools.varLibrrrfontTools.varLib.modelsrrrrrfontTools.varLib.varStorer functoolsrfontTools.otlLib.builderrfontTools.otlLib.optimize.gposrr getLoggerrerrorsrrrrr r!r"r#r$r%r&objectr(rrEGDEFr4rrrrrrrrr&r2r?r\rcrr MarkBasePos MarkMarkPosrrrrr CursivePosrLookupr CaretValuer0rErU BaseCoordrjrrrrrClipBox Affine2x3r ColorLineClipListrOr0r.rsJ  RRRRRRRR((((((------555555111111333333>>>>>><<<<<<<<<<<<6666666666SSSSSSSSSSSSSS777777333333 g122                          rrrrrVrrrp     V   rw00##10#2   """"Jv)**##+*#ry!!##"!#$6r|$$::%$:zrz""2424#"24j,,,B86KKKK\&3&3&3Rrz""((#"(VS)S)S)S)lr~&& T T'& Tr~&& T T'& T22<*0r}%%44&%4.r)**##+*#ry!!a a "!a R>>>>>n>>> &&'& ""  #" *++'',+'2 1 1 1 1 1N 1 1 1bm$$%$*bi  ! :f())<<*)<>%!%!%!%!%!n%!%!%!P222 %%''&%' &&'''&' "" ) )#" )*++ 6 6,+ 6 \6\6\6\6\6/\6\6\6~B,--"".-""BL))*)AFAFAFHRXrz233%%%%43%%PR\2<899 ) ):9 ) BL))))*))BK11&&21&&&r0