
    <`S                        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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(d Z)d Z*d Z+dZ,d Z-d Z.d Z/d Z0 edd          Z1d Z2d Z3d Z4d Z5 G d de          Z6 G d d e6          Z7 G d! d"e          Z8d#S )$    )
namedtuple)
maxStackLimitTopDictIndex
buildOrdertopDictOperatorstopDictOperators2privateDictOperatorsprivateDictOperators2FDArrayIndexFontDictVarStoreData)BytesIO)specializeCommandscommandsToProgram)newTable)varLib)allEqual)	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     4lib/python3.11/site-packages/fontTools/varLib/cff.py
<listcomp>z"addCFFVarStore.<locals>.<listcomp>%   s    555dT\555    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%   addCFFVarStorer@   #   s    V_55in55511.(KK,,\;GG6?+A. L999OA%O' / /hh	"" /%.H	 &%/ /r'   c                    | j         j        }t          d |d           }| j        j        |_        || _        |d         }t          |d          r|j        }nd }t          t                    }||_	        ||_
        t          |d          st                      x}|_        d |_        |j        |_        ||j        _        |j        }|j        r||j        _        n||_        t'                      }	|	                    d           |                    |	           ||	_        t          t,                    }
|Gt.          D ]?}|d         }||
vr1||j        v r|j        |= t          ||          rt3          ||           @n|j        }t          t,                    }
|D ]}	|	                    d           t5          |	j                                                  D ]3}||	j	        vr(|	j        |= t          |	|          rt3          |	|           4|	j        }t.          D ]?}|d         }||
vr1||j        v r|j        |= t          ||          rt3          ||           @t8          D ]?}|d         }||vr1||j        v r|j        |= t          ||          rt3          ||           @d| _        t=                      }|                     ||d           |                     d           | !                    ||d           d S )Nr   r*   r2   Tr      )isCFF2)"otFontgetGlyphOrderr   r0   itemsr4   r*   r   r   ordercff2GetGlyphOrderr   r2   stringsGlobalSubrsr>   CharStringscharStringsAreIndexedcharStringsIndexr   setCFF2appendr
   r	   rawDictdelattrlistkeysr   majorr   compileseek	decompile)r/   rD   rH   topDictDatar=   privateDictopOrderr>   charStringsr?   privateOpOrderentrykeyfiles                 r%   lib_convertCFFToCFF2r`   2   sK   Z-D"3T::%+q>GY +++'((.## - *nn,'GO'/+' ''#+& !*1;'' ;ZZ(
