
    +gh{                       d Z ddlZddlmZ ddlmZ ddlmZ ddl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mZ ddlmZmZmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z,m-Z.m/Z0m1Z2 ddl3m4Z4m5Z5 ddl6Z6ddl7Z7ddl8Z8ddl9Z9ddlm:Z: ddl;m<Z<m=Z=m>Z>m?Z?m@Z@ e<rddlAmBZB  e6j                  eD      ZE G d de:      ZF edg d      ZG eGeFj                  ddd       eGeFj                  ddd       eGeFj                  ddd       eGeFj                  ddd       eGeFj                  ddd       eGeFj                  ddd       eGeFj                  ddd       eGeFj                  ddd       eGeFj                  ddd      d 	ZQd! d" d# d$ d%ZRd& d' d( d) d%ZSd* ZTd+ ZU G d, d-      ZV G d. d/      ZW G d0 d1eX      ZY G d2 d3eX      ZZ G d4 d5eX      Z[ G d6 d7e[      Z\ G d8 d9e[      Z] G d: d;eX      Z^ G d< d=e[      Z_ G d> d?e[      Z` G d@ dAe%      Za G dB dCea      Zb G dD dEea      Zc G dF dGea      Zd G dH dIe&      ZedJZf G dK dL e)dM            Zg G dN dOe%      Zh G dP dQe%      Zi G dR dSe&      Zj G dT dUe&      Zk G dV dWe&      Zl G dX dYe&      Zm G dZ d[e&      Zn G d\ d]e%      Zo G d^ d_e%      Zp G d` dae%      Zq G db dce%      Zr G dd dee      Zs G df dg e)dM            Zt G dh di e)dM            Zu G dj dke      Zv G dl dme      Zw G dn doe      Zx G dp dq e)dM            Zydrdsdtdudvdwdxdydzd{d|d}d~dddZzd Z{d Z|d Z}d Z~d Zd Ze|e}e~deeddZd Zd Z e        d Zy)zfontTools.ttLib.tables.otTables -- A collection of classes representing the various
OpenType subtables.

Most are constructed upon import from data in otData.py, all are populated with
converter objects from otConverters.py.
    N)IntEnum)reduce)radians)defaultdict
namedtuple)OPTIMIZE_FONT_SPEED)TupleVariation)dfs_base_table)quantizeRect)otRound)	TransformIdentityDecomposedTransform)	bytesjoinpadsafeEval)Vector)ControlBoundsPen)TransformPen   )	BaseTableFormatSwitchingBaseTableValueRecordCountReference getFormatSwitchingBaseTableClass)fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloat)LookupDebugInfoLOOKUP_DEBUG_INFO_KEY)IntFlag)TYPE_CHECKINGIteratorListOptionalSet)_TTGlyphSetc                   L    e Z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ZdZdZdZdZy)VarComponentFlagsr                   @         i                 @  l      N)__name__
__module____qualname__RESET_UNSPECIFIED_AXES	HAVE_AXESAXIS_VALUES_HAVE_VARIATIONTRANSFORM_HAS_VARIATIONHAVE_TRANSLATE_XHAVE_TRANSLATE_YHAVE_ROTATIONHAVE_CONDITIONHAVE_SCALE_XHAVE_SCALE_YHAVE_TCENTER_XHAVE_TCENTER_YGID_IS_24BITHAVE_SKEW_XHAVE_SKEW_YRESERVED_MASK     w/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/fontTools/ttLib/tables/otTables.pyr*   r*   4   sW    #I!'$MNLLNNLKK)MrL   r*   VarTransformMappingValues)flagfractionalBitsscaledefaultValue      
   iL)	
translateX
translateYrotationscaleXscaleYskewXskewYtCenterXtCenterYc                 .    t        j                  d|       S )N>Bstructpackvs    rM   <lambda>rf   f       T1% rL   c                 .    t        j                  d|       S )N>Hra   rd   s    rM   rf   rf   g   rg   rL   c                 4    t        j                  d|       dd  S )N>Lr   ra   rd   s    rM   rf   rf   h   s    T1%ab) rL   c                 .    t        j                  d|       S )Nrk   ra   rd   s    rM   rf   rf   i   rg   rL   )r   r+      r,   c                 4    t        j                  d|       d   S )Nr`   r   rb   unpackrd   s    rM   rf   rf   l       tQ'* rL   c                 4    t        j                  d|       d   S )Nri   r   ro   rd   s    rM   rf   rf   m   rq   rL   c                 :    t        j                  dd| z         d   S )Nrk       r   ro   rd   s    rM   rf   rf   n   s    tUQY/2 rL   c                 4    t        j                  d|       d   S )Nrk   r   ro   rd   s    rM   rf   rf   o   rq   rL   c                    | |   }|dk  r||dz   fS |dk  r|dz
  dz  | |dz      z  |dz   fS |dk  r"|dz
  dz  | |dz      dz  z  | |dz      z  |dz   fS |d	k  r.|dz
  d
z  | |dz      dz  z  | |dz      dz  z  | |dz      z  |dz   fS |d	z
  dz  | |dz      d
z  z  | |dz      dz  z  | |dz      dz  z  | |dz      z  |dz   fS )zlRead a variable-length number from data starting at index i.

    Return the number and the next index.
    r1   r      r-   r+      r.   rm         r,   r/      rK   )dataib0s      rM   _read_uint32varr   s   sX    
aB	Dy1q5y	dT	a$q1u+-q1u44	dT	b 4A;!#33d1q5kA1q5HH	dT	b 4A;"#44tAE{a7GG$EK
 
q5 	 T	b 4A;"#44tAE{b7HH4EL
L a!e!e$ 	$rL   c                 L   | dk  rt        j                  d|       S | dk  rt        j                  d| dz        S | dk  rt        j                  d| dz        d	d
 S | dk  rt        j                  d| dz        S t        j                  dd      t        j                  d|       z   S )z:Write a variable-length number.

    Return the data.
    r1   r`   r7   ri      i    rk   i   r   Ni   l      @ ry   ra   rd   s    rM   _write_uint32varr      s    
 	4x{{4##	
V{{4!f*..	
X{{4!h,044	
Z{{4!j.22{{4&T1)===rL   c                   D    e Zd Zd ZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zy)VarComponentc                 $    | j                          y N)populateDefaultsselfs    rM   __init__zVarComponent.__init__   s    rL   Nc                     d| _         d | _        d | _        d | _        d| _        t
        | _        t
        | _        t               | _	        y )Nr   rK   )
flags	glyphNameconditionIndexaxisIndicesIndex
axisValuesNO_VARIATION_INDEXaxisValuesVarIndextransformVarIndexr   	transformr   
propagators     rM   r   zVarComponent.populateDefaults   sA    
" $"4!3,.rL   c                    dt              \  | _        | j                  t        j                  z  rdnd}t	        |   |z          }|z  |j
                  |   | _        t        j                  z  rt              \  | _        t        j                  z  rt              \  | _
        nd | _
        | j                  d}n'|d   j                  | j                     }t        |      }t        j                  z  r2t        j                  |      \  }t        d |D              | _        nd| _        t        | j                         |k(  sJ t        j"                  z  rt              \  | _        nt&        | _        t        j(                  z  rt              \  | _        nt&        | _        t-               | _        fd}	t0        j3                         D ]$  \  }
} |	|      }t5        | j.                  |
|       & t        j6                  z  s%| j.                  j8                  | j.                  _        t        j<                  z  }|rt              \  }||dz
  z  }|rd  S )	Nr   rm   r+   AxisIndicesListc              3   4   K   | ]  }t        |d         yw   N)fi2fl.0re   s     rM   	<genexpr>z)VarComponent.decompile.<locals>.<genexpr>   s     #EQE!RL#E   rK   c           	          | j                   z  rGt        t        j                  ddz          d   | j                        | j
                  z  }dz  |S | j                  S )N>hr+   r   )rO   r   rb   rp   rP   rQ   rR   )valuesre   r|   r   r}   s     rM   read_transform_componentz8VarComponent.decompile.<locals>.read_transform_component   sk    v{{"dDQUO<Q?AVAV ll#  Q***rL   r   )r   r   r*   rG   	_unpacker
glyphOrderr   rB   r   r<   r   Itemlenr	   decompileDeltas_tupler   r=   r   r   r>   r   r   r   VAR_TRANSFORM_MAPPINGitemssetattrrD   rY   rZ   rJ   )r   r|   font
localStategidSizeglyphIDnumAxesaxisIndicesr   r   	attr_namemapping_valuesvaluen_r   r}   s    `             @@rM   	decompilezVarComponent.decompile   sO   'a0
A

0===!1G$T!a'k%:;	W1$333%4T1%="D$...'6tQ'?$D!1$(D!  (G$%67<<T=R=RSK+&G$...*;;GT1MMJ##E*#EEDO DO4??#w...$???)8q)A&D#Q&8D#$<<<(7a(@%D"A%7D",.	+ *?)D)D)F 	6%I~,^<EDNNIu5	6 )666$(NN$9$9DNN!%333"4+DAqQJA  ABxrL   c                 z   |j                   t           }g }| j                  |j                  | j                        }|dkD  r1t
        j                  z  |j                  t        d   |             n1t
        j                   z  |j                  t        d   |             | j                  7t
        j                  z  |j                  t        | j                               t        | j                        }|rt
        j                  z  |j                  t        | j                               |j                  t!        j"                  | j                  D cg c]  }t%        |d       c}|              nt
        j                   z  | j&                  t(        k7  r8t
        j*                  z  |j                  t        | j&                               nt
        j*                   z  | j,                  t(        k7  r8t
        j.                  z  |j                  t        | j,                               nt
        j.                   z  fd}t0        j3                         D ]3  \  }}	t5        | j6                  |      }
|j                   ||
|	             5 t              t9        |      z   S c c}w )N  rm   r+   r   )optimizeSizec                     |j                   z  r7t        j                  dt        | |j                  z  |j
                              S y)Nr   rL   )rO   rb   rc   fl2firQ   rP   )r   r   r   s     rM   write_transform_componentz7VarComponent.compile.<locals>.write_transform_component  s@    v{{"{{% 4f6K6KL  rL   )cfgr   r   
getGlyphIDr   r*   rG   append_packerr   rB   r   r   r   r<   r   r	   compileDeltaValues_r   r   r   r=   r   r>   r   r   getattrr   r   )r   r   optimizeSpeedr|   r   r   re   r   r   r   r   r   s              @rM   compilezVarComponent.compile   sB   !45

//$..1U?&333EKK
7+,'4444EKK
7+,*&555EKK()<)<=>doo&&000EKK()>)>?@KK22+/??;aU1b\;%2!2 '1111E""&88&AAAEKK()@)@AB'BBBBE!!%77&>>>EKK()?)?@A'????E	 *?)D)D)F 	J%I~DNNI6EKK1%HI	J  &488= <s   J8c                    j                  d|       j                          dfd	} |d| j                         | j                   |d| j                         | j                   |d| j                         | j                  | j
                  t        j                  z  rW| j
                  t        j                  z  rd}nd} |d| j                  D cg c]  }t        t        |d	             c}|       | j                  t        k7  r |d
| j                         | j                  t        k7  r |d| j                         t        j                         D ]R  \  }}| j
                  |j                   z  s t#        | j$                  |      } ||t        ||j&                               T j)                  d       j                          y c c}w )Nr   rK   c                 \    |)j                  | d|ff|z          j                          y y )Nr   )	simpletagnewline)namer   attrswriters      rM   writez!VarComponent.toXML.<locals>.write-  s5       %(8':U'BC  !rL   r   r   r   ))resetUnspecifiedAxesr   r   r   r   r   )rK   )begintagr   r   r   r   r   r*   r;   r   floatfl2strr   r   r   r   r   rO   r   r   rP   endtag)r   r   ttFontr   r   re   r   mappings    `      rM   toXMLzVarComponent.toXML)  s   .	!
 	k4>>**"D$7$78  ,$d&;&;<!!-zz-DDDzz-DDD6,t O!va}!5 OQVW""&88&(?(?@!!%77%t'='=> #8"="="? 	@IwJJ-	2A)VAw'='=>?		@ 	n%! !Ps   G
