
    huY                        S SK Jr  S SKJrJrJrJrJrJrJ	r	J
r
JrJr  S SKJr  S SKJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJr  S S
KJrJr  S SKJ r   S SK!J"r"  SSK#J$r$J%r%J&r&J'r'  \$r(\%r)S r*\" S5      S 5       r+S r,Sr-S r.S r/S r0S r1\" SS5      r2S r3S%S jr4S r5S r6 " S S\5      r7 " S  S!\75      r8 " S" S#\ 5      r9g$)&    )
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                    U S   nUR                    Vs/ s H  oUR                  PM     nn[        R                  R	                  X65      n[        R                  R                  Xr5      nU S   R                  R                  S   n	[        US9U	l	        U	R                  S   R                  cD  U	R                  n
U
 H1  n[        US5      (       d  M  U	R                  UR                  l        M3     g g s  snf )NfvarCFF2r   )
otVarStorePrivate)axesaxisTagr   builderbuildVarRegionListbuildVarStorecfftopDictIndexr   VarStoreFDArrayvstorehasattrr#   )varFontvarModelvarDataListmasterSupports	fvarTableaxisaxisKeysvarTupleListvarStoreCFFVtopDictfdArrayfontDicts               F/var/www/html/env/lib/python3.13/site-packages/fontTools/varLib/cff.pyaddCFFVarStorer<   &   s    I)28H8>>44^NL>>//JLfo!!..q1G#|<Gq  (//Hx++*1*:*:  '   ) 9s   C2z8Use fontTools.cffLib.CFFToCFF2.convertCFFToCFF2 instead.c                     SSK Jn  U" U 5      $ )Nr   )convertCFFToCFF2)fontTools.cffLib.CFFToCFF2r>   )r/   r>   s     r;   convertCFFtoCFF2r@   5   s    ;G$$    c                 p    [        U [        5      (       a   U R                  5       (       a  [        U 5      $ U $ N)
isinstancefloat
is_integerint)nums    r;   conv_to_intrI   <   s)    #u#.."2"23xJrA   )
BlueValues
OtherBluesFamilyBluesFamilyOtherBlues	BlueScale	BlueShiftBlueFuzzStdHWStdVW	StemSnapH	StemSnapVc                 L    X   nX1   nX%;   a  XR   nXF   R                   nU$ S nU$ rC   )r#   )regionFDArraysfd_indexrifd_mapregion_fdArrayregion_fd_mapregion_fdIndexprivates           r;   get_privater^   Q   sA    #'N$M	&* 088 N NrA   c           
         U S   nU SS n[        US   S5      (       a  U Vs/ s H  ofR                  PM     nnOU Vs/ s H  of/PM     nn[        UR                  5       GH  u  pU	R                  n
[	        U
SS5      nX   u  p/ nUR
                  SS  H2  nUR
                  R                  U5      S-
  nUR                  U5        M4     U
/nU
nU H)  n[        XxUU5      nUc  UnOUnUR                  U5        M+     [        U5      nU
R                  R                  5        GH  u  nn/ nU[        ;  a  M  [        U[        5      (       a   U Vs/ s H  nUR                  U   PM     nn [%        U6 n S/U-  nSnU Hn  n[        U5       VVs/ s H  u  nnUUU   -
  PM     nnnU(       d  [+        U5      (       d  S	nUnUR-                  U5      nUS   US'   UR                  U5        Mp     U(       d  U V s/ s H  n U S   PM
     nn OFU Vs/ s H  nUR                  U   PM     nn[+        U5      (       d  UR-                  U5      nOUS   n[        U[        5      (       aa  [        U5       HQ  u  nn![        U![        5      (       a(  [        U!5       H  u  n"n#[/        U#5      UU   U"'   M     MC  [/        U!5      UU'   MS     O[/        U5      nUU
R                  U'   GM     GM     gs  snf s  snf s  snf ! [         a    [!        SR#                  US95         GM  f = f! [&         a    [)        UUU5      ef = fs  snnf s  sn f s  snf )
ak  
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   Nr,   vsindexz\Warning: {key} in default font Private dict is missing from another font, and was discarded.)keyFT)r.   r,   	enumerater#   getattr	locationsindexappendr^   lenrawDictitemspd_blend_fieldsrD   listKeyErrorprintformatzip
IndexErrorr   r   	getDeltasrI   )$	top_dictsvsindex_dict	var_modelrY   r8   region_top_dicts	fdTopDictrV   rW   	font_dictprivate_dictr`   	sub_model_master_indiceslocipdslast_pdrX   pdnum_mastersra   valuedataListvaluesprev_val_listany_points_differval_listvalrel_listdeltasdataitemjjtems$                                       r;   merge_PrivateDictsr   \   sr   " lG }"I..=MN=M	++=MN7GH7G)+7GH(9 ((,	15 $,	&&qr*C##))#.2A!!!$ + n B^r6BB zJJrN ! #h&..446JCH/)%&&8;<"bjjoF<F &\F "#k 1$)! &HAJ8AT ATXa}Q//AT    .x7I7I,0)$,M&00:F !)F1IOOF+ !' )4<=HDQHH=478Cb"**S/C8''(226:H%ayH (D))(2GAt!$--'0GAt-8->HQKN (7 '2$&7  3 'x0(0L  %G 7/  : OH< = %%+VV_
  " F1#ufEEF$   >8sL   K5K:LK?/L2L.M	MM?L"L+*L+.Mc                 "    SU ;   a  U S   $ U S   $ )NzCFF r!    )fonts    r;   _cff_or_cff2r      s    ~F|<rA   c                    0 nUS   nUSS n[        U5      n[        U5      R                  R                  S   n[	        US5      (       d!  [        U5       Vs0 s H  owS_M     snUS'   U$ 0 nUR                  n	UR                  5       n
[        U	5       H  u  pXX   '   X;  d  M  0 X,'   M     [        U5       H  u  p}UR                  5       n[        U5      R                  R                  S   n[	        US5      (       d  XS      nSUU   U'   MY  UR                  n[        U5       H  u  pXU      nUU   nUU;  d  M  UUU'   M      M     U$ s  snf )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FDSelect)	rg   r   r)   r*   r.   ranger   getGlyphOrderrb   )r/   
fonts_listrY   default_fontregion_fontsnum_regionsr8   rX   gname_mappingdefault_fdSelect
glyphOrdergidfdIndexregion_fontregion_glyphOrderregion_topDictdefault_fdIndexregion_fdSelect
region_maps                      r;   	getfd_mapr      su    Fa=Lab>Ll#K<(,,99!<G7J'' &+;%78%7rU%78q	M''++-J!"23)0jo&  FO 4 %\2'557%k266CCAF~z22+a,@AO*+F?#B',55O )/ :"/#0F"G#O4
Z'%,JrN	 !; 3 M1 9s   ECVarDataz'varDataList masterSupports vsindex_dictc                    U S   R                   R                  S   nU/USS   Vs/ s H%  n[        U5      R                   R                  S   PM'     sn-   n[        UR                  5      n[        X7Xa5      n[        X5      n	[        XhR                  X5        [        XUR                  UR                  5        g s  snf )Nr!   r   r   )r)   r*   r   rg   mappingmerge_charstringsr   r   rs   r<   r1   r2   )
r/   modelordered_fonts_listr   r8   ttFontrr   r   cvDatarY   s
             r;   merge_region_fontsr     s    fo!!..q1G	?QRSRT?U?UVV  --a0?U I emm$Kz	IFw3Fy"5"5uE76#5#5v7L7LMs   ,B;c                 B   X;  a  g X   nU(       a  UR                  5         UR                  / :X  a  g [        UR                  5      S::  aS  UR                  S   S:X  a@  [        UR                  5      S:X  d&  [        UR                  S   5      [        [
        4;   a  g U$ )N   endcharr   r   )	decompileprogramrg   typerG   rE   )charstrings	glyphNamefilterEmptycss       r;   _get_csr     s~    #		B
::

Oq 

2)+RZZA%bjjm)<e)LIrA   c                 0   / nU R                   SS   H9  nXr;  a  UR                  U5        UR                  UR                  U5      5        M;     [        R                  R                  US S5      n[        U5      n	XU'   X/4X9'   UR                  U5        U	$ )Nr   F)supportsrf   re   r   r&   buildVarDatarg   )
r   ra   r2   rs   vsindex_by_keyr1   varTupleIndexessupportvar_datar`   s
             r;   _add_new_vsindexr   #  s     O>>!"%(!!'*~33G<= & ~~**?D%HH,G!3"ENLx NrA   c                 ~   0 n0 n/ n/ nUS   R                   n[        U 5       GHL  u  p[        U5       VVs/ s H  u  p[        UR                   XS:g  5      PM      nnnUR                  U5      u  pUS   n[	        / XS5      n[
        Ul        UR                  U5        USS  n[        USS9 H3  u  nnUR                  U5        [
        Ul        UR                  U5        M5     UR                  UR                  UR                  USS9nUX'   U(       d  M  UR                  (       a  SUR                  ;  a  GM  [        S U 5       5      n UU   nUS:w  d  GM;  US/UR                  S S& GMO     U(       d  S	U-  n[!        UUXtXV5        [#        UUUS
9nU$ s  snnf ! [         a    [!        UUXtXV5      n Nff = f)Nr   r   )startT)r]   globalSubrsrt   optimizeblendc              3   (   #    U  H  oS Lv   M
     g 7frC   r   ).0vs     r;   	<genexpr>$merge_charstrings.<locals>.<genexpr>e  s     26aTM6s   r`   )T)r1   r2   rs   )CharStringsrb   r   getSubModelCFF2CharStringMergePenMergeOutlineExtractoroutlineExtractordrawrestartgetCharStringr]   r   seen_movetor   tuplerl   r   r   )r   r   rr   masterModelrs   r   r1   r2   default_charstringsr   gnamer}   tdall_csr   model_csdefault_charstringvar_pen	region_cs
region_idxregion_charstringnew_csra   r`   r   s                            r;   r   r   3  s   LNKN#A,22
+
 AJ)@T
@TuqGBNNE62@T 	 
 &11&9 &a[(UC /D+( QRL	-6y-J)J)OOJ'1F.""7+ .K &&&..*66	 ' 
 &,"##)F  2622	$S)G a<")9!5FNN2Am ,v #nN	
 %!F MK
Z  	&sN.G	s   %FF!!F<;F<c                   "    \ rS rSrSrSS jrSrg)CFFToCFF2OutlineExtractori  zThis class is used to remove the initial width from the CFF
charstring without trying to add the width to self.nominalWidthX,
which is None.c                     U R                  5       nU R                  (       d3  U[        U5      S-  -  (       a  USS  nU R                  U l        SU l        U$ )Nr   r   )popallgotWidthrg   defaultWidthXwidth)selfevenOddargss      r;   popallWidth%CFFToCFF2OutlineExtractor.popallWidth  sH    {{}}}#d)a-(ABx++DJDMrA   )r   r   N)r   )__name__
__module____qualname____firstlineno____doc__r   __static_attributes__r   rA   r;   r   r     s    rA   r   c                   j   ^  \ rS rSrSr  SU 4S jjrS rS rS rS r	S r
S	 rS
 rS rS rSrU =r$ )r   i  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.c           	      *   > [         TU ]  XX4XVU5        g rC   )super__init__)	r   pen
localSubrsr   nominalWidthXr   r]   blender	__class__s	           r;   r   MergeOutlineExtractor.__init__  s     	[QX	
rA   c                 f    U R                  5       nU R                  [        U5      S-  -   U l        U$ )Nr   )r   	hintCountrg   )r   r   s     r;   
countHints MergeOutlineExtractor.countHints  s-    !#d)q.8rA   c                 :    U R                   R                  X5        g rC   )r   add_hint)r   r   r   s      r;   _hint_opMergeOutlineExtractor._hint_op  s    $%rA   c                 H    U R                  5       nU R                  SU5        g )Nhstemr  r  r   re   r   s      r;   op_hstemMergeOutlineExtractor.op_hstem       gt$rA   c                 H    U R                  5       nU R                  SU5        g )Nvstemr  r  s      r;   op_vstemMergeOutlineExtractor.op_vstem  r  rA   c                 H    U R                  5       nU R                  SU5        g )Nhstemhmr  r  s      r;   
op_hstemhm MergeOutlineExtractor.op_hstemhm       i&rA   c                 H    U R                  5       nU R                  SU5        g )Nvstemhmr  r  s      r;   
op_vstemhm MergeOutlineExtractor.op_vstemhm  r  rA   c                     U R                   (       d@  U R                  5       nU(       a  U R                  SU5        U R                  S-   S-  U l         U R                  S   R                  XR                   5      u  p1X4$ )Nr        r   )hintMaskBytesr  r  r  callingStackgetBytes)r   re   r   r   s       r;   _get_hintmask#MergeOutlineExtractor._get_hintmask  sk    !!??$Di."&..1"4!:D#004==eEWEWX##rA   c                 h    U R                  U5      u  pU R                  R                  SU/5        X!4$ )Nhintmaskr#  r   add_hintmaskr   re   r   s      r;   op_hintmask!MergeOutlineExtractor.op_hintmask  4    #11%8j=/:##rA   c                 h    U R                  U5      u  pU R                  R                  SU/5        X!4$ )Ncntrmaskr'  r)  s      r;   op_cntrmask!MergeOutlineExtractor.op_cntrmask  r,  rA   )r  r   )NN)r   r   r   r   r   r   r  r  r  r  r  r  r#  r*  r/  r   __classcell__r   s   @r;   r   r     sG    - 

&%%''$$
$ $rA   r   c                      ^  \ rS rSrSr SU 4S jjrS rS rS rS r	S r
S	 rS
 rS rS rS rS r SS jrSrU =r$ )r   i  z Pen to merge Type 2 CharStrings.c                    > [         TU ]  S S SUS9  SU l        Xl        X@l        X0l        SU l        SU l        X l        [        U[        S9U l
        g )NT)r   glyphSetr!   roundTolerancer   Fround)r   r   pt_index	_commandsm_indexr   prev_move_idxr   r   r   r8  )r   default_commandsr   r   
master_idxr6  r   s         r;   r   CFF2CharStringMergePen.__init__  s\     	D 	 	
 )!& "~U;
rA   c                 X   U R                   S:X  a  U R                  R                  X//5        OgU R                  U R                     nUS   U:w  a1  [	        XR                  [        US   5      US   U R                  5      eUS   R                  U5        U =R                  S-  sl        g Nr   r   )r;  r:  rf   r9  r   rg   r   )r   
point_type	pt_coordscmds       r;   	add_point CFF2CharStringMergePen.add_point  s    <<1NN!!:{";<../C1v#2s3q6{CFDNN  FMM)$rA   c                 X   U R                   S:X  a  U R                  R                  X//5        OgU R                  U R                     nUS   U:w  a1  [	        XR                  [        US   5      US   U R                  5      eUS   R                  U5        U =R                  S-  sl        g rA  r;  r:  rf   r9  r   rg   r   )r   	hint_typer   rD  s       r;   r  CFF2CharStringMergePen.add_hint  s    <<1NN!!9f"56../C1v"1}}c#a&k3q64>>  FMM$rA   c                    U R                   S:X  a<  U R                  R                  U/ /5        U R                  R                  SU//5        OU R                  U R                     nUS   U:w  a1  [	        XR                  [        US   5      US   U R                  5      eU =R                  S-  sl        U R                  U R                     nUS   R                  U5        U =R                  S-  sl        g )Nr    r   rH  )r   rI  abs_argsrD  s       r;   r(  #CFF2CharStringMergePen.add_hintmask  s    
 <<1NN!!9b/2NN!!2z"23../C1v"1}}c#a&k3q64>>  MMQM../CFMM(#rA   c                     U R                   (       d  SU l         U R                  U5      nU R                  SU5        U R                  S-
  U l        g )NTrmovetor   )r   _prE  r9  r<  r   ptrC  s      r;   _moveToCFF2CharStringMergePen._moveTo  sA    #DGGBK	y), "]]Q.rA   c                 J    U R                  U5      nU R                  SU5        g )NrlinetorQ  rE  rR  s      r;   _lineToCFF2CharStringMergePen._lineTo  s    GGBK	y),rA   c                 t    U R                   nU" U5      U" U5      -   U" U5      -   nU R                  SU5        g )N	rrcurvetorX  )r   pt1pt2pt3rQ  rC  s         r;   _curveToOne"CFF2CharStringMergePen._curveToOne  s4    WWsGbg%3/	{I.rA   c                     g rC   r   r   s    r;   
_closePath!CFF2CharStringMergePen._closePath!      rA   c                     g rC   r   rc  s    r;   _endPathCFF2CharStringMergePen._endPath$  rf  rA   c                 ,    SU l         Xl        SU l        g )Nr   )r   r   )r9  r;  _p0)r   r   s     r;   r   CFF2CharStringMergePen.restart'  s    !rA   c                     U R                   $ rC   )r:  rc  s    r;   getCommands"CFF2CharStringMergePen.getCommands,  s    ~~rA   c                    U H  nUS   n[        U6 n[        U5      US'   M      SnU H  nUS   nUS;   a6  [        US   5      n[        U5      (       d  [        S5      eUS   S   /US'   OpUS   n	/ n
U	 H_  n[        U5      (       a  U
R	                  US   5        M)  U" U5      SS nUS   /U-   nUR	                  S5        U
R	                  U5        Ma     XS'   UnM     U$ )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&  r.  z3Hintmask values cannot differ between source fonts.)ro   rk   r   r   rf   )r   commandsget_delta_funcrD  r   m_argslastOpopcoordcoords
new_coordsr   s               r;   reorder_blend_args)CFF2CharStringMergePen.reorder_blend_args/  s   , Cq6D$ZF &\CF  CQB 11SV*M   (1+AQ
#E"))%(3 "0!6qr!:!&q
V 3Q"))%0 $ $AF1 2 rA   c                     U R                   nU R                  U[        UR                  U R                  S95      nU(       a  [        US[        S9n[        U5      n[        XaUS9nU$ )Nr7  F)generalizeFirstmaxstack)r   r]   r   )	r:  ry  r   rq   r8  r   r   r   r   )r   r]   r   rt   r   rq  r   
charStrings           r;   r   $CFF2CharStringMergePen.getCharStringh  sl     >>**gi11D
 )%-H $H-!+

 rA   )	r:  rk  r   r;  r   r<  r9  r8  r   )g{Gz?)NNNT)r   r   r   r   r   r   rE  r  r(  rT  rY  r`  rd  rh  r   rn  ry  r   r   r1  r2  s   @r;   r   r     s[    * TX< 

&/-/

7t HL rA   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MergeTypeErrorr<   r@   rI   rj   r^   r   r   r   r   r   r   r   r   r   r   r   r   rA   r;   <module>r     s    "    N $  , 9 / I :   )-; MN% O%q1h(V j"KL	N& M` 2 <$5 <$~f_ frA   