
    Mcgz                       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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-Z.m/Z0 ddl1m2Z2m3Z3 ddl4Z4ddl5Z5ddl6Z6ddl7Z7ddlm8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> e:rddl?m@Z@  e4j                  eB      ZC G d de8      ZD edg d      ZE eEeDj                  ddd       eEeDj                  ddd       eEeDj                  ddd       eEeDj                  ddd       eEeDj                  ddd       eEeDj                  ddd       eEeDj                  ddd       eEeDj                  ddd       eEeDj                  ddd      d	ZOd  d! d" d# d$ZPd% d& d' d( d$ZQd) ZRd* ZS G d+ d,      ZT G d- d.      ZU G d/ d0eV      ZW G d1 d2eV      ZX G d3 d4eV      ZY G d5 d6eY      ZZ G d7 d8eY      Z[ G d9 d:eV      Z\ G d; d<eY      Z] G d= d>eY      Z^ G d? d@e#      Z_ G dA dBe_      Z` G dC dDe_      Za G dE dFe_      Zb G dG dHe$      ZcdIZd G dJ dK e'dL            Ze G dM dNe#      Zf G dO dPe#      Zg G dQ dRe$      Zh G dS dTe$      Zi G dU dVe$      Zj G dW dXe$      Zk G dY dZe$      Zl G d[ d\e#      Zm G d] d^e#      Zn G d_ d`e#      Zo G da dbe#      Zp G dc dde      Zq G de df e'dL            Zr G dg dh e'dL            Zs G di dje      Zt G dk dle      Zu G dm dne      Zv G do dp e'dL            Zwdqdrdsdtdudvdwdxdydzd{d|d}d~ddZxd Zyd Zzd Z{d Z|d Z}d Z~eze{e|de}e~ddZd 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)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     Z/var/www/html/bid-api/venv/lib/python3.12/site-packages/fontTools/ttLib/tables/otTables.pyr)   r)   3   sW    #I!'$MNLLNNLKK)MrK   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    rL   <lambda>re   e       T1%rK   c                 .    t        j                  d|       S )N>Hr`   rc   s    rL   re   re   f   rf   rK   c                 4    t        j                  d|       dd  S )N>Lr   r`   rc   s    rL   re   re   g   s    T1%ab)rK   c                 .    t        j                  d|       S )Nrj   r`   rc   s    rL   re   re   h   rf   rK   )r   r*      r+   c                 4    t        j                  d|       d   S )Nr_   r   ra   unpackrc   s    rL   re   re   k       tQ'*rK   c                 4    t        j                  d|       d   S )Nrh   r   rn   rc   s    rL   re   re   l   rp   rK   c                 :    t        j                  dd| z         d   S )Nrj       r   rn   rc   s    rL   re   re   m   s    tUQY/2rK   c                 4    t        j                  d|       d   S )Nrj   r   rn   rc   s    rL   re   re   n   rp   rK   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.
    r0   r      r,   r*      r-   rl         r+   r.      rJ   )dataib0s      rL   _read_uint32varr~   r   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$ 	$rK   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.
    r0   r_   r6   rh      i    rj   i   r   Ni   l      @ rx   r`   rc   s    rL   _write_uint32varr      s    
 	4x{{4##	
V{{4!f*..	
X{{4!h,044	
Z{{4!j.22{{4&T1)===rK   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    rL   __init__zVarComponent.__init__   s    rK   Nc                     d| _         d | _        d | _        d | _        d| _        t
        | _        t
        | _        t               | _	        y )Nr   rJ   )
flags	glyphNameconditionIndexaxisIndicesIndex
axisValuesNO_VARIATION_INDEXaxisValuesVarIndextransformVarIndexr   	transformr   
propagators     rL   r   zVarComponent.populateDefaults   sA    
" $"4!3,.rK   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   rl   r*   AxisIndicesListc              3   4   K   | ]  }t        |d         yw   N)fi2fl.0rd   s     rL   	<genexpr>z)VarComponent.decompile.<locals>.<genexpr>   s     #E*QE!RL*   rJ   c           	          | j                   z  rGt        t        j                  ddz          d   | j                        | j
                  z  }dz  |S | j                  S )N>hr*   r   )rN   r   ra   ro   rO   rP   rQ   )valuesrd   r{   r   r|   s     rL   read_transform_componentz8VarComponent.decompile.<locals>.read_transform_component   sk    v{{"dDQUO<Q?AVAV ll#  Q***rK   r   )r~   r   r)   rF   	_unpacker
glyphOrderr   rA   r   r;   r   Itemlenr   decompileDeltas_tupler   r<   r   r   r=   r   r   r   VAR_TRANSFORM_MAPPINGitemssetattrrC   rX   rY   rI   )r   r{   font
localStategidSizeglyphIDnumAxesaxisIndicesr   r   	attr_namemapping_valuesvaluen_r   r|   s    `             @@rL   	decompilezVarComponent.decompile   sK   '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%I~,^<EDNNIu5 *G )666$(NN$9$9DNN!%333"4+DAqQJA  ABxrK   c                 N  
 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}t,        j/                         D ]3  \  }}t1        | j2                  |      }	|j                   ||	|             5 t        
      t5        |      z   S c c}w )N  rl   r*   r   c                     |j                   z  r7t        j                  dt        | |j                  z  |j
                              S y)Nr   rK   )rN   ra   rb   fl2firP   rO   )r   r   r   s     rL   write_transform_componentz7VarComponent.compile.<locals>.write_transform_component  s@    v{{"{{% 4f6K6KL  rK   )r   
getGlyphIDr   r)   rF   append_packerr   rA   r   r   r   r;   r   r   compileDeltaValues_r   r   r   r<   r   r=   r   r   getattrr   r   )r   r   r{   r   r   rd   r   r   r   r   r   s             @rL   compilezVarComponent.compile   s+   

//$..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\?; '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%I~DNNI6EKK1%HI *G  &488; <s   J"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   rJ   c                 \    |)j                  | d|ff|z          j                          y y )Nr   )	simpletagnewline)namer   attrswriters      rL   writez!VarComponent.toXML.<locals>.write)  s5       %(8':U'BC  !rK   r   r   r   ))resetUnspecifiedAxesr   r   r   r   r   )rJ   )begintagr   r   r   r   r   r)   r:   r   floatfl2strr   r   r   r   r   rN   r   r   rO   endtag)r   r   ttFontr   r   rd   r   mappings    `      rL   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     rL   r   z'VarComponent.fromXML.<locals>.<genexpr>^  s     'K{!q"{r   r   0r   r   )
isinstancer   r   r   r   r   r   r   getr   r)   r:   r   r   r   r   r   rN   )r   r   r   contentr   crd   s          rL   fromXMLzVarComponent.fromXMLN  sD   %>gAu)=1g>$+ 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   rN   r   rO   rP   )r   rd   deltasr|   r   s     rL   read_transform_component_deltazIVarComponent.applyTransformDeltas.<locals>.read_transform_component_deltar  sC    zzFKK'&)V%:%:;fllJQrK   )r   r   r   r   r   r   r)   rC   rX   rY   r   )r   r   r   r   r   r   r|   s   ``    @rL   applyTransformDeltasz!VarComponent.applyTransformDeltaso  s    	 *?)D)D)F%I~2>BE	74>>9+MPU+U *G 

