
    +gDD                        d 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	 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mZ ddlmZmZ ddlmZmZmZ  G d de      Z G d de      Z G d de      Z  G d de      Z! G d de      Z" G d de"      Z# G d de"      Z$d Z% G d de"      Z&ddd Z' G d! d"e      Z( G d# d$      Z)y%)&zGlyphSets returned by a TTFont.    )ABCabstractmethod)Mapping)contextmanager)copydeepcopy)SimpleNamespace)Vector)otRoundfixedToFloat)deprecateFunction)	TransformDecomposedTransform)TransformPenTransformPointPen)DecomposingRecordingPenlerpRecordingsreplayRecordingc                   t    e Zd ZdZdddZedefd       Zed        Zd Z	d	 Z
d
 Z ede      d        Zy)_TTGlyphSetzlGeneric dict-like GlyphSet class that pulls metrics from hmtx and
    glyph shape from TrueType or CFF.
    TrecalcBoundsc                p   || _         || _        d| j                  v r2| j                  d   j                  D ci c]  }|j                  d c}ni | _        ||ni | _        i | _        ||ni | _        d| _        g | _	        g | _
        || _        |d   j                  | _        t        |j                  d      dd       | _        d | _        |reddlm} t        |j                  d      dd       | _        | j"                  1 || j"                  j(                  |d   j                  |      | _        y y y c c}w )	Nfvarr   hmtxvmtxmetricsVarStoreInstancerHVARtable)r   fontaxesaxisTagdefaultLocationNormalizedlocationrawLocationoriginalLocationdepthlocationStackrawLocationStackglyphsMappingr   hMetricsgetattrgetvMetrics	hvarTablefontTools.varLib.varStorer   VarStorehvarInstancer)selfr"   r&   r,   r   axisr   s          r/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/fontTools/ttLib/ttGlyphSet.py__init__z_TTGlyphSet.__init__   s)   (	 " *.6):)?)?@T\\1_@ 	&
 %-$8b,4,@b
 "*V,, 0)TBC$TXXf%5wEDN~~)%6NN++T&\->->&" *	  As   D3resetc              #     K   | j                   j                  | j                         | j                  j                  | j                         |r?| j
                  j                         | _        | j                  j                         | _        n&| j                  j                         | _        i | _        | j                  j                  |       | j                  j                  |       	 d  | j                   j                         | _        | j                  j                         | _        y # | j                   j                         | _        | j                  j                         | _        w xY wwN)
r*   appendr&   r+   r'   r(   r   r%   updatepop)r5   r&   r9   s      r7   pushLocationz_TTGlyphSet.pushLocation5   s    !!$--0$$T%5%56 11668DM#==BBDD MM..0DM!DX&)	;J ..224DM#4488:D !..224DM#4488:Ds   C(E1+D. /?E1.A E..E1c              #      K   	 | j                   }| xj                   dz  c_         | | xj                   dz  c_         y # | xj                   dz  c_         w xY ww)N   )r)   )r5   r)   s     r7   	pushDepthz_TTGlyphSet.pushDepthH   s@     	JJEJJ!OJKJJ!OJDJJ!OJs   A%? AAAc                     || j                   v S r;   r,   r5   	glyphNames     r7   __contains__z_TTGlyphSet.__contains__Q   s    D....    c                 H    t        | j                  j                               S r;   )iterr,   keysr5   s    r7   __iter__z_TTGlyphSet.__iter__T   s    D&&++-..rH   c                 ,    t        | j                        S r;   )lenr,   rL   s    r7   __len__z_TTGlyphSet.__len__W   s    4%%&&rH   z#use 'glyphName in glyphSet' instead)categoryc                     || j                   v S r;   rD   rE   s     r7   has_keyz_TTGlyphSet.has_keyZ   s     D....rH   N)__name__
__module____qualname____doc__r8   r   boolr?   rB   rG   rM   rP   r   DeprecationWarningrS    rH   r7   r   r      sp     GK 8 ;D ; ;$  //' -8J//rH   r   c                   &     e Zd Zd fd	Zd Z xZS )_TTGlyphSetGlyfc                     |d   | _         t        | 	  ||| j                   |       |j                  d      | _        y )Nglyfr   gvar)	glyfTablesuperr8   r/   	gvarTable)r5   r"   r&   r   	__class__s       r7   r8   z_TTGlyphSetGlyf.__init__b   s8    fxlS&)rH   c                 2    t        | || j                        S )Nr   )_TTGlyphGlyfr   rE   s     r7   __getitem__z_TTGlyphSetGlyf.__getitem__g   s    D)$:K:KLLrH   )TrT   rU   rV   r8   rf   __classcell__rc   s   @r7   r\   r\   a   s    *
MrH   r\   c                   @     e Zd Z fdZd Zd Zedefd       Z xZ	S )_TTGlyphSetCFFc                     d|v rdnd}t        ||   j                  j                               d   j                  | _        t
        |   ||| j                         | j                  |       y )NCFF2zCFF r   )listcffvaluesCharStringscharStringsra   r8   setLocation)r5   r"   r&   tableTagrc   s       r7   r8   z_TTGlyphSetCFF.__init__l   s`    #t^6X 2 2 9 9 ;<Q?KKx)9)9:"rH   c                     t        | |      S r;   )_TTGlyphCFFrE   s     r7   rf   z_TTGlyphSetCFF.__getitem__r   s    4++rH   c                     d | _         |r]ddlm} t        | j                  dd       }|= ||j
                  | j                  d   j                  |      }|j                  | _         y y d | _         y )Nr   r   varStorer   )	blenderr2   r   r.   rr   