c                    |D cg c]  }t        |t              s| }}| j                          |D ]/  \  }}}|rJ |d   }|dk(  r|| _        |dk(  rt	        |      | _        4|dk(  rt	        |      | _        J|dk(  r`t        d t	        |      D              | _        t	        |j                  dd            s| xj                  t        j                  z  c_	        |d	k(  rt	        |      | _        |d
k(  rt	        |      | _        |t        v rHt        | j                   |t	        |             | xj                  t        |   j"                  z  c_	        +J |        y c c}w )Nr   r   r   r   r   c              3   4   K   | ]  }t        |d         ywr   )str2flr   s     rM   r   z'VarComponent.fromXML.<locals>.<genexpr>b  s     'K!q"'Kr   r   0r   r   )
isinstancer   r   r   r   r   r   r   getr   r*   r;   r   r   r   r   r   rO   )r   r   r   contentr   cre   s          rM   fromXMLzVarComponent.fromXMLR  sH   %>Au)=1>>$+ 	# D%;gA{"!"))&.qk#++(0%%"''Kx{'K"KEII&<cBCJJ"3"J"JJJ--*21+',,)1!&..NNQK
 

3D9>>>
"d"u5	#	 ?s
   E'E'c           	          d fd}t         j                         D ];  \  }} ||      }t         j                  |t	         j                  |      |z          =  j
                  t        j                  z  s% j                  j                   j                  _	        t              k(  sJ t              f       y )Nr   c                     j                   | j                  z  r-t           | j                        | j                  z  }dz  |S y)Nr   r   )r   rO   r   rP   rQ   )r   re   deltasr}   r   s     rM   read_transform_component_deltazIVarComponent.applyTransformDeltas.<locals>.read_transform_component_deltav  sC    zzFKK'&)V%:%:;fllJQrL   )r   r   r   r   r   r   r*   rD   rY   rZ   r   )r   r   r   r   r   r   r}   s   ``    @rM   applyTransformDeltasz!VarComponent.applyTransformDeltass  s    	 *?)D)D)F 	%I~2>BE	74>>9+MPU+U	 

.;;;$(NN$9$9DNN!CK1!S[!11rL   c                 n    t        |       t        |      k7  rt        S | j                  |j                  k(  S r   )typeNotImplemented__dict__)r   others     rM   __eq__zVarComponent.__eq__  s+    :e$!!}}..rL   c                 >    | j                  |      }|t        u r|S | S r   )r   r   )r   r   results      rM   __ne__zVarComponent.__ne__  s$    U#>1vA6zArL   r   )r8   r9   r:   r   r   r   r   r   r   r   r   r   rK   rL   rM   r   r      s5     /DL89t'R#B2./
BrL   r   c                   ,    e Zd ZddZd Zd Zd Zd Zy)VarCompositeGlyphNc                 &    ||| _         y g | _         y r   
components)r   r   s     rM   r   zVarCompositeGlyph.__init__  s    (2(>*BrL   c                     g | _         |r<t               }|j                  |||      }| j                   j                  |       |r;y y r   )r   r   r   r   )r   r|   r   r   	components        rM   r   zVarCompositeGlyph.decompile  s>    $I&&tT:>DOO""9- rL   c                 ~    g }| j                   D ]"  }|j                  |j                  |             $ t        |      S r   )r   r   r   r   )r   r   r|   r   s       rM   r   zVarCompositeGlyph.compile  s;     	1IKK	))$/0	1rL   c                     |j                  d|       |j                          t        | j                        D ]  \  }}|j	                  ||d|fg        |j                  d       |j                          y )Nr   index)r   r   	enumerater   r   r   )r   	xmlWriterr   r   r   r}   r   s          rM   r   zVarCompositeGlyph.toXML  sl    .6%doo6 	=LAyOOItwl^<	=,-rL   c                     |D cg c]  }t        |t              s| }}|D ]F  \  }}}|dk(  sJ t               }|j                  ||||       | j                  j                  |       H y c c}w )Nr   )r   r   r   r   r   r   )r   r   r   r   r   r   r   s          rM   r   zVarCompositeGlyph.fromXML  st    %>Au)=1>>$+ 	. D%>)))$IdE7D9OO""9-		. ?s
   A-A-r   )r8   r9   r:   r   r   r   r   r   rK   rL   rM   r   r     s    G..rL   r   c                       e Zd Zd Zy)AATStateTablec                 .    i | _         g | _        g | _        y r   )GlyphClassesStatesPerGlyphLookupsr   s    rM   r   zAATStateTable.__init__  s    !rL   Nr8   r9   r:   r   rK   rL   rM   r   r     s    "rL   r   c                       e Zd Zd Zy)AATStatec                     i | _         y r   )Transitionsr   s    rM   r   zAATState.__init__  s
    rL   Nr  rK   rL   rM   r  r    s    rL   r  c                   ,    e Zd ZdZed        Zd Zd Zy)	AATActionNc                      y)NNNrK   )r   statess     rM   compileActionszAATAction.compileActions  s    rL   c                 H   | j                   D cg c]  }| j                  |   s| }}|r2|j                  ddj                  |             |j	                          | j
                  dk7  r1|j                  dd| j
                  z         |j	                          y y c c}w )NFlags,r   r   ReservedFlagsz0x%04X)_FLAGSr   r   joinr   r  )r   r   fr   s       rM   _writeFlagsToXMLzAATAction._writeFlagsToXML  s     KK<q4==+;<<sxx?"x$BTBT7TU #	 =s
   BBc                 R    || j                   v s
J d|z         d| j                  |<   y )Nzunsupported flag %sT)r  r   r   rO   s     rM   _setFlagzAATAction._setFlag  s-    t{{"@$9D$@@""drL   )r8   r9   r:   r  staticmethodr  r  r  rK   rL   rM   r  r    s#    F  #rL   r  c                       e Zd ZdZdZg dZi ddddddd	d
ddddddddddddddddddddddd d!Zd" Zd# Zd$ Z	d% Z
d& Zy')(RearrangementMorphActionr,   r   )	MarkFirstDontAdvanceMarkLastz	no changer   u	   Ax ⇒ xAr+   u	   xD ⇒ Dxrm   u   AxD ⇒ DxAu   ABx ⇒ xABr{   u   ABx ⇒ xBA   u   xCD ⇒ CDx   u   xCD ⇒ DCxr-   u   AxCD ⇒ CDxA	   u   AxCD ⇒ DCxArU   u   ABxD ⇒ DxAB   u   ABxD ⇒ DxBArS   u   ABxCD ⇒ CDxAB   u   ABxCD ⇒ CDxBAr   u   ABxCD ⇒ DCxAB   u   ABxCD ⇒ DCxBAc                 X    d| _         d| _        d| _        d| _        d| _        d| _        y Nr   F)NewStateVerbr  r  r  r  r   s    rM   r   z!RearrangementMorphAction.__init__  s.    	 rL   c                 Z   |J |j                  | j                         | j                  dk\  r| j                  dk  sJ | j                         | j                  | j                  z  }| j                  r|dz  }| j
                  r|dz  }| j                  r|dz  }|j                  |       y )Nr   r$  r   r7   r6   )writeUShortr'  r(  r  r  r  r  r   r   r   actionIndexr   s        rM   r   z RearrangementMorphAction.compile  s    """4==)yyA~$))r/<499<1		D...>>VOEVOE==VOE5!rL   c                     |J |j                         | _        |j                         }|dz  | _        t        |dz        | _        t        |dz        | _        t        |dz        | _        |dz  | _        y )Nr$  r   r7   r6   i  )
readUShortr'  r(  boolr  r  r  r  r   readerr   actionReaderr   s        rM   r   z"RearrangementMorphAction.decompile  st    ###))+!!#CK	efn-/UV^,"V^rL   c                     |j                   |fi | |j                          |j                  d| j                         |j                          | j	                  |       |j                  d| j
                         | j                  j                  | j
                        }||j                  |       |j                          |j                  |       |j                          y )Nr'  r  r(  )
r   r   r   r'  r  r(  _VERBSr   commentr   )r   r   r   r   r   verbComments         rM   r   zRearrangementMorphAction.toXML  s    	4)5)Jdmm<i(F$))4kkoodii0"k*rL   c                    dx| _         x| _        | _        dx| _        x| _        | _        |D cg c]  }t        |t              s| }}|D ]  \  }}}|dk(  rt        |d         | _          |dk(  rt        |d         | _        9|dk(  rt        |d         | _        R|dk(  sX|d   j                  d      D ]!  }	| j                  |	j                                #  y c c}w )	Nr   Fr'  r   r(  r  r  r  )r'  r(  r  r  r  r  r   r   r   splitr  strip
r   r   r   r   r   teltNameeltAttrs
eltContentrO   s
             rM   r   z RearrangementMorphAction.fromXML  s    9:::	D$6<AAA)DM%>Au)=1>>-4 		0)GXz*$ ('): ;F"$Xg%67	O+%-hw.?%@"G#$W-33C8 0DMM$**,/0		0 ?s   C C N)r8   r9   r:   
staticSizeactionHeaderSizer  r4  r   r   r   r   r   rK   rL   rM   r  r    s    J5F	;	; 	
; 	
=	
 	
= 	
= 	
= 	
= 	
? 	
? 	O 	O 	 	 	  	!F&",0rL   r  c                   :    e Zd ZdZdZddgZd Zd Zd Zd Z	d	 Z
y
)ContextualMorphActionr-   r   SetMarkr  c                 \    d| _         d\  | _        | _        d| _        d\  | _        | _        y )Nr   FFr   r   )r'  rC  r  r  	MarkIndexCurrentIndexr   s    rM   r   zContextualMorphAction.__init__1  s/    )5&d&,:))rL   c                 ,   |J |j                  | j                         | j                  }| j                  r|dz  }| j                  r|dz  }|j                  |       |j                  | j
                         |j                  | j                         y )Nr   r7   )r*  r'  r  rC  r  rG  rH  r+  s        rM   r   zContextualMorphAction.compile7  s    """4==)""<<VOEVOE5!4>>*4,,-rL   c                 
   |J |j                         | _        |j                         }t        |dz        | _        t        |dz        | _        |dz  | _        |j                         | _        |j                         | _        y )Nr   r7   i?  )r.  r'  r/  rC  r  r  rG  rH  r0  s        rM   r   zContextualMorphAction.decompileC  sz    ###))+!!#EFN+/"V^**,"--/rL   c                     |j                   |fi | |j                          |j                  d| j                         |j                          | j	                  |       |j                  d| j
                         |j                          |j                  d| j                         |j                          |j                  |       |j                          y )Nr'  r  rG  rH  )r   r   r   r'  r  rG  rH  r   r   r   r   r   r   s        rM   r   zContextualMorphAction.toXMLM  s    	4)5)Jdmm<i(Kt~~>N$2C2CDrL   c                    dx| _         | _        dx| _        | _        d\  | _        | _        |D cg c]  }t        |t              s| }}|D ]  \  }}}|dk(  rt        |d         | _          |dk(  r9|d   j                  d      D ]!  }	| j                  |	j                                # ^|dk(  rt        |d         | _        w|d	k(  rt        |d         | _        |d
k(  st        |d         | _         y c c}w )Nr   FrF  r'  r   r  r  r  rG  rH  )r'  r  rC  r  rG  rH  r   r   r   r8  r  r9  r:  s
             rM   r   zContextualMorphAction.fromXMLZ  s   -..**//t',:))%>Au)=1>>-4 	@)GXz*$ ('): ;G#$W-33C8 0DMM$**,/0O+%-hw.?%@"K'!)(7*;!<N*$,Xg->$?!	@ ?s   C:C:N)r8   r9   r:   r?  r@  r  r   r   r   r   r   rK   rL   rM   rB  rB  ,  s1    J'F;
.0@rL   rB  c                       e Zd Zd Zy)	LigActionc                      d| _         d| _        y )NFr   )StoreGlyphIndexDeltar   s    rM   r   zLigAction.__init__n  s    
  !rL   Nr  rK   rL   rM   rO  rO  m  s    !rL   rO  c                   V    e Zd ZdZdZddgZd Zd Zd Ze	d        Z
d	 Zd
 Zd Zd Zy)LigatureMorphActionr  rS   SetComponentr  c                 L    d| _         d\  | _        | _        d| _        g | _        y )Nr   rE  )r'  rU  r  r  Actionsr   s    rM   r   zLigatureMorphAction.__init__  s(    .:+4+rL   c                    |J |j                  | j                         | j                  }| j                  r|dz  }| j                  r|dz  }t        | j                        dkD  r|dz  }|j                  |       t        | j                        dkD  r%| j                         }|j                  ||          y |j                  d       y )Nr   r7   r   r6   )r*  r'  r  rU  r  r   rW  compileLigActions)r   r   r   r,  r   actionss         rM   r   zLigatureMorphAction.compile  s    &&&4==)""VOEVOEt||q VOE5!t||q ,,.G{734q!rL   c                 4   |J |j                         | _        |j                         }t        |dz        | _        t        |dz        | _        t        |dz        }|dz  | _        |j                         }|r| j                  ||      | _        y g | _        y )Nr   r7   r6   i  )r.  r'  r/  rU  r  r  _decompileLigActionsrW  )r   r1  r   r2  r   performActionr,  s          rM   r   zLigatureMorphAction.decompile  s    '''))+!!# 0/UV^, #V^'')44\;ODLDLrL   c                    dt               i }}}|D ]C  }|j                  j                         D ]$  \  }}|j                  |j	                                & E t        |d       D ]O  }||vst        dt        |      d      D ]*  }	||	d  }
t        |      |	z   dz  }|j                  |
|       , ||z  }Q t        |d      }||fS )NrL   c                     t        |        | fS r   r   xs    rM   rf   z4LigatureMorphAction.compileActions.<locals>.<lambda>  s    Q| rL   keyr   r,   )
setr  r   addrY  sortedranger   
setdefaultr   )r   r  r   rZ  r,  state_glyphClasstransar}   suffixsuffixIndexs               rM   r  z"LigatureMorphAction.compileActions  s    '*CE2 	7E&+&7&7&=&=&? 7"UE33567	7 %;< 	A#q#a&!, @AqrUF#&v;?q"8K**6;?@ !	 VQ$$rL   c                 ,   g }t        | j                        D ]p  \  }}|t        | j                        dz
  k(  }|j                  dz  }||rdndz  }||j                  rdndz  }|j                  t        j                  d|             r t        |      S )Nr   ?        r      @rk   )	r   rW  r   rR  rQ  r   rb   rc   r   )r   r   r}   actionlastr   s         rM   rY  z%LigatureMorphAction.compileLigActions  s    "4<<0 	4IAvDLL)A--D**Z7E4ZQ.E6<<ZQ6EMM&++dE23	4   rL   c                    g }d}|j                  |j                  |dz  z         }|se|j                         }t        |dz        }t	               }|j                  |       t        |dz        |_        |dz  }|dk\  rd|z   }||_        |se|S )NFr,   rr  rs  rq  i    i   )getSubReaderpos	readULongr/  rO  r   rQ  rR  )	r   r2  r,  rZ  ru  r1  r   rt  deltas	            rM   r\  z(LigatureMorphAction._decompileLigActions  s    **<+;+;kAo+MN$$&E
*+D[FNN6"
 23FLJ&E
"#e+%*F"  rL   c                    dx| _         | _        dx| _        | _        d| _        g | _        |D cg c]  }t        |t              s| }}|D ]  \  }}}|dk(  rt        |d         | _          |dk(  r9|d   j                  d      D ]!  }	| j                  |	j                                # ^|dk(  rt        |d         | _        w|dk(  s}t               }
|j                  dd	      j                  d      }|D cg c]  }|j                          }}d
|v |
_        t        |d         |
_        | j                  j                  |
        y c c}w c c}w )Nr   Fr'  r   r  r  r  Action rQ  rR  )r'  r  rU  r  rW  r   r   r   r8  r  r9  rO  r   rQ  rR  r   )r   r   r   r   r   r;  r<  r=  r>  rO   rt  r   r  s                rM   r   zLigatureMorphAction.fromXML  sL   -..*/44D,%>Au)=1>>-4 	,)GXz*$ ('): ;G#$W-33C8 0DMM$**,/0O+%-hw.?%@"H$" Wb177<,12q22&%/)1(;L2M)N&##F+	, ? 3s   EE9Ec                     |j                   |fi | |j                          |j                  d| j                         |j                          | j	                  |       | j
                  D ]P  }d|j                  fg}|j                  r|j                  d       |j                  d|       |j                          R |j                  |       |j                          y )Nr'  r  rR  )r  rQ  r|  )
r   r   r   r'  r  rW  rR  rQ  r   r   )r   r   r   r   r   rt  attribss          rM   r   zLigatureMorphAction.toXML  s    	4)5)Jdmm<i(ll 	 F)6+A+ABCG||12'2	  	rL   N)r8   r9   r:   r?  r@  r  r   r   r   r  r  rY  r\  r   r   rK   rL   rM   rT  rT  |  sP    J m,F""& % %4! ,,rL   rT  c                   P    e Zd ZdZdZg dZd Zd Zd Zd Z	d Z
d	 Zed
        Zy)InsertionMorphActionr-   r,   )rC  r  CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 z    d| _         | j                  D ]  }t        | |d        d| _        g g c| _        | _        y r&  )r'  r  r   r  CurrentInsertionActionMarkedInsertionActionr  s     rM   r   zInsertionMorphAction.__init__  sB    KK 	'DD$&	'BDb?#T%?rL   c                    |J |j                  | j                         | j                  }| j                  r|dz  }| j                  r|dz  }| j
                  r|dz  }| j                  r|dz  }| j                  r|dz  }| j                  r|dz  }|t        | j                        dz  z  }|t        | j                        z  }|j                  |       t        | j                        dkD  r|t        | j                           }nd	}|j                  |       t        | j                        dkD  r|t        | j                           }nd	}|j                  |       y )
Nr   r7   r6   r5   r4   r3   r{   r   r   )r*  r'  r  rC  r  r  r  r  r  r   r  r  r   )r   r   r   r,  r   currentIndexmarkedIndexs          rM   r   zInsertionMorphAction.compile  sH   &&&4==)""<<VOEVOE$$VOE##VOE##VOE""VOET001Q66T//005!t**+a/&uT-H-H'IJL!L<(t))*Q.%eD,F,F&GHK K;'rL   c                    |J |j                         | _        |j                         }t        |dz        | _        t        |dz        | _        t        |dz        | _        t        |dz        | _        t        |dz        | _        t        |dz        | _        | j                  |||j                         |dz  dz	  	      | _
        | j                  |||j                         |d
z  	      | _        y )Nr   r7   r6   r5   r4   r3   i  r{   )r   count   )r.  r'  r/  rC  r  r  r  r  r  _decompileInsertionActionr  r  r0  s        rM   r   zInsertionMorphAction.decompile:  s    '''))+!!#EFN+/$($8!#'#7 #'#7 "&uv~"6&*&D&D$f&7&7&956>VWBW 'E '
# &*%C%C$f&7&7&9%&. &D &
"rL   c                     |dk(  s|dk(  rg S |j                  |j                  |dz  z         }|j                  |j                  |            S )Nr   r   r+   )rw  rx  getGlyphNameManyreadUShortArray)r   r2  r   r   r  r1  s         rM   r  z.InsertionMorphAction._decompileInsertionActionK  sO    F?eqjI**<+;+;eai+GH$$V%;%;E%BCCrL   c                     |j                   |fi | |j                          |j                  d| j                         |j                          | j	                  |       | j
                  D ]%  }|j                  d|       |j                          ' | j                  D ]%  }|j                  d|       |j                          ' |j                  |       |j                          y )Nr'  r  r  glyphr  )r   r   r   r'  r  r  r  r   )r   r   r   r   r   gs         rM   r   zInsertionMorphAction.toXMLQ  s    	4)5)Jdmm<i(,, 	 A 8B	  ++ 	 A 7qA	  	rL   c                    | j                          |D cg c]  }t        |t              s| }}|D ]  \  }}}|dk(  rt        |d         | _         |dk(  r9|d   j                  d      D ]!  }	| j                  |	j                                # ^|dk(  r| j                  j                  |d          |dk(  r| j                  j                  |d          J |        y c c}w )Nr'  r   r  r  r  r  r  )r   r   r   r   r'  r8  r  r9  r  r   r  r:  s
             rM   r   zInsertionMorphAction.fromXML`  s    %>Au)=1>>-4 	&)GXz*$ ('): ;G#$W-33C8 0DMM$**,/044++228G3DE33**11(72CD%g%u	& ?s
   C"C"c                    t               i d}}}|D ]  }|j                  j                         D ]f  \  }}|j                  $|j	                  t        |j                               |j                  C|j	                  t        |j                               h  t        |d       D ]  }||v rt        dt        |            D ]G  }	t        |      dz  |	z   }
