
    ]MhuY                        d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlm Z  d dl!m"Z" ddl#m$Z$m%Z%m&Z&m'Z' e$Z(e%Z)d Z* ed          d             Z+d Z,dZ-d Z.d Z/d Z0d Z1 edd          Z2d Z3d&dZ4d Z5d Z6 G d d e          Z7 G d! d"e7          Z8 G d# d$e           Z9d%S )'    )
namedtuple)
maxStackLimitTopDictIndex
buildOrdertopDictOperatorstopDictOperators2privateDictOperatorsprivateDictOperators2FDArrayIndexFontDictVarStoreData)BytesIO)specializeCommandscommandsToProgram)newTable)varLib)allEqual)deprecateFunction)	roundFunc)T2CharStringT2OutlineExtractor)T2CharStringPen)partial   )VarLibCFFDictMergeErrorVarLibCFFPointTypeMergeErrorVarLibCFFHintTypeMergeErrorVarLibMergeErrorc                    | d         }d |j         D             }t          j                            ||          }t          j                            ||          }| d         j        j        d         }t          |          |_        |j	        d         j
        -|j	        }	|	D ]%}
t          |
d          r|j        |
j        _
        $d S d S )Nfvarc                     g | ]	}|j         
S  )axisTag).0axiss     T/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/varLib/cff.py
<listcomp>z"addCFFVarStore.<locals>.<listcomp>(   s    888888    CFF2r   )
otVarStorePrivate)axesr   builderbuildVarRegionListbuildVarStorecfftopDictIndexr   VarStoreFDArrayvstorehasattrr+   )varFontvarModelvarDataListmasterSupports	fvarTableaxisKeysvarTupleListvarStoreCFFVtopDictfdArrayfontDicts              r&   addCFFVarStorerA   &   s    I88888H>44^XNNL>//kJJLfo!.q1G#|<<<Gq (/ 	; 	;Hx++ ;*1*: '	 )(	; 	;r(   z8Use fontTools.cffLib.CFFToCFF2.convertCFFToCFF2 instead.c                 $    ddl m}  ||           S )Nr   )convertCFFToCFF2)fontTools.cffLib.CFFToCFF2rC   )r6   rC   s     r&   convertCFFtoCFF2rE   5   s%    ;;;;;;G$$$r(   c                 v    t          | t                    r#|                                 rt          |           S | S N)
isinstancefloat
is_integerint)nums    r&   conv_to_intrM   <   s5    #u #.."2"2 3xxJr(   )
BlueValues
OtherBluesFamilyBluesFamilyOtherBlues	BlueScale	BlueShiftBlueFuzzStdHWStdVW	StemSnapH	StemSnapVc                 ^    | |         }||         }||v r||         }||         j         }nd }|S rG   )r+   )regionFDArraysfd_indexrifd_mapregion_fdArrayregion_fd_mapregion_fdIndexprivates           r&   get_privaterb   Q   sD    #B'N8$M	]&r* 08Nr(   c                 .    | d         }| dd         }t          |d         d          rd |D             }nd |D             }t          |j                  D ]\  }}|j        }	t	          |	dd          }
||
         \  }}g }|j        dd         D ]4}|j                            |          dz
  }|                    |           5|	g}|	}|D ]0}t          ||||          }||}n|}|                    |           1t          |          }|	j
                                        D ]\  }g }t          vrt          |t                    r	 fd|D             }n3# t          $ r& t!          d	                    
                     Y fw xY w	 t%          | }n# t&          $ r t)          ||          w xY w	 dg|z   d}|D ]g} fdt          |          D             }|st+          |          sd}| |                    |          }|d         |d<   |                    |           h|sd |D             }n;fd|D             }t+          |          s|                    |          }n|d         }t          |t                    rkt          |          D ]Z\  }}t          |t                    r.t          |          D ]\  }}t/          |          ||         |<   Ht/          |          ||<   [nt/          |          }||	j
        <   dS )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``.
    r   r   Nr3   c                     g | ]	}|j         