.;;;$(NN$9$9DNN!CK1!S[!11rK   c                 n    t        |       t        |      k7  rt        S | j                  |j                  k(  S r   )typeNotImplemented__dict__)r   others     rL   __eq__zVarComponent.__eq__  s+    :e$!!}}..rK   c                 >    | j                  |      }|t        u r|S | S r   )r   r   )r   r   results      rL   __ne__zVarComponent.__ne__  s$    U#>1vA6zArK   r   )r7   r8   r9   r   r   r   r   r   r   r   r   r   rJ   rK   rL   r   r      s5     /DL59n'R#B2./
BrK   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     rL   r   zVarCompositeGlyph.__init__  s    (2(>*BrK   c                     g | _         |r<t               }|j                  |||      }| j                   j                  |       |r;y y r   )r   r   r   r   )r   r{   r   r   	components        rL   r   zVarCompositeGlyph.decompile  s>    $I&&tT:>DOO""9- rK   c                 ~    g }| j                   D ]"  }|j                  |j                  |             $ t        |      S r   )r   r   r   r   )r   r   r{   r   s       rL   r   zVarCompositeGlyph.compile  s6    IKK	))$/0 )rK   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          rL   r   zVarCompositeGlyph.toXML  sg    .6%doo6LAyOOItwl^< 7,-rK   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          rL   r   zVarCompositeGlyph.fromXML  sp    %>gAu)=1g>$+ D%>)))$IdE7D9OO""9-	 %, ?s
   A-A-r   )r7   r8   r9   r   r   r   r   r   rJ   rK   rL   r   r     s    G..rK   r   c                       e Zd Zd Zy)AATStateTablec                 .    i | _         g | _        g | _        y r   )GlyphClassesStatesPerGlyphLookupsr   s    rL   r   zAATStateTable.__init__  s    !rK   Nr7   r8   r9   r   rJ   rK   rL   r   r     s    "rK   r   c                       e Zd Zd Zy)AATStatec                     i | _         y r   )Transitionsr   s    rL   r   zAATState.__init__  s
    rK   Nr   rJ   rK   rL   r   r     s    rK   r   c                   ,    e Zd ZdZed        Zd Zd Zy)	AATActionNc                      y)NNNrJ   )r   statess     rL   compileActionszAATAction.compileActions  s    rK   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       rL   _writeFlagsToXMLzAATAction._writeFlagsToXML  s     KK<Kq4==+;K<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   rN   s     rL   _setFlagzAATAction._setFlag  s-    t{{"@$9D$@@""drK   )r7   r8   r9   r  staticmethodr  r  r  rJ   rK   rL   r  r    s#    F  #rK   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 ⇒ Dxrl   u   AxD ⇒ DxAu   ABx ⇒ xABrz   u   ABx ⇒ xBA   u   xCD ⇒ CDx   u   xCD ⇒ DCxr,   u   AxCD ⇒ CDxA	   u   AxCD ⇒ DCxArT   u   ABxD ⇒ DxAB   u   ABxD ⇒ DxBArR   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    rL   r   z!RearrangementMorphAction.__init__  s.    	 rK   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   r6   r5   )writeUShortr#  r$  r  r  r  r  r   r   r   actionIndexr   s        rL   r   z RearrangementMorphAction.compile  s    """4==)yyA~$))r/<499<1		D...>>VOEVOE==VOE5!rK   c                     |J |j                         | _        |j                         }|dz  | _        t        |dz        | _        t        |dz        | _        t        |dz        | _        |dz  | _        y )Nr   r   r6   r5   i  )
readUShortr#  r$  boolr  r  r  r  r   readerr   actionReaderr   s        rL   r   z"RearrangementMorphAction.decompile   st    ###))+!!#CK	efn-/UV^,"V^rK   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         rL   r   zRearrangementMorphAction.toXML
  s    	4)5)Jdmm<i(F$))4kkoodii0"k*rK   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