otVarStorer"   r#   interpolateFromDeltas)r5   r&   r   rx   	instancers        r7   rs   z_TTGlyphSetCFF.setLocationu   so     Dt//TBH#-''6):)?)?	  )>>	 $  DLrH   r9   c              #     K   | j                  |       t        j                  | ||      5 }	 | | j                  | j                         	 d d d        y # | j                  | j                         w xY w# 1 sw Y   y xY wwr;   )rs   r   r?   r&   )r5   r&   r9   values       r7   r?   z_TTGlyphSetCFF.pushLocation   ss     "%%dHe< 	00  /		0 	0   /		0 	0s2   )BA6AA6	BA33A66A?;B)
rT   rU   rV   r8   rf   rs   r   rX   r?   rh   ri   s   @r7   rk   rk   k   s-    #,   0D 0 0rH   rk   c                   $     e Zd Z fdZd Z xZS )_TTGlyphSetVARCc                 ^    || _         t        | 	  |||       |d   j                  | _        y )NVARC)glyphSetra   r8   r!   	varcTable)r5   r"   r&   r   rc   s       r7   r8   z_TTGlyphSetVARC.__init__   s,     x2f++rH   c                     | j                   }||j                  j                  vr| j                  |   S t	        | |      S r;   )r   Coverageglyphsr   _TTGlyphVARC)r5   rF   varcs      r7   rf   z_TTGlyphSetVARC.__getitem__   s9    ~~DMM000==++D),,rH   rg   ri   s   @r7   r   r      s    ,
-rH   r   c                   2    e Zd ZdZdddZed        Zd Zy)_TTGlyphaS  Glyph object that supports the Pen protocol, meaning that it has
    .draw() and .drawPoints() methods that take a pen object as their only
    argument. Additionally there are 'width' and 'lsb' attributes, read from
    the 'hmtx' table.

    If the font contains a 'vmtx' table, there will also be 'height' and 'tsb'
    attributes.
    Tr   c                   || _         || _        || _        |j                  |   \  | _        | _        |j                  |j                  |   \  | _        | _        nd\  | _        | _        |j                  r|j                  w|j                  j                  |j                  j                  |      n"|j                  j                  j                  |   }| xj                  |j                  |   z  c_        y y y )NNN)r   namer   r-   widthlsbr0   heighttsbr&   r1   AdvWidthMapr"   