t        |	t        |            D ]  }||	|dz    }|j                  ||
        I |D ],  }| j                  |      }|t        j                  d|      z  }.  ||fS )NrL   c                     t        |        | fS r   r`  ra  s    rM   rf   z5InsertionMorphAction.compileActions.<locals>.<lambda>|  s    c!fWaL rL   rc  r   r+   r   ri   )re  r  r   r  rf  r   r  rg  rh  r   ri  r   rb   rc   )r   r  rZ  r,  r   rj  rk  rl  rt  start
startIndexlimitglyphsr  r   s                  rM   r  z#InsertionMorphAction.compileActionsp  s[   '*ub#f 	DE&+&7&7&=&=&? D"U//;KKe&B&B CD..:KKe&A&A BC	D	D W*@A 	5F $q#f+. ?!&kQ.%7
"5#f+6 ?E#EEAI6F**6:>??
   5//%0&++dG445	5" {""rL   N)r8   r9   r:   r?  r@  r  r   r   r   r  r   r   r  r  rK   rL   rM   r  r  	  sH    JFI(<
"D&  # #rL   r  c                       e Zd Zd ZddZy)FeatureParamsc                     t         j                  |d         | j                  k(  s$J d|d   d| j                  j                         t	        j
                  | ||       y )N
FeatureTagz&Wrong FeatureParams type for feature 'z': )featureParamTypesr   	__class__r8   r   r   )r   r   r   s      rM   r   zFeatureParams.compile  s[    !!&"674>>I	
 < NN##
	
I
 	$-rL   Nc                 `    t        j                  | |||| j                  j                         y )N)r   )r   r   r  r8   rL  s        rM   r   zFeatureParams.toXML  s     iu4>>;R;RSrL   r
  )r8   r9   r:   r   r   rK   rL   rM   r  r    s    .TrL   r  c                       e Zd Zy)FeatureParamsSizeNr8   r9   r:   rK   rL   rM   r  r        rL   r  c                       e Zd Zy)FeatureParamsStylisticSetNr  rK   rL   rM   r  r    r  rL   r  c                       e Zd Zy)FeatureParamsCharacterVariantsNr  rK   rL   rM   r  r    r  rL   r  c                   ,    e Zd ZddZd Zd Zd Zd Zy)CoverageNc                 ,    t        | d      sg | _        y y )Nr  )hasattrr  r   s     rM   r   zCoverage.populateDefaults  s    tX&DK 'rL   c           	          | j                   dk(  r|d   | _        | ` y | j                   dk(  rg x}| _        |d   }t        |d       }||k7  rt        j	                  d       |}~|D ]i  }|j
                  }|j                  }|j                  |      }	|j                  |      dz   }