eltContentrN   s
             rL   r   z RearrangementMorphAction.fromXML  s    9:::	D$6<AAA)DM%>gAu)=1g>-4)GXz*$ ('): ;F"$Xg%67	O+%-hw.?%@"G#$W-33C8DMM$**,/ 9 .5 ?s   C C N)r7   r8   r9   
staticSizeactionHeaderSizer  r0  r   r   r   r   r   rJ   rK   rL   r  r    s    J5F	;	; 	
; 	
=	
 	
= 	
= 	
= 	
= 	
? 	
? 	O 	O 	 	 	  	!F&",0rK   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#  r?  r  r  	MarkIndexCurrentIndexr   s    rL   r   zContextualMorphAction.__init__-  s/    )5&d&,:))rK   c                 ,   |J |j                  | j                         | j                  }| j                  r|dz  }| j                  r|dz  }|j                  |       |j                  | j
                         |j                  | j                         y )Nr   r6   )r&  r#  r  r?  r  rC  rD  r'  s        rL   r   zContextualMorphAction.compile3  s    """4==)""<<VOEVOE5!4>>*4,,-rK   c                 
   |J |j                         | _        |j                         }t        |dz        | _        t        |dz        | _        |dz  | _        |j                         | _        |j                         | _        y )Nr   r6   i?  )r*  r#  r+  r?  r  r  rC  rD  r,  s        rL   r   zContextualMorphAction.decompile?  sz    ###))+!!#EFN+/"V^**,"--/rK   c                     |j                   |fi | |j                          |j                  d| j                         |j                          | j	                  |       |j                  d| j
                         |j                          |j                  d| j                         |j                          |j                  |       |j                          y )Nr#  r  rC  rD  )r   r   r   r#  r  rC  rD  r   r   r   r   r   r   s        rL   r   zContextualMorphAction.toXMLI  s    	4)5)Jdmm<i(Kt~~>N$2C2CDrK   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   FrB  r#  r   r
  r  r  rC  rD  )r#  r  r?  r  rC  rD  r   r   r   r4  r  r5  r6  s
             rL   r   zContextualMorphAction.fromXMLV  s    -..**//t',:))%>gAu)=1g>-4)GXz*$ ('): ;G#$W-33C8DMM$**,/ 9O+%-hw.?%@"K'!)(7*;!<N*$,Xg->$?! .5 ?s   C:C:N)r7   r8   r9   r;  r<  r  r   r   r   r   r   rJ   rK   rL   r>  r>  (  s1    J'F;
.0@rK   r>  c                       e Zd Zd Zy)	LigActionc                      d| _         d| _        y )NFr   )StoreGlyphIndexDeltar   s    rL   r   zLigAction.__init__j  s    
  !rK   Nr   rJ   rK   rL   rK  rK  i  s    !rK   rK  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  rR   SetComponentr  c                 L    d| _         d\  | _        | _        d| _        g | _        y )Nr   rA  )r#  rQ  r  r  Actionsr   s    rL   r   zLigatureMorphAction.__init__  s(    .:+4+rK   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   r6   r   r5   )r&  r#  r  rQ  r  r   rS  compileLigActions)r   r   r   r(  r   actionss         rL   r   zLigatureMorphAction.compile  s    &&&4==)""VOEVOEt||q VOE5!t||q ,,.G{734q!rK   c                 4   |J |j                         | _        |j                         }t        |dz        | _        t        |dz        | _        t        |dz        }|dz  | _        |j                         }|r| j                  ||      | _        y g | _        y )Nr   r6   r5   i  )r*  r#  r+  rQ  r  r  _decompileLigActionsrS  )r   r-  r   r.  r   performActionr(  s          rL   r   zLigatureMorphAction.decompile  s    '''))+!!# 0/UV^, #V^'')44\;ODLDLrK   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 )NrK   c                     t        |        | fS r   r   xs    rL   re   z4LigatureMorphAction.compileActions.<locals>.<lambda>  s    Q|rK   keyr   r+   )
setr  r   addrU  sortedranger   
setdefaultr   )r   r  r   rV  r(  state_glyphClasstransar|   suffixsuffixIndexs               rL   r  z"LigatureMorphAction.compileActions  s    '*CE2E&+&7&7&=&=&?"UE3356 '@  %;<A#q#a&!,AqrUF#&v;?q"8K**6;? - ! = VQ$$rK   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      @rj   )	r   rS  r   rN  rM  r   ra   rb   r   )r   r   r|   actionlastr   s         rL   rU  z%LigatureMorphAction.compileLigActions  s    "4<<0IAvDLL)A--D**Z7E4ZQ.E6<<ZQ6EMM&++dE23 1   rK   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+   rn  ro  rm  i    i   )getSubReaderpos	readULongr+  rK  r   rM  rN  )	r   r.  r(  rV  rq  r-  r   rp  deltas	            rL   rX  z(LigatureMorphAction._decompileLigActions  s    **<+;+;kAo+MN$$&E
*+D[FNN6"
 23FLJ&E
"#e+%*F"  rK   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 rM  rN  )r#  r  rQ  r  rS  r   r   r   r4  r  r5  rK  r   rM  rN  r   )r   r   r   r   r   r7  r8  r9  r:  rN   rp  r   r  s                rL   r   zLigatureMorphAction.fromXML  sD   -..*/44D,%>gAu)=1g>-4)GXz*$ ('): ;G#$W-33C8DMM$**,/ 9O+%-hw.?%@"H$" Wb177<,12EqE2&%/)1(;L2M)N&##F+ .5 ? 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  rN  )r
  rM  rx  )