getGlyphIDmappingr4   )r5   r   rF   r   varidxs        r7   r8   z_TTGlyph.__init__   s     	('00;
DH($,$5$5i$@!DK$.!DK!3!3!? %%119 ((3''33;;IF 
 JJ(0088J "@rH   c                     t         )dDraw the glyph onto ``pen``. See fontTools.pens.basePen for details
        how that works.
        )NotImplementedErrorr5   pens     r7   drawz_TTGlyph.draw   s
    
 "!rH   c                 >    ddl m} | j                   ||             y)eDraw the glyph onto ``pen``. See fontTools.pens.pointPen for details
        how that works.
        r   )SegmentToPointPenN)fontTools.pens.pointPenr   r   )r5   r   r   s      r7   
drawPointsz_TTGlyph.drawPoints   s     	>		#C()rH   N)rT   rU   rV   rW   r8   r   r   r   rZ   rH   r7   r   r      s+     =A 9$ " "*rH   r   c                   $    e Zd Zd Zd Zd Zd Zy)re   c                     | j                         \  }}| j                  j                         5 }|rd}|j                  || j                  j                  |       ddd       y# 1 sw Y   yxY w)r   r   N)_getGlyphAndOffsetr   rB   r   r`   r5   r   glyphoffsetr)   s        r7   r   z_TTGlyphGlyf.draw   s_     //1v]]$$& 	=%JJsDMM33V<		= 	= 	=   ,A##A,c                     | j                         \  }}| j                  j                         5 }|rd}|j                  || j                  j                  |       ddd       y# 1 sw Y   yxY w)r   r   N)r   r   rB   r   r`   r   s        r7   r   z_TTGlyphGlyf.drawPoints   se     //1v]]$$& 	C%S$--"9"96B		C 	C 	Cr   c                    | j                   j                  r'| j                   j                  | j                         }n#| j                   j                  | j
                     }t        |d      r| j                  |j                  z
  nd}||fS )NxMinr   )	r   r&   rb   _getGlyphInstancer`   r   hasattrr   r   )r5   r   r   s      r7   r   z_TTGlyphGlyf._getGlyphAndOffset   sk    ==!!dmm&=&=&I**,EMM++DII6E*1%*@EJJ&af}rH   c           	         ddl m} ddlm} ddlm} | j                  }|j                  }|j                  j                  | j                     }|j                  }|j                  }|j                  | j                  ||      \  }	}
d\  }}|D ]  } ||j                  |j                        }|s#|j                   }d |v rY|M|j                  | j                  ||      \  }}|d   dk\  r|d   nt#        t%        t'        |d                     } ||||      }|	 ||      |z  z  }	 t)        || j                           }t+        ||	|| j,                        \  }}}}|| _        || _        |j2                  || _        || _        |S )Nr   )	iup_delta)GlyphCoordinates)supportScalarr   rA   r   )fontTools.varLib.iupr   fontTools.ttLib.tables._g_l_y_fr   fontTools.varLib.modelsr   r   r`   rb   
variationsr   r-   r0   _getCoordinatesAndControlsr&   r#   coordinatesrn   rangerO   r   _setCoordinatesr   r   r   r1   r   r   )r5   r   r   r   r   r`   r   r-   r0   r   _
origCoordsendPtsvarscalardeltacontrolr   r   r   r   r   s                         r7   r   z_TTGlyphGlyf._getGlyphInstance   s   2D9==&&	''22499=
$$$$"==IIx
Q (
F 	<C"8#4#4chh?FOOEu}%*3*N*N		8X+'J '.ajAo
4c'RS*o@V;W  "%V<+E2V;;K	<  Ytyy)*"1;	8I8I#
sFC %DJ DKrH   N)rT   rU   rV   r   r   r   r   rZ   rH   r7   re   re      s    
=
C(rH   re   c                       e Zd Zd Zy)rv   c                     | j                   j                  | j                     j                  || j                   j                         y)r   N)r   rr   r   r   ry   r   s     r7   r   z_TTGlyphCFF.draw  s1     	!!$)),11#t}}7L7LMrH   N)rT   rU   rV   r   rZ   rH   r7   rv   rv     s    NrH   rv   c                 J   | j                   dk(  rU| j                  }||   j                  }|j                  |d      }| j                  }| j
                  }||cxk  xr |k  S c S | j                   dk(  r&| j                  }	|	|| j                     d   z  }	|	dkD  S | j                   dk(  r"| j                  D ]  }
t        |
|||      r y y| j                   dk(  r"| j                  D ]  }
t        |
|||      s y y| j                   dk(  rt        | j                  |||       S y)	NrA   r         FT      )Format	AxisIndexr$   r/   FilterRangeMinValueFilterRangeMaxValueDefaultValueVarIdxConditionTable_evaluateConditionconditionTable)	conditionfvarAxesr&   r|   	axisIndexr$   	axisValueminValuemaxValuer~   subconditions              r7   r   r     sJ   1''	9%--LL!,	0000900000			Q	&&9++,Q//qy			Q	%44 	L%lHh	R	 			Q	%44 	L!,(IN	 			Q	%$$h)
 
 	
 rH   c                       e Zd Zd Zd Zd Zy)r   c                 n   ddl m}m} | j                  }|j                  }|j
                  j                  j                  | j                        }|j                  j                  |   }ddlm}	 ddlm}
 |j                  d   j                   } |	|j"                  || j                  j$                        }|j&                  D ]  }|j(                  |j*                  z  rF|j,                  j.                  |j0                     }t3        ||| j                  j$                  |      sci }|j4                  |j6                  j8                  |j4                     }t;        |j<                        }|j>                  |k7  r|tA        ||j>                     d      z  }tC        |      tC        |      k(  sJ tC        |      tC        |      f       tE        ||      D ci c]  \  }}||   jF                  | }}}|jH                  |k7  r+||jH                     }tK        |      }|jM                  |       |jN                  }|j(                  |jP                  z  }| j                  j                  jS                  ||      5  | j                  jS                  ||      5  | j                  |jT                  k(  }|s2	 |jW                  |jT                  || j                  jX                         |r|j]                         }|jT                  | j                  k7  r| j                  n|j                  }||jT                     }|rt_        ||      }|ja                  |       ntc        ||      }|je                  |       ddd       ddd        yc c}}w # tZ        $ r d}Y w xY w# 1 sw Y   ,xY w# 1 sw Y   xY w)	r   r   )VarComponentFlagsNO_VARIATION_INDEX)MultiVarStoreInstancerr   r   N   T)3fontTools.ttLib.tables.otTablesr   r   r   r   r   r   indexr   VarCompositeGlyphsVarCompositeGlyphfontTools.varLib.multiVarStorer   r2   r   r"   r#   MultiVarStorer&   