|j                  |j                  t        |	|
                   k | ` y g | _        t        j	                  d| j                          | ` y )	Nr   
GlyphArrayr+   RangeRecordc                     | j                   S r   )StartCoverageIndexrm  s    rM   rf   z#Coverage.postRead.<locals>.<lambda>  s    9M9M rL   rc  .GSUB/GPOS Coverage is not sorted by glyph ids.zUnknown Coverage format: %s)Formatr  rg  logwarningStartEndr   extendr  rh  )r   rawTabler   r  rangessorted_rangesrr  endstartIDendIDs              rM   postReadzCoverage.postRead  s    ;;!"<0DK* K) [[A#%%FT[m,F #6/MNM&LM& Lee//%0,q0d33E'54IJKL K DKKK5t{{CKrL   c                    t        | dd       }|	g x}| _        d}d|i}|rB|j                  |      }t        |      |k7  }|d   }|gg}|dd  D ]2  }	|	|dz   k7  r&|d   j	                  |       |j	                  |	g       |	}4 |d   j	                  |       |st        |      dz  t        |      k  rd}
t        t        |            D ]^  }||   \  }}t               }||_        |j                  |      |_
        |j                  |      |_        |
|_        |||<   |
|z   |z
  dz   }
` |r(t        j                  d       |j                  d 	       |D ]  }|` d
}d|i}|| _        |S )Nr  r   r  r   rm   r  c                     | j                   S r   )StartIDr  s    rM   rf   z#Coverage.preWrite.<locals>.<lambda>  s
    aii rL   rc  r+   r  )r   r  getGlyphIDManyrg  r   r   rh  r  r  getGlyphNamer  r  r  r  r  sortr  )r   r   r  formatr  glyphIDsbrokenOrderru  r  r   r   r}   r  r  r  s                  rM   preWritezCoverage.preWrite  s   x.>#%%FT[ &)**62H *h6KA;DfXF#AB< dQh&2J%%d+MM7),	
 2Jd#c&kAoF;s6{+ 4A!'JE3#A %AI"//6AG --c2AE+0A( !F1I!CK%/!3E4 KK PQKK$7K8 "A	")62 rL   c                 n    t        | dg       D ]%  }|j                  d|       |j                          ' y )Nr  Glyphr  )r   r   r   )r   r   r   r   s       rM   toXML2zCoverage.toXML2  s9     x4 	 Iy9	 rL   c                 \    t        | dd       }|	g }|| _        |j                  |d          y )Nr  r   )r   r  r   )r   r   r   r   r   r  s         rM   r   zCoverage.fromXML  s1    x.>F DKeGn%rL   r   r8   r9   r:   r   r  r  r  r   rK   rL   rM   r  r    s    2*X 
&rL   r  l    c                   B    e Zd Zd	dZd Zed        Zd Zd Zd Z	d Z
y)
DeltaSetIndexMapNc                 ,    t        | d      sg | _        y y Nr   r  r   r   s     rM   r   z!DeltaSetIndexMap.populateDefaults	      tY'DL (rL   c                 2    |d   dz  dk(  sJ |d   | _         y )NEntryFormat  r   r   )r   )r   r  r   s      rM   r  zDeltaSetIndexMap.postRead  s&    '&0Q666	*rL   c                     d}| D ]  }||z  }	 |dz  }d}|r|dz  }|dz  }|rt        |d      }|dk  sJ |d|z
  z	  |d|z  dz
  z  z  }|dk  rd}n|dk  rd}n
|dk  rd}nd	}|dz
  d	z  |dz
  z  S )
Nr   r   r   r.      r+   i rm   r,   )max)r   oredidxinner	innerBits	entrySizes         rM   getEntryFormatzDeltaSetIndexMap.getEntryFormat  s     	CCKD	 v	NIaKE  	1%	Bi(Ta9n5I-JK:IZIZIIQ1$Q77rL   c                     t        | dd       }|	g x}| _        t        |      dkD  rdnd| _        | j                  j                         }t        |      |d<   | j                  |      |d<   |S )Nr   r   r   r   MappingCountr  )r   r   r   r  r   copyr  )r   r   r   r  s       rM   r  zDeltaSetIndexMap.preWrite+  so    $	40?%''Gdlw<&0aa==%%'#&w< "&"5"5g">rL   c                    |j                  d       |j                          t        t        | dg             D ]R  \  }}d|fg}|t        k7  r|j                  d|dz	  fd|dz  fg       |j                  d|       |j                          T y )	Nz7Omitted values default to 0xFFFF/0xFFFF (no variations)r   r   outerr.   r  r   Map)r5  r   r   r   r   r  r   )r   r   r   r}   r   r   s         rM   r  zDeltaSetIndexMap.toXML25  s     	ST!'$	2">? 
	 HAuq\NE** %2+. %&.1 u-
	 rL   c                     t        | dd       }|	g x| _        }t        |d         }t        |j                  dd            }t        |j                  dd            }|dk  sJ |j	                  ||dz  |z         y )Nr   r   r  0xFFFFr  r   r.   )r   r   r   r   insert)	r   r   r   r   r   r   r   r  r  s	            rM   r   zDeltaSetIndexMap.fromXMLF  s|    $	40?%''DL7w(7H567H56uu{e34rL   c                 \    |t        | j                        k  r| j                  |   S t        S r   )r   r   r   )r   r}   s     rM   __getitem__zDeltaSetIndexMap.__getitem__P  s&    "#c$,,&7"7t||AO=OOrL   r   )r8   r9   r:   r   r  r  r  r  r  r   r  rK   rL   rM   r  r    s5    + 8 82 "5PrL   r  uint8c                   2    e Zd ZddZd Zd Zd Zd Zd Zy)		VarIdxMapNc                 ,    t        | d      si | _        y y r  r  r   s     rM   r   zVarIdxMap.populateDefaultsU  r  rL   c                     |d   dz  dk(  sJ |j                         }|d   }|j                  |d   gt        |      t        |      z
  z         t        t	        ||            | _        y )Nr  r  r   r   r  )getGlyphOrderr  r   dictzipr   )r   r  r   r   mapLists        rM   r  zVarIdxMap.postReadY  si    '&0Q666'')
9%}J#g,(FGHC
G45rL   c                 D   t        | dd       }|	i x}| _        |j                         }|D cg c]  }||   	 }}t        |      dkD  r(|d   |d   k(  r|d= t        |      dkD  r|d   |d   k(  rd|i}t        |      |d<   t        j                  |      |d<   |S c c}w )Nr   r   r  r  r  )r   r   r  r   r  r  )r   r   r   r   r  r  s         rM   r  zVarIdxMap.preWrite`  s    $	40?%''Gdl'')
'12!71:22'lQ72;'"+#= 'lQ72;'"+#= w'#&w< "2"A"A'"J 3s   Bc                     t        t        | di       j                               D ]8  \  }}d|fd|dz	  fd|dz  ff}|j                  d|       |j	                          : y )Nr   r  r  r.   r  r   r  )rg  r   r   r   r   )r   r   r   r  r   r   s         rM   r  zVarIdxMap.toXML2o  sq    "74B#?#E#E#GH 	 LE5% %2+&%&.)E
 u-	 rL   c                     t        | dd       }|	i }|| _        	 |d   }t        |d         }t        |d         }|dk  sJ |dz  |z  ||<   y #  |j                         |d      }Y IxY w)Nr   r  r   r  r  r   r.   )r   r   r  r   )	r   r   r   r   r   r   r  r  r  s	            rM   r   zVarIdxMap.fromXMLy  s    $	40?G"DL	9'NE w(w(2+.	9&&(w8Es   A A(c                 B    | j                   j                  |t              S r   )r   r   r   )r   r   s     rM   r  zVarIdxMap.__getitem__  s    ||	+=>>rL   r   )	r8   r9   r:   r   r  r  r  r   r  rK   rL   rM   r  r  T  s     6 /?rL   r  c                       e Zd Zd Zy)VarRegionListc                     |j                  d      }|rt        |j                        | _        i | j                  dt        | j                  d      iS )NfvarRegionAxisCount)r   r   axesr  r   r   )r   r   	fvarTables      rM   r  zVarRegionList.preWrite  sR     HHV$	#&y~~#6D 
mm
~dmm=NO
 	
rL   Nr8   r9   r:   r  rK   rL   rM   r  r    s    
rL   r  c                   ,    e Zd ZddZd Zd Zd Zd Zy)SingleSubstNc                 ,    t        | d      si | _        y y r  r  r   s     rM   r   zSingleSubst.populateDefaults  r  rL   c                    i }t        |d         }| j                  dk(  rV|d   }|j                  |      }|D cg c]
  }||z   dz   }}|j                  |      }	t	        ||	      D ]
  \  }
}|||
<    nZ| j                  dk(  r7t        |      |d   k(  sJ d       |d   }t	        ||      D ]
  \  }
}|||
<    nJ d	| j                  z         || _        | `y c c}w )
Nr  r   DeltaGlyphID   r+   
GlyphCountz invalid SingleSubstFormat2 table
Substituteunknown format: %s)_getGlyphsFromCoverageTabler  r  r  r  r   r   )r   r  r   r   inputrz  	inputGIDSr   outGIDSoutNamesinpoutsubstsubs                 rM   r  zSingleSubst.postRead  s   +HZ,@A;;!^,E++E2I@IJW%50JGJ,,W5Hx0 #S"#[[AE
h|442124\*Eu- #S"# 9*T[[881K Ks   Cc                 "   t        | dd       }|	i x}| _        t        |j                               }|j                  }|D cg c]  \  }} ||       ||      f }}}t        t        ||            }d}	d }
|D ]  \  }}|
||z
  dz  }