r   r   r   r#  r  rS  rN  rM  r   r   )r   r   r   r   r   rp  attribss          rL   r   zLigatureMorphAction.toXML  s    	4)5)Jdmm<i(llF)6+A+ABCG||12'2 # 	rK   N)r7   r8   r9   r;  r<  r  r   r   r   r  r  rU  rX  r   r   rJ   rK   rL   rP  rP  x  sP    J m,F""& % %4! ,,rK   rP  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+   )r?  r  CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 z    d| _         | j                  D ]  }t        | |d        d| _        g g c| _        | _        y r"  )r#  r  r   r  CurrentInsertionActionMarkedInsertionActionr  s     rL   r   zInsertionMorphAction.__init__  s=    KKDD$&  BDb?#T%?rK   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   r6   r5   r4   r3   r2   rz   r   r   )r&  r#  r  r?  r  r~  r  r  r  r   r  r  r   )r   r   r   r(  r   currentIndexmarkedIndexs          rL   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;'rK   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   r6   r5   r4   r3   r2   i  rz   )r   count   )r*  r#  r+  r?  r  r~  r  r  r  _decompileInsertionActionr  r  r,  s        rL   r   zInsertionMorphAction.decompile6  s    '''))+!!#EFN+/$($8!#'#7 #'#7 "&uv~"6&*&D&D$f&7&7&956>VWBW 'E '
# &*%C%C$f&7&7&9%&. &D &
"rK   c                     |dk(  s|dk(  rg S |j                  |j                  |dz  z         }|j                  |j                  |            S )Nr   r   r*   )rs  rt  getGlyphNameManyreadUShortArray)r   r.  r   r   r  r-  s         rL   r  z.InsertionMorphAction._decompileInsertionActionG  sO    F?eqjI**<+;+;eai+GH$$V%;%;E%BCCrK   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         rL   r   zInsertionMorphAction.toXMLM  s    	4)5)Jdmm<i(,,A 8B - ++A 7qA , 	rK   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#  r4  r  r5  r  r   r  r6  s
             rL   r   zInsertionMorphAction.fromXML\  s    %>gAu)=1g>-4)GXz*$ ('): ;G#$W-33C8DMM$**,/ 944++228G3DE33**11(72CD%g%u .5 ?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 )NrK   c                     t        |        | fS r   r\  r]  s    rL   re   z5InsertionMorphAction.compileActions.<locals>.<lambda>x  s    c!fWaLrK   r_  r   r*   r   rh   )ra  r  r   r  rb  r   r  rc  rd  r   re  r   ra   rb   )r   r  rV  r(  r   rf  rg  rh  rp  start
startIndexlimitglyphsr  r   s                  rL   r  z#InsertionMorphAction.compileActionsl  s;   '*ub#fE&+&7&7&=&=&?"U//;KKe&B&B CD..:KKe&A&A BC	 '@  W*@AF $q#f+.!&kQ.%7
"5#f+6E#EEAI6F**6:> 7 /
  //%0&++dG44   B" {""rK   N)r7   r8   r9   r;  r<  r  r   r   r   r  r   r   r  r  rJ   rK   rL   r}  r}    sH    JFI(<
"D&  # #rK   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__r7   r   r   )r   r   r   s      rL   r   zFeatureParams.compile  s[    !!&"674>>I	
 < NN##
	
I
 	$-rK   Nc                 `    t        j                  | |||| j                  j                         y )N)r   )r   r   r  r7   rH  s        rL   r   zFeatureParams.toXML  s     iu4>>;R;RSrK   r  )r7   r8   r9   r   r   rJ   rK   rL   r  r    s    .TrK   r  c                       e Zd Zy)FeatureParamsSizeNr7   r8   r9   rJ   rK   rL   r  r        rK   r  c                       e Zd Zy)FeatureParamsStylisticSetNr  rJ   rK   rL   r  r    r  rK   r  c                       e Zd Zy)FeatureParamsCharacterVariantsNr  rJ   rK   rL   r  r    r  rK   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     rL   r   zCoverage.populateDefaults  s    tX&DK 'rK   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ri  s    rL   re   z#Coverage.postRead.<locals>.<lambda>  s
    9M9MrK   r_  .GSUB/GPOS Coverage is not sorted by glyph ids.zUnknown Coverage format: %s)Formatr  rc  logwarningStartEndr   extendr  rd  )r   rawTabler   r  rangessorted_rangesrr  endstartIDendIDs              rL   postReadzCoverage.postRead  s    ;;!"<0DK* K) [[A#%%FT[m,F #6/MNM&LM&ee//%0,q0d33E'54IJK  K DKKK5t{{CKrK   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   rl   r  c                     | j                   S r   )StartIDr  s    rL   re   z#Coverage.preWrite.<locals>.<lambda>  s    aiirK   r_  r*   r  )r   r  getGlyphIDManyrc  r   r   rd  r  r  getGlyphNamer  r  r  r  r  sortr  )r   r   r  formatr  glyphIDsbrokenOrderrq  r  r   r   r|   r  r  r  s                  rL   preWritezCoverage.preWrite  s   x.>#%%FT[ &)**62H *h6KA;DfXF#AB<dQh&2J%%d+MM7),	 (
 2Jd#c&kAoF;s6{+A!'JE3#A %AI"//6AG --c2AE+0A( !F1I!CK%/!3E , KK PQKK$7K8A	  )62 rK   c                 n    t        | dg       D ]%  }|j                  d|       |j                          ' y )Nr  Glyphr  )r   r   r   )r   r   r   r   s       rL   toXML2zCoverage.toXML2  s4     x4Iy9 5rK   c                 \    t        | dd       }|	g }|| _        |j                  |d          y )Nr  r   )r   r  r   )r   r   r   r   r   r  s         rL   r   zCoverage.fromXML  s1    x.>F DKeGn%rK   r   r7   r8   r9   r   r  r  r  r   rJ   rK   rL   r  r    s    2*X 
&rK   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     rL   r   z!DeltaSetIndexMap.populateDefaults      tY'DL (rK   c                 2    |d   dz  dk(  sJ |d   | _         y )NEntryFormat  r   r   )r   )r   r  r   s      rL   r  zDeltaSetIndexMap.postRead	  s&    '&0Q666	*rK   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 rl   r+   )max)r   oredidxinner	innerBits	entrySizes         rL   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7rK   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       rL   r  zDeltaSetIndexMap.preWrite'  so    $	40?%''Gdlw<&0aa==%%'#&w< "&"5"5g">rK   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)r1  r   r   r   r   r  r   )r   r   r   r|   r   r   s         rL   r  zDeltaSetIndexMap.toXML21  s     	ST!'$	2">?HAuq\NE** %2+. %&.1 u- @rK   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	            rL   r   zDeltaSetIndexMap.fromXMLB  s|    $	40?%''DL7w(7H567H56uu{e34rK   c                 \    |t        | j                        k  r| j                  |   S t        S r   )r   r   r   )r   r|   s     rL   __getitem__zDeltaSetIndexMap.__getitem__L  s&    "#c$,,&7"7t||AO=OOrK   r   )r7   r8   r9   r   r  r  r  r  r  r   r  rJ   rK   rL   r  r    s5    + 8 82 "5PrK   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     rL   r   zVarIdxMap.populateDefaultsQ  r  rK   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        rL   r  zVarIdxMap.postReadU  si    '&0Q666'')
9%}J#g,(FGHC
G45rK   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         rL   r  zVarIdxMap.preWrite\  s    $	40?%''Gdl'')
'12z!71:z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  )rc  r   r   r   r   )r   r   r   r  r   r   s         rL   r  zVarIdxMap.toXML2k  sm    "74B#?#E#E#GHLE5% %2+&%&.)E
 u- IrK   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	            rL   r   zVarIdxMap.fromXMLu  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     rL   r  zVarIdxMap.__getitem__  s    ||	+=>>rK   r   )	r7   r8   r9   r   r  r  r  r   r  rJ   rK   rL   r  r  P  s     6 /?rK   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      rL   r  zVarRegionList.preWrite  sR     HHV$	#&y~~#6D 
mm
~dmm=NO
 	
rK   Nr7   r8   r9   r  rJ   rK   rL   r  r    s    
rK   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     rL   r   zSingleSubst.populateDefaults  r  rK   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   inputrv  	inputGIDSr   outGIDSoutNamesinpoutsubstsubs                 rL   r  zSingleSubst.postRead  s   +HZ,@A;;!^,E++E2I@IJ	W%50	GJ,,W5Hx0S" 1[[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   rc  r  r  r  r  )r   r   r   r   r   ri  bgidItemssortableItemsr  rv  inIDoutIDr  covitemr  r  s                     rL   r  zSingleSubst.preWrite  sa   $	40?%''GdlW]]_%__
?DEutq!Z]JqM2uEs8U34 #KD%}.u%. $ }j(56a6(56a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  )rc  r   r   r   r   )r   r   r   r   inGlyphoutGlyphs         rL   r  zSingleSubst.toXML2  sR    t||))+,!&GX$5(BS0TU "'rK   c                 J    t        | dd       }|	i }|| _        |d   ||d   <   y )Nr   r  r"  )r   r   )r   r   r   r   r   r   s         rL   r   zSingleSubst.fromXML  s3    $	40?G"DL$U|drK   r   r  rJ   rK   rL   r  r    s    ,%N ,rK   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     rL   r   zMultipleSubst.populateDefaults  r  rK   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          rL   r  zMultipleSubst.postRead  sx    ;;!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   r_  r   )r  r*  )
r   r   r  rc  r  keysr   r  r  makeSequence_)r   r   r   r  r  r  s         rL   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  )rc  r   r   r  r   r   )r   r   r   r   r#  	outGlyphsr  s          rL   r  zMultipleSubst.toXML2  s_    t||))+,"'GY((9%C$5#,0OP #(rK   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   r4  r5  )r   r   r   r   r   r   elementelement_nameelement_attrsr   r   r  glyph_mappingr0  r  s                  rL   r   zMultipleSubst.fromXML  sB   $	40?G"DL :!#D"!'5118.mQ7*&&--mG.DE # :		'3w<89E&&u-E-//MGEN"!'5118.mQ</!((w)?@ #  05U|E%L&&s+	3<=9a	9=d=s   ?D c                 (    t               }| |_        |S r   )r*  r  )r  seqs     rL   r.  zMultipleSubst.makeSequence_-  s    j
rK   r   )
r7   r8   r9   r   r  r  r  r   r  r.  rJ   rK   rL   r'  r'    s0    	 >@  rK   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  r=  r   s     rL   r   zClassDef.populateDefaults5      t[)DN *rK   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  rd  r  Classr  r  r  r  r=  )r   r  r   r=  r  	classListr  r  
glyphNamesr   clsrecordsrecr  s                 rL   r  zClassDef.postRead9  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"KrK   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 )Nr=  r   r   r  )r   r=  r   r   r   r  r  )r   r   r=  r   r   r   rF  rq  lastNamelastClsr  r   s               rL   _getClassRangeszClassDef._getClassRangesX  s   D+t4	DN__
'oo/NIsLL*Y/C@A 0 JJL&+Ah#D(Gh/0F+09'CdQh&#.2J%%tX&67MM3";<$ ,5 2JtX./M rK   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*   rB  r   r   r  rl   )r@  rA  )rL  r   rd  rB  r  r  rC  r  )r   r   r  r  r  
startGlyphendGlyph
glyphCountr|   rF  r  	startNamer  endNamerH  startGlyphNameclassesr  s                     rL   r  zClassDef.preWriteq  s7   &+%%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%(
 M <B *8WUrK   c                     t        | j                  j                               }|D ]-  \  }}|j                  dd|fd|fg       |j	                          / y )Nr;  r  class)rc  r=  r   r   r   )r   r   r   r   r   rF  s         rL   r  zClassDef.toXML2  sQ    t~~++-.#NIs
gy-AGS>,RS $rK   c                 \    t        | dd       }|	i }|| _        t        |d         ||d   <   y )Nr=  rV  r  )r   r=  r3  )r   r   r   r   r   r=  s         rL   r   zClassDef.fromXML  s9    D+t4	I&DN$'g$7	%.!rK   r   )	r7   r8   r9   r   r  rL  r  r  r   rJ   rK   rL   r;  r;  4  s      >2> 8rK   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     rL   r   zAlternateSubst.populateDefaults  s    t\* DO +rK   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           rL   r  zAlternateSubst.postRead  s    
;;!/0DEEN+Du:T***t,S"%--
3 - 9*T[[881$KrK   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  r]  )r  r   r[  r  r   rd  r   r   r  r  r  r]  r^  r   sortCoverageLast)r   r   r[  r   r|   r   ra  r  r  setListr_  s              rL   r  zAlternateSubst.preWrite  s   T<6
+--JZ%%'(s5z"A"1XNIsy19cAE!H # 	

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 )Nr]  r  r^  )rc  r[  r   r   r   r   r   )r   r   r   r   r   r[  r`  s          rL   r  zAlternateSubst.toXML2  s    t,,./%*!Iz~Y?!##Ks#;!!# " ^, &+rK   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   ra  r4  s	            rL   r   zAlternateSubst.fromXML  sm    T<6
J(DO'N	 #
9Ggu-#* D%JJuW~&	 rK   r   r  rJ   rK   rL   rY  rY    s    !=4	 'rK   rY  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  ri  r   s     rL   r   zLigatureSubst.populateDefaults  r>  rK   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   rd  Ligatureri  )r   r  r   ri  r  ligSetsr|   s          rL   r  zLigatureSubst.postRead  s    	;;!/0DEE}-Gu:W---3u:&&-aj&9&9	%(# ' 9*T[[881"KrK   c                     t        |        S r   r\  r   s    rL   _getLigatureSortKeyz!LigatureSubst._getLigatureSortKey  s    6 JrK   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   ri  r_  r   r  )r  rk  )r  r   ri  r   nextiterr   r  rc  r-  ro  rl  	Componentr   	CompCountLigGlyphre  r   r  r   rd  r   r  r  r  rk  rb  )r   r   ri  newLigaturescompsligaturer   r|   r   ra  r  r  rm  rc  ligSetligsligs                    rL   r  zLigatureSubst.preWrite  s   D+t4	)++IDi$95A
  6L	 0d6N6NO#:%*12Y"%(Z"$-e$4!''a"5<<XF P %IY__&'s5z"A"1XNIsy19cAE!H # 	

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 )Nrk  r  rl  r  )r  r   )
rc  ri  r   r   r   r   ru  r  rs  r   )r   r   r   r   r   rm  r{  s          rL   r  zLigatureSubst.toXML2=  s    t~~++-."'Iw}I>##cllsxx?V $  !!#	 
 ]+ #(rK   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 )Nri  r  r   r  )r   ri  r   r   rl  ru  r4  rs  r   rt  r   )r   r   r   r   r   ri  r   rz  r4  r{  r   s              rL   r   zLigatureSubst.fromXMLJ  s    D+t4	I&DN'N	#	)Ggu-#* D%*C >CL|,J5?J,,S1RCM.CMKK rK   r   )
