)Ej[ddlmZddlmZmZmZmZmZmZm 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&dZ4dZ5dZ6Gdd eZ7Gd!d"e7Z8Gd#d$e Z9d%S)') namedtuple) maxStackLimit TopDictIndex buildOrdertopDictOperatorstopDictOperators2privateDictOperatorsprivateDictOperators2 FDArrayIndexFontDict VarStoreData)BytesIO)specializeCommandscommandsToProgram)newTable)varLib)allEqual)deprecateFunction) roundFunc) T2CharStringT2OutlineExtractor)T2CharStringPen)partial)VarLibCFFDictMergeErrorVarLibCFFPointTypeMergeErrorVarLibCFFHintTypeMergeErrorVarLibMergeErrorc|d}d|jD}tj||}tj||}|djjd}t||_|j dj -|j } | D]%} t| dr|j| j _ $dSdS)Nfvarcg|] }|j S)axisTag).0axiss FC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/varLib/cff.py z"addCFFVarStore..(s888 888CFF2r) otVarStorePrivate) axesrbuilderbuildVarRegionList buildVarStorecff topDictIndexr VarStoreFDArrayvstorehasattrr+) varFontvarModel varDataListmasterSupports fvarTableaxisKeys varTupleList varStoreCFFVtopDictfdArrayfontDicts r&addCFFVarStorerA&sI88888H>44^XNNL>// kJJLfo!.q1G#|<<.psNNN )+NNNr(cg|]}|gSr"r"res r&r'z&merge_PrivateDicts..rsHHH)9+HHHr(vsindexc*g|]}|jSr"rawDictr$pdkeys r&r'z&merge_PrivateDicts..s<<<"bjo<<.s4   5=a}Q//   r(Tcg|] }|d Srr")r$datas r&r'z&merge_PrivateDicts..s===DQ===r(c*g|]}|jSr"rjrls r&r'z&merge_PrivateDicts..s888b"*S/888r()r5 enumerater3r+getattr locationsindexappendrblenrkitemspd_blend_fieldsrHlistKeyErrorprintformatzip IndexErrorrr getDeltasrM)! top_dicts vsindex_dict var_modelr]r>region_top_dictsrZr[ font_dict private_dictrh sub_model_master_indiceslocrppdslast_pdr\rm num_mastersvaluedataListvaluesany_points_differval_listrel_listdeltasitemjjtemrnrrs! @@r&merge_PrivateDictsr\s#"lG }"I..INN=MNNNHH7GHHH(99Z1Z1) ( , 155$G, 1&qrr* % %C#))#..2A  ! !! $ $ $ $n   B^Xr6BBBz JJrNNNN#hh &.4466C 1C 1JCH/))%&&2 )<<<<<<==H===H8888C888'')(226::HH%ayH(D)) 1(2288GAt!$--8'0??GAt-8->->HQKNN?'2$&7&7 8'x00(0L  % %GC 1/Z1Z1sE-F F FF8c*d|vr|dS|dS)NzCFF r)r")fonts r& _cff_or_cff2rs ~~F| <r(ci}|d}|dd}t|}t|jjd}t |dsdt |D|d<|Si}|j}|} t|D]\} } | || | <| |vri|| <t|D]\} } | }t| jjd}t |ds||d}d||| <b|j}t|D]$\} } ||| }||}| |vr| || <%|S)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.rrNFDSelectci|]}|dSrtr")r$r\s r& zgetfd_map..s888rR888r() r|rr0r1r5ranger getGlyphOrderrw)r6 fonts_listr] default_font region_fonts num_regionsr> gname_mappingdefault_fdSelect glyphOrdergidfdIndexr\ region_fontregion_glyphOrderregion_topDictdefault_fdIndexregion_fdSelect region_maps r& getfd_maprsFa=Labb>Ll##K<((,9!.s85; V -a0r(r) r0r1r|mappingmerge_charstringsrrrrAr8r9) r6modelordered_fonts_listrr>rrcvDatar]s r&merge_region_fontsrsfo!.q1G ?QRSRTRT?UIem$$K z; 5 I IF w 2 3 3Fy&"5ufEEE7E6#5v7LMMMMMr(Fc>||vrdS||}|r||jgkrdSt|jdkrS|jddkrBt|jdks(t|jdtt fvrdS|S)Nendcharrr) decompileprogramr|typerKrI) charstrings glyphName filterEmptycss r&_get_csrs ##t Y B   :  4  OOq  2)++RZA%%bjm)<)<e )L)L4 Ir(cTg}|jddD]C}||vr|||||Dtj|dd}t |} | ||<||gf|| <||| S)NrF)supportsr{rzrr- buildVarDatar|) rrnr9rvsindex_by_keyr8varTupleIndexessupportvar_datarhs r&_add_new_vsindexr#sO>!""%>> . ( (  ! !' * * *~33G<<====~**?D%HHH,G!N3"SENLx   Nr(c ti}i}g}g}|dj}t|D]c\} fdt|D} || \} } | d} tg|d}t| _| || dd}t|dD];\}}||t|_||<|| j | j | d}||<|s|j r d|j vrtd| D} ||}n$#t$rt| |||||}YnwxYw|dkr|d g|j dd<e|sd |z}t||||||t!||| }|S) NrcJg|]\}}t|j|dk Srt)r CharStrings)r$rptdgnames r&r'z%merge_charstrings..;s<   7z$merge_charstrings..es&22aATM222222r(rh)T)r8r9r)rrw getSubModelCFF2CharStringMergePenMergeOutlineExtractoroutlineExtractordrawrestart getCharStringrar seen_movetortuplerrr)rrr masterModelrrr8r9default_charstringsrall_csrmodel_csdefault_charstringvar_pen region_cs region_idxregion_charstringnew_csrnrhrrs @r&rr3spLNKN#A,2 ++6666 U    @I)@T@T   &11&99x&a[(UKCC/D+(((QRRL -6y-J-J-J , , )J) OOJ ' ' '1F  .  " "7 + + + +&&&.*6 '   &,E"  # )F)F 22622222 $S)GG   &sNL.+GGG  a<<")9!5FN2A2    # nlNK   %!F MsEE21E2ceZdZdZddZdS)CFFToCFF2OutlineExtractorzThis class is used to remove the initial width from the CFF charstring without trying to add the width to self.nominalWidthX, which is None.rc|}|js2|t|dzz r |dd}|j|_d|_|S)Nrr)popallgotWidthr| defaultWidthXwidth)selfevenOddargss r& popallWidthz%CFFToCFF2OutlineExtractor.popallWidthsS{{}}} #d))a-( ABBx+DJDM r(Nrt)__name__ __module__ __qualname____doc__rr"r(r&rrs2r(rc^eZdZdZ d fd ZdZdZdZdZdZ d Z d Z d Z d Z xZS)rzUsed to extract the charstring commands - including hints - from a CFF charstring in order to merge it as another set of region data into a CFF2 variable font charstring.Nc Vt|||||||dSrG)super__init__) rpen localSubrsr nominalWidthXrrablender __class__s r&rzMergeOutlineExtractor.__init__s;  [-QX     r(cl|}|jt|dzz|_|S)Nr)r hintCountr|)rrs r& countHintsz MergeOutlineExtractor.countHintss0!!#d))q.8 r(c<|j||dSrG)radd_hint)rrrs r&_hint_opzMergeOutlineExtractor._hint_ops  $%%%%%r(cZ|}|d|dS)Nhstemrrrrzrs r&op_hstemzMergeOutlineExtractor.op_hstem+   gt$$$$$r(cZ|}|d|dS)Nvstemrrs r&op_vstemzMergeOutlineExtractor.op_vstemrr(cZ|}|d|dS)Nhstemhmrrs r& op_hstemhmz MergeOutlineExtractor.op_hstemhm+   i&&&&&r(cZ|}|d|dS)Nvstemhmrrs r& op_vstemhmz MergeOutlineExtractor.op_vstemhmrr(c|js>|}|r|d||jdzdz|_|jd||j\}}||fS)Nr r) hintMaskBytesrrr  callingStackgetBytes)rrzrr%s r& _get_hintmaskz#MergeOutlineExtractor._get_hintmasks|! ;??$$D / i..."&.1"4!:D #04==eTEWXX um##r(cr||\}}|jd|g||fS)Nhintmaskr(r add_hintmaskrrzr%s r& op_hintmaskz!MergeOutlineExtractor.op_hintmask?#11%88} j=/:::e##r(cr||\}}|jd|g||fS)Ncntrmaskr+r-s r& op_cntrmaskz!MergeOutlineExtractor.op_cntrmaskr/r()NN)rrrrrrrrrrr!r(r.r2 __classcell__r s@r&rrs--        &&&%%%%%%''''''$$$$$$ $$$$$$$r(rcreZdZdZ dfd ZdZdZdZdZdZ d Z d Z d Z d Z d ZdZ ddZxZS)rz Pen to merge Type 2 CharStrings.{Gz?ctddd|d|_||_||_||_d|_d|_||_t|t|_ dS)NT)rglyphSetr)roundTolerancerFround) rrpt_index _commandsm_indexr prev_move_idxrrrr;)rdefault_commandsrr master_idxr9r s r&rzCFF2CharStringMergePen.__init__s} D     )! & "~U;;; r(cV|jdkr|j||ggno|j|j}|d|kr6t ||jt |d|d|j|d||xjdz c_dSNrr)r>r=r{r<rr|r)r point_type pt_coordscmds r& add_pointz CFF2CharStringMergePen.add_points <1   N ! !: {"; < < < <./C1v##2 s3q6{{CFDN FMM) $ $ $  r(cV|jdkr|j||ggno|j|j}|d|kr6t ||jt |d|d|j|d||xjdz c_dSrCr>r=r{r<rr|r)r hint_typerrFs r&rzCFF2CharStringMergePen.add_hints <1   N ! !9tf"5 6 6 6 6./C1v""1t}c#a&kk3q64> FMM$     r(c|jdkr:|j|gg|jd|ggn|j|j}|d|kr6t ||jt |d|d|j|xjdz c_|j|j}|d||xjdz c_dS)NrrrI)rrJabs_argsrFs r&r,z#CFF2CharStringMergePen.add_hintmasks <1   N ! !9b/ 2 2 2 N ! !2z"2 3 3 3 3./C1v""1t}c#a&kk3q64> MMQ MM./C FMM( # # #  r(c|jsd|_||}|d||jdz |_dS)NTrmovetor)r_prGr<r?rptrEs r&_moveTozCFF2CharStringMergePen._moveTosO $#D GGBKK  y),,,"]Q.r(c\||}|d|dS)NrlinetorPrGrQs r&_lineTozCFF2CharStringMergePen._lineTos+GGBKK  y),,,,,r(c|j}||||z||z}|d|dS)N rrcurvetorV)rpt1pt2pt3rPrEs r& _curveToOnez"CFF2CharStringMergePen._curveToOnesJ WBsGGbbgg%3/  {I.....r(cdSrGr"rs r& _closePathz!CFF2CharStringMergePen._closePath! r(cdSrGr"r_s r&_endPathzCFF2CharStringMergePen._endPath$rar(c0d|_||_d|_dS)Nr)rr)r<r>_p0)rrs r&rzCFF2CharStringMergePen.restart's ! r(c|jSrG)r=r_s r& getCommandsz"CFF2CharStringMergePen.getCommands,s ~r(c|D]%}|d}t|}t||d<&d}|D]}|d}|dvrFt|d}t|std|ddg|d<n|d} g} | D]v}t|r| |d-||dd} |dg| z}|d| |w| |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)r*r1z3Hintmask values cannot differ between source fonts.)rrrrr{) rcommandsget_delta_funcrFrm_argslastOpopcoordcoords new_coordsrs r&reorder_blend_argsz)CFF2CharStringMergePen.reorder_blend_args/sW, " "Cq6D$ZF&\\CFF  CQB111SV *M (1+AQ #11E1"))%(3333"0!6!6qrr!:!&q V 3 Q"))%0000#AFFr(NTc|j}||t|j|j}|rt |dt }t|}t|||}|S)Nr:F)generalizeFirstmaxstack)rrar) r=rqrrr;rrrr)rrarrrrir charStrings r&rz$CFF2CharStringMergePen.getCharStringhs>** gi1DDD    )%-H$H--!W+   r()r6)NNNT)rrrrrrGrr,rSrWr]r`rcrrgrqrr3r4s@r&rrs **TX<<<<<<      &///---///        777tHLr(rN)F): collectionsrfontTools.cffLibrrrrrr r r r r iorfontTools.cffLib.specializerrrfontTools.ttLibr fontToolsrfontTools.varLib.modelsrfontTools.misc.loggingToolsrfontTools.misc.roundToolsrfontTools.misc.psCharStringsrrfontTools.pens.t2CharStringPenr functoolsrerrorsrrrrMergeDictErrorMergeTypeErrorrArErMr~rbrrrrrrrrrrrr"r(r&rs""""""                        NNNNNNNN$$$$$$,,,,,,999999//////IIIIIIII::::::)- ; ; ;MNN%%ON%  q1q1q1h (((V :j"K L L N N N&    MMM`      2   <$<$<$<$<$5<$<$<$~fffff_fffffr(