S r"   )r3   r$   	fdTopDicts     r&   r'   z&merge_PrivateDicts.<locals>.<listcomp>p   s    NNN	)+NNNr(   c                     g | ]}|gS r"   r"   re   s     r&   r'   z&merge_PrivateDicts.<locals>.<listcomp>r   s    HHH)9+HHHr(   vsindexc                 *    g | ]}|j                  S r"   rawDictr$   pdkeys     r&   r'   z&merge_PrivateDicts.<locals>.<listcomp>   s    <<<"bjo<<<r(   z\Warning: {key} in default font Private dict is missing from another font, and was discarded.)rn   Fc                 ,    g | ]\  }}||         z
  S r"   r"   )r$   ivalprev_val_lists      r&   r'   z&merge_PrivateDicts.<locals>.<listcomp>   s4          5=a}Q//     r(   Tc                     g | ]
}|d          S r   r"   )r$   datas     r&   r'   z&merge_PrivateDicts.<locals>.<listcomp>   s    ===DQ===r(   c                 *    g | ]}|j                  S r"   rj   rl   s     r&   r'   z&merge_PrivateDicts.<locals>.<listcomp>   s    888b"*S/888r(   )r5   	enumerater3   r+   getattr	locationsindexappendrb   lenrk   itemspd_blend_fieldsrH   listKeyErrorprintformatzip
IndexErrorr   r   	getDeltasrM   )!	top_dictsvsindex_dict	var_modelr]   r>   region_top_dictsrZ   r[   	font_dictprivate_dictrh   	sub_model_master_indiceslocrp   pdslast_pdr\   rm   num_mastersvaluedataListvaluesany_points_differval_listrel_listdeltasitemjjtemrn   rr   s!                                  @@r&   merge_PrivateDictsr   \   s#   " lG }"I.. INN=MNNNHH7GHHH(99 Z1 Z1) (,	155 $G,	1&qrr* 	% 	%C#))#..2A!!!$$$$n  	 	B^Xr6BBB zJJrNNNN#hh&.4466 C	1 C	1JCH/))%&& 2)<<<<<<<FF   %%+VV__  
 HF &\FF! F F F1#ufEEEF "#k 1$)! & , ,H       AJ8ATAT     H . 1x7I7I 1,0)$,M&00::F !)F1IOOF++++ ) >==H===H8888C888'' )(226::HH%ayH (D)) 1(22 8 8GAt!$-- 8'0 ? ?GAt-8->->HQKNN? '2$&7&78 'x00(0L %%GC	1/Z1 Z1s   E-FF	FF8c                 *    d| v r| d         S | d         S )NzCFF r)   r"   )fonts    r&   _cff_or_cff2r      s    ~~F|<r(   c                    i }|d         }|dd         }t          |          }t          |          j        j        d         }t	          |d          sd t          |          D             |d<   |S i }|j        }|                                }	t          |          D ]\  }
}|||	|
         <   ||vri ||<   t          |          D ]\  }}|                                }t          |          j        j        d         }t	          |d          s||d                  }d||         |<   b|j        }t          |          D ]$\  }
}|||
                  }||         }||vr|||<   %|S )a  Since 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.r   r   NFDSelectc                     i | ]}|d S rt   r"   )r$   r\   s     r&   
<dictcomp>zgetfd_map.<locals>.<dictcomp>   s    888rR888r(   )	r|   r   r0   r1   r5   ranger   getGlyphOrderrw   )r6   
fonts_listr]   default_fontregion_fontsnum_regionsr>   gname_mappingdefault_fdSelect
glyphOrdergidfdIndexr\   region_fontregion_glyphOrderregion_topDictdefault_fdIndexregion_fdSelect
region_maps                      r&   	getfd_mapr      s    Fa=Labb>Ll##K<((,9!<G7J''  98U;%7%7888q	M'++--J!"233 ! !W)0jo&&   F7O$\22 - -K'5577%k226CAF~z22 
	-+,=a,@AO*+F?#B'',5O )/ : : - -W"/0A#0F"G#O4