r7   r8   r9   r   r  r  ro  r  r  r   rJ   rK   rL   rg  rg    s0         8(9T rK   rg  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)	rs  getConvertersr   advancer;  readAssertionErrorr   r   )r   r-  r   	subReaderconvs        rL   r   zCOLR.decompile_  s     ''q'1	&&(Dyy..!!$//2 $		)TR	 HF499 ) !!GHH""466rK   c                 \    d | _         i | j                  dt        | j                  d      iS )Nr  )r  r   r   r   r   s     rL   r  zCOLR.preWritep  s8     !%
mm
t}}>P Q
 	
rK   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  rH  clipBoxer  hasClipLists	            rL   computeClipBoxeszCOLR.computeClipBoxesz  s    <<1%%::C))224<P "'.cmm$ ; dJ/MDMM4M $   (
'($"'DMM%  6 9#--9JKs   B;;	C%C  C%Nr   )r7   r8   r9   r   r  r3  r  rJ   rK   rL   r  r  ^  s    7"
( (c (rK   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   r7   endswith
ValueError)r   lsts      rL   tablezLookupList.table  s\    Ajj8$$--g6!8$$--e4!	 !  rK   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featurer1  r   xmlWriteauxevalvars)r   r   r   	debugDatar  r   lookupIndexr  infotagscriptlanguager  r  s                rL   r  zLookupList.toXML2  s   T!$DL,=,==7>)T22L%%&;<TZZH	&&(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 )rK   )r7   r8   r9   propertyr  r  __classcell__)r  s   @rL   r  r    s!      E  ErK   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  rH  r   s    rL   re   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>  s    $//#--2PrK   r_  )rc  BaseGlyphRecordr   r  r  s    `rL   r  zBaseGlyphRecordArray.preWrite  s1    %  &P 
 }}!!##rK   Nr  rJ   rK   rL   r  r        $rK   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    rL   re   z(BaseGlyphList.preWrite.<locals>.<lambda>  s    ts}}7UrK   r_  )rc  r  r   r  r  s    `rL   r  zBaseGlyphList.preWrite  s1    $*%%+U%