||
z   dz  |k7  s n |
d}	nd}	i }|	| _        t               }|D cg c]
  }|d   d    }}|D cg c]
  }|d   d    }}||_	        ||d<   |	dk(  r|
J |
|d<   |S ||d<   |S c c}}w c c}w c c}w )	Nr   r+   r  r   r   r  r  r  )
r   r   listr   r   rg  r  r  r  r  )r   r   r   r   r   rm  bgidItemssortableItemsr  rz  inIDoutIDr  covitemr  r  s                     rM   r  zSingleSubst.preWrite  sc   $	40?%''GdlW]]_%__
?DEtq!Z]JqM2EEs8U34 # 	KD%}.u%.	 }j(56a66(56a66
"Q;$$$',H^$  &+H\"? F, 76s   D8DDc                     t        | j                  j                               }|D ]-  \  }}|j                  dd|fd|fg       |j	                          / y )NSubstitutioninr  )rg  r   r   r   r   )r   r   r   r   inGlyphoutGlyphs         rM   r  zSingleSubst.toXML2  sW    t||))+,!& 	 GX$5(BS0TU	 rL   c                 J    t        | dd       }|	i }|| _        |d   ||d   <   y )Nr   r  r&  )r   r   )r   r   r   r   r   r   s         rM   r   zSingleSubst.fromXML  s3    $	40?G"DL$U|drL   r   r  rK   rL   rM   r
  r
    s    ,%N ,rL   r
  c                   <    e Zd ZddZd Zd Zd Zd Zed        Z	y)	MultipleSubstNc                 ,    t        | d      si | _        y y r  r  r   s     rM   r   zMultipleSubst.populateDefaults  r  rL   c                     i }| j                   dk(  r@t        |d         }|d   D cg c]  }|j                   }}t        t	        ||            }nJ d| j                   z         || _        | ` y c c}w )Nr   r  Sequencer  )r  r  r  r  r  r   )r   r  r   r   r  sr  s          rM   r  zMultipleSubst.postRead  su    ;;!0*1EFF+3J+?@aQ\\@E@3vu-.G8*T[[881K As   A0c                 &   t        | dd       }|	i x}| _        t               }t        t	        |j                               |j                        |_        d| _        ||j                  D cg c]  }| j                  ||          c}d}|S c c}w )Nr   rc  r   )r  r.  )
r   r   r  rg  r  keysr   r  r  makeSequence_)r   r   r   r"  r  r  s         rM   r  zMultipleSubst.preWrite  s    $	40?%''GdljD0dooF
ILT++GEN;T
  Us   ,Bc                     t        | j                  j                               }|D ]>  \  }}dj                  |      }|j	                  dd|fd|fg       |j                          @ y )Nr  r%  r&  r  )rg  r   r   r  r   r   )r   r   r   r   r'  	outGlyphsr  s          rM   r  zMultipleSubst.toXML2
  sd    t||))+,"' 	 GY((9%C$5#,0OP	 rL   c                 J   t        | dd       }|	i }|| _        |dk(  rJg | _        |D ]=  }t        |t              s|\  }}}	|dk(  s | j                  j                  |d          ? y |dk(  rst        |j                  dt        |                  }
| j                  |
   }g x}||<   |D ]3  }t        |t              s|\  }}}	|dk(  s |j                  |d          5 y |d   r|d   j                  d	      ng }|D cg c]  }|j                          c}||d
   <   y c c}w )Nr   r  r  r   r.  r   r  r  r  r&  )r   r   old_coverage_r   r   r   intr   r   r8  r9  )r   r   r   r   r   r   elementelement_nameelement_attrsr   r   r  glyph_mappingr4  r  s                  rM   r   zMultipleSubst.fromXML  sL   $	40?G"DL :!#D" F!'5118.mQ7*&&--mG.DEF :		'3w<89E&&u-E-//MGEN" A!'5118.mQ</!((w)?@A  05U|E%L&&s+	3<=a	=d=s   ?D c                 (    t               }| |_        |S r   )r.  r  )r  seqs     rM   r2  zMultipleSubst.makeSequence_1  s    j
rL   r   )
r8   r9   r:   r   r  r  r  r   r  r2  rK   rL   rM   r+  r+    s0    	 >@  rL   r+  c                   2    e Zd ZddZd Zd Zd Zd Zd Zy)	ClassDefNc                 ,    t        | d      si | _        y y )N	classDefs)r  rA  r   s     rM   r   zClassDef.populateDefaults9      t[)DN *rL   c                 X   i }| j                   dk(  ra|d   }|d   }|j                  |      }|t        |      z   }|j                  t	        ||            }t        ||      D ]  \  }	}
|
s	|
||	<    n| j                   dk(  r|d   }|D ]u  }|j                  }
|
s|j                  }|j                  }|j                  |      }|j                  |      dz   }|j                  t	        ||            }|D ]  }	|
||	<   	 w n t        j                  d| j                          || _        | ` y )Nr   
StartGlyphClassValueArrayr+   ClassRangeRecordzUnknown ClassDef format: %s)r  r   r   r  rh  r  Classr  r  r  r  rA  )r   r  r   rA  r  	classListr  r  
glyphNamesr   clsrecordsrecr  s                 rM   r  zClassDef.postRead=  s=   	;;!\*E !23Iooe,Gc)n,E..uWe/DEJ"%j)"< /	3+.Ii(/ [[A12G 
/ii		gg//%0,q0!225%3HI
!+ /I+.Ii(/
/ KK5t{{C"KrL   c                    t        | dd       }|i | _        y |j                  }g }|j                         D ]"  \  }}|s	|j	                   ||      ||f       $ |r|j                          |d   \  }}}	|	||gg}
|dd  D ]C  \  }}}||dz   k7  s||	k7  r*|
d   j                  ||g       |
j	                  |||g       |}|}|}	E |
d   j                  ||g       |
S y )NrA  r   r   r  )r   rA  r   r   r   r  r  )r   r   rA  r   r   r   rJ  ru  lastNamelastClsr  r   s               rM   _getClassRangeszClassDef._getClassRanges\  s   D+t4	DN__
'oo/ 	BNIsLL*Y/C@A	B JJL&+Ah#D(Gh/0F+09 'CdQh&#.2J%%tX&67MM3";<$ 2JtX./M rL   c                    d}dg i}| j                  |      }|r|d   d   }|d   d   }||z
  dz   }t        |      dz  |dz   k  rOt        t        |            D ]1  }||   \  }	}
}}}t               }||_        ||_        |	|_        |||<   3 d}d|i}nA|d   d   }dg|z  }|D ]'  \  }	}
}}}t        |
|z
  ||z
  dz         D ]  }|	||<   	 ) d}||d}|| _        |S )Nr+   rF  r   r   r  rm   )rD  rE  )rP  r   rh  rF  r  r  rG  r  )r   r   r  r  r  
startGlyphendGlyph
glyphCountr}   rJ  r  	startNamer  endNamerL  startGlyphNameclassesr  s                     rM   r  zClassDef.preWriteu  sD   &+%%d+1Jbz!}H!J.2J6{Qa/s6{+ $A:@)7C	3*,C )CI%CG #CI #F1I$ .7 "(1#
*;A )7C	3"5:#5sZ7G!7KL )%(
)) *8WUrL   c                     t        | j                  j                               }|D ]-  \  }}|j                  dd|fd|fg       |j	                          / y )Nr?  r  class)rg  rA  r   r   r   )r   r   r   r   r   rJ  s         rM   r  zClassDef.toXML2  sV    t~~++-.# 	 NIs
gy-AGS>,RS	 rL   c                 \    t        | dd       }|	i }|| _        t        |d         ||d   <   y )NrA  rZ  r  )r   rA  r7  )r   r   r   r   r   rA  s         rM   r   zClassDef.fromXML  s9    D+t4	I&DN$'g$7	%.!rL   r   )	r8   r9   r:   r   r  rP  r  r  r   rK   rL   rM   r?  r?  8  s      >2> 8rL   r?  c                   ,    e Zd ZddZd Zd Zd Zd Zy)AlternateSubstNc                 ,    t        | d      si | _        y y )N
alternates)r  r_  r   s     rM   r   zAlternateSubst.populateDefaults  s    t\* DO +rL   c                     i }| j                   dk(  rPt        |d         }|d   }t        |      t        |      k(  sJ t        ||      D ]  \  }}|j                  ||<    nJ d| j                   z         || _        | ` y )Nr   r  AlternateSetr  )r  r  r   r  	Alternater_  )r   r  r   r_  r  altsr  alts           rM   r  zAlternateSubst.postRead  s    
;;!/0DEEN+Du:T***t, 0S"%--
30 9*T[[881$KrL   c                    d| _         t        | dd       }|	i x}| _        t        |j	                               }t        t        |            D ]!  }||   \  }}|j                  |      ||f||<   # |j                          t               }|D cg c]  }|d   	 c}|_
        g }|D cg c]  }|d   	 }	}|	D ]$  }t               }
||
_        |j                  |
       & d| _        ||dS c c}w c c}w )Nr   r_  r  )r  ra  )r  r   r_  r  r   rh  r   r   r  r  r  ra  rb  r   sortCoverageLast)r   r   r_  r   r}   r   re  r"  r#  setListrc  s              rM   r  zAlternateSubst.preWrite  s   T<6
+--JZ%%'(s5z" 	BA"1XNIsy19cAE!H	B 	

j*/0$d1g0

(-.48.. 	$C>D DNd#	$ !"<< 1.s   C,)C1c                 :   t        | j                  j                               }|D ]s  \  }}|j                  d|       |j	                          |D ]%  }|j                  d|       |j	                          ' |j                  d       |j	                          u y )Nra  r  rb  )rg  r_  r   r   r   r   r   )r   r   r   r   r   r_  rd  s          rM   r  zAlternateSubst.toXML2  s    t,,./%* 	 !Iz~Y?! $##Ks#;!!#$ ^,	 rL   c                     t        | dd       }|	i }|| _        |d   }g }|||<   |D ]-  }t        |t              s|\  }}}|j	                  |d          / y )Nr_  r  )r   r_  r   r   r   )	r   r   r   r   r   r_  r   re  r8  s	            rM   r   zAlternateSubst.fromXML  sr    T<6
J(DO'N	 #
9 	'Ggu-#* D%JJuW~&		'rL   r   r  rK   rL   rM   r]  r]    s    !=4	 'rL   r]  c                   <    e Zd ZddZd Zed        Zd Zd Zd Z	y)	LigatureSubstNc                 ,    t        | d      si | _        y y )N	ligatures)r  rm  r   s     rM   r   zLigatureSubst.populateDefaults  rB  rL   c                    i }| j                   dk(  r[t        |d         }|d   }t        |      t        |      k(  sJ t        t        |            D ]  }||   j                  |||   <    nJ d| j                   z         || _        | ` y )Nr   r  LigatureSetr  )r  r  r   rh  Ligaturerm  )r   r  r   rm  r  ligSetsr}   s          rM   r  zLigatureSubst.postRead  s    	;;!/0DEE}-Gu:W---3u:& :&-aj&9&9	%(#: 9*T[[881"KrL   c                     t        |        S r   r`  r   s    rM   _getLigatureSortKeyz!LigatureSubst._getLigatureSortKey  s    6 JrL   c                 x   d| _         t        | dd       }|	i x}| _        |rt        t	        t        |            t              rt               }t        |j                         | j                        D ]T  }t               }|dd  |_        t        |      |_        ||   |_        |j!                  |d   g       j#                  |       V |}t%        |j'                               }t)        t        |            D ]!  }||   \  }}	|j+                  |      ||	f||<   # |j-                          t/               }
|D cg c]  }|d   	 c}|
_        g }|D cg c]  }|d   	 }}|D ]>  }	t3               }g x}|_        |	D ]  }|j#                  |        |j#                  |       @ d| _        |
|dS c c}w c c}w )Nr   rm  rc  r   r  )r  ro  )r  r   rm  r   nextiterr   r  rg  r1  rs  rp  	Componentr   	CompCountLigGlyphri  r   r  r   rh  r   r  r  r  ro  rf  )r   r   rm  newLigaturescompsligaturer   r}   r   re  r"  r#  rq  rg  ligSetligsligs                    rM   r  zLigatureSubst.preWrite  s   D+t4	)++IDi$95A
  6L	 0d6N6NO G#:%*12Y"%(Z"$-e$4!''a"5<<XFG %IY__&'s5z" 	BA"1XNIsy19cAE!H	B 	

j*/0$d1g0
(-.48.. 	#C ]F%''D6? !C !NN6"	# !"88 1 /s   ;F2F7c           	         t        | j                  j                               }|D ]  \  }}|j                  d|       |j	                          |D ]I  }|j                  d|j                  dj                  |j                               |j	                          K |j                  d       |j	                           y )Nro  r  rp  r  )r  r   )
rg  rm  r   r   r   r   ry  r  rw  r   )r   r   r   r   r   rq  r  s          rM   r  zLigatureSubst.toXML2A  s    t~~++-."' 		 Iw}I> $##cllsxx?V $  !!#	$
 ]+		 rL   c                 D   t        | dd       }|	i }|| _        |d   }g }|||<   |D ]w  }t        |t              s|\  }}}t	               }	|d   |	_        |d   }