componentsflagsHAVE_CONDITIONConditionListr   conditionIndexr   axisIndicesIndexAxisIndicesListItemr
   
axisValuesaxisValuesVarIndexfi2flrO   zipr$   transformVarIndexr   applyTransformDeltas	transformRESET_UNSPECIFIED_AXESr?   rF   addVarComponentr'   AttributeErrortoTransformr   r   r   r   )r5   r   
isPointPenr   r   r   r   idxr   r   r   r   r|   compr   r&   axisIndicesr   ivdeltasr   r9   shouldDecomposetcompGlyphSetgtPens                               r7   _drawz_TTGlyphVARC._drawA  sI   	

 ==!!mm""((3''99#>I?==(--*$--*@*@
	 $$ 6	)Dzz-<<< ..==d>Q>QR	)x)?)? H$$0"22778M8MN#DOO4
**.@@%	$2I2I(JB"OOJ;'3z?: $
O= :
 8;;
7S/3q!HQK''*  %%);;"4#9#9:~))&1IJJ!2!I!IIE''44XuE )]]//%@ )&*ii4>>&AO*3// $	4==;T;T '%113  $~~: !MM!)!2!2 %
 )8%#4S!#<DLL.#/Q#7DFF4L1)) );6	)$(  . 3.2O3) )) )sO   N9N*N31N$BN3N*N	NN	NN'#N**N4	c                 (    | j                  |d       y )NFr  r   s     r7   r   z_TTGlyphVARC.draw  s    

3rH   c                 (    | j                  |d       y )NTr  r   s     r7   r   z_TTGlyphVARC.drawPoints  s    