! }}!!##rK   Nr  rJ   rK   rL   r  r    r  rK   r  c                        e Zd ZdZdZd Zd Zy)ClipBoxFormatr   r*   c                     | | j                   u S r   Variabler   s    rL   is_variablezClipBoxFormat.is_variable  s    t}}$$rK   c                     | j                   S r   r  r   s    rL   as_variablezClipBoxFormat.as_variable  s    }}rK   N)r7   r8   r9   Staticr  r  r  rJ   rK   rL   r  r    s    FH%rK   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     rL   r   z#ClipBox.as_tuple.<locals>.<genexpr>  s     O:N$WT499-:Ns    #)r   r  r   s   `rL   as_tuplezClipBox.as_tuple  s    O$:L:L:NOOOrK   c                 R    | j                   j                   | j                          S r   )r  r7   r  r   s    rL   __repr__zClipBox.__repr__  s#    ..))*4==?*;<<rK   N)r7   r8   r9   r  
formatEnumr  r  rJ   rK   rL   r  r    s    JP=rK   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     rL   r   zClipList.populateDefaults  s    tW%DJ &rK   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  rd  
IndexErrorr   r  r  minr  r  )r   r  r   r  r   r|   rH  redefinedGlyphsmissingGlyphsr   r  s              rL   r  zClipList.postRead  sO   '')
 67FAs#..0/$$NN  OM !1!13>>A3EF&w/E %#'99S[[#9E%L#**73 G 8 (( S&&	A 8L 