Z''%,JrN	-
 Mr(   CVarDataz'varDataList masterSupports vsindex_dictc                 8   | d         j         j        d         }|gd |dd          D             z   }t          |j                  }t	          ||||          }t          | |          }t          ||j        ||           t          | ||j	        |j
                   d S )Nr)   r   c                 L    g | ]!}t          |          j        j        d          "S rt   )r   r0   r1   )r$   ttFonts     r&   r'   z&merge_region_fonts.<locals>.<listcomp>  s8       5;V -a0  r(   r   )r0   r1   r|   mappingmerge_charstringsr   r   r   rA   r8   r9   )	r6   modelordered_fonts_listr   r>   r   r   cvDatar]   s	            r&   merge_region_fontsr     s    fo!.q1G	  ?QRSRTRT?U   I em$$Kz;	5IIFw 233Fy&"5ufEEE7E6#5v7LMMMMMr(   Fc                 >   || vrd S | |         }|r|                                  |j        g k    rd S t          |j                  dk    rS|j        d         dk    rBt          |j                  dk    s(t          |j        d                   t          t
          fv rd S |S )N   endcharr   r   )	decompileprogramr|   typerK   rI   )charstrings	glyphNamefilterEmptycss       r&   _get_csr     s    ##t	Y	B 	
:4
OOq  
2)++RZA%%bjm)<)<e)L)L4Ir(   c                 T   g }| j         dd          D ]C}||vr|                    |           |                    |                    |                     Dt          j                            |d d          }t          |          }	|	||<   | |gf||	<   |                    |           |	S )Nr   F)supportsr{   rz   r   r-   buildVarDatar|   )
r   rn   r9   r   vsindex_by_keyr8   varTupleIndexessupportvar_datarh   s
             r&   _add_new_vsindexr   #  s     O>!""% > >.((!!'***~33G<<====~**?D%HHH,G!N3"SENLx   Nr(   c           
      t   i }i }g }g }|d         j         }t          |           D ]c\  }	fdt          |          D             }
|                    |
          \  }}|d         }t          g |d          }t          |_        |                    |           |dd          }t          |d          D ];\  }}|                    |           t          |_        |                    |           <|                    |j	        |j
        |d          }||<   |s|j        r	d|j        vrt          d |
D                       }	 ||         }n$# t          $ r t          ||||||          }Y nw xY w|dk    r|d	g|j        d d<   e|sd
|z  }t          ||||||           t!          |||          }|S )Nr   c                 J    g | ]\  }}t          |j        |d k               S rt   )r   CharStrings)r$   rp   tdgnames      r&   r'   z%merge_charstrings.<locals>.<listcomp>;  s<     
 
 
7<q"GBNE1622
 
 
r(   r   )startT)ra   globalSubrsr   optimizeblendc              3      K   | ]}|d uV  	d S rG   r"   )r$   vs     r&   	<genexpr>z$merge_charstrings.<locals>.<genexpr>e  s&      22aATM222222r(   rh   )T)r8   r9   r   )r   rw   getSubModelCFF2CharStringMergePenMergeOutlineExtractoroutlineExtractordrawrestartgetCharStringra   r   seen_movetor   tupler   r   r   )r   r   r   masterModelr   r   r8   r9   default_charstringsr   all_csr   model_csdefault_charstringvar_pen	region_cs
region_idxregion_charstringnew_csrn   rh   r   r   s                         @r&   r   r   3  sp   LNKN#A,2
++ 66 66
U
 
 
 