3rH   N)rT   rU   rV   r  r   r   rZ   rH   r7   r   r   @  s    L)\rH   r   Tr   c                   t        |      dk\  sJ |d   d   }|d   d   }|d   d   }|d   d   }t        d      D ]  }|d=  | j                         rt        |      t        | j                        k(  sJ | j                  D 	cg c]  }	t	        |	       c}	| _        t        || j                        D ]!  \  }
}	t        |	d      s|
\  |	_        |	_        # nI| j                  dk(  rt        |      dk(  s,J t        |      t        | j                        k(  sJ || _
        |r| j                  |       t        ||z
        }t        ||z
        }t        | j                  |z
        }t        || j                  z
        }||||fS c c}	w )	Nr   r   rA   x)rO   r   isCompositer   r   r   r   r  ynumberOfContoursr   r   r   r   yMax)r   coordr`   r   	leftSideX
rightSideXtopSideYbottomSideYr   r   phorizontalAdvanceWidthverticalAdvanceWidthleftSideBearingtopSideBearings                  r7   r   r     s   u:??b	!Ir1JRy|H)A,K1X "I 5zS!1!12222383C3CD4DJD5%"2"23 	#GAttS!!"	# 
		1	$5zQ5zS!2!23333!9%$Z)%;<"8k#9:ejj945OX

23N	 # Es   Fc                   0    e Zd ZdZddZd Zd Zd Zd Zy)	LerpGlyphSeta+  A glyphset that interpolates between two other glyphsets.

    Factor is typically between 0 and 1. 0 means the first glyphset,
    1 means the second glyphset, and 0.5 means the average of the
    two glyphsets. Other values are possible, and can be useful to
    extrapolate. Defaults to 0.5.
    c                 .    || _         || _        || _        y r;   )	glyphset1	glyphset2factor)r5   r  r  r   s       r7   r8   zLerpGlyphSet.__init__  s    ""rH   c                 h    || j                   v r|| j                  v rt        ||       S t        |      r;   )r  r  	LerpGlyphKeyErrorr5   	glyphnames     r7   rf   zLerpGlyphSet.__getitem__  s1    &9+FY--y!!rH   c                 >    || j                   v xr || j                  v S r;   )r  r  r$  s     r7   rG   zLerpGlyphSet.__contains__  s    DNN*JyDNN/JJrH   c                     t        | j                        }t        | j                        }t        |j	                  |            S r;   )setr  r  rJ   intersectionr5   set1set2s      r7   rM   zLerpGlyphSet.__iter__  s4    4>>"4>>"D%%d+,,rH   c                     t        | j                        }t        | j                        }t        |j	                  |            S r;   )r(  r  r  rO   r)  r*  s      r7   rP   zLerpGlyphSet.__len__  s4    4>>"4>>"4$$T*++rH   N)g      ?)	rT   rU   rV   rW   r8   rf   rG   rM   rP   rZ   rH   r7   r  r    s!    
"
K-
,rH   r  c                       e Zd Zd Zd Zy)r"  c                      || _         || _        y r;   )glyphsetr%  )r5   r%  r0  s      r7   r8   zLerpGlyph.__init__  s     "rH   c                    t        | j                  j                        }| j                  j                  | j                     j	                  |       t        | j                  j
                        }| j                  j
                  | j                     j	                  |       | j                  j                  }t        t        |j                  |j                  |      |       y r;   )
r   r0  r  r%  r   r  r   r   r   r~   )r5   r   
recording1
recording2r   s        r7   r   zLerpGlyph.draw  s    ,T]]-D-DE
/44Z@,T]]-D-DE
/44Z@%%z'7'79I9I6RTWXrH   N)rT   rU   rV   r8   r   rZ   rH   r7   r"  r"    s    #YrH   r"  N)*rW   abcr   r   collections.abcr   
contextlibr   r   r   typesr	   fontTools.misc.vectorr
   fontTools.misc.fixedToolsr   r   r   fontTools.misc.loggingToolsr   fontTools.misc.transformr   r   fontTools.pens.transformPenr   r   fontTools.pens.recordingPenr   r   r   r   r\   rk   r   r   re   rv   r   r   r   r  r"  rZ   rH   r7   <module>r>     s    % # # %  ! ( D 9 C G J/' J/ZMk M!0[ !0H
-k 
-)*s )*XJ8 JZN( N FS8 Sl >B #L,7 ,BY YrH   