/ " !((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  r`  r  s          rL   groupszClipList.groups  s    "4("&**"2"2"4Iw""$C$$Y/+%#*C 	 #5 DPCUCUCW
CWKCIf{3//CW
 	
 
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   rJ   )r   r   glyphMaps     rL   r   z$ClipList.preWrite.<locals>.<genexpr>,  s!      5;	yH?T#Vs   	
r   r   r  )	ClipCountr  )r  r  getReverseGlyphMapr  r   rc  r   r  r  r  r  r   )r   r   clipBoxRangesr  r  r  rq  r  r   r  r  clipRecordsrecordr  r  s                 @rL   r  zClipList.preWrite&  sh   tW%DJ**,#{{}224OFG 5; H A;DfXF#AB<dQh&2J%%d+MM7),	 (
 2Jd#$
ss|=888.5ucl+ %  5$ %+M,?,?,A%B!LUC'\F"'F #F$FNv& &C [)%
 rK   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    rL   re   z ClipList.toXML.<locals>.<lambda>T  s    CQLrK   r_  Clipr  r  r  )r  r7   r  r   r  r   r   rc  r  r   r   r  r   )	r   r   r   r   r   	tableNamer  r  r   s	            rL   r   zClipList.toXMLJ  sS    Ddnn&=&=	=E4"LL(DKK019e,%KKM!'@ 
OFG v&#F^	##G9#=!!# , yHgnn+E*FGNN9d+Y'V$ 
 	#rK   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
             rL   r   zClipList.fromXMLe  s    gt,=!##DJv~~DdE*#' D%weGn-"!)!)%/!:#D%dE2 +/(D%OOD%$?	 $  #	#*i  $ rK   r   r  )	r7   r8   r9   r   r  r  r  r   r   rJ   rK   rL   r  r    s"    )V

"H6+rK   r  c                       e Zd ZdZdZdZy)
ExtendModer   r   r*   N)r7   r8   r9   PADREPEATREFLECTrJ   rK   rL   r  r    s    
CFGrK   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*   rl   r+   rz   r  r  r,   r  rT   r  rR   r  r   r   r-                        ry            N)r7   r8   r9   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_LUMINOSITYrJ   rK   rL   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NrK   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*   rl   r+   rz   r  r  r,   r  rT   r  rR   r  r   r   r-   r  r  r  r  r  r  r  ry   r	  r
  r           r  r.   c                 8    | j                   j                  d      S )NPaintVar)r   
startswithr   s    rL   r  zPaintFormat.is_variable  s    yy##J//rK   c                     | j                         r| S 	 t        j                  d| j                  dd      S # t        $ r Y y w xY w)Nr.  rz   )r  r)  __members__r   KeyErrorr   s    rL   r  zPaintFormat.as_variable  sL    K	**Xdiim_+EFF 		s   "7 	AAN)%r7   r8   r9   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  rJ   rK   rL   r)  r)    s    OJMJNNNJM "$&!')$KN !#IL!N0rK   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    rL   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  r7   r   r  r   r1  rV  r   r  r   )r   r   r   r   r   r  s         rL   r   zPaint.toXML  s     Ddnn&=&=	=Eh,-9e,$,,./It$#rK   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|   rd   s      rL   r   z+Paint.iterPaintSubTables.<locals>.<genexpr>  s2      DAq ''XQaHHs   %'r  )r   r   z not in colr.BaseGlyphList)r  r)  r3  	LayerListr  r   FirstLayerIndex	NumLayersr=  r  r  r  r  r   r]  r2  r  
tableClass
issubclassr   r   r   )r   rX  layersr  r  r   s         rL   iterPaintSubTableszPaint.iterPaintSubTables  s?    ;;+555F~~)--%4//$2F2F2WX   ;;+444,,AA##tzz1#11{&,,WW B
 $**/IJKK&&(D*z$//4PT:/Vdii0--499EJJ )!s&   A;F=F>AFAF1F=Fc                 ^    | j                  |      D cg c]  }|j                   c}S c c}w r   )rd  r   )r   rX  ps      rL   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   rd  paintrX  s    rL   re   z Paint.traverse.<locals>.<lambda>      %2J2J42PrK   iter_subtables_fnr  N)callable	TypeErrorr	   r   )r   rX  callbackpathrl  s    `   rL   traversezPaint.traverse  sB    !788"$P
D HNNEUO	
rK   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)  r>  r   xxyxxyyydxdyr@  r   	translaterB  rP   rX   rY   rD  centerXcenterYrF  rH  rJ  rotater   anglerL  rN  skew
xSkewAngle
ySkewAnglerP  r  rU  )r   r7  s     rL   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rK   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   rj  rk  s    rL   re   z&Paint.computeClipBox.<locals>.<lambda>C  rm  rK   rn  r  c              3   P   K   | ]  }|j                   j                            y wr   )r   r  )r   r  s     rL   r   z'Paint.computeClipBox.<locals>.<genexpr>I  s     <tRXX**,ts   $&)r   r	   r   r  r)  r<  r   r   r   r   r  drawr   boundsr  r3  r  r  r
   xMinyMinxMaxyMax)	r   rX  r  r  penrs  rl  transformationcbs	    `       rL   r  zPaint.computeClipBox>  s     x("$P
D HNNE||{555!'''<t<"
 %**<^+LM
 ::Y,,-	-9#**l-S*"'27	rK   r  r  )r7   r8   r9   r)  r  rV  r   r  r#   r   r]  rd  r$   rg  rt  r   r  r3  r%   r  r  rJ   rK   rL   r  r    s    JN
Kt K9P9P0Q K6@4= @	T 	)i )X HI$1AD	'	rK   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  
LookupTyperd  r   lookupTypesr  ExtSubTable)ttfoverflowRecordokr  extTypelookupslookupsisubTableextSubTableClassextSubTables              rL   fixLookupOverFlowsr    s   0 
B 00K##+!AoQ	6)		!	!V	+.**+11<<CCG[!F
//!

&
&
1
1W
<!Ao?I%	 //!

&
&
1
1W
< [#g,7%' 'FC01!??2.#.~/G/G#H#Q .0%&"*2'&1# 2	 8 
BIrK   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   )rc  r   r   r   itemName	itemIndexrd  )
oldSubTablenewSubTabler  r  
oldMappingoldLennewLenr|   r  r`  s
             rL   splitMultipleSubstr    s    	
