L iuYddlmZddlmZmZmZmZmZmZm Z m Z m Z m Z ddl mZddlmZmZddlmZddlmZddlmZddlmZdd lmZdd lmZmZdd lm Z dd l!m"Z"d dl#m$Z$m%Z%m&Z&m'Z'e$Z(e%Z)dZ*eddZ+dZ,dZ-dZ.dZ/dZ0dZ1eddZ2dZ3d%dZ4dZ5dZ6GddeZ7Gd d!e7Z8Gd"d#e Z9y$)&) namedtuple) maxStackLimit TopDictIndex buildOrdertopDictOperatorstopDictOperators2privateDictOperatorsprivateDictOperators2 FDArrayIndexFontDict VarStoreData)BytesIO)specializeCommandscommandsToProgram)newTable)varLib)allEqual)deprecateFunction) roundFunc) T2CharStringT2OutlineExtractor)T2CharStringPen)partial)VarLibCFFDictMergeErrorVarLibCFFPointTypeMergeErrorVarLibCFFHintTypeMergeErrorVarLibMergeErrorc|d}|jDcgc]}|j}}tjj ||}tjj ||}|dj jd} t|| _ | jdj<| j} | D]*} t| ds| j| j_ ,yycc}w)NfvarCFF2r) otVarStorePrivate)axesaxisTagrbuilderbuildVarRegionList buildVarStorecff topDictIndexr VarStoreFDArrayvstorehasattrr#) varFontvarModel varDataListmasterSupports fvarTableaxisaxisKeys varTupleList varStoreCFFVtopDictfdArrayfontDicts Z/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/varLib/cff.pyaddCFFVarStorer<&sI)28 8H8>>44^XNL>>// kJLfo!!..q1G#|)r/r>s r;convertCFFtoCFF2r@5s; G $$c\t|tr|jr t|S|SN) isinstancefloat is_integerint)nums r; conv_to_intrI<s##u#.."23x JrA) BlueValues OtherBlues FamilyBluesFamilyOtherBlues BlueScale BlueShiftBlueFuzzStdHWStdVW StemSnapH StemSnapVcR||}||}||vr||}||j}|Sd}|SrC)r#)regionFDArraysfd_indexrifd_mapregion_fdArray region_fd_mapregion_fdIndexprivates r; get_privater^QsK#B'N8$M ]&r* 088 N NrAc $|d}|dd}t|ddr|Dcgc]}|j}}n|Dcgc]}|g}}t|jD]P\}} | j} t | dd} || \} } g}| j ddD]1}|j j |dz }|j|3| g}| }|D](}t||||}||}n|}|j|*t|}| jjD]\}}g}|tvrt|tr |Dcgc]}|j|}} t%|} dg|z}d}|D]`}t|Dcgc] \}}|||z }}}|s t+|sd }|}| j-|}|d|d<|j|b|sQ|D cgc]} | d }} n>|Dcgc]}|j|}}t+|s| j-|}n|d}t|trWt|D]H\}}!t|!tr%t|!D]\}"}#t/|#|||"<;t/|!||<Jn t/|}|| j|<Sycc}wcc}wcc}w#t$rt!dj#|YwxYw#t&$rt)|||wxYwcc}}wcc} wcc}w) a I step through the FontDicts in the FDArray of the varfont TopDict. For each varfont FontDict: * step through each key in FontDict.Private. * For each key, step through each relevant source font Private dict, and build a list of values to blend. The 'relevant' source fonts are selected by first getting the right submodel using ``vsindex_dict[vsindex]``. The indices of the ``subModel.locations`` are mapped to source font list indices by assuming the latter order is the same as the order of the ``var_model.locations``. I can then get the index of each subModel location in the list of ``var_model.locations``. rrNr,vsindexz\Warning: {key} in default font Private dict is missing from another font, and was discarded.)keyFT)r.r, enumerater#getattr locationsindexappendr^lenrawDictitemspd_blend_fieldsrDlistKeyErrorprintformatzip IndexErrorrr getDeltasrI)$ top_dicts vsindex_dict var_modelrYr8region_top_dicts fdTopDictrVrW font_dict private_dictr` sub_model_master_indiceslocipdslast_pdrXpd num_mastersravaluedataListvalues prev_val_listany_points_differval_listvalrel_listdeltasdataitemjjtems$ r;merge_PrivateDictsr\s"lG }"I.=MN )++NN7GH)9+HH(9Z1) (( , 15$G, 1&&qr* %C##))#.2A  ! !! $ %n  B^Xr6BBz JJrN #h &..446C 1JCH/)%&8;<"bjjoHQKN?'2$&7 8'x0(0L  %GC 1/Z1OH<=%%+VV_  "F1#ufEEF$  >8sLJ. J3J=J8J=K(L  L,L 8J==$K%$K%(K?cd|vr|dS|dS)NzCFF r!)fonts r; _cff_or_cff2rs ~F| <rAci}|d}|dd}t|}t|jjd}t |dst |Dcic]}|dc}|d<|Si}|j } |j} t| D]\} } | || | <| |vsi|| <t|D]\}} | j}t| jjd}t |ds||d}d|||<U|j }t|D]\} } ||| }||}||vs| ||<|Scc}w)aSince a subset source font may have fewer FontDicts in their FDArray than the default font, we have to match up the FontDicts in the different fonts . We do this with the FDSelect array, and by assuming that the same glyph will reference matching FontDicts in each source font. We return a mapping from fdIndex in the default font to a dictionary which maps each master list index of each region font to the equivalent fdIndex in the region font.rrNFDSelect) rgrr)r*r.ranger getGlyphOrderrb)r/ fonts_listrY default_font region_fonts num_regionsr8rX gname_mappingdefault_fdSelect glyphOrdergidfdIndex region_fontregion_glyphOrderregion_topDictdefault_fdIndexregion_fdSelect region_maps r; getfd_maprsFa=Lab>Ll#K<(,,99!c,||vry||}|r|j|jgk(ryt|jdkrO|jddk(r=t|jdk(s$t|jdtt fvry|S)Nendcharrr) decompileprogramrgtyperGrE) charstrings glyphName filterEmptycss r;_get_csrs # Y B  ::   Oq  2)+RZZA%bjjm)<e )L IrAc0g}|jddD]7}||vr|j||j|j|9tjj |dd}t |} | ||<||gf|| <|j|| S)NrF)supportsrfrerr& buildVarDatarg) rrar2rsvsindex_by_keyr1varTupleIndexessupportvar_datar`s r;_add_new_vsindexr#sO>>!"%> . (  ! !' *~33G<=>~~**?D%HH,G!N3"SENLx NrAc ji}i}g}g}|dj}t|D]B\} } t|D cgc]\} } t| j| | dk7!} } } |j| \}}|d}t g| |d}t |_|j||dd}t|dD]2\}}|j|t |_|j|4|j|j|j|d}||| <|s|jrd|jvrtd| D} ||}|dk7s2|dg|jddE|sd |z}t!||||||t#||| }|Scc} } w#t$rt!||||||}YcwxYw) Nrr)startT)r] globalSubrsrtoptimizeblendc3$K|]}|du ywrCr).0vs r; z$merge_charstrings..es2aATM2sr`)T)r1r2rs) CharStringsrbr getSubModelCFF2CharStringMergePenMergeOutlineExtractoroutlineExtractordrawrestart getCharStringr]r seen_movetortuplerlrr)rrrr masterModelrsrr1r2default_charstringsrgnamer}tdall_csrmodel_csdefault_charstringvar_pen region_cs region_idxregion_charstringnew_csrar`rs r;rr3sLNKN#A,22 +66 UAJ)@T 7> FMM$   rAc|jdk(r<|jj|gg|jjd|ggn|j|j}|d|k7r2t ||jt |d|d|j |xjdz c_|j|j}|dj||xjdz c_y)Nrrr8)rr9abs_argsr5s r;rz#CFF2CharStringMergePen.add_hintmasks <<1  NN ! !9b/ 2 NN ! !2z"2 3../C1v"1t}}c#a&k3q64>> MMQ M../C FMM( #  rAc|jsd|_|j|}|jd||jdz |_y)NTrmovetor)r_pr6r+r.rptr4s r;_moveTozCFF2CharStringMergePen._moveTosA#D GGBK  y),"]]Q.rAcJ|j|}|jd|y)Nrlinetor?r6r@s r;_lineTozCFF2CharStringMergePen._lineTosGGBK  y),rAct|j}||||z||z}|jd|y)N rrcurvetorE)rpt1pt2pt3r?r4s r; _curveToOnez"CFF2CharStringMergePen._curveToOnes4 WWsGbg%3/  {I.rAcyrCrrs r; _closePathz!CFF2CharStringMergePen._closePath! rAcyrCrrNs r;_endPathzCFF2CharStringMergePen._endPath$rPrAc.d|_||_d|_y)Nr)rr)r+r-_p0)rrs r;rzCFF2CharStringMergePen.restart's ! rAc|jSrC)r,rNs r; getCommandsz"CFF2CharStringMergePen.getCommands,s ~~rAc|D]}|d}t|}t||d<d}|D]}|d}|dvr1t|d}t|s td|ddg|d<ni|d} g} | D]X}t|r| j |d#||dd} |dg| z}|j d| j |Z| |d<|}|S)a We first re-order the master coordinate values. For a moveto to lineto, the args are now arranged as:: [ [master_0 x,y], [master_1 x,y], [master_2 x,y] ] We re-arrange this to:: [ [master_0 x, master_1 x, master_2 x], [master_0 y, master_1 y, master_2 y] ] If the master values are all the same, we collapse the list to as single value instead of a list. We then convert this to:: [ [master_0 x] + [x delta tuple] + [numBlends=1] [master_0 y] + [y delta tuple] + [numBlends=1] ] rNr)rr!z3Hintmask values cannot differ between source fonts.)rorkrrrf) rcommandsget_delta_funcr5rm_argslastOpopcoordcoords new_coordsrs r;reorder_blend_argsz)CFF2CharStringMergePen.reorder_blend_args/s , "Cq6D$ZF&\CF  " CQB11SV *M (1+AQ #1E"))%(3"0!6qr!:!&q V 3 Q"))%01$AF1 2rAc|j}|j|t|j|j}|rt |dt }t|}t|||}|S)Nr)F)generalizeFirstmaxstack)rr]r) r,r`rrqr*rrrr)rr]rrtrrXr charStrings r;rz$CFF2CharStringMergePen.getCharStringhsn>>** gi11D  )%-H$H-!W+ rA)g{Gz?)NNNT)rrrrrr6rrrBrFrLrOrRrrVr`rr#r$s@r;rrsV*TX<  &/-/    7tHLrArN)F): collectionsrfontTools.cffLibrrrrrr r r r r iorfontTools.cffLib.specializerrrfontTools.ttLibr fontToolsrfontTools.varLib.modelsrfontTools.misc.loggingToolsrfontTools.misc.roundToolsrfontTools.misc.psCharStringsrrfontTools.pens.t2CharStringPenr functoolsrerrorsrrrrMergeDictErrorMergeTypeErrorr<r@rIrjr^rrrrrrrrrrrrrAr;rts"   N$,9/I:)- ;MN%O%  q1h (V j"K L N&  M`  2 <$5<$~f_frA