4	.. (344.$    u
(C
.  {"""

c
"S!!  k3 O'344.    hD8#((**++  s
(.  		#	# h!;$    u
(C
.  {"""

c
"S!!  k3    Ua#	W_gs GS 		T6$'''1tVD)))))r'   c                     | d         }t          |j        |            t          d          }|j        |_        || d<   | d= d S NzCFF r(   )r`   r/   r   )r5   cffTablenewCFF2s      r%   convertCFFtoCFF2re      sG    FOhlG,,,F|V___r'   c                 v    t          | t                    r#|                                 rt          |           S | S N)
isinstancefloat
is_integerint)nums    r%   conv_to_intrm      s5    sE s~~// 	S/r'   )
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_privater      sD     $!- $.>*2'''r'   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 )ab  
	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   Nr2   c                     g | ]	}|j         
S r!   )r2   r#   	fdTopDicts     r%   r&   z&merge_PrivateDicts.<locals>.<listcomp>   s    HHH)I%HHHr'   c                     g | ]}|gS r!   r!   r   s     r%   r&   z&merge_PrivateDicts.<locals>.<listcomp>   s    BBBIYKBBBr'   vsindexc                 *    g | ]}|j                  S r!   rP   r#   pdr^   s     r%   r&   z&merge_PrivateDicts.<locals>.<listcomp>   s    ---2rz#---r'   z\Warning: {key} in default font Private dict is missing from another font, and was discarded.)r^   Fc                 ,    g | ]\  }}||         z
  S r!   r!   )r#   ivalprev_val_lists      r%   r&   z&merge_PrivateDicts.<locals>.<listcomp>   s:     ' ' ' /# a(( ' ' 'r'   Tc                     g | ]
}|d          S r   r!   )r#   datas     r%   r&   z&merge_PrivateDicts.<locals>.<listcomp>   s    ...Ta...r'   c                 *    g | ]}|j                  S r!   r   r   s     r%   r&   z&merge_PrivateDicts.<locals>.<listcomp>   s    ,,,"bjo,,,r'   )r4   	enumerater2   r*   getattr	locationsindexrO   r   lenrP   rF   pd_blend_fieldsrh   rR   KeyErrorprintformatzip
IndexErrorr   r   	getDeltasrm   )!	top_dictsvsindex_dict	var_modelr}   r=   region_top_dictsrz   r{   	font_dictprivate_dictr   	sub_model_master_indiceslocr   pdslast_pdr|   r   num_mastersvaluedataListvaluesany_points_differval_listrel_listdeltasitemjjtemr^   r   s!                                  @@r%   merge_PrivateDictsr      s    Q<abbMQ++ CHH7GHHH..BB1ABBB.%go66 X( X(Xy",L)Q//' g&,)Q. $  c  %%)1	#'  bNHb&992 	j	BBG::b>>>>C+ (..00 A( A(jc58	   0-------VV   
6c6??$ $ $ X76lVV 7 7 7"3v6667 C+%M 
 
' ' ' 'H%%' ' 'X (:(: ]!!(++V !VAY__V  /..X...X,,,,,,,FF ##F++XXq	X 4   %X&& & &44 &t__ * *'!T#D))x{1~~*  %%hqkk& 8$$H'<CA(/X( X(s   E-FF	FF8c                 *    d| v r| d         S | d         S rb   r!   )fonts    r%   _cff_or_cff2r     s    
dNN	fV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 r   r!   )r#   r|   s     r%   
<dictcomp>zgetfd_map.<locals>.<dictcomp>(  s    111r!111r'   )	r   r   r/   r0   r4   ranger   rE   r   )r5   
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    1122<  %%)6q9$$  21eK00111&)	-$((**/00  \S'#*-
3 F6'?!,//  _R!//11,,0=a@.		,	, 
"#4Q#78?!"6/2#,? 11  |sG#$5c$:;O(J	Z^	
 	r'   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 r   )r   r/   r0   )r#   ttFonts     r%   r&   z&merge_region_fonts.<locals>.<listcomp>F  s;       	 &*1-  r'   r   )r/   r0   r   mappingmerge_charstringsr   r   r   r@   r7   r8   )	r5   modelordered_fonts_listr   r=   r   r   cvDatar}   s	            r%   merge_region_fontsr   D  s    6?+A.Y  %abb)    5=!!
JY
F
F
G/
0
0Iv2E6BBB 2    r'   c                     || vrd S | |         S rg   r!   )charstrings	glyphNames     r%   _get_csr   R  s    [  	Ir'   c                 T   g }| j         dd          D ]C}||vr|                    |           |                    |                    |                     Dt          j                            |d d          }t          |          }	|	||<   | |gf||	<   |                    |           |	S )Nr   F)supportsrO   r   r   r,   buildVarDatar   )
r   r^   r8   r   vsindex_by_keyr7   varTupleIndexessupportvar_datar   s
             r%   _add_new_vsindexr   W  s    qrr" 8 8WN""!!!--g667777N''uEE|#gHr'   c           
         i }i }g }g }|d         j         }t          |           D ]q\  }	fd|D             }
t          d |
D                       dk    r2|                    |
          \  }}|d         }t	          g |d          }t
          |_        |                    |           |dd          }t          |d          D ];\  }}|                    |           t
          |_        |                    |           <|	                    |j
        |j        |d          }||<   |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<   s|sd|z  }t!          ||||||           t#          |||          }|S )Nr   c                 :    g | ]}t          |j                  S r!   )r   rK   )r#   tdgnames     r%   r&   z%merge_charstrings.<locals>.<listcomp>m  s5       
 BNE""  r'   c                     g | ]}||S rg   r!   )r#   gss     r%   r&   z%merge_charstrings.<locals>.<listcomp>p  s    	0	0	0"r'   r   )startT)r   globalSubrsr   optimizeblendc              3      K   | ]}|d uV  	d S rg   r!   )r#   vs     r%   	<genexpr>z$merge_charstrings.<locals>.<genexpr>  s&      ,,atm,,,,,,r'   r   )T)r7   r8   r   )rK   r   r   getSubModelCFF2CharStringMergePenMergeOutlineExtractoroutlineExtractordrawrestartgetCharStringr   r   seen_movetoprogramtupler   r   r   )r   r   r   masterModelr   r   r7   r8   default_charstringsr   all_csr   model_csdefault_charstringvar_pen	region_cs
region_idxregion_charstringnew_csr^   r   r   r   s                         @r%   r   r   e  s|    |/Z(( 1- 1-ZS%     & 		0	0v	0	0	011Q66++F33/%  {"2uk1==' )>%'""" qrrl)'0!'D'D'D # ##j#
??:(=%'""""   %!-T ! # #&  &e

 7&.#@#@  	,,V,,,,,#!C 77	 ! ! !eS.,K! !777!
 \\ ),6>"1"
 	  +#;^\;     
{>! ! ! 	s   EF ?F c                       e Zd ZdZddZdS )CFFToCFF2OutlineExtractorz This 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 )NrB   r   )popallgotWidthr   defaultWidthXwidth)selfevenOddargss      r%   popallWidthz%CFFToCFF2OutlineExtractor.popallWidth  sS    	$	 TQ 8D"4:4=	+r'   Nr   )__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   z Used 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                 T    t                                          ||||||           d S rg   )super__init__)r  pen
localSubrsr   nominalWidthXr  r   	__class__s          r%   r  zMergeOutlineExtractor.__init__  s6    ''3
}g7 7 7 7 7r'   c                 l    |                                  }| j        t          |          dz  z   | _        |S )NrB   )r  	hintCountr   )r  r  s     r%   
countHintsz MergeOutlineExtractor.countHints  s0    					$>CIIN2$.	+r'   c                 <    | j                             ||           d S rg   )r  add_hint)r  typer  s      r%   _hint_opzMergeOutlineExtractor._hint_op  s     (D$r'   c                 Z    |                                  }|                     d|           d S )Nhstemr!  r%  r  r   r  s      r%   op_hstemzMergeOutlineExtractor.op_hstem  +    			$--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  +    			$--	4     r'   c                 Z    |                                  }|                     d|           d S )Nvstemhmr(  r)  s      r%   
op_vstemhmz MergeOutlineExtractor.op_vstemhm  r2  r'   c                     | j         s>|                                 }|r|                     d|           | j        dz   dz  | _         | j        d                             || j                   \  }}||fS )Nr4        )hintMaskBytesr!  r%  r   callingStackgetBytes)r  r   r  r:  s       r%   _get_hintmaskz#MergeOutlineExtractor._get_hintmask  s    		 2
//

4
 #MM)T"""!+14*2.77 -		r'   c                 r    |                      |          \  }}| j                            d|g           ||fS )Nhintmaskr=  r  add_hintmaskr  r   r:  s      r%   op_hintmaskz!MergeOutlineExtractor.op_hintmask  ?    ++E22%(
]O444		r'   c                 r    |                      |          \  }}| j                            d|g           ||fS )Ncntrmaskr@  rB  s      r%   op_cntrmaskz!MergeOutlineExtractor.op_cntrmask  rD  r'   rg   )r  r  r  r  r  r!  r%  r*  r.  r1  r5  r=  rC  rG  __classcell__r  s   @r%   r   r     s        * *
 *.7 7 7 7 7 7
  
         ! ! !! ! !    
      r'   r   c                   t     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.
	      ?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   rP  )r  default_commandsr   r   
master_idxrN  r  s         r%   r  zCFF2CharStringMergePen.__init__  s     ''4$  & & & $-#$.$, $$$$.u555$***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   )rS  rR  rO   rQ  r   r   r   )r  
point_type	pt_coordscmds       r%   	add_pointz CFF2CharStringMergePen.add_point  s    	\Q>*yk23333		&3	!f

&		CF	Q! ! ! q6==--1----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 rX  rS  rR  rO   rQ  r   r   r   )r  	hint_typer  r[  s       r%   r#  zCFF2CharStringMergePen.add_hint  s    	\Q>)dV,----		&3	!f	
%iCFVT^  q6==--1----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   r^  )r  r_  abs_argsr[  s       r%   rA  z#CFF2CharStringMergePen.add_hintmask  s    
 
\Q>)R)))>"xj)****		&3	!f	
%iCFVT^  ==A==		&3q6==--1----r'   c                     | j         sd| _         |                     |          }|                     d|           | j        dz
  | _        d S )NTrmovetor   )r   _pr\  rQ  rT  r  ptrZ  s      r%   _moveTozCFF2CharStringMergePen._moveTo/  sO    		 4ggbkk)..I&&& }q($r'   c                 \    |                      |          }|                     d|           d S )Nrlinetore  r\  rf  s      r%   _lineTozCFF2CharStringMergePen._lineTo8  s+    ggbkk)..I&&&&&r'   c                     | j         } ||           ||          z    ||          z   }|                     d|           d S )N	rrcurvetork  )r  pt1pt2pt3re  rZ  s         r%   _curveToOnez"CFF2CharStringMergePen._curveToOne<  sI    w"bggbbggobbgg%)..i(((((r'   c                     d S rg   r!   r  s    r%   
_closePathz!CFF2CharStringMergePen._closePathA      $r'   c                     d S rg   r!   rt  s    r%   _endPathzCFF2CharStringMergePen._endPathD  rv  r'   c                 0    d| _         || _        d| _        d S )Nr   )r   r   )rQ  rS  _p0)r  r  s     r%   r   zCFF2CharStringMergePen.restartG  s    $-$,$(((r'   c                     | j         S rg   )rR  rt  s    r%   getCommandsz"CFF2CharStringMergePen.getCommandsL  s
    	r'   c                    |D ]%}|d         }t          | }t          |          |d<   &d}|D ]}|d         }|dv rFt          |d                   }t          |          st          d          |d         d         g|d<   ns|d         }	g }
|	D ]a}t          |          r|
                    |d                    - ||          dd         }|d         g|z   }|
                    |           b|
|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?  rF  z3Hintmask values cannot differ between source fonts.)r   rR   r   r   rO   )r  commandsget_delta_funcr[  r  m_argslastOpopcoordcoords
new_coordsr   s               r%   reorder_blend_argsz)CFF2CharStringMergePen.reorder_blend_argsO  sA   "   c
a&4J6 LL3q66&  cA2 (((QLLEE?? SQRRRAhqk]CFFVFJ   a!!!! ~e$$QRR(fQxj6!eCF66	/r'   NTc                     | j         }|                     |t          |j        | j                            }|rt          |dt                    }t          |          }t          |||          }|S )NrO  F)generalizeFirstmaxstack)r   r   r   )	rR  r  r   r   rP  r   r   r   r   )r  r   r   r   r   r~  r   
charStrings           r%   r   z$CFF2CharStringMergePen.getCharString  s     ^($$Xw	8KSWS]/^/^/^__(    8 h'''w  * 
r'   )rK  )NNNT)r  r  r  r  r  r\  r#  rA  rh  rl  rr  ru  rx  r   r|  r  r   rH  rI  s   @r%   r   r     s         6 6 6 6 6 6   	 	 	  $) ) )' ' ') ) )
      
  / / /d &*"       r'   r   N)9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.roundToolsr   fontTools.misc.psCharStringsr   r   fontTools.pens.t2CharStringPenr   	functoolsr   errorsr   r   r   r   MergeDictErrorMergeTypeErrorr@   r`   re   rm   r   r   r   r   r   r   r   r   r   r   r	  r   r   r!   r'   r%   <module>r     s   " " " " " "                             ( ( ( ( ( ( ( ( $ $ $ $ $ $       , , , , , , / / / / / / I I I I I I I I : : : : : :      / / / / / / / / / / / / )-/ / /L* L* L*^      m( m( m(`  ( ( (V :j"KLL    
  E E EP     2   4 4 4 4 45 4 4 4n[ [ [ [ [_ [ [ [ [ [r'   