|
r|
j                  d      ng |	_        t        |	j                        |	_	        |j                  |	       y y )Nrm  r  r   r  )r   rm  r   r   rp  ry  r8  rw  r   rx  r   )r   r   r   r   r   rm  r   r~  r8  r  r   s              rM   r   zLigatureSubst.fromXMLN  s    D+t4	I&DN'N	#	) 		Ggu-#* D%*C >CL|,J5?J,,S1RCM.CMKK		rL   r   )
r8   r9   r:   r   r  r  rs  r  r  r   rK   rL   rM   rk  rk    s0         8(9T rL   rk  c                   *    e Zd Zd Zd ZddddefdZy)	COLRc                 .   |j                  d      }| j                         D ]O  }|j                  dk7  r|j                  |j                         .|j                  ||i       ||j                  <    n t        d      t        j                  | ||      S )Nr   )offsetLayerRecordCount)	tableDictz$LayerRecordCount converter not found)	rw  getConvertersr   advancer?  readAssertionErrorr   r   )r   r1  r   	subReaderconvs        rM   r   zCOLR.decompilec  s     ''q'1	&&( 	IDyy..!!$//2 $		)TR	 HF499	I !!GHH""466rL   c                 \    d | _         i | j                  dt        | j                  d      iS )Nr  )r  r   r   r   r   s     rM   r  zCOLR.preWritet  s8     !%
mm
t}}>P Q
 	
rL   glyphSetr(   quantizationc                    | j                   dk(  ry i }| j                  j                  D ]2  }	 |j                  j	                  | ||      }|$|||j                  <   4 t        | d      xr | j                  d u}|s|rd | _
        y y |s t               | _
        d| j                  _        || j                  _        y # t
        $ r!}ddlm}  |d|j                        |d }~ww xY w)Nr   )
TTLibErrorz#Failed to compute COLR ClipBox for ClipListr   )VersionBaseGlyphListBaseGlyphPaintRecordPaintcomputeClipBox	ExceptionfontTools.ttLibr  	BaseGlyphr  r  r  clips)	r   r  r  r  rL  clipBoxer  hasClipLists	            rM   computeClipBoxeszCOLR.computeClipBoxes~  s    <<1%%:: 	/C))224<P "'.cmm$	/ dJ/MDMM4M $   (
'($"'DMM%  6 9#--9JKs   B;;	C%C  C%Nr   )r8   r9   r:   r   r  r7  r  rK   rL   rM   r  r  b  s    7"
( (c (rL   r  c                   .     e Zd Zed        Z fdZ xZS )
LookupListc                     | j                   D ]a  }|j                  D ]P  }t        |      j                  j	                  d      r  yt        |      j                  j	                  d      sO  y c t
        )NSubstGSUBPosGPOS)LookupSubTabler   r8   endswith
ValueError)r   lsts      rM   tablezLookupList.table  sf     	"Ajj "8$$--g6!8$$--e4!	"	" rL   c           
      t   |rd|vst         |d   j                  vrt        |   ||      S |d   j                  t            | j                     }| j                         D ]U  }|j                  rt        | |j                  g       }t        |      D ]  \  }}t        |      |v rt        |t        |          }|j                  }	|j                  r|j                   d|	 }	|j                  r|j                  \  }
}}|	 d| d|
 d| d}	|j                  |	       |j                          |j!                  ||||j                  d|fg        |j"                  r"t%        |j"                  d t'        |             s t        | |j                  d       }|j!                  ||||j                  g        X y )NDebgz: z in z (/)r   )r!   r|   superr  r  r  repeatr   r   r   strr    locationfeaturer5  r   xmlWriteauxevalvars)r   r   r   	debugDatar  r   lookupIndexr#  infotagscriptlanguager  r  s                rM   r  zLookupList.toXML2  s   T!$DL,=,==7>)T22L%%&;<TZZH	&&( 	ED{{dii4)25)9 %K;'94.	#k:J0KL"mm99%)YYKr#"7C<<8<5FHg%(EgYb(1"MC!))#.!))+MM!4tyyG[;Q:R  88D4d$D$))T iudiiD1	ErL   )r8   r9   r:   propertyr  r  __classcell__)r  s   @rM   r  r    s!      E  ErL   r  c                       e Zd Zd Zy)BaseGlyphRecordArrayc                 v    t        | j                  fd      | _        | j                  j                         S )Nc                 :    j                  | j                        S r   r   r  rL  r   s    rM   rf   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>  s    $//#--2P rL   rc  )rg  BaseGlyphRecordr   r  r  s    `rM   r  zBaseGlyphRecordArray.preWrite  s1    %  &P 
 }}!!##rL   Nr  rK   rL   rM   r  r        $rL   r  c                       e Zd Zd Zy)r  c                 v    t        | j                  fd      | _        | j                  j                         S )Nc                 :    j                  | j                        S r   r  r  s    rM   rf   z(BaseGlyphList.preWrite.<locals>.<lambda>  s    ts}}7U rL   rc  )rg  r  r   r  r  s    `rM   r  zBaseGlyphList.preWrite  s1    $*%%+U%
! }}!!##rL   Nr  rK   rL   rM   r  r    r  rL   r  c                        e Zd ZdZdZd Zd Zy)ClipBoxFormatr   r+   c                     | | j                   u S r   Variabler   s    rM   is_variablezClipBoxFormat.is_variable  s    t}}$$rL   c                     | j                   S r   r  r   s    rM   as_variablezClipBoxFormat.as_variable  s    }}rL   N)r8   r9   r:   Staticr  r  r  rK   rL   rM   r  r    s    FH%rL   r  c                       e Zd ZeZd Zd Zy)ClipBoxc                 H     t         fd j                         D              S )Nc              3   J   K   | ]  }t        |j                          y wr   )r   r   )r   r  r   s     rM   r   z#ClipBox.as_tuple.<locals>.<genexpr>  s     O$WT499-Os    #)r   r  r   s   `rM   as_tuplezClipBox.as_tuple  s    O$:L:L:NOOOrL   c                 R    | j                   j                   | j                          S r   )r  r8   r  r   s    rM   __repr__zClipBox.__repr__  s#    ..))*4==?*;<<rL   N)r8   r9   r:   r  
formatEnumr  r  rK   rL   rM   r  r    s    JP=rL   r  c                   4    e Zd ZddZd Zd Zd Zd	dZd Zy)
r  Nc                 ,    t        | d      si | _        y y )Nr  )r  r  r   s     rM   r   zClipList.populateDefaults  s    tW%DJ &rL   c           	         i }|j                         }t        |d         D ]  \  }}|j                  |j                  kD  r-t        j                  d||j                  |j                         Mg }g }t        |j                  |j                  dz         D ]@  }		 ||	   }
|
|vr#t        j                  |j                        ||
<   0|j                  |	       B |r*t        j                  d|t        |      t        |             |st        j                  d|t        |      t        |              || _        y # t        $ r |j                  |	       Y w xY w)N
ClipRecordzCinvalid ClipRecord[%i].StartGlyphID (%i) > EndGlyphID (%i); skippedr   zqClipRecord[%i] overlaps previous records; ignoring redefined clip boxes for the following glyph ID range: [%i-%i]z:ClipRecord[%i] range references missing glyph IDs: [%i-%i])r  r   StartGlyphID
EndGlyphIDr  r  rh  
IndexErrorr   r  r  minr  r  )r   r  r   r  r   r}   rL  redefinedGlyphsmissingGlyphsr   r  s              rM   r  zClipList.postRead  sX   '')
 67 %	FAs#..0/$$NN  OM !1!13>>A3EF 	4&w/E %#'99S[[#9E%L#**73	4 8 (( S&&	A%	L 
/ " !((1s   D<<EEc                 0   t        t              }i }| j                  j                         D ]3  \  }}|j	                         }||   j                  |       ||vs/|||<   5 |j                         D ci c]  \  }}t        |      ||    c}}S c c}}w r   )r   r  r  r   r  r   	frozenset)r   glyphsByClipuniqueClipsr   r  rd  r  s          rM   groupszClipList.groups  s    "4("&**"2"2"4 	+Iw""$C$$Y/+%#*C 		+ DPCUCUCW
4?CIf{3//
 	
 
s   5Bc                 t   t        | d      si | _        i }|j                         | j                         j	                         D ]  \  }}t        fd|D              }|s|d   }|gg}|dd  D ]2  }||dz   k7  r&|d   j                  |       |j                  |g       |}4 |d   j                  |       |D ]  \  }	}
|	|
f|vsJ |||	|
f<     g }t        |j	                               D ]8  \  \  }	}
}t               }|	|_        |
|_	        ||_
        |j                  |       : t        |      |d}|S )Nr  c              3   2   K   | ]  }|v s|     y wr   rK   )r   r   glyphMaps     rM   r   z$ClipList.preWrite.<locals>.<genexpr>0  s"      (1yH?T#s   	
r   r   r  )	ClipCountr  )r  r  getReverseGlyphMapr  r   rg  r   r  r  r  r  r   )r   r   clipBoxRangesr  r  r  ru  r  r   r  r  clipRecordsrecordr  r  s                 @rM   r  zClipList.preWrite*  s{   tW%DJ**,#{{}224 	6OFG 5; H A;DfXF#AB< dQh&2J%%d+MM7),	
 2Jd#$ 6
ss|=888.5ucl+6	6$ %+M,?,?,A%B 	'!LUC'\F"'F #F$FNv&	' [)%
 rL   c                 *   |r|n| j                   j                  }|g }t        | d      r|j                  d| j                  f       |j                  ||       |j                          t        | j                         j                         d       D ]  \  }}|j                  d       |j                          t        |      D ]%  }|j                  d|       |j                          ' |j                  dd|j                  fg       |j                          |j                  ||       |j                  d       |j                          |j                  d       |j                           |j                  |       |j                          y )Nr  c                     t        | d         S )Nr   )r  )r#  s    rM   rf   z ClipList.toXML.<locals>.<lambda>X  s    CQL rL   rc  Clipr  r  r  )r  r8   r  r   r  r   r   rg  r  r   r   r  r   )	r   r   r   r   r   	tableNamer  r  r   s	            rM   r   zClipList.toXMLN  s]    Ddnn&=&=	=E4"LL(DKK019e,%KKM!'@ 
 	 OFG v&#F^ $	##G9#=!!#$ yHgnn+E*FGNN9d+Y'V$	  	#rL   c                    t        | dd       }|	i x| _        }|dk(  sJ g }d }|D ]  }t        |t              s|\  }}}|dk(  r|j	                  |d          4|dk(  s:t               }t        |d         |_        |D ]-  }t        |t              s|\  }}}|j                  ||||       /  |r|D ]  }	|||	<   	 y y )Nr  r  r  r   r  r  )	r   r  r   r   r   r  r   r  r   )
r   r   r   r   r   r  r  r  elemr   s
             rM   r   zClipList.fromXMLi  s    gt,=!##DJv~~ 	@DdE*#' D%weGn-"!)!)%/!:# @D%dE2 +/(D%OOD%$?	@	@ # +	#*i + rL   r   r
  )	r8   r9   r:   r   r  r  r  r   r   rK   rL   rM   r  r    s"    )V

"H6+rL   r  c                       e Zd ZdZdZdZy)
ExtendModer   r   r+   N)r8   r9   r:   PADREPEATREFLECTrK   rL   rM   r   r     s    
CFGrL   r   c                   |    e Z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Z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ZdZdZdZy)CompositeModer   r   r+   rm   r,   r{   r  r   r-   r!  rU   r"  rS   r#  r   r$  r.                        rz            N)r8   r9   r:   CLEARSRCDESTSRC_OVER	DEST_OVERSRC_INDEST_INSRC_OUTDEST_OUTSRC_ATOP	DEST_ATOPXORPLUSSCREENOVERLAYDARKENLIGHTENCOLOR_DODGE
COLOR_BURN
HARD_LIGHT
SOFT_LIGHT
DIFFERENCE	EXCLUSIONMULTIPLYHSL_HUEHSL_SATURATION	HSL_COLORHSL_LUMINOSITYrK   rL   rM   r  r    s    E
CDHIFGGHHI
CDFGFGKJJJJIHGNINrL   r  c                       e Z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Z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ZdZdZdZdZdZ dZ!d Z"d! Z#d" Z$y#)$PaintFormatr   r+   rm   r,   r{   r  r   r-   r!  rU   r"  rS   r#  r   r$  r.   r  r  r  r	  r
  r  r  rz   r  r  r           r  r/   c                 8    | j                   j                  d      S )NPaintVar)r   
