L i 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,ejZdZ.ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:Gdde;Z<Gdde<Z=e=j}ej~ddZ@dZAdQdZBe=j}ejdZ@e=j}ejdZ@d ZEd!ZFe=j}ejd"Z@e=j}ejd#Z@d$ZIdRd%ZJdRd&ZKdSd'ZLd(ZMe=j}ejd)Z@dTd*ZOe=j}ejd+Z@e=j}ejd,Z@d-ZRd.ZSd/ZTd0ZUd1ZVe=j}ejd2Z@e=j}ejd3Z@e=j}ejd4Z@Gd5d6e=ZZeZj}ejd7Z@eZj}ejd8Z@eZj}ejd9Z@Gd:d;e=Z\e\j}ejd<Z@e\j}ejd=Z@e\j}ejd>Z@Gd?d@e=Z]dAZ^e]j}ejdBZ@e]j}ejdCZ@e]j}ejdDZ@e]j}ejdEZ@GdFdGe]Z`e`j}ejdHZ@e`j}ejdIZ@dJZcdKZde`j}ejejfdLZ@e`j}ejejfdMZ@e`j}ejdNZ@e`j}ejdOdPZ@y)Uz4 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 KeysDifferInconsistentGlyphOrderInconsistentExtensionsInconsistentFormatsUnsupportedFormatVarLibMergeErrorcTeZdZddZed dZeifdZd dZdZdZ d Z y) MergerNc ||_d|_yN)fontttfs)selfr+s ]/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/varLib/merger.py__init__zMerger.__init__/s  r*ctk7sJddjvri_tttj fvrftt k(rffd}|S)NzSubclass Merger instead.mergersc|jdk(sJg}D]\}||vr|j|jj|i}D]#}||vsJd|jd|d|||<%^y)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. >>41.%+GDM + +r0)r(__dict__r2typeenumEnumMetastr)r=r>r<r?s``` r.mergerz Merger.merger4scv~999~ DMM )DL =T4==1 1jG ;# HE  r0ct|}|jD]6}t|dd}||S|jj |d}|4|cS|S)Nr2)rAmrogetattrr2get)r=thing_defaulttypr2ms r. mergersForzMerger.mergersForPsf5kHHJ DdIt4G     d+A} r0c t|dr|jd|D]!}t|ds|jd#tt|j t fd|Dsz&Merger.mergeObjects..fs%?a46$q',,.11?s/2expectedgot*.)hasattrrPrSrTrUallr!rNrI __class__ mergeThingsrHr&stackr6)r-outlstexcludeitemrWr2 defaultMergerkeyvaluetablevalues mergerFuncerUs @r. mergeObjectszMerger.mergeObjects_s\ 3* +   / 5Dt/0%%e%4 5d3inn&'?3??t#)NQ&a*@)N //#& C)C)CD   0'>S);>?%'%-??$[[m< 4/  0 *O@   GGNN39 %  s0)D> 0E E EE E5E00E5c ^t||ts.t|t||Dcgc] }t|c}tt |t |D]\}\}} |j ||ycc}w#t $r$}|jjd|zd}~wwxYw)NrYz[%d]) rlenr enumerateziprar&rbr6)r-rcrdxirirkrms r. mergeListszMerger.mergeListsxs#sC(s3xc=Rc!f=RS S"+CS#Y,?"@  Av   / >S$ vz* sA: %A?? B,B''B,c 2t||tsBt|t|j|Dcgc]}t|jc}|j |j dd}| ||||yt |tjrt||st|||yt|dr|j||yt |tr|j||yt||st|||ycc}w)NrYr@)rrArr5rNrI isinstancerBEnumrr^rnlistru)r-rcrdrsrls r.razMerger.mergeThingss#sD)!tCy11RU7VQQ8H8H7V __S)--dD9  ! tS# & TYY 'c3'&tcsCC( S* %   c3 ' T " OOC %c3'&tcsCC(8WsD c |D]A}||vr ||_|j|||Dcgc]}|j|c}Cycc}w#t$r!}|jj |d}~wwxYwr*)r,rarIr&rbr6)r-r+ master_ttfs tableTagstagrMrms r. mergeTableszMerger.mergeTablessw C$ '   c,MAQUU3Z,MN   -N# s# s'A A A A  A7A22A7)r*)) r5 __module__ __qualname__r/ classmethodrErNrnrurar~rr0r.r(r(.sG 6)+  2D* r0r(c eZdZy)AligningMergerN)r5rrrr0r.rrsr0r GlyphClassDefc|t|st|d|y|Dcgc]}|j}}i|_|j}t}|j|Dcgc]}|j c}|D]Gt fd|D}t|st||d|dzg|sd|<@|d|<Iycc}wcc}w)NrYc3@K|]}|jywr*)rI)rVlks r.rXzmerge..s2AEE!H2srr])rZr[rb) rr classDefssetupdaterUrrr)rEr-rdrallKeys allValuesrs @r.r4r4s |s|6Dc: : # $11;; $C $DN >>DeGGNNs+!QVVX+,  #2c22  ""13sQwi DGlDG # % ,s C $CcF|jdk(r|Stj}d|_|j|_|j|_|jj Dcgc]}|j c}|_t|j |_|Scc}w)N) Formatot SinglePosCoverage ValueFormatglyphsValuerp ValueCount)r-ret_s r._SinglePosUpgradeToFormat2rsv {{a ,,.CCJ==CL&&CO%(\\%8%899CI^CN J:s'Bc ||Dcgc] }t|}}n@t||Dcgc]%\}}t||Dcic]\}}|| c}}'}}}}}t} | j||jjt | } t fd|Ds t~ d} |)|D cgc]} | D cgc] } | | vr| n| c} }} } | |fSt|t|k(sJ|D cgc]} | D cgc] } | | vr| | n|c} }} } | |fScc}wcc}}wcc}}}}wcc} wcc} } wcc} wcc} } w)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. Nrhc3>K|]}t||k(yw)rN)rS)rVvssortKeys r.rXz%_merge_GlyphOrders..s;vbg&",;s) rrrrgetReverseGlyphMap __getitem__rSr_r"rp)r+rd values_lstdefaultr dict_setsrgrWcombinedorder paddedValuesdict_setglyphpaddedrs @r._merge_GlyphOrdersrs{%()SV) )@CC@TUUuq"s1bz2tq!ad2U UuHHOOY%%'33G 8 )E ;s; ;$&&L& CH Hex'UW 4 H   &= 3x3z?***& MR R5 1Xe_w > R   &=3*2U I  S sLD.D9  D3D9  EE E EE "E3D9 E Ecl|djj|_|j||yNrr@copyrnrEr-rds r.r4r4,FOO((*DM c"r0cl|djj|_|j||yrrrs r.r4r4rr0cp|D]}|@t|tjk7s$|j||jjvrF|j dk(r|j cS|j dk(r4|j |jjj|cSt|dy)Nrrsingle positioning lookupsubtable) rArrrrrrindexr%)rE subtablesrr-s r.%_Lookup_SinglePos_get_effective_valuers R LDzR\\)}}$DMM000  ;;! ::  [[A ::dmm2288?@ @#F5PQ Q R r0cx|D]4}|@t|tjk7s$|j||jjvrG|j dk(r[|j |jjj|}|j}|D]}|j|k(s|ccS|j dk(rj|jjj|d}|jjj|d} |j|j| cSt!|dy)Nrrrpair positioning lookupr)rArPairPosrrrPairSetrPairValueRecord SecondGlyph ClassDef1rrI ClassDef2 Class1Record Class2Recordr%) rEr firstGlyph secondGlyphr-pspvrrecklass1klass2s r.(_Lookup_PairPos_get_effective_value_pairrsP LDzRZZ'}}$!5!55  ;;! dmm2288DEB$$C ??k1J   [[A ^^--11*a@F^^--11+qAF$$V,99&A A#F5NO O)P* r0c ttj|Dcgc]}|jc}dx|_}t |dk(s|dzdk(s t |d|j j td|Drt fd|Drtj||j|_ |dk7rT|j|j|Dcgc].}|j |jntj0c}|jj|_yd|_|Dcgc] }t|}}t!|j"|Dcgc]}|j jc}|Dcgc]}|jc}\}}||j _|Dcgc]}tj|c}|_ t |j|_t'|D]T\} } t'|D]A\} } | |  t)||j*| | }|tj|}|| | <CV|j-|j||j/||d ttj|jDcgc]}|j1c}d|_ycc}wcc}wcc}wcc}wcc}wcc}wcc}w) Nrrirrc3:K|]}|jdk(yw)rNrrVrWs r.rXzmerge..<s &Q188q= &sc3PK|]}|jjk(ywr*)rr)rVrWcoverageGlyphss r.rXzmerge..<s%/01!**+++/s#&r)rrrrrre)rint__or__rrpr%rrr_r ValueRecordrra getFormatrrrr+rrqrlookup_subtablesrurngetEffectiveFormat)rEr-rdr valueFormatrWrrrrtrkjrrs @r.r4r44s%+CJJPS8T18TVW%XXD{ HMkD0A51LMM]]))N &# &&3/58/,'' TZZ@ !     SVWaAGG/V5G5G5IIW  :://1DK25 6Q %a ( 6C 6( 5Aajj''57MA7MNFF"DMM;ABa&$$[1BDJ$**oDOv&  6!&) HAuay$ 6//2EAy&&{3F1I   djj&)  cW TZZ@Q))+@!Do9U X 767MC2As)K 3K K",K' K, K13K6 c t|j|Dcgc]&}|jDcgc]}|jc}(c}}|Dcgc]}|jc}\}}gx|_}|D]}t j} || _|j rt j|j nd| _|jrt j|jnd| _ |j| t|j|_ t|D]\} } t|D]\} }t j}||_| | | | } n%t||j | |j"|} | d\}}nt%| dd}t%| dd}|j r!t j|j |nd|_|jr!t j|j|nd|_ || | <|`|j'|j|ycc}wcc}}wcc}w)NNNValue1Value2)src)rr+rrr valueFormat1r rr valueFormat2rr6rpPairValueCountrqrr _firstGlyphrHru)rEr-rdrrWrrpvrsrrrtrkrvpairv1v2s r.r4r4rs+( ?BC!3!3 4A!-- 4C&)*  *NFF #%$D4   "7=7J7JF  v22 3PT 8>7J7JF  v22 3PT  C d223Dv& 6!&) HAu""$A!AMay$q @F33A68H8H%}#BUHd3UHd3&&""6#6#6B? H&&""6#6#6B? H F1I3 6  d**F3] 5C*sI H>I I >I ct|Dcgc]}|js|jdk( c}sJd|j||dt j}g|_d|_t|j|Dcgc]}|jjc}|Dcgc]}|jc}|\}}||j_ |Dcgc]}t jc}|_t|j|_ t||jD] \} } | | _|j|j|ycc}wcc}wcc}wcc}w)NrReport bug against fonttools.)rr PairSetCount ValueFormat1 ValueFormat2rr)rrrrnrrrrr+rrrprrrrru) r-rdrEremptyrWrrrrrs r._PairPosFormat1_mergers< &)7QYY1 7 '&'     W JJLEEE( $'(q  ( q  NFF"DMM*01QBJJL1DLDLL)D. r dllF+9 8" ) 2sEEE (E% E*ct|tr|}n|r|jr |jni}|rt|j nd}g}t |dzD]}|j t|jD]\}}||j||d|d<|St|x|d<}|ddD]$} | j||j| &|S)Nrr) rwdictrmaxrkranger6ritemsaddintersection_updatedifference_update) r- allGlyphsrrMrrrrWclass0ss r._ClassDef_invertrs$ &*t~~DNN2 #,I   !A C 1q5\ 35!1 A 1 A J i.(AQR (A ! !& )  $ $Q ' ( Jr0ctj}ix|_}|du}|rdgt|z}t j }t ||D])\}}t||}||dd}|j|+|j} |r| jdtt| D]\} } | dk(r | D]} | || < || fS)Nrr) rClassDefrrpr Classifierrrrr getClassesinsertrrq) rd allGlyphsesr-rallGlyphsesWasNone classifierclassDefrsetsclassesrtclassSetrs r._ClassDef_merge_classifyr s ;;=D!##DNY$,fs3x' ))+J"3 4 ))4  8D$  ##%Gq#%  ) 8 6  AIaL  =r0cH|Dcgc]}|j}}t|Dcgc]}|jc}|Dcgc]}|jjc}\|_}t ||_g}t||D]e\}}d} t|jj} |jj} g} |D]} tt| }|| vrd} | tj} gx}| _ t|jD]}|rd}nxtj}|j rt#j$|j nd|_|j(rt#j$|j(nd|_|j-|| }n| j/|d}||}| j-||j-| h|}~t|Dcgc]}|j0c}\|_}t ||_g}t||D]\}}|j0j}g} |D]}|j}tj}gx}|_ |D]Y} | s|d}n+tt| }|j/|d}||}|j-t3j4|[| j-||j-| |}~|Scc}wcc}wcc}wcc}wr)rr rrrrp Class1Countrrrrnextiterrrr Class2Countrr rrrrr6rIrrdeepcopy)r-rdr+ transparentrmatricesr new_matricesmatrixnullRowcoverage classDef1 class1Recordsr  exemplarGlyph class2recordsrrec2rec1klass classDef2rec1oldoldClass2Recordsrec1new class2Recordss r._PairPosFormat2_align_matricesr#s (+,1,H,7!""$D1QZZ%6%6$DDNG7|DLh'&+ 6qzz(()KK))   'H h0MH, ? oo/G;==MG$8"1==13&#'D#%??#4D$(#4#4!' 2 243D3D E%)!K$(#4#4!' 2 243D3D E%)!K &,,T23 ! mQ7e}   &A 'B M*M&+NH7S7Q 7QRDNG7|DLh'+ 6KK))   *G&33 oo'G35 5MG0# :+A.D$(h$8M%MM-;E+E2D$$T]]4%89 :   ) * M*!+"H OU- #$D^8RsLLL ;Lc\t|Dcgc]}|js|jdk( c}sJd|j||dt |j |Dcgc]}|j jc}\}}||j _t||jD])\}}|j j|k7s ||dk(r)Jt|||j }t|d|_|j|j|ycc}wcc}w)Nrr)rrr rrrrrr) rrrrnrr+rrrrrr#ryru) r-rdrErrWrrrrs r._PairPosFormat2_merger&Ns &)<Q^^1 < '&'        #6;;C0Pq1B1B0PQIFA!DMMC!8!89& 9 ::   & " % %%&.dCEHXa[)D d''2I =&1QsD$D$#D) cttj|Dcgc]}|jc}dx|_|_ttj|Dcgc]}|j c}dx|_|_|jdk(rt|||n*|jdk(rt|||n t|d|`|`d}d}|jdk(rh|jD]X}|jD]G}t|dd}|||jz}t|dd} | 5|| jz}IZnv|jdk(rg|jD]X} | j D]G} t| dd}|||jz}t| dd} | 5|| jz}IZ||_||_ycc}wcc}w)Nrrrrrrr)rrrrrrrrrr&r%rrrHrrr) rEr-rdrvf1vf2pairSetpairValueRecordpv1pv2 class1Record class2Records r.r4r4ws.4 S1Q^^11/F$+/5 S1Q^^11/F$+ {{adC0  dC01JKKV0 C C {{a|| +G#*#:#: +ox>?3==?*Cox>?3==?*C  + +   -- +L , 9 9 + lHd;?3==?*ClHd;?3==?*C  + +DDM22s G G cZtd|D|_t|j|Dcgc]}t ||dzj c}|Dcgc]}t ||dzj c}\}}|t ||dz_t|j|Dcgc]}t ||dzj c}|Dcgc]}t t ||dz|dz c}\}} |t ||dz_g} t|t|D]\} } | D cgc]} | | j}} t|st||d|tj }|d|_| D cgc]} | dn | j}} t|rd}n-tj}d|_|j!||||_ | j#|tj$}| |_t'| |_t+||dz|g} t|t| D]\} } t| rd}nt t|dz}g}t+||dz|| D cgc]} | gnt | |dz}} |D]-}|j-dg|jt'|z z/t|D]N}t|rd}n-tj}d|_|j!|||j#|P| j#|t t|dz}t+||dz| t+||d zt'| t+||dz|ycc}wcc}wcc}wcc}wcc} wcc} wcc} w) Nc34K|]}|jywr*) ClassCountrVrs r.rXz,_MarkBasePosFormat1_merge..s41!,,4rArrayRecordrrYrAnchorCount)rr2rr+rHr MarkRecordrrClassrrr MarkAnchorrr7rrar6 MarkArrayrp MarkCountsetattrextend)r-rdrEMarkBaserMarkCoverageGlyphs MarkRecordsBaseCoverageGlyphs BaseRecordsrecordsr glyphRecordsr allClassesr allAnchorsanchorarrayanchors glyphAnchorss r._MarkBasePosFormat1_mergerOs444DO&8 7:;!D:% & - -;8;<1D7N # . .<'# /AGD$#$+&8 7:;!D:% & - -;GJK!D7N+TH_ =K'# /AGD$#$+G13 3DE <'3E!q}aggE E$ #"6JqMzR R--/C"1 CIGST!!)$=TJTz" ! ""6:6#CNsA B LLNEE'lEO D$.%(G13 3DE< < C.'"dXo.0CG C' 2JVEFaiWQx%@@L" >$4??SV#;<= >!<0 ' :&!FYY[F$%FM&&vz:v& ' s)* (GBw ' )E E4(?G, E4'>3w<0 D$.%(] << <KF.U.s/ N  N $ N #N )N1N?N#>N(c t|jd|Ds1t|d|j|Dcgc]}|jc}|jdk(rt|||yt |dcc}w)Nc34K|]}|jywr*rr3s r.rXzmerge..#:AHH#:r4zmark-to-base positioning lookuprrZr[rrrrr$rOr%rEr-rdrs r.r4r4so dkk#:c#: ;! 6[[#&'a'    {{a!$V41RSS (sA9c t|jd|Ds1t|d|j|Dcgc]}|jc}|jdk(rt|||ddyt |dcc}w)Nc34K|]}|jywr*rr3s r.rXzmerge.. rRr4zmark-to-mark positioning lookuprSrMark1Mark2rrTrUs r.r4r4ss dkk#:c#: ;! 6[[#&'a'    {{a!$VWgF1RSS (sA;c tj}tj|_t||Dcgc]&}|jDcgc]}|j c}(c}}|Dcgc]}|jc}\}}||j_gx|_}t|D]}|D]}||j|Jt|j|_ |Scc}wcc}}wcc}wr*) rrrrrrrrrr6rpr) rdr+r-rrWrrrrks r._PairSet_flattenr[s ::s@FFF ?F )F F" F,F'F' F,'F,ct|Dcgc]}|js|jdk( c}sJdtj}d|_tj |_ttj|Dcgc]}|jc}d|_ ttj|Dcgc]}|jc}d|_t||Dcgc]}|j jc}\}}||j _ t|||d}gx}|_t|D]} tj} |j| g| _| j } tt#d| DD].} t%t'd| D} | j| 0|Scc}wcc}wcc}wcc}w)NrrrT)rc34K|]}|jywr*)r)rVrHs r.rXz;_Lookup_PairPosFormat2_subtables_flatten..`s;ann;r4c3&K|] }|| ywr*rrVcs r.rXz;_Lookup_PairPosFormat2_subtables_flatten..as=!q}A=s)rrrrrrrrrrrrrr#rrr6rryr r) rdr+rr-rWrrrrrowsrowcolscols r.(_Lookup_PairPosFormat2_subtables_flattenrgIs &)<Q^^1 < '&'  ::C JJsO   K3 = ,I+H*JsG G G ?G )G cxt|}t|}d}||kr/||jdk(r|dz }||kr||jdk(rt|d||g|d|t|}|}|dkDr5||dz jdk(r |dz}|dkDr||dz jdk(r t ||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)ryrprr]rg)rdr+rrts r.&_Lookup_PairPos_subtables_canonicalizerigs s)C CA A a%CFMMQ& Q a%CFMMQ&7BQFGCG CA A a%CAJ%%* Q a%CAJ%%*7ABFGCG Jr0ct||Dcgc]}|jjc}d\}}t|}t j }d|_||_t j|_||j_||_dg|z|_ |D]}|j dk(r[|j} |jjD]5} |j| } tj| |j| <7m|j dk(s}t|jjD]G\} } |j| } |j| } tj| |j| <I|gScc}w)Nrr)rrrrprrrrrrrrrrq) rdr+min_inclusive_rec_formatrWrr num_glyphsnew singlePosval_recgnamertrs r.#_Lookup_SinglePos_subtables_flattenrq|sS"4S)I!***;*;)I4PIFAVJ ,,.CCJ.CO;;=CL CLLCN#CI 6   q ooG"++22 6LL'#}}W5 !  6   "%i&8&8&?&?@ 65#//!,LL'#}}W5 !  6 6 5L)*JsF ct|j|Dcgc]}|jjc}|Dcgc]}|jc}\}}d|_t j|_||j_g|_|D]}t j}t j|_d|j_t j|_ d|j_|jj||j|j|t|j|_ ycc}wcc}wNr)rr+rrEntryExitRecordrrr7 EntryAnchor ExitAnchorr6rurpEntryExitCount)rEr-rdrrrrrs r.r4r4s( $'(q  ($'(q  (NFF DKKKMDM!DMMD )  "))+!" ! ##C( ) d**F3d223D! )(s E E ctd|Drd|_td|Drd|_|j||y)Nc38K|]}|jduywr*)rurVmasters r.rXzmerge..s 8&6   % 8c38K|]}|jduywr*)rvrzs r.rXzmerge..s 76   $ 7r|)r_rurvrnrs r.r4r4s= 8C 88 73 77 c"r0c  |Dcgc]}|jc}x}|_tt||||jfgzD]\}}|s |djj j ds2t|Dcgc]}|jc}s0t|d|Dcgc]}|jj c}t|Dcgc]}|jc}s t||dj|_ |Dcgc]}|j}}|dd=|j||jxr't|jdtj}|rQt!|j|j"|_|Dcgc]}t!||j"c}x}|_n|jxr't|jdtj$} | r|Dcgc] }t'|} }t)| D cgc] } | | dk( c} s|D cgc]}|D]} | j*} }} t-t.| }t1|j|j"||_|Dcgc]}t1||j"|c}x}|_d}nd}|j3|j|t'|j|_|rt'|jdk\r|jdj6dk(sJ|jdj8j:s0|jj=d|xj4dzc_t'|jdk\r|jdj6dk(sJ|jdj8j:s0|jj=d|xj4dzc_|j"j>jAd tC }|dk7rtDjGd tI|j"||j|_t'|j|_n{ ryrw|jd}|j8j:}t||jJDcic]\}}|| }}}tM||j"jO|_|jQ||d d g|`ycc}wcc}wcc}wcc}wcc}wcc}wcc}wcc} wcc} }wcc}wcc}}w)Nr ExtensionrYTFrr%rz0fontTools.otlLib.optimize.gpos:COMPRESSION_LEVELrzCompacting GPOS...SubTable SubTableCountr))rrryrrr`r5 startswithrr#ExtensionLookupType LookupType ExtSubTabler?rwrrrir+rrpr_rrrrqrurrrrpopcfgrIrloginforrrrrn)rEr-rdrrstsstnew_sts isPairPos isSinglePos numSubtablesnumstvalueFormatListmirf flattenedlevelsinglePosTablerrp valRecordsinglePosMappings r.r4r4s?B*C!1::*CCI's3 *+dmm/D.EE 3  q6   $ $ / / <C8bR\\89,(9<=2..= cBR33BC,V44q655AL034"r~~4G4A JJw  " J*T]]1-=rzz"JI? MM6;;  OX/ HJ 22v{{ C/  F+mmR 4==3CR\\(R .78CG8L8LID Q/IJ/1$  A: HH) *,V[[%ODM!$T]]!3D  q)((//69AUAU5V !1 E9   ' fkk<<>   cJ+HIA+D9>B5/ 9I#R 7T sAT'T, 'T1T6 T;UUU :UU UceZdZdZdZy)InstancerMergerzLA merger that takes multiple master fonts, and instantiates an instance.cxtj||||_||_|j ||_yr*)r(r/modellocationgetMasterScalars masterScalars)r-r+rrs r.r/zInstancerMerger.__init__#s1d#   "33H=r0Nr5rr__doc__r/rr0r.rrs >r0rc|jdk(sJ|Dcgc]}|j}}|j}|j}t |j |||_ycc}wrs)r CoordinaterrrinterpolateFromValuesAndScalars)rEr-rdaCoordsrrs r.r4r4*s` ;;!  $' (qall (F ( LLE((M --fmDDO)sA$cN|jdk(sJ|Dcgc]}|j}}|Dcgc]}|j}}|j}|j}t |j |||_t |j |||_ycc}wcc}wrs)r XCoordinate YCoordinaterrrr)rEr-rdrXCoordsYCoordsrrs r.r4r45s ;;!  &)*q}}*G*&)*q}}*G* LLE((M --g}ED --g}ED+*s BB"c  |j}|j}dD]b\}}t||rJt||s!|Dcgc]}t||d}}t |j ||} t ||| dycc}wN)XAdvance XAdvDevice)YAdvance YAdvDevice) XPlacement XPlaDevice) YPlacement YPlaDevicer)rrr^rHrrr>) rEr-rdrrname tableNamerrkris r.r4r4Ds LLE((M 'i 4+++ 4 367agaq)7F755fmLE D$ & '8sBceZdZdZddZy) 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.cLtj||||_||_yr*)r(r/ instancerdeleteVariations)r-r+rrs r.r/zMutatorMerger.__init__dsd#" 0r0NTrrr0r.rr^s  1r0rc|djj|_|jdk7ry|j}|j}|j r|`|rP|j dk(sJ|jdz|jz}t||}|xj|z c_ |j rd|_yy)Nrr) r@rrr DeviceTabler DeltaFormat StartSizeEndSizerr)rEr-rdrdevvaridxdeltas r.r4r4jsFOO((*DM {{a  I   C    &(((--2%4 &)* 5   r0c |djj|_|jdk7ry|j}dD]}|dz}t ||st ||}|j r t|||<|jdk(sJ|jdz|jz}t||}|dz} t|| t || |z|j rd|_yy) NrrXYrrrrr) r@rrrr^rHrdelattrrrrrr>) rEr-rdrrWrrrrr;s r.r4r4sFOO((*DM {{a  I 9 % tY' dI&  " " D) $ ; &(((--2%4 &)*<dGD$/%789" r0c |djj|_|j}dD]\}}t||st ||}|j r t |||:|jdk(sJ|jdz|jz}t||}t||t ||d|zy)Nrrrr) r@rrr^rHrrrrrrr>) rEr-rdrrrrrrs r.r4r4sFOO((*DM  I<i tY' dI&  " " D) $ ; &(((--2%4 &)*dGD$2U:;%)rEr-rdrrrri deviceTables r.r4r4st 6i 4 !1$$C&Hqwq$':&H" E; D$ &i5 6'IsA( cveZdZdZddZddZdfdZdZdZdZ d e fd Z d e fd Z e d Zed Zy)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. ctj||||i|_g|_t |_g|_d|_|rt|_d|_ y)NF) rr/ varIndexCachevarIdxesr varTableIdslayerslayerReuseCacher_doneBaseGlyphs)r-rrr+allowLayerReuses r.r/zCOLRVariationMerger.__init__1sX  uh=  5 # #2#4D $r0cd|vr"d|vr|j|djtj||||y)NCOLR)expandPaintColrLayersrjrr~)r-r+r{r|s r.r~zCOLRVariationMerger.mergeTablesCs> Y 6T>  & &tF|'9'9 :##D$ YGr0cy)NTr)rs r.zCOLRVariationMerger.Psr0c|j}|j}d} ||}||}|s!t|t |j ||}g}|D])} t | dd} ||}|j|+t||s"t|t |j |||S#t$rYwxYw#t$rY]wxYw)NF)rrirrS) r formatEnum ValueErrorr%rAr5rHr6rr$) r-rcrdvalidatefmtrokrZr[rWs r.checkFormatEnumz#COLRVariationMerger.checkFormatEnumPsjj^^  S/C#B#D493E3ESQ Q A!Xt,C  o JJsO  (C(%c++!   -     s#B1&C1 B=<B= C  C c |jD]5} |j|||Dcgc]}|j|c}7ycc}w#t$r%}|jj d|dd}~wwxYw)N[])rUrarIr&rbr6)r-rcrdrrWrms r.mergeSparseDictz#COLRVariationMerger.mergeSparseDictnsq A   QC)@q!%%()@A )@# 1%qz* s(AA A A A= A88A=c|D]:}t||}|Dcgc]}t||}} |j||<ycc}w#t$r$}|jj d|d}~wwxYw)Nr])rHrar&rbr6) r-rcrdr<r;rirfrkrms r. mergeAttrszCOLRVariationMerger.mergeAttrsvsz DC&E69:dgdD):F:   /  :$ 4&z* sAA A3A..A3cx|Dcgc]}t||}}d}|j|}t|tr d}|Dcgc]}|j |}}|d} t j } t|s|jj|\} } |r|j| } | | fScc}wcc}w)NFTr) rHgetConverterByNamerwr toIntrNO_VARIATION_INDEXrrrfromInt) r-rcrdr;rfris_fixed_size_floatconvrW baseValuers r.storeMastersForAttrz'COLRVariationMerger.storeMastersForAttrs9<=t,= = $%%d+ dN +"& 4ABqTZZ]BMB!!$ && & $ 2 2 ? ? N Iv  Y/I&  '>Cs B2B7returnct|}|jj|}|ctt |j t |z dzD]3}|j ||t |z|k(s"|x|j|<}n|{tt |dz ddD]_}|j | d|d|k(st |j |z }||j|<|j j ||dn|?t |j x|j|<}|j j ||S)Nrrr%)tuplerrIrrprr?)r-rrh varIndexBasertns r.storeVariationIndicesz)COLRVariationMerger.storeVariationIndicessHHo))--c2  3t}}-H =AB ==QX%678C=>>D&&s+l   3x=1,a4 ==!%"15#&t}}#5#9L.:D&&s+MM((!"6    585G GD  s #l MM  *r0ctj}g}|D]6}|j|||\}}t||||j |8t d|Dr|j |}|S)Nc3BK|]}|tjk7ywr*)rr rs r.rXz9COLRVariationMerger.mergeVariableAttrs..sr6anyr) r-rcrdr<rrr;rrs r.mergeVariableAttrsz&COLRVariationMerger.mergeVariableAttrssx,,  $D $ 8 8c4 H Iv Cy ) OOF # $ <8< <55h?Lr0ct|ddD]}|d}|j}t|j}|}|jj |j|j |dj}|j$|t||j|j<t||j|y)NTcLtt|djddduS)Nr%VarType)rHrAri)paths r.rz?COLRVariationMerger.convertSubTablesToVarType..s%T"X^^,i>dJr0) skip_root predicater%) r rirArr@rpopulateDefaultsrrHrr>)clsrjrrsubTablevarType newSubTableparents r.convertSubTablesToVarTypez-COLRVariationMerger.convertSubTablesToVarTypes"   6DbBxxH8n,,G!)K  ' '(9(9 :  ( ( *"X^^Fxx#5@(25# 6r0cj|jsyt}g}|jjD]<}|jg}|s|j }|j tjjk(r;|j tjjk(rtt||}t|}|D]^}t||vr$tj |}t||vsJ|j#||j%t|`||_t||_n|j+|}|j-t/||r)?t|t|k(sJ||j_t||j_y)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 PaintFormatPaintColrGlyphPaintColrLayersry_flatten_layersrpidrrr6rFirstLayerIndex NumLayers getChildrenr?reversed LayerCount) colruniqueLayerIDs newLayerListrfrontierpaintchildrenfirst_layer_indexlayers r.rz)COLRVariationMerger.expandPaintColrLayerssh~~  %%:: 4C {H <<2>>#@#@@\\R^^%C%CC $OE4$@AH(+L(9%!)6e96$(MM%$8E#%e9N#BB#B$++E2&**2e95 6 ->E)&)(mEO$006H 23) 40< C$7777+$' $5!r0Nr))r)r5rrrr/r~rrrrrrrrr( staticmethodrrr0r.rr&sl%$ H2@<!,: S 66(,6,6r0rc |jDcic]}|j|}}|Dcgc]'}|jDcic]}|j|c})}}}t|jD]8\}} |j |||D cgc]} | j |c} :d|_ ycc}wcc}wcc}}wcc} w#t $r7} | jjd|dd|| jd<d} ~ wwxYw)Nz.BaseGlyphPaintRecord[rz base glyph rT) r, BaseGlyphrqrUrarIr&rbr6causer) rEr-rdrrcrMmastersrtrrWrms r.r4r4s*.)B)B C#3==#  CC CORS!a.D.DEs s"ESGS#((*%1    s1v''BQa'B C"F DES (C  GGNN3A3a8 9$/u"5AGGJ   sEB5B?B: B?9C  C $C :B?C  D 2DD c|jsJdt|j|_|j|_y)Nz-BaseGlyphList must be merged before LayerList)rrprr7r-rs r.r4r4s4  ! !R#RR !&--(DODJr0c#K|jtjjk(sJ|j |D]B}|jtjjk(rt ||Ed{?|Dy7 wr*)rrr.r0r5r1)rootr8r<s r.r1r1!sj ;;"..88 88 8!!$' <<2>>99 9&ud3 3 3K  3sA4B6B7 Bc ^ tt|jdj}t j t |k(sJt t |Dcgc]4}tt||j |dj6}} j||jjj|}t |tkD}t|t} fd |Dcgc] } | }}t |dk(rS|djt j"j$k(r)|dj&|_|dj(|_yt ||_t j*|_j*j-|j*|s'jj/||j(yyycc}w#t$r!}|jjdd}~wwxYwcc}w)Nrz.Layers)rct|tr|Dcgc] }| }}tj}t tj j |_t||_ tj|_ jj|j&jj||j|Scc}wr*)rwryrr-rr.r0rrpr4rr3r?rr)r<rrlistToColrLayersr-s r.rJz0_merge_PaintColrLayers..listToColrLayersMs eT "389a&q)9F9HHJEr~~==>EL!&kEO$' $4E ! KK  v &##/$$((1F1FG :sCrr)ryr1r+rjrpr,rrur&rbr6r try_reuserrrrr.r0r4r3rr?r) r-rcrd out_layersrtmaster_layersesrmis_treerrJs ` @r._merge_PaintColrLayersrO*soc499V+<+B+BCDJ tyy>SX %% %s3x  _SVTYYq\&%9%?%? @AO   O4 '))33J? *o ::G!*0JKJ 0::!"1%:J: :! 1 4 48V8V V #1 // (m;;J !$++. :&    +G  $ $Z1D1D E5< +o  y! >;s$(9G8$G= H*= H'H""H'cx j||d}|tjjurt ||y|j }d |t jt|| fd|jD}j|||j|| }|jDcgc]}|j}}|tjk7xstfd|D} | r1 r||_|rj#||Jt%||_yycc}w)Nc$|j Sr*) is_variable)rs r.rzmerge..psCOO.{ Ra166;Q166R((c3LK|]}t|jvywr*r2r)rVrjrEs r.rXzmerge..s%>,15 V'''>!$)rrr.r0rO as_variabler getVariableAttrsrA getConvertersrr iterSubTablesrir r VarIndexBaser(rr) rEr-rdr varFormat staticAttrsrr subTables isVariablerVs ` @r.r4r4ns.  s,M NC bnn,,,vtS1!IH**4:yAR4#5#5#7RK dC-,,T3AL$($6$6$89b9I9!6!66#>5>>;J !-D    , ,T 2$$$)n :sD7cVt|j}tj|fd|j D}|j ||||j ||}|tjk7r,||_ |jjt|yy)Nc3TK|]}|jvs|j!ywr*rTrUs r.rXzmerge..rWrX) rArr r]r^rrrr r`rrr2)rEr-rdr%rbrrVs @r.r4r4s4j  G&&w/HR4#5#5#7RK dC-,,T3ALr,,,(r$x(-r0cj||d|jDtfd|jDr6j |j j t|yy)Nc34K|]}|jywr*rTras r.rXzmerge..s!GQ!&&!Gr4c3LK|]}t|jvywr*rZ)rVstoprEs r.rXzmerge..s Ed2d8v)) ) Er[)rr^r ColorStopr(rrr2rs` r.r4r4sb dC!G$2D2D2F!GH Ednn EE((.r$x(Fr0clipsc(|j||yr*)rrs r.r4r4s 4%r0rr*)F)r@rA)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(rrEGDEFr4rrrr7rrrrrrr r#r&rrO MarkBasePos MarkMarkPosr[r]rgrirq CursivePosrtLookupr CaretValuerrr BaseCoordrr+r*r1rOr-ClipBox Affine2x3rk ColorLineClipListrr0r.rs  R(-513><<66SS73 g12    rVrp V rww0#1#2 "Jv))*#+#ryy!#"#$6r||$:%:zrzz"24#24j,B86K\&3Rrzz"(#(VS)lr~~& T' Tr~~& T' T22<*0r}}%4&4.r))*#+#ryy!a "a R>n> &' " # **+','2 1N 1bmm$%*bii !:f(()<*<>%!n%!P2 %'&' &''' " )# )**+ 6, 6 \6/\6~B,,-".""BLL)*AFHRXXrzz23%%4%%PR\\2<<89 ): ) BLL))*)BKK1&2&r0