@I)@T@T
 
 
 &11&99x &a[(UKCC /D+((( QRRL	-6y-J-J-J 	, 	,)J)OOJ'''1F.""7++++ &&&.*6	 ' 
 
 &,E" 	# 	)F)F  22622222	$S)GG 	 	 	&sNL.+ GGG	 a<<")9!5FN2A2
  
#nlNK	
 	
 	
 %!  F Ms   EE21E2c                       e Zd ZdZddZdS )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.r   c                     |                                  }| j        s2|t          |          dz  z  r
|dd          }| j        | _        d| _        |S )Nr   r   )popallgotWidthr|   defaultWidthXwidth)selfevenOddargss      r&   popallWidthz%CFFToCFF2OutlineExtractor.popallWidth  sS    {{}}} 	#d))a-(  ABBx+DJDMr(   Nrt   )__name__
__module____qualname____doc__r   r"   r(   r&   r   r     s2              r(   r   c                   ^     e Zd ZdZ	 	 d fd	Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Z xZS )r   zUsed 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           	      V    t                                          |||||||           d S rG   )super__init__)	r   pen
localSubrsr   nominalWidthXr   ra   blender	__class__s	           r&   r  zMergeOutlineExtractor.__init__  s;     	[-QX	
 	
 	
 	
 	
r(   c                 l    |                                  }| j        t          |          dz  z   | _        |S )Nr   )r   	hintCountr|   )r   r   s     r&   
countHintsz MergeOutlineExtractor.countHints  s0    !!#d))q.8r(   c                 <    | j                             ||           d S rG   )r  add_hint)r   r   r   s      r&   _hint_opzMergeOutlineExtractor._hint_op  s     $%%%%%r(   c                 Z    |                                  }|                     d|           d S )Nhstemr  r  r   rz   r   s      r&   op_hstemzMergeOutlineExtractor.op_hstem  +      gt$$$$$r(   c                 Z    |                                  }|                     d|           d S )Nvstemr  r  s      r&   op_vstemzMergeOutlineExtractor.op_vstem  r  r(   c                 Z    |                                  }|                     d|           d S )Nhstemhmr  r  s      r&   
op_hstemhmz MergeOutlineExtractor.op_hstemhm  +      i&&&&&r(   c                 Z    |                                  }|                     d|           d S )Nvstemhmr  r  s      r&   
op_vstemhmz MergeOutlineExtractor.op_vstemhm  r  r(   c                     | j         s>|                                 }|r|                     d|           | j        dz   dz  | _         | j        d                             || j                   \  }}||fS )Nr         r   )hintMaskBytesr  r  r  callingStackgetBytes)r   rz   r   r%  s       r&   _get_hintmaskz#MergeOutlineExtractor._get_hintmask  s|    ! 	;??$$D /i..."&.1"4!:D#04==eTEWXXum##r(   c                 r    |                      |          \  }}| j                            d|g           ||fS )Nhintmaskr(  r  add_hintmaskr   rz   r%  s      r&   op_hintmaskz!MergeOutlineExtractor.op_hintmask  ?    #11%88}j=/:::e##r(   c                 r    |                      |          \  }}| j                            d|g           ||fS )Ncntrmaskr+  r-  s      r&   op_cntrmaskz!MergeOutlineExtractor.op_cntrmask  r/  r(   )NN)r   r   r  r  r  r  r  r  r  r  r!  r(  r.  r2  __classcell__r  s   @r&   r   r     s        - - 
 
 
 
 
 
  
& & &% % %% % %' ' '' ' '$ $ $$ $ $
$ $ $ $ $ $ $r(   r   c                   r     e Zd ZdZ	 d fd	Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Z	 ddZ xZS )r   z Pen to merge Type 2 CharStrings.{Gz?c                     t                                          d d d|           d| _        || _        || _        || _        d| _        d| _        || _        t          |t                    | _
        d S )NT)r   glyphSetr)   roundTolerancer   Fround)r  r  pt_index	_commandsm_indexr   prev_move_idxr   r   r   r;  )r   default_commandsr   r   
master_idxr9  r  s         r&   r  zCFF2CharStringMergePen.__init__  s}     	D 	 	
 	
 	
 )!& "~U;;;


r(   c                 V   | j         dk    r| j                            ||gg           no| j        | j                 }|d         |k    r6t	          || j        t          |d                   |d         | j                  |d                             |           | xj        dz  c_        d S Nr   r   )r>  r=  r{   r<  r   r|   r   )r   
point_type	pt_coordscmds       r&   	add_pointz CFF2CharStringMergePen.add_point  s    <1N!!:	{";<<<<./C1v##2s3q6{{CFDN   FMM)$$$r(   c                 V   | j         dk    r| j                            ||gg           no| j        | j                 }|d         |k    r6t	          || j        t          |d                   |d         | j                  |d                             |           | xj        dz  c_        d S rC  r>  r=  r{   r<  r   r|   r   )r   	hint_typer   rF  s       r&   r  zCFF2CharStringMergePen.add_hint  s    <1N!!9tf"56666./C1v""1t}c#a&kk3q64>   FMM$r(   c                    | j         dk    r:| j                            |g g           | j                            d|gg           n| j        | j                 }|d         |k    r6t	          || j        t          |d                   |d         | j                  | xj        dz  c_        | j        | j                 }|d                             |           | xj        dz  c_        d S )Nr    r   rI  )r   rJ  abs_argsrF  s       r&   r,  z#CFF2CharStringMergePen.add_hintmask  s    
 <1N!!9b/222N!!2z"23333./C1v""1t}c#a&kk3q64>   MMQMM./CFMM(###r(   c                     | j         sd| _         |                     |          }|                     d|           | j        dz
  | _        d S )NTrmovetor   )r   _prG  r<  r?  r   ptrE  s      r&   _moveTozCFF2CharStringMergePen._moveTo  sO     	$#DGGBKK	y),,, "]Q.r(   c                 \    |                      |          }|                     d|           d S )NrlinetorP  rG  rQ  s      r&   _lineTozCFF2CharStringMergePen._lineTo  s+    GGBKK	y),,,,,r(   c                     | j         } ||           ||          z    ||          z   }|                     d|           d S )N	rrcurvetorV  )r   pt1pt2pt3rP  rE  s         r&   _curveToOnez"CFF2CharStringMergePen._curveToOne  sJ    WBsGGbbgg%3/	{I.....r(   c                     d S rG   r"   r   s    r&   
_closePathz!CFF2CharStringMergePen._closePath!      r(   c                     d S rG   r"   r_  s    r&   _endPathzCFF2CharStringMergePen._endPath$  ra  r(   c                 0    d| _         || _        d| _        d S )Nr   )r   r   )r<  r>  _p0)r   r   s     r&   r   zCFF2CharStringMergePen.restart'  s    !r(   c                     | j         S rG   )r=  r_  s    r&   getCommandsz"CFF2CharStringMergePen.getCommands,  s
    ~r(   c                    |D ]%}|d         }t          | }t          |          |d<   &d}|D ]}|d         }|dv rFt          |d                   }t          |          st          d          |d         d         g|d<   n|d         }	g }
|	D ]v}t          |          r|
                    |d                    - ||          dd         }|d         g|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]
                ]
        r   Nr   )r*  r1  z3Hintmask values cannot differ between source fonts.)r   r   r   r   r{   )r   commandsget_delta_funcrF  r   m_argslastOpopcoordcoords
new_coordsr   s               r&   reorder_blend_argsz)CFF2CharStringMergePen.reorder_blend_args/  sW   ,  	" 	"Cq6D$ZF &\\CFF 	 	CQB 111SV *M    (1+AQ
# 1 1E 1"))%(3333 "0!6!6qrr!:!&q
V 3Q"))%0000#AFFr(   NTc                     | j         }|                     |t          |j        | j                            }|rt          |dt                    }t          |          }t          |||          }|S )Nr:  F)generalizeFirstmaxstack)r   ra   r   )	r=  rq  r   r   r;  r   r   r   r   )r   ra   r   r   r   ri  r   
charStrings           r&   r   z$CFF2CharStringMergePen.getCharStringh  s     >**gi1DDD
 
  	)%-  H $H--!W+
 
 

 r(   )r6  )NNNT)r   r   r  r  r  rG  r  r,  rS  rW  r]  r`  rc  r   rg  rq  r   r3  r4  s   @r&   r   r     s       ** TX< < < < < < 
 
 

 
 
  &/ / /- - -/ / /
      
  7 7 7t HL       r(   r   N)F):collectionsr   fontTools.cffLibr   r   r   r   r   r	   r
   r   r   r   ior   fontTools.cffLib.specializerr   r   fontTools.ttLibr   	fontToolsr   fontTools.varLib.modelsr   fontTools.misc.loggingToolsr   fontTools.misc.roundToolsr   fontTools.misc.psCharStringsr   r   fontTools.pens.t2CharStringPenr   	functoolsr   errorsr   r   r   r   MergeDictErrorMergeTypeErrorrA   rE   rM   r~   rb   r   r   r   r   r   r   r   r   r   r   r   r"   r(   r&   <module>r     s   " " " " " "                              N N N N N N N N $ $ $ $ $ $       , , , , , , 9 9 9 9 9 9 / / / / / / I I I I I I I I : : : : : :                  )-; ; ; MNN% % ON%    q1 q1 q1h  ( ( (V :j"KLL	N 	N 	N   &   M M M`     2   <$ <$ <$ <$ <$5 <$ <$ <$~f f f f f_ f f f f fr(   