B++1134J_F"== 1		 	 J	.  ))A-K66"!}1g#'7C $	 # IrK   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   rb  r  r*   r]  r   )	r  rb  rc  r[  r   r   r  r  rd  )
r  r  r  r  oldAltsr  r  r|   r  r`  s
             rL   splitAlternateSubstr  	  s    	
B{./'2'C'C$[++1134G\F"== 1		 	 N	2  ))A-K66"qz1g&*1gs#""3'	 # IrK   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*   rk  r   )rc  ri  r   r   r  r  rd  )
r  r  r  r  oldLigsr  r  r|   r  r`  s
             rL   splitLigatureSubstr  $	  s    	
B[**0023G\F"== 1		 	 M	1  ))A-K66"qz1g%)!Wc"!!#&	 # IrK   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   rJ   )r   krd   oldCounts      rL   r   zsplitPairPos.<locals>.<genexpr>o	  s     I&7da1=&7s   )r  r   PairSetr   r   r  r  r  PairSetCountClass1Recordr  Class2Recordr  	DontSharer  r=  ra  r   Class1Count)r  r  r  r  r  r   coveragerG  r=  	newGlyphsr  r  rd   r  s                @rL   splitPairPosr  >	  s=   	B	B$++KQ3{':':#;a#?2DKw{D'AB 3
  +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#NDKw{D'AB O !%  +33==? + 5 5 ? ? A''..))33	**{//0A5Iioo&7II	2:&Q(Qay>Pq(&Q#&__.+
.TQ!h,AqD.+
' $+9H#5 2:&M(Qa9nq(&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  
MarkRecordrC  r   	BaseArray
BaseRecordr  r  r  r  r   	MarkCount	BaseCount)r  r  r  
classCountoldClassCountnewClassCountoldMarkCoverageoldMarkRecordsnewMarkCoveragenewMarkRecordsr   
markRecordoldBaseRecordsnewBaseRecordsrH  oldBaseRecordnewBaseRecords                    rL   splitMarkBasePosr  	  sV   ''JA~!OM.M&("^O&("^O!$  '')>)>)I)I"	: m+""9-!!*--""9-!!*-" &(NN$$//'*}}}#&>>.=#A #&>>-.#A m,m, 0 %++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#rK   )r*   rl   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  
splitTabler2  r  errorr  )r  r  r  r  subIndexsubtablesubTableTyper  newExtSubTableClassnewExtSubTabletoInsertnewSubTableClassr  	splitFuncr  s                  rL   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Varrl   )r   r*   rl   r+   rz   r  r  r,   )	r   r*   rl   r+   rz   r  r  r,   r  r+   )r   r   r*   r+   rz   )r  r  mortmorxr  JSTFsizer  zss%02dd   zcv%02d)buildConverters
converters)5rer,  r   globalsr   matchgroupr   r   r  r/  r   	NoVarTypeVarType_equivalentsr   r  r'  rY  rg  ContextSubstChainContextSubstExtensionSubstReverseChainSingleSubst	SinglePosPairPos
CursivePosMarkBasePos
MarkLigPosMarkMarkPos
ContextPosChainContextPosExtensionPosNoncontextualMorphRearrangementMorphContextualMorphLigatureMorphInsertionMorphr  r   r  r  r  rd  r  r  otConvertersr3  r  r3  r  r4  convertersByName)r5  r,  	formatPat	namespacer   r  	baseClassm
formatTyperF  r   varType	noVarTypebaser_  r`  
lookupEnumenumr|   r3  r  r4  rO  s                          rL   _buildClassesrZ  
  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*C(Q,' 1f*H(Q,'  .eOOD!88:LD&[FD/C3-!#')$+:59i+P(J(%/CNN6"+;C  ( D/C3B5)3T0CNC0! rK   c                 "    | g S | j                   S r   )r  )r  s    rL   r  r  
  s    	rK   )__doc__r  rY  r   	functoolsr   mathr   	itertoolscollectionsr   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    loggingra   arraysysr!   typingr"   r#   r$   r%   r&   fontTools.ttLib.ttGlyphSetr'   	getLoggerr7   r  r)   rM   r>   r?   r@   rB   rC   rG   rH   rD   rE   r   r   r   r~   r   r   r   objectr   r   r  r  r>  rK  rP  r}  r  r  r  r  r  r   r  r  r  r  r'  r;  rY  rg  r  r  r  r  r  r  r  r  r  r)  r  r;  r  r  r  r  r  r  r   r*  rZ  r  rJ   rK   rL   <module>rt     sS        / @ < 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*		$.>"sB sBl. .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8v4:4DN9~ 		 	

25vkU^ rK   