startswithr   s    rM   r  zPaintFormat.is_variable  s    yy##J//rL   c                     | j                         r| S 	 t        j                  d| j                  dd      S # t        $ r Y y w xY w)Nr2  r{   )r  r-  __members__r   KeyErrorr   s    rM   r  zPaintFormat.as_variable  sL    K	**Xdiim_+EFF 		s   "7 	AAN)%r8   r9   r:   PaintColrLayers
PaintSolidPaintVarSolidPaintLinearGradientPaintVarLinearGradientPaintRadialGradientPaintVarRadialGradientPaintSweepGradientPaintVarSweepGradient
PaintGlyphPaintColrGlyphPaintTransformPaintVarTransformPaintTranslatePaintVarTranslate
PaintScalePaintVarScalePaintScaleAroundCenterPaintVarScaleAroundCenterPaintScaleUniformPaintVarScaleUniformPaintScaleUniformAroundCenter PaintVarScaleUniformAroundCenterPaintRotatePaintVarRotatePaintRotateAroundCenterPaintVarRotateAroundCenter	PaintSkewPaintVarSkewPaintSkewAroundCenterPaintVarSkewAroundCenterPaintCompositer  r  rK   rL   rM   r-  r-    s    OJMJNNNJM "$&!')$KN !#IL!N0rL   r-  c            
           e Zd ZeZd ZddZdedee	j                     fdZded    fdZdefdZdefd	Z	 dded
ddedee   fdZy)r  c                     	 | j                  | j                        j                  S # t        $ r t	        d| j                         w xY w)NzUnknown Paint format: )r  r  r   r  NotImplementedErrorr   s    rM   getFormatNamezPaint.getFormatName  sI    	N??4;;/444 	N%(>t{{m&LMM	Ns	   $' "A	Nc                 b   |r|n| j                   j                  }|g }|j                  d| j                  f       |j	                  ||       |j                  | j                                |j                          | j                  ||       |j                  |       |j                          y )Nr  )
r  r8   r   r  r   r5  rZ  r   r  r   )r   r   r   r   r   r  s         rM   r   zPaint.toXML  s     Ddnn&=&=	=Eh,-9e,$,,./It$#rL   colrreturnc              #   $  K   | j                   t        j                  k(  rcg }|j                  |j                  j                  }d t        || j                  | j                  | j                  z          D        E d {    y | j                   t        j                  k(  rq|j                  j                  D ]@  }|j                  | j                  k(  st        j                  d|j                          y  t        | j                  d      | j!                         D ]h  }|j"                  t%        |j"                  t'        |             s0t)        | |j*                        }t        j                  |j*                  |       j y 7 w)Nc              3   R   K   | ]  \  }}t        j                  d ||       ! yw)Layers)r   r   r   N)r   SubTableEntry)r   r}   re   s      rM   r   z+Paint.iterPaintSubTables.<locals>.<genexpr>  s.      Aq ''XQaHHs   %'r  )r   r   z not in colr.BaseGlyphList)r  r-  r7  	LayerListr  r   FirstLayerIndex	NumLayersrA  r  r  r  r  r   ra  r6  r  
tableClass
issubclassr   r   r   )r   r\  layersr  r  r   s         rM   iterPaintSubTableszPaint.iterPaintSubTables  sL    ;;+555F~~)--%4//$2F2F2WX   ;;+444,,AA L##tzz1#11{&,,WWL
 $**/IJKK&&( 	KD*z$//4PT:/Vdii0--499EJJ	K!s&   A;F=F>AFAF1F=Fc                 ^    | j                  |      D cg c]  }|j                   c}S c c}w r   )rh  r   )r   r\  ps      rM   getChildrenzPaint.getChildren  s%    !%!8!8!>?A???s   *c                     t        |      st        d      t        | fd      D ]  }|d   j                  } ||        y)zEDepth-first traversal of graph rooted at self, callback on each node.zcallback must be callablec                 &    | j                        S r   rh  paintr\  s    rM   rf   z Paint.traverse.<locals>.<lambda>      %2J2J42P rL   iter_subtables_fnr  N)callable	TypeErrorr
   r   )r   r\  callbackpathrp  s    `   rM   traversezPaint.traverse  sG    !788"$P
 	D HNNEUO		rL   c                    | j                   t        j                  k(  rX| j                  }t        |j                  |j
                  |j                  |j                  |j                  |j                        S | j                   t        j                  k(  r*t        j                  | j                  | j                        S | j                   t        j                  k(  r*t        j                  | j                  | j                         S | j                   t        j"                  k(  rtt        j                  | j$                  | j&                        j                  | j                  | j                         j                  | j$                   | j&                         S | j                   t        j(                  k(  rt        j                  | j                        S | j                   t        j*                  k(  rit        j                  | j$                  | j&                        j                  | j                        j                  | j$                   | j&                         S | j                   t        j,                  k(  r(t        j.                  t1        | j2                              S | j                   t        j4                  k(  rrt        j                  | j$                  | j&                        j/                  t1        | j2                              j                  | j$                   | j&                         S | j                   t        j6                  k(  r=t        j8                  t1        | j:                         t1        | j<                              S | j                   t        j>                  k(  rt        j                  | j$                  | j&                        j9                  t1        | j:                         t1        | j<                              j                  | j$                   | j&                         S t        | j                         jA                         rtC        d| j                          t        S )NzVariable Paints not supported: )"r  r-  rB  r   xxyxxyyydxdyrD  r   	translaterF  rQ   rY   rZ   rH  centerXcenterYrJ  rL  rN  rotater   anglerP  rR  skew
xSkewAngle
ySkewAnglerT  r  rY  )r   r;  s     rM   getTransformzPaint.getTransform  s   ;;+444AQTT144qttQTT144@@[[K666%%dggtww77[[K222>>$++t{{;;[[K>>>""4<<>t{{DKK0DLL=4<<-8
 [[K999>>$**--[[KEEE""4<<>tzz"DLL=4<<-8
 [[K333??74::#677[[K???""4<<>

+,DLL=4<<-8
 [[K111==$//)9!:GDOO<TUU[[K===""4<<>gt./1IJDLL=4<<-8
 t{{#//1%(G}&UVVrL   r  r(   r  c                    t        |      }t        | fd      D ]}  }|d   j                  }|j                  t        j
                  k(  s0t        t        j                  d |D        t              }||j                     j                  t        ||              |j                  y t               }t        t         j"                        |_        t%        |j                  |      \  |_        |_        |_        |_        |S )Nc                 &    | j                        S r   rn  ro  s    rM   rf   z&Paint.computeClipBox.<locals>.<lambda>G  rq  rL   rr  r  c              3   P   K   | ]  }|j                   j                            y wr   )r   r  )r   r  s     rM   r   z'Paint.computeClipBox.<locals>.<genexpr>M  s     <RXX**,<s   $&)r   r
   r   r  r-  r@  r   r   r   r   r  drawr   boundsr  r7  r  r  r   xMinyMinxMaxyMax)	r   r\  r  r  penrw  rp  transformationcbs	    `       rM   r  zPaint.computeClipBoxB  s     x("$P
 
	ND HNNE||{555!'''<t<"
 %**<^+LM
	N ::Y,,-	-9#**l-S*"'27	rL   r
  r  )r8   r9   r:   r-  r  rZ  r   r  r$   r   ra  rh  r%   rk  rx  r   r  r7  r&   r  r  rK   rL   rM   r  r    s    JN
Kt K9P9P0Q K6@4= @	T 	)i )X HI$1AD	'	rL   r  )
Mark1Array)DefaultLangSys)MarkCoverageBaseCoverageLigatureCoverageMark1CoverageMark2CoverageBacktrackCoverageInputCoverageLookAheadCoverageVertGlyphCoverageHorizGlyphCoverageTopAccentCoverageExtendedShapeCoverageMathKernCoverage)	ClassDef1	ClassDef2BacktrackClassDefInputClassDefLookAheadClassDefGlyphClassDefMarkAttachClassDef)EntryAnchor
ExitAnchor
BaseAnchorLigatureAnchorMark2Anchor
MarkAnchor)
XPlaDevice
YPlaDevice
XAdvDevice
YAdvDeviceXDeviceTableYDeviceTableDeviceTable)	HorizAxisVertAxis)DefaultMinMax)MinCoordMaxCoord)DefJstfLangSys)ShrinkageEnableGSUBShrinkageDisableGSUBExtensionEnableGSUBExtensionDisableGSUB)ShrinkageEnableGPOSShrinkageDisableGPOSExtensionEnableGPOSExtensionDisableGPOS)ShrinkageJstfMaxExtensionJstfMax)TopRightMathKernTopLeftMathKernBottomRightMathKernBottomLeftMathKern)VertGlyphConstructionHorizGlyphConstruction)	MarkArrayLangSysr  r?  AnchorDeviceAxisMinMax	BaseCoordJstfLangSysJstfGSUBModListJstfGPOSModListJstfMaxMathKernMathGlyphConstructionc                     d}|j                   }|j                  |dz
  }|dk  r|S |j                  dk(  rd}n|j                  dk(  rd}| |j                     j                  j                  j
                  }||   }|j                  d   j                  j                  k(  r8|dz
  }|dk  r|S ||   }|j                  d   j                  j                  |k(  r8t        |t        |            D ]  }||   }|j                  |k7  s||_        t        t        |j                              D ]K  }|j                  |   }t        |j                     |   }	 |	       }
d|
_        ||
_        |
|j                  |<   M  d}|S )a#  Either the offset from the LookupList to a lookup overflowed, or
    an offset from a lookup to a subtable overflowed.

    The table layout is::

      GPSO/GUSB
              Script List
              Feature List
              LookUpList
                      Lookup[0] and contents
                              SubTable offset list
                                      SubTable[0] and contents
                                      ...
                                      SubTable[n] and contents
                      ...
                      Lookup[n] and contents
                              SubTable offset list
                                      SubTable[0] and contents
                                      ...
                                      SubTable[n] and contents

    If the offset to a lookup overflowed (SubTableIndex is None)
            we must promote the *previous* lookup to an Extension type.

    If the offset from a lookup to subtable overflowed, then we must promote it
            to an Extension Lookup type.
    r   r   r  r   r  r!  )LookupListIndexSubTableIndex	tableTyper  r  r  r  r  
LookupTyperh  r   lookupTypesr  ExtSubTable)ttfoverflowRecordokr  extTypelookupslookupsisubTableextSubTableClassextSubTables              rM   fixLookupOverFlowsr    s   8 
B 00K##+!AoQ	6)		!	!V	+.**+11<<CCG[!F
//!

&
&
1
1W
<!Ao?I%	 //!

&
&
1
1W
< [#g,7 
2%' 'FC01 2!??2.#.~/G/G#H#Q .0%&"*2'&1#2	
2 
BIrL   c                 L   d}t        | j                  j                               }t        |      }|j                  dv r|dz  }n|j                  dk(  r|j
                  dz
  }i |_        t        |      D ]+  }||   }|d   }	|d   |j                  |	<   | j                  |	= - |S )Nr   r  r  r+   r.  r   )rg  r   r   r   itemName	itemIndexrh  )
oldSubTablenewSubTabler  r  
oldMappingoldLennewLenr}   r#  rd  s
             rM   splitMultipleSubstr    s    	
B++1134J_F"== 1		 	 J	.  ))A-K66" %!}1g#'7C $	% IrL   c                    d}t        | d      r| j                  |_        t        | j                  j	                               }t        |      }|j                  dv r|dz  }n|j                  dk(  r|j                  dz
  }i |_        t        |      D ]+  }||   }|d   }	|d   |j                  |	<   | j                  |	= - |S )Nr   rf  r  r+   ra  r   )	r  rf  rg  r_  r   r   r  r  rh  )
r  r  r  r  oldAltsr  r  r}   r#  rd  s
             rM   splitAlternateSubstr  	  s    	
B{./'2'C'C$[++1134G\F"== 1		 	 N	2  ))A-K66" (qz1g&*1gs#""3'	( IrL   c                 L   d}t        | j                  j                               }t        |      }|j                  dv r|dz  }n|j                  dk(  r|j
                  dz
  }i |_        t        |      D ]+  }||   }|d   }	|d   |j                  |	<   | j                  |	= - |S )Nr   r  r+   ro  r   )rg  rm  r   r   r  r  rh  )
r  r  r  r  oldLigsr  r  r}   r#  rd  s
             rM   splitLigatureSubstr  ,	  s    	
B[**0023G\F"== 1		 	 M	1  ))A-K66" 'qz1g%)!Wc"!!#&	' IrL   c           	         | }d}| j                   |_         | j                   dk(  rt        | j                        dkD  rdD ]  }t        ||t	        | |              | j
                  j                         |_        | j
                  j                  }| j                  }t        | j                        dz  |d  | j
                  _        |d  | _        |d  |j
                  _        |d  |_        t        | j                        | _        t        |j                        |_        d}|S | j                   dk(  r(t        | j                        dkD  rt        | d      s't        | j                  d   j                        | _        dD ]  }t        ||t	        | |              d| _        | j
                  j                         |_        | j                  j                         |_        | j
                  j                  }| j                  j                  }| j                  }t        | j                        dz  t!        fd	|j#                         D              }	|D 
cg c]	  }
|
|	vs|
 c}
| j
                  _        |j#                         D ci c]  \  }}|k  s|| c}}| j                  _        |d  | _	        |D 
cg c]	  }
|
|	v s|
 c}
|j
                  _        |j#                         D ci c]  \  }}|kD  s||z
   c}}|j                  _        |d  |_	        t        | j                        | _        t        |j                        |_        d}|S c c}
w c c}}w c c}
w c c}}w )
NFr   )ValueFormat1ValueFormat2r+   TClass2Countr   )r   r  r  r  c              3   4   K   | ]  \  }}|k\  s|  y wr   rK   )r   kre   oldCounts      rM   r   zsplitPairPos.<locals>.<genexpr>w	  s     Ida1=Is   )r  r   PairSetr   r   r  r  r  PairSetCountClass1Recordr  Class2Recordr   	DontSharer  rA  re  r   Class1Count)r  r  r  r  r  r   coveragerK  rA  	newGlyphsr  r  re   r  s                @rM   splitPairPosr  F	  s8   	B	B$++KQ3{':':#;a#?2 	CDKw{D'AB	C
  +33==?''..%%{**+q0&.y&9#%ix0&.xy&9#%hi0#&{':':#; #&{':':#; T IQ 
		q	 S)A)A%BQ%F{M2&)+*B*B1*E*R*R&SK#N 	CDKw{D'AB	C !%  +33==? + 5 5 ? ? A''..))33	**{//0A5Iioo&7II	2:&QQay>Pq&Q#&__.+
Q!h,AqD+
' $+9H#5 2:&MQa9nq&M#*3//*;+
"&!Qq8|AH+
' $+89#5 "%k&>&>"?"%k&>&>"?I# 'R+

 'N+
s0   	M$)M$M) M)	M/M/9M4M4c                 ^   | j                   }|dk  ry|dz  }||z
  }g g }}g g }	}t        | j                  j                  | j                  j
                        D ]n  \  }
}|j                  |k  r#|j                  |
       |j                  |       8|xj                  |z  c_        |j                  |
       |	j                  |       p g g }}| j                  j                  D ]l  }|j                         |j                         }}|j                  d | |_        |j                  |d  |_        |j                  |       |j                  |       n | j                  |_        || j                  _        | j                  j                         |_        ||j                  _        | j                  |_        || _         ||_         || j                  _        | j                  j                         |_        |	|j                  _        t        |      | j                  _        t        |	      |j                  _        || j                  _	        | j                  j                         |_        ||j                  _	        t        |      | j                  _        t        |      |j                  _        y)Nr+   FT)
ClassCountr  r  r  r  
MarkRecordrG  r   	BaseArray
BaseRecordr  r  r  r  r   	MarkCount	BaseCount)r  r  r  
classCountoldClassCountnewClassCountoldMarkCoverageoldMarkRecordsnewMarkCoveragenewMarkRecordsr   
markRecordoldBaseRecordsnewBaseRecordsrL  oldBaseRecordnewBaseRecords                    rM   splitMarkBasePosr   	  s`   ''JA~!OM.M&("^O&("^O!$  '')>)>)I)I" 	.	: m+""9-!!*--""9-!!*-	. &(NN$$// -'*}}}#&>>.=#A #&>>-.#A m,m,- %++K&5K#*77AACK&5K#  +77K*K*K'5K$'11;;=K'5K$&).&9K#&).&9K#'5K$'11;;=K'5K$&).&9K#&).&9K#rL   )r+   rm   r,   )r+   r,   r  r  c                    | |j                      j                  }|j                  j                  |j                     }|j
                  }|j                  |   }t        |d      sd|_        yt        |d      r|j                  j                  j                  }|}|j                  }t        |j                      |j                  j                     } |       }	|j                  |	_        |	}
t        |j                      |   } |       }||	_	        n5|j                  j                  }t        |j                      |   } |       }|}
t        |d      r|j                  dz   |_        	 t        |j                      |   } ||||      }|r|j                  j'                  |dz   |
       |S # t         $ r$ t"        j%                  d|j                   |       Y yw xY w)zj
    An offset has overflowed within a sub-table. We need to divide this subtable into smaller parts.
    r  Tr  SubTableCountr   z)Don't know how to split %s lookup type %sF)r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  
splitTabler6  r  errorr  )r  r  r  r  subIndexsubtablesubTableTyper  newExtSubTableClassnewExtSubTabletoInsertnewSubTableClassr  	splitFuncr  s                  rM   fixSubTableOverFlowsr.  	  s    (()//E$$^%C%CDF++Hx(H 8[)!x'  ++55@@**).*B*BC!!,,
 -. + 2 2!&~'?'?@N&(%0"))44&~'?'?@N&(v'%33a7~778F	 
8[.	9B	x!|X6I  		7$$	

 s   %F( (*GGc                     dd l } ddlm} | j                  d      }t               }|D ]e  \  }}t        }|j                  |      }|r$|j                  d      }|d   d   }t        |      }||vsHt        ||fi       }	|dv rd|	_	        |	||<   g |D ]I  \  }}
|j                  d      st        |      dkD  s'|dd  |v s/||   }||dd     }||_        ||_        K t        j                         D ]  \  }}||   }|D ]  }|||<   	  t         t"        t$        t&        t(        t*        t,        t.        d	t0        t2        t4        t6        t8        t:        t<        t>        t@        d
	dtB        itD        tF        tH        tB        tJ        dda&tL        d   tL        d<   tL        jO                         D ]!  }|j                         D ]  \  }}	||	_(         # dtR        ia*tW        dd      D ]  }tX        tT        d|z  <    tW        dd      D ]  }tZ        tT        d|z  <    ddl.m/} |D ]  \  }}|j                  |      }|rk|ja                         \  }}tc        |      }||   }	te        |	d      si |	_3        i |	_4         ||dd  |      \  }}||	jf                  |<   ||	jh                  |<   ||   }	 |||      \  |	_3        |	_4         y )Nr   r   )otDataz([A-Za-z0-9]+)Format(\d+)$r!  TVarrm   )r   r+   rm   r,   r{   r  r   r-   )	r   r+   rm   r,   r{   r  r   r-   r!  r,   )r   r   r+   r,   r{   )r  r  mortmorxr  JSTFsizer
  zss%02dd   zcv%02d)buildConverters
converters)5rer0  r   globalsr   matchgroupr   r   r  r3  r   	NoVarTypeVarType_equivalentsr   r
  r+  r]  rk  ContextSubstChainContextSubstExtensionSubstReverseChainSingleSubst	SinglePosPairPos
CursivePosMarkBasePos
MarkLigPosMarkMarkPos
ContextPosChainContextPosExtensionPosNoncontextualMorphRearrangementMorphContextualMorphLigatureMorphInsertionMorphr  r   r  r  r  rh  r  r  otConvertersr7  r  r7  r  r8  convertersByName)r9  r0  	formatPat	namespacer   r  	baseClassm
formatTyperJ  r   varType	noVarTypebaserc  rd  
lookupEnumenumr}   r7  r  r8  rS  s                          rM   _buildClassesr^  
  s   

89I	I  "e	OOD!771:D q!J8DIy ti\2.C'' $!IdO!"&  (a??5!c$i!mQRI8MoG!$qr(+I )G 'I( #((* "
d 	"C!IcN	""  &	
 

 !
 "!
3!KD &f-K!((* "
#))+ 	"ID#!CN	"" 	! 1f D*C(Q,'D1f I*H(Q,'I . UeOOD!88:LD&[FD/C3-!#')$+:59i+P(J(%/CNN6"+;C  ( D/C3B5)3T0CNC0!UrL   c                 "    | g S | j                   S r   )r  )r
  s    rM   r  r  
  s    	rL   )__doc__r  r]  r   	functoolsr   mathr   	itertoolscollectionsr   r   r  r   %fontTools.ttLib.tables.TupleVariationr	   !fontTools.ttLib.tables.otTraverser
   fontTools.misc.arrayToolsr   fontTools.misc.roundToolsr   fontTools.misc.transformr   r   r   fontTools.misc.textToolsr   r   r   fontTools.misc.vectorr   fontTools.pens.boundsPenr   fontTools.pens.transformPenr   otBaser   r   r   r   r   fontTools.misc.fixedToolsr   r   r   r   r   r   r   r    fontTools.feaLib.lookupDebugInfor    r!   loggingrb   arraysysr"   typingr#   r$   r%   r&   r'   fontTools.ttLib.ttGlyphSetr(   	getLoggerr8   r  r*   rN   r?   r@   rA   rC   rD   rH   rI   rE   rF   r   r   r   r   r   r   r   objectr   r  r  r  rB  rO  rT  r  r  r  r  r  r  r   r  r  r  r
  r+  r?  r]  rk  r  r  r  r  r  r  r  r   r  r-  r  r?  r  r  r  r  r  r   r$  r.  r^  r  rK   rL   rM   <module>rx     sV        / / @ < 2 - M M = = ( 5 4   T    
  ? ?6 g!* *6 '7  ,**Aq! ,**Aq! **;*I*I2sTUV'(9(F(FAqQ'(9(F(FAqQ&'8'D'Db$PQR&'8'D'Db#qQ)*;*J*JAqRST)*;*J*JAqRST $ &%)%	 +*2*		$.>"vB vBr. .D"F "v 
# #*R0y R0j>@I >@B! !J) JZD#9 D#NTI T	 		 		] 	V&' V&v   IP7@ IPX4?	 4?n
I 
$M,* M,`H, HVg8' g8TC'- C'Lw, wt6(9 6(r+E +E\$9 $$I $G =.w7 =R+/8 R+j G >+' +\@,W5 @T !" ! ' QYMj<~4:4DN9~ 		 	

25vkU^ rL   