
    #Vf"@                       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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mZm Z m!Z!m"Z" ddl#m$Z$m%Z% ddl&Z&ddl'Z'ddl(m)Z)m*Z*m+Z+m,Z,m-Z- e)rddl.m/Z/  e&j`                  e1      Z2 G d de3      Z4 G d de3      Z5 G d de3      Z6 G d de6      Z7 G d de6      Z8 G d de3      Z9 G d d e6      Z: G d! d"e6      Z; G d# d$e      Z< G d% d&e<      Z= G d' d(e<      Z> G d) d*e<      Z? G d+ d,e      Z@d-ZA G d. d/ e"d0            ZB G d1 d2e      ZC G d3 d4e      ZD G d5 d6e      ZE G d7 d8e      ZF G d9 d:e      ZG G d; d<e      ZH G d= d>e      ZI G d? d@e      ZJ G dA dBe      ZK G dC dDe      ZL G dE dFe      ZM G dG dHe      ZN G dI dJ e"d0            ZO G dK dL e"d0            ZP G dM dNe      ZQ G dO dPe      ZR G dQ dRe      ZS G dS dT e"d0            ZTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcddZUde ZVdf ZWdg ZXdh ZYdi ZZdj Z[eWeXeYdkeZe[dldmZ\dn Z]do Z^ e^        dp Z_y)qzfontTools.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)dfs_base_table)quantizeRect)otRound)	TransformIdentity)	bytesjoinpadsafeEval)ControlBoundsPen)TransformPen   )	BaseTableFormatSwitchingBaseTableValueRecordCountReference getFormatSwitchingBaseTableClass)LookupDebugInfoLOOKUP_DEBUG_INFO_KEY)TYPE_CHECKINGIteratorListOptionalSet)_TTGlyphSetc                       e Zd Zd Zy)AATStateTablec                 .    i | _         g | _        g | _        y N)GlyphClassesStatesPerGlyphLookupsselfs    h/var/www/html/software/conda/envs/catlas/lib/python3.12/site-packages/fontTools/ttLib/tables/otTables.py__init__zAATStateTable.__init__)   s    !    N__name__
__module____qualname__r*    r+   r)   r!   r!   (   s    "r+   r!   c                       e Zd Zd Zy)AATStatec                     i | _         y r#   )Transitionsr'   s    r)   r*   zAATState.__init__0   s
    r+   Nr,   r0   r+   r)   r2   r2   /   s    r+   r2   c                   ,    e Zd ZdZed        Zd Zd Zy)	AATActionNc                      y)NNNr0   )fontstatess     r)   compileActionszAATAction.compileActions7   s    r+   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,valuer   ReservedFlagsz0x%04X)_FLAGS__dict__	simpletagjoinnewlinerA   )r(   	xmlWriterfflagss       r)   _writeFlagsToXMLzAATAction._writeFlagsToXML;   s     KK<q4==+;<<sxx?"x$BTBT7TU #	 =s
   BBc                 R    || j                   v s
J d|z         d| j                  |<   y )Nzunsupported flag %sT)rB   rC   r(   flags     r)   _setFlagzAATAction._setFlagD   s-    t{{"@$9D$@@""dr+   )r-   r.   r/   rB   staticmethodr;   rJ   rN   r0   r+   r)   r6   r6   4   s#    F  #r+   r6   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')(RearrangementMorphAction   r   )	MarkFirstDontAdvanceMarkLastz	no changer   u	   Ax ⇒ xA   u	   xD ⇒ Dx   u   AxD ⇒ DxAu   ABx ⇒ xAB   u   ABx ⇒ xBA   u   xCD ⇒ CDx   u   xCD ⇒ DCx   u   AxCD ⇒ CDxA	   u   AxCD ⇒ DCxA
   u   ABxD ⇒ DxAB   u   ABxD ⇒ DxBA   u   ABxCD ⇒ CDxAB   u   ABxCD ⇒ CDxBA   u   ABxCD ⇒ DCxAB   u   ABxCD ⇒ DCxBAc                 X    d| _         d| _        d| _        d| _        d| _        d| _        y Nr   F)NewStateVerbrS   rT   rU   rA   r'   s    r)   r*   z!RearrangementMorphAction.__init__a   s.    	 r+   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   rb       @      )writeUShortre   rf   rA   rS   rT   rU   r(   writerr9   actionIndexrI   s        r)   compilez RearrangementMorphAction.compilei   s    """4==)yyA~$))r/<499<1		D...>>VOEVOE==VOE5!r+   c                     |J |j                         | _        |j                         }|dz  | _        t        |dz        | _        t        |dz        | _        t        |dz        | _        |dz  | _        y )Nrb   rh   ri   rj   i  )
readUShortre   rf   boolrS   rT   rU   rA   r(   readerr9   actionReaderrI   s        r)   	decompilez"RearrangementMorphAction.decompilev   st    ###))+!!#CK	efn-/UV^,"V^r+   c                     |j                   |fi | |j                          |j                  d| j                         |j                          | j	                  |       |j                  d| j
                         | j                  j                  | j
                        }||j                  |       |j                          |j                  |       |j                          y )Nre   r?   rf   )
begintagrF   rD   re   rJ   rf   _VERBSgetcommentendtag)r(   rG   r9   attrsnameverbComments         r)   toXMLzRearrangementMorphAction.toXML   s    	4)5)Jdmm<i(F$))4kkoodii0"k*r+   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   Fre   r@   rf   rA   r=   r>   )re   rf   rA   rS   rT   rU   
isinstancetupler   splitrN   strip
r(   r~   r}   contentr9   teltNameeltAttrs
eltContentrM   s
             r)   fromXMLz RearrangementMorphAction.fromXML   s    9:::	D$6<AAA)DM%>Au)=1>>-4 		0)GXz*$ ('): ;F"$Xg%67	O+%-hw.?%@"G#$W-33C8 0DMM$**,/0		0 ?s   C C N)r-   r.   r/   
staticSizeactionHeaderSizerB   ry   r*   ro   rv   r   r   r0   r+   r)   rQ   rQ   I   s    J5F	;	; 	
; 	
=	
 	
= 	
= 	
= 	
= 	
? 	
? 	O 	O 	 	 	  	!F&",0r+   rQ   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   SetMarkrT   c                 \    d| _         d\  | _        | _        d| _        d\  | _        | _        y )Nr   FF  r   )re   r   rT   rA   	MarkIndexCurrentIndexr'   s    r)   r*   zContextualMorphAction.__init__   s/    )5&d&,:))r+   c                 ,   |J |j                  | j                         | j                  }| j                  r|dz  }| j                  r|dz  }|j                  |       |j                  | j
                         |j                  | j                         y )Nrh   ri   )rk   re   rA   r   rT   r   r   rl   s        r)   ro   zContextualMorphAction.compile   s    """4==)""<<VOEVOE5!4>>*4,,-r+   c                 
   |J |j                         | _        |j                         }t        |dz        | _        t        |dz        | _        |dz  | _        |j                         | _        |j                         | _        y )Nrh   ri   i?  )rq   re   rr   r   rT   rA   r   r   rs   s        r)   rv   zContextualMorphAction.decompile   sz    ###))+!!#EFN+/"V^**,"--/r+   c                     |j                   |fi | |j                          |j                  d| j                         |j                          | j	                  |       |j                  d| j
                         |j                          |j                  d| j                         |j                          |j                  |       |j                          y )Nre   r?   r   r   )rx   rF   rD   re   rJ   r   r   r|   r(   rG   r9   r}   r~   s        r)   r   zContextualMorphAction.toXML   s    	4)5)Jdmm<i(Kt~~>N$2C2CDr+   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   Fr   re   r@   r=   r>   rA   r   r   )re   rA   r   rT   r   r   r   r   r   r   rN   r   r   s
             r)   r   zContextualMorphAction.fromXML   s   -..**//t',:))%>Au)=1>>-4 	@)GXz*$ ('): ;G#$W-33C8 0DMM$**,/0O+%-hw.?%@"K'!)(7*;!<N*$,Xg->$?!	@ ?s   C:C:N)r-   r.   r/   r   r   rB   r*   ro   rv   r   r   r0   r+   r)   r   r      s1    J'F;
.0@r+   r   c                       e Zd Zd Zy)	LigActionc                      d| _         d| _        y )NFr   )StoreGlyphIndexDeltar'   s    r)   r*   zLigAction.__init__   s    
  !r+   Nr,   r0   r+   r)   r   r      s    !r+   r   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)LigatureMorphActionrY   r_   SetComponentrT   c                 L    d| _         d\  | _        | _        d| _        g | _        y )Nr   r   )re   r   rT   rA   Actionsr'   s    r)   r*   zLigatureMorphAction.__init__   s(    .:+4+r+   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 )Nrh   ri   r   rj   )rk   re   rA   r   rT   lenr   compileLigActions)r(   rm   r9   rn   rI   actionss         r)   ro   zLigatureMorphAction.compile   s    &&&4==)""VOEVOEt||q VOE5!t||q ,,.G{734q!r+   c                 4   |J |j                         | _        |j                         }t        |dz        | _        t        |dz        | _        t        |dz        }|dz  | _        |j                         }|r| j                  ||      | _        y g | _        y )Nrh   ri   rj   i  )rq   re   rr   r   rT   rA   _decompileLigActionsr   )r(   rt   r9   ru   rI   performActionrn   s          r)   rv   zLigatureMorphAction.decompile  s    '''))+!!# 0/UV^, #V^'')44\;ODLDLr+   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 )Nr+   c                     t        |        | fS r#   r   xs    r)   <lambda>z4LigatureMorphAction.compileActions.<locals>.<lambda>1  s    Q| r+   keyr   rR   )
setr4   itemsaddr   sortedranger   
setdefaultr   )r9   r:   resultr   rn   state_glyphClasstransaisuffixsuffixIndexs               r)   r;   z"LigatureMorphAction.compileActions   s    '*CE2 	7E&+&7&7&=&=&? 7"UE33567	7 %;< 	A#q#a&!, @AqrUF#&v;?q"8K**6;?@ !	 VQ$$r+   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      @z>L)		enumerater   r   r   r   appendstructpackr   )r(   r   r   actionlastr@   s         r)   r   z%LigatureMorphAction.compileLigActions;  s    "4<<0 	4IAvDLL)A--D**Z7E4ZQ.E6<<ZQ6EMM&++dE23	4   r+   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 )NFrR   r   r   r   i    i   )getSubReaderpos	readULongrr   r   r   r   r   )	r(   ru   rn   r   r   rt   r@   r   deltas	            r)   r   z(LigatureMorphAction._decompileLigActionsE  s    **<+;+;kAo+MN$$&E
*+D[FNN6"
 23FLJ&E
"#e+%*F"  r+   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   Fre   r@   r=   r>   rA   Action r   r   )re   rA   r   rT   r   r   r   r   r   rN   r   r   rz   r   r   r   )r(   r~   r}   r   r9   r   r   r   r   rM   r   rI   rH   s                r)   r   zLigatureMorphAction.fromXMLU  sL   -..*/44D,%>Au)=1>>-4 	,)GXz*$ ('): ;G#$W-33C8 0DMM$**,/0O+%-hw.?%@"H$" Wb177<,12q22&%/)1(;L2M)N&##F+	, ? 3s   EE9Ec                     |j                   |fi | |j                          |j                  d| j                         |j                          | j	                  |       | j
                  D ]P  }d|j                  fg}|j                  r|j                  d       |j                  d|       |j                          R |j                  |       |j                          y )Nre   r?   r   )r=   r   r   )
rx   rF   rD   re   rJ   r   r   r   r   r|   )r(   rG   r9   r}   r~   r   attribss          r)   r   zLigatureMorphAction.toXMLk  s    	4)5)Jdmm<i(ll 	 F)6+A+ABCG||12'2	  	r+   N)r-   r.   r/   r   r   rB   r*   ro   rv   rO   r;   r   r   r   r   r0   r+   r)   r   r      sP    J m,F""& % %4! ,,r+   r   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[   rR   )r   rT   CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 z    d| _         | j                  D ]  }t        | |d        d| _        g g c| _        | _        y rd   )re   rB   setattrrA   CurrentInsertionActionMarkedInsertionActionrL   s     r)   r*   zInsertionMorphAction.__init__  sB    KK 	'DD$&	'BDb?#T%?r+   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 )
Nrh   ri   rj            rX   r   r   )rk   re   rA   r   rT   r   r   r   r   r   r   r   r   )r(   rm   r9   rn   rI   currentIndexmarkedIndexs          r)   ro   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;'r+   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 )Nrh   ri   rj   r   r   r   i  rX   )indexcount   )rq   re   rr   r   rT   r   r   r   r   _decompileInsertionActionr   r   rs   s        r)   rv   zInsertionMorphAction.decompile  s    '''))+!!#EFN+/$($8!#'#7 #'#7 "&uv~"6&*&D&D$f&7&7&956>VWBW 'E '
# &*%C%C$f&7&7&9%&. &D &
"r+   c                     |dk(  s|dk(  rg S |j                  |j                  |dz  z         }|j                  |j                  |            S )Nr   r   rV   )r   r   getGlyphNameManyreadUShortArray)r(   ru   r9   r   r   rt   s         r)   r   z.InsertionMorphAction._decompileInsertionAction  sO    F?eqjI**<+;+;eai+GH$$V%;%;E%BCCr+   c                     |j                   |fi | |j                          |j                  d| j                         |j                          | j	                  |       | j
                  D ]%  }|j                  d|       |j                          ' | j                  D ]%  }|j                  d|       |j                          ' |j                  |       |j                          y )Nre   r?   r   glyphr   )rx   rF   rD   re   rJ   r   r   r|   )r(   rG   r9   r}   r~   gs         r)   r   zInsertionMorphAction.toXML  s    	4)5)Jdmm<i(,, 	 A 8B	  ++ 	 A 7qA	  	r+   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 )Nre   r@   r=   r>   r   r   r   )r*   r   r   r   re   r   rN   r   r   r   r   r   s
             r)   r   zInsertionMorphAction.fromXML  s    %>Au)=1>>-4 	&)GXz*$ ('): ;G#$W-33C8 0DMM$**,/044++228G3DE33**11(72CD%g%u	& ?s
   C"C"c                    t               i d}}}|D ]  }|j                  j                         D ]f  \  }}|j                  $|j	                  t        |j                               |j                  C|j	                  t        |j                               h  t        |d       D ]  }||v rt        dt        |            D ]G  }	t        |      dz  |	z   }
t        |	t        |            D ]  }||	|dz    }|j                  ||
        I |D ],  }| j                  |      }|t        j                  d|      z  }.  ||fS )Nr+   c                     t        |        | fS r#   r   r   s    r)   r   z5InsertionMorphAction.compileActions.<locals>.<lambda>  s    c!fWaL r+   r   r   rV   r   z>H)r   r4   r   r   r   r   r   r   r   r   r   
getGlyphIDr   r   )r9   r:   r   rn   r   r   r   r   r   start
startIndexlimitglyphsr   glyphIDs                  r)   r;   z#InsertionMorphAction.compileActions  s[   '*ub#f 	DE&+&7&7&=&=&? D"U//;KKe&B&B CD..:KKe&A&A BC	D	D W*@A 	5F $q#f+. ?!&kQ.%7
"5#f+6 ?E#EEAI6F**6:>??
   5//%0&++dG445	5" {""r+   N)r-   r.   r/   r   r   rB   r*   ro   rv   r   r   r   rO   r;   r0   r+   r)   r   r   {  sH    JFI(<
"D&  # #r+   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': )featureParamTypesrz   	__class__r-   r   ro   )r(   rm   r9   s      r)   ro   zFeatureParams.compile  s[    !!&"674>>I	
 < NN##
	
I
 	$-r+   Nc                 `    t        j                  | |||| j                  j                         y )N)r~   )r   r   r  r-   r   s        r)   r   zFeatureParams.toXML  s     iu4>>;R;RSr+   r8   )r-   r.   r/   ro   r   r0   r+   r)   r   r     s    .Tr+   r   c                       e Zd Zy)FeatureParamsSizeNr-   r.   r/   r0   r+   r)   r  r        r+   r  c                       e Zd Zy)FeatureParamsStylisticSetNr  r0   r+   r)   r	  r	    r  r+   r	  c                       e Zd Zy)FeatureParamsCharacterVariantsNr  r0   r+   r)   r  r    r  r+   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(   
propagators     r)   populateDefaultszCoverage.populateDefaults  s    tX&DK 'r+   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   
GlyphArrayrV   RangeRecordc                     | j                   S r#   )StartCoverageIndexr   s    r)   r   z#Coverage.postRead.<locals>.<lambda>,  s    9M9M r+   r   .GSUB/GPOS Coverage is not sorted by glyph ids.zUnknown Coverage format: %s)Formatr   r   logwarningStartEndr   extendr   r   )r(   rawTabler9   r   rangessorted_rangesrr   endstartIDendIDs              r)   postReadzCoverage.postRead#  s    ;;!"<0DK* K) [[A#%%FT[m,F #6/MNM&LM& Lee//%0,q0d33E'54IJKL K DKKK5t{{CKr+   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   rW   r  c                     | j                   S r#   )StartIDr  s    r)   r   z#Coverage.preWrite.<locals>.<lambda>^  s
    aii r+   r   rV   r  )getattrr   getGlyphIDManyr   r   r   r   r  r+  getGlyphNamer  r  r  r  r  sortr  )r(   r9   r   formatr   glyphIDsbrokenOrderr   r!  r   r   r   r   r$  r#  s                  r)   preWritezCoverage.preWrite<  s   x.>#%%FT[ &)**62H *h6KA;DfXF#AB< dQh&2J%%d+MM7),	
 2Jd#c&kAoF;s6{+ 4A!'JE3#A %AI"//6AG --c2AE+0A( !F1I!CK%/!3E4 KK PQKK$7K8 "A	")62 r+   c                 n    t        | dg       D ]%  }|j                  d|       |j                          ' y )Nr   Glyphr?   )r,  rD   rF   )r(   rG   r9   	glyphNames       r)   toXML2zCoverage.toXML2h  s9     x4 	 Iy9	 r+   c                 \    t        | dd       }|	g }|| _        |j                  |d          y )Nr   r@   )r,  r   r   )r(   r~   r}   r   r9   r   s         r)   r   zCoverage.fromXMLm  s1    x.>F DKeGn%r+   r#   r-   r.   r/   r  r'  r3  r7  r   r0   r+   r)   r  r    s    2*X 
&r+   r  l    c                   <    e Zd ZddZd Zed        Zd Zd Zd Z	y)	DeltaSetIndexMapNc                 ,    t        | d      sg | _        y y Nmappingr  r>  r  s     r)   r  z!DeltaSetIndexMap.populateDefaults{      tY'DL (r+   c                 2    |d   dz  dk(  sJ |d   | _         y )NEntryFormat  r   r>  )r>  )r(   r   r9   s      r)   r'  zDeltaSetIndexMap.postRead  s&    '&0Q666	*r+   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         rV   i rW   rR   )max)r>  oredidxinner	innerBits	entrySizes         r)   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7r+   c                     t        | dd       }|	g x}| _        t        |      dkD  rdnd| _        | j                  j                         }t        |      |d<   | j                  |      |d<   |S )Nr>  r   r   r   MappingCountrB  )r,  r>  r   r  rC   copyrM  )r(   r9   r>  r   s       r)   r3  zDeltaSetIndexMap.preWrite  so    $	40?%''Gdlw<&0aa==%%'#&w< "&"5"5g">r+   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   outerrE  rJ  r   Map)r{   rF   r   r,  NO_VARIATION_INDEXr  rD   )r(   rG   r9   r   r@   r}   s         r)   r7  zDeltaSetIndexMap.toXML2  s     	ST!'$	2">? 
	 HAuq\NE** %2+. %&.1 u-
	 r+   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   rR  0xFFFFrJ  r   rE  )r,  r>  r   rz   insert)	r(   r~   r}   r   r9   r>  r   rR  rJ  s	            r)   r   zDeltaSetIndexMap.fromXML  s|    $	40?%''DL7w(7H567H56uu{e34r+   r#   )
r-   r.   r/   r  r'  rO   rM  r3  r7  r   r0   r+   r)   r;  r;  z  s/    + 8 82 "5r+   r;  uint8c                   ,    e Zd ZddZd Zd Zd Zd Zy)	VarIdxMapNc                 ,    t        | d      si | _        y y r=  r?  r  s     r)   r  zVarIdxMap.populateDefaults  r@  r+   c                     |d   dz  dk(  sJ |j                         }|d   }|j                  |d   gt        |      t        |      z
  z         t        t	        ||            | _        y )NrB  rC  r   r>  r)  )getGlyphOrderr  r   dictzipr>  )r(   r   r9   
glyphOrdermapLists        r)   r'  zVarIdxMap.postRead  si    '&0Q666'')
9%}J#g,(FGHC
G45r+   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)  rO  rB  )r,  r>  r]  r   r;  rM  )r(   r9   r>  r`  r   r   s         r)   r3  zVarIdxMap.preWrite  s    $	40?%''Gdl'')
'12!71:22'lQ72;'"+#= 'lQ72;'"+#= w'#&w< "2"A"A'"J 3s   Bc                     t        t        | di       j                               D ]8  \  }}d|fd|dz	  fd|dz  ff}|j                  d|       |j	                          : y )Nr>  r   rR  rE  rJ  r   rS  )r   r,  r   rD   rF   )r(   rG   r9   r   r@   r}   s         r)   r7  zVarIdxMap.toXML2  sq    "74B#?#E#E#GH 	 LE5% %2+&%&.)E
 u-	 r+   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   rR  rJ  r   rE  )r,  r>  r]  r   )	r(   r~   r}   r   r9   r>  r   rR  rJ  s	            r)   r   zVarIdxMap.fromXML  s    $	40?G"DL	9'NE w(w(2+.	9&&(w8Es   A A(r#   r9  r0   r+   r)   rZ  rZ    s    6 /r+   rZ  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)rz   r   axesrj  rC   r   )r(   r9   	fvarTables      r)   r3  zVarRegionList.preWrite  sR     HHV$	#&y~~#6D 
mm
~dmm=NO
 	
r+   Nr-   r.   r/   r3  r0   r+   r)   rg  rg    s    
r+   rg  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     r)   r  zSingleSubst.populateDefaults
  r@  r+   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   rV   
GlyphCountz invalid SingleSubstFormat2 table
Substituteunknown format: %s)_getGlyphsFromCoverageTabler  r-  r   r_  r   r>  )r(   r   r9   r>  inputr   	inputGIDSr   outGIDSoutNamesinpoutsubstsubs                 r)   r'  zSingleSubst.postRead  s   +HZ,@A;;!^,E++E2I@IJW%50JGJ,,W5Hx0 #S"#[[AE
h|442124\*Eu- #S"# 9*T[[881K Ks   Cc                 "   t        | dd       }|	i x}| _        t        |j                               }|j                  }|D cg c]  \  }} ||       ||      f }}}t        t        ||            }d}	d }
|D ]  \  }}|
||z
  dz  }
||
z   dz  |k7  s n |
d}	nd}	i }|	| _        t               }|D cg c]
  }|d   d    }}|D cg c]
  }|d   d    }}||_	        ||d<   |	dk(  r|
J |
|d<   |S ||d<   |S c c}}w c c}w c c}w )	Nr>  rV   rs  r   r   r  rr  ru  )
r,  r>  listr   r   r   r_  r  r  r   )r(   r9   r>  r   r   r   bgidItemssortableItemsr0  r   inIDoutIDr   covitemrx  r~  s                     r)   r3  zSingleSubst.preWrite$  sc   $	40?%''GdlW]]_%__
?DEtq!Z]JqM2EEs8U34 # 	KD%}.u%.	 }j(56a66(56a66
"Q;$$$',H^$  &+H\"? F, 76s   D8DDc                     t        | j                  j                               }|D ]-  \  }}|j                  dd|fd|fg       |j	                          / y )NSubstitutioninr}  )r   r>  r   rD   rF   )r(   rG   r9   r   inGlyphoutGlyphs         r)   r7  zSingleSubst.toXML2K  sW    t||))+,!& 	 GX$5(BS0TU	 r+   c                 J    t        | dd       }|	i }|| _        |d   ||d   <   y )Nr>  r}  r  )r,  r>  )r(   r~   r}   r   r9   r>  s         r)   r   zSingleSubst.fromXMLQ  s3    $	40?G"DL$U|dr+   r#   r9  r0   r+   r)   ro  ro  	  s    ,%N ,r+   ro  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     r)   r  zMultipleSubst.populateDefaultsZ  r@  r+   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  Sequencerv  )r  rw  ru  r^  r_  r>  )r(   r   r9   r>  r   sr~  s          r)   r'  zMultipleSubst.postRead^  su    ;;!0*1EFF+3J+?@aQ\\@E@3vu-.G8*T[[881K As   A0c                 &   t        | dd       }|	i x}| _        t               }t        t	        |j                               |j                        |_        d| _        ||j                  D cg c]  }| j                  ||          c}d}|S c c}w )Nr>  r   r   )r  r  )
r,  r>  r  r   r  keysr   r   r  makeSequence_)r(   r9   r>  r  r   r   s         r)   r3  zMultipleSubst.preWritei  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}  )r   r>  r   rE   rD   rF   )r(   rG   r9   r   r  	outGlyphsr}  s          r)   r7  zMultipleSubst.toXML2v  sd    t||))+,"' 	 GY((9%C$5#,0OP	 r+   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  r5  r@   r  r   ru  r}  r>   r  )r,  r>  old_coverage_r   r   r   intrz   r   r   r   )r(   r~   r}   r   r9   r>  elementelement_nameelement_attrs_r   r   glyph_mappingr  r   s                  r)   r   zMultipleSubst.fromXML}  sL   $	40?G"DL :!#D" F!'5118.mQ7*&&--mG.DEF :		'3w<89E&&u-E-//MGEN" A!'5118.mQ</!((w)?@A  05U|E%L&&s+	3<=a	=d=s   ?D c                 (    t               }| |_        |S r#   )r  ru  )r   seqs     r)   r  zMultipleSubst.makeSequence_  s    j
r+   r#   )
r-   r.   r/   r  r'  r3  r7  r   rO   r  r0   r+   r)   r  r  Y  s0    	 >@  r+   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     r)   r  zClassDef.populateDefaults      t[)DN *r+   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ClassValueArrayrV   ClassRangeRecordzUnknown ClassDef format: %s)r  r   r   r   r   r_  Classr  r  r  r  r  )r(   r   r9   r  r   	classListr%  r&  
glyphNamesr6  clsrecordsrecr$  s                 r)   r'  zClassDef.postRead  s=   	;;!\*E !23Iooe,Gc)n,E..uWe/DEJ"%j)"< /	3+.Ii(/ [[A12G 
/ii		gg//%0,q0!225%3HI
!+ /I+.Ii(/
/ KK5t{{C"Kr+   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(   r9   r  r   r   r6  r  r   lastNamelastClsr!  r   s               r)   _getClassRangeszClassDef._getClassRanges  s   D+t4	DN__
'oo/ 	BNIsLL*Y/C@A	B JJL&+Ah#D(Gh/0F+09 'CdQh&#.2J%%tX&67MM3";<$ 2JtX./M r+   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 )NrV   r  r   r   r)  rW   )r  r  )r  r   r   r  r  r  r  r  )r(   r9   r0  r   r!  
startGlyphendGlyph
glyphCountr   r  r   	startNamer$  endNamer  startGlyphNameclassesr   s                     r)   r3  zClassDef.preWrite  sD   &+%%d+1Jbz!}H!J.2J6{Qa/s6{+ $A:@)7C	3*,C )CI%CG #CI #F1I$ .7 "(1#
*;A )7C	3"5:#5sZ7G!7KL )%(
)) *8WUr+   c                     t        | j                  j                               }|D ]-  \  }}|j                  dd|fd|fg       |j	                          / y )Nr  r   class)r   r  r   rD   rF   )r(   rG   r9   r   r6  r  s         r)   r7  zClassDef.toXML2   sV    t~~++-.# 	 NIs
gy-AGS>,RS	 r+   c                 \    t        | dd       }|	i }|| _        t        |d         ||d   <   y )Nr  r  r   )r,  r  r  )r(   r~   r}   r   r9   r  s         r)   r   zClassDef.fromXML  s9    D+t4	I&DN$'g$7	%.!r+   r#   )	r-   r.   r/   r  r'  r  r3  r7  r   r0   r+   r)   r  r    s      >2> 8r+   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     r)   r  zAlternateSubst.populateDefaults  s    t\* DO +r+   c                     i }| j                   dk(  rPt        |d         }|d   }t        |      t        |      k(  sJ t        ||      D ]  \  }}|j                  ||<    nJ d| j                   z         || _        | ` y )Nr   r  AlternateSetrv  )r  rw  r   r_  	Alternater  )r(   r   r9   r  rx  altsr|  alts           r)   r'  zAlternateSubst.postRead  s    
;;!/0DEEN+Du:T***t, 0S"%--
30 9*T[[881$Kr+   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   r   r   r   r/  r  r   r  r  r   sortCoverageLast)r(   r9   r  r   r   r6  r   r  r  setListr  s              r)   r3  zAlternateSubst.preWrite   s   T<6
+--JZ%%'(s5z" 	BA"1XNIsy19cAE!H	B 	

j*/0$d1g0

(-.48.. 	$C>D DNd#	$ !"<< 1.s   C,)C1c                 :   t        | j                  j                               }|D ]s  \  }}|j                  d|       |j	                          |D ]%  }|j                  d|       |j	                          ' |j                  d       |j	                          u y )Nr  r   r  )r   r  r   rx   rF   rD   r|   )r(   rG   r9   r   r6  r  r  s          r)   r7  zAlternateSubst.toXML2:  s    t,,./%* 	 !Iz~Y?! $##Ks#;!!#$ ^,	 r+   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   r9   r  r6  r   r  s	            r)   r   zAlternateSubst.fromXMLE  sr    T<6
J(DO'N	 #
9 	'Ggu-#* D%JJuW~&		'r+   r#   r9  r0   r+   r)   r  r    s    !=4	 'r+   r  c                   ,    e Zd ZddZd Zd Zd Zd Zy)LigatureSubstNc                 ,    t        | d      si | _        y y )N	ligatures)r  r  r  s     r)   r  zLigatureSubst.populateDefaultsU  r  r+   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  LigatureSetrv  )r  rw  r   r   Ligaturer  )r(   r   r9   r  rx  ligSetsr   s          r)   r'  zLigatureSubst.postReadY  s    	;;!/0DEE}-Gu:W---3u:& :&-aj&9&9	%(#: 9*T[[881"Kr+   c                 f   d| _         t        | dd       }|	i x}| _        |rt        t	        t        |            t              rt               }t        |j                         d       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 ]>  }
t/               }g x}|_
        |
D ]  }|j!                  |        |j!                  |       @ d| _        ||dS c c}w c c}w )Nr   r  c                 *    t        | d          | d   fS Nr   r   r  s    r)   r   z(LigatureSubst.preWrite.<locals>.<lambda>s  s    c$q'l]DG4L r+   r   r   r)  )r  r  )r  r,  r  r   nextiterr   r^  r   r   r  	Componentr   	CompCountLigGlyphr   r   r  r   r   r/  r  r   r  r  )r(   r9   r  newLigaturescompsligligaturer   r   r6  r   r  r  r  r  ligSetligss                    r)   r3  zLigatureSubst.preWritef  s   D+t4	)++IDi$95A
  6L$!'L G
s $:%*12Y"%(Z"$'!''a"5<<XFG %IY__&'s5z" 	BA"1XNIsy19cAE!H	B 	

j*/0$d1g0
(-.48.. 	#C ]F%''D6? !C !NN6"	# !"88 1 /s   2F)F.c           	         t        | j                  j                               }|D ]  \  }}|j                  d|       |j	                          |D ]I  }|j                  d|j                  dj                  |j                               |j	                          K |j                  d       |j	                           y )Nr  r   r  r>   )r   
components)
r   r  r   rx   rF   rD   r  rE   r  r|   )r(   rG   r9   r   r6  r  r  s          r)   r7  zLigatureSubst.toXML2  s    t~~++-."' 		 Iw}I> $##cllsxx?V $  !!#	$
 ]+		 r+   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 )Nr  r   r  r>   )r,  r  r   r   r  r  r   r  r   r  r   )r(   r~   r}   r   r9   r  r6  r  r  r  r  s              r)   r   zLigatureSubst.fromXML  s    D+t4	I&DN'N	#	) 		Ggu-#* D%*C >CL|,J5?J,,S1RCM.CMKK		r+   r#   r9  r0   r+   r)   r  r  T  s     *9X r+   r  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)	r   getConvertersr~   advancer   readAssertionErrorr   rv   )r(   rt   r9   	subReaderconvs        r)   rv   zCOLR.decompile  s     ''q'1	&&( 	IDyy..!!$//2 $		)TR	 HF499	I !!GHH""466r+   c                 \    d | _         i | j                  dt        | j                  d      iS )Nr  )r  rC   r   r(   r9   s     r)   r3  zCOLR.preWrite  s8     !%
mm
t}}>P Q
 	
r+   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  r  clipBoxer  hasClipLists	            r)   computeClipBoxeszCOLR.computeClipBoxes  s    <<1%%:: 	/C))224<P "'.cmm$	/ dJ/MDMM4M $   (
'($"'DMM%  6 9#--9JKs   B;;	C%C  C%Nr   )r-   r.   r/   rv   r3  r  r	  r0   r+   r)   r  r    s    7"
( (c (r+   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SubTabletyper-   endswith
ValueError)r(   lsts      r)   tablezLookupList.table  sf     	"Ajj "8$$--g6!8$$--e4!	"	" r+   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   datasuperr7  r  r  repeatr,  r~   r   strr   locationfeaturer{   rF   xmlWriteauxevalvars)r(   rG   r9   	debugDatar  r@   lookupIndexr  infotagscriptlanguager#  r  s                r)   r7  zLookupList.toXML2  s   T!$DL,=,==7>)T22L%%&;<TZZH	&&( 	ED{{dii4)25)9 %K;'94.	#k:J0KL"mm99%)YYKr#"7C<<8<5FHg%(EgYb(1"MC!))#.!))+MM!4tyyG[;Q:R  88D4d$D$))T iudiiD1	Er+   )r-   r.   r/   propertyr  r7  __classcell__)r  s   @r)   r  r    s!      E  Er+   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  r  r9   s    r)   r   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>  s    $//#--2P r+   r   )r   BaseGlyphRecordrC   rP  r  s    `r)   r3  zBaseGlyphRecordArray.preWrite  s1    %  &P 
 }}!!##r+   Nrm  r0   r+   r)   r1  r1        $r+   r1  c                       e Zd Zd Zy)r  c                 v    t        | j                  fd      | _        | j                  j                         S )Nc                 :    j                  | j                        S r#   r4  r5  s    r)   r   z(BaseGlyphList.preWrite.<locals>.<lambda>%  s    ts}}7U r+   r   )r   r  rC   rP  r  s    `r)   r3  zBaseGlyphList.preWrite#  s1    $*%%+U%
! }}!!##r+   Nrm  r0   r+   r)   r  r  "  r7  r+   r  c                        e Zd ZdZdZd Zd Zy)ClipBoxFormatr   rV   c                     | | j                   u S r#   Variabler'   s    r)   is_variablezClipBoxFormat.is_variable.  s    t}}$$r+   c                     | j                   S r#   r>  r'   s    r)   as_variablezClipBoxFormat.as_variable1  s    }}r+   N)r-   r.   r/   Staticr?  r@  rB  r0   r+   r)   r<  r<  *  s    FH%r+   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~   ).0r  r(   s     r)   	<genexpr>z#ClipBox.as_tuple.<locals>.<genexpr>9  s     O$WT499-Os    #)r   r  r'   s   `r)   as_tuplezClipBox.as_tuple8  s    O$:L:L:NOOOr+   c                 R    | j                   j                   | j                          S r#   )r  r-   rJ  r'   s    r)   __repr__zClipBox.__repr__;  s#    ..))*4==?*;<<r+   N)r-   r.   r/   r<  
formatEnumrJ  rL  r0   r+   r)   rE  rE  5  s    JP=r+   rE  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     r)   r  zClipList.populateDefaults@  s    tW%DJ &r+   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  r   
IndexErrorr   rP  rE  minrG  r  )r(   r   r9   r  r`  r   r  redefinedGlyphsmissingGlyphsr   r   s              r)   r'  zClipList.postReadD  sX   '')
 67 %	FAs#..0/$$NN  OM !1!13>>A3EF 	4&w/E %#'99S[[#9E%L#**73	4 8 (( S&&	A%	L 
/ " !((1s   D<<EEc                 0   t        t              }i }| j                  j                         D ]3  \  }}|j	                         }||   j                  |       ||vs/|||<   5 |j                         D ci c]  \  }}t        |      ||    c}}S c c}}w r#   )r   r  r  r   rJ  r   	frozenset)r(   glyphsByClipuniqueClipsr6  r  r   r   s          r)   groupszClipList.groupso  s    "4("&**"2"2"4 	+Iw""$C$$Y/+%#*C 		+ DPCUCUCW
4?CIf{3//
 	
 
s   5Bc                 t   t        | d      si | _        i }|j                         | j                         j	                         D ]  \  }}t        fd|D              }|s|d   }|gg}|dd  D ]2  }||dz   k7  r&|d   j                  |       |j                  |g       |}4 |d   j                  |       |D ]  \  }	}
|	|
f|vsJ |||	|
f<     g }t        |j	                               D ]8  \  \  }	}
}t               }|	|_        |
|_	        ||_
        |j                  |       : t        |      |d}|S )Nr  c              3   2   K   | ]  }|v s|     y wr#   r0   )rH  r6  glyphMaps     r)   rI  z$ClipList.preWrite.<locals>.<genexpr>  s"      (1yH?T#s   	
r   r   r)  )	ClipCountrQ  )r  r  getReverseGlyphMapr\  r   r   r   rQ  rR  rS  rE  r   )r(   r9   clipBoxRangesr   r  r1  r   r!  r   r   r$  clipRecordsrecordr   r_  s                 @r)   r3  zClipList.preWrite{  s{   tW%DJ**,#{{}224 	6OFG 5; H A;DfXF#AB< dQh&2J%%d+MM7),	
 2Jd#$ 6
ss|=888.5ucl+6	6$ %+M,?,?,A%B 	'!LUC'\F"'F #F$FNv&	' [)%
 r+   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 r  )rU  r  s    r)   r   z ClipList.toXML.<locals>.<lambda>  s    CQL r+   r   Clipr5  r?   rE  )r  r-   r  r   r  rx   rF   r   r\  r   rD   r7  r|   )	r(   rG   r9   r}   r~   	tableNamer   r  r6  s	            r)   r   zClipList.toXML  s]    Ddnn&=&=	=E4"LL(DKK019e,%KKM!'@ 
 	 OFG v&#F^ $	##G9#=!!#$ yHgnn+E*FGNN9d+Y'V$	  	#r+   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  rg  r5  r@   rE  r  )	r,  r  r   r   r   rE  r   r  r   )
r(   r~   r}   r   r9   r  r   r  elemr6  s
             r)   r   zClipList.fromXML  s    gt,=!##DJv~~ 	@DdE*#' D%weGn-"!)!)%/!:# @D%dE2 +/(D%OOD%$?	@	@ # +	#*i + r+   r#   r8   )	r-   r.   r/   r  r'  r\  r3  r   r   r0   r+   r)   r  r  ?  s"    )V

"H6+r+   r  c                       e Zd ZdZdZdZy)
ExtendModer   r   rV   N)r-   r.   r/   PADREPEATREFLECTr0   r+   r)   rl  rl    s    
CFGr+   rl  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   rV   rW   rR   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rE                                   N)r-   r.   r/   CLEARSRCDESTSRC_OVER	DEST_OVERSRC_INDEST_INSRC_OUTDEST_OUTSRC_ATOP	DEST_ATOPXORPLUSSCREENOVERLAYDARKENLIGHTENCOLOR_DODGE
COLOR_BURN
HARD_LIGHT
SOFT_LIGHT
DIFFERENCE	EXCLUSIONMULTIPLYHSL_HUEHSL_SATURATION	HSL_COLORHSL_LUMINOSITYr0   r+   r)   rq  rq    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Nr+   rq  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   rV   rW   rR   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rE  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|           r       c                 8    | j                   j                  d      S )NPaintVar)r~   
startswithr'   s    r)   r@  zPaintFormat.is_variable  s    yy##J//r+   c                     | j                         r| S 	 t        j                  d| j                  dd      S # t        $ r Y y w xY w)Nr  rX   )r@  r  __members__r~   KeyErrorr'   s    r)   rB  zPaintFormat.as_variable   sL    K	**Xdiim_+EFF 		s   "7 	AAN)%r-   r.   r/   PaintColrLayers
PaintSolidPaintVarSolidPaintLinearGradientPaintVarLinearGradientPaintRadialGradientPaintVarRadialGradientPaintSweepGradientPaintVarSweepGradient
PaintGlyphPaintColrGlyphPaintTransformPaintVarTransformPaintTranslatePaintVarTranslate
PaintScalePaintVarScalePaintScaleAroundCenterPaintVarScaleAroundCenterPaintScaleUniformPaintVarScaleUniformPaintScaleUniformAroundCenter PaintVarScaleUniformAroundCenterPaintRotatePaintVarRotatePaintRotateAroundCenterPaintVarRotateAroundCenter	PaintSkewPaintVarSkewPaintSkewAroundCenterPaintVarSkewAroundCenterPaintCompositer@  rB  r0   r+   r)   r  r    s    OJMJNNNJM "$&!')$KN !#IL!N0r+   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: )rM  r  r~   r  NotImplementedErrorr'   s    r)   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  r-   r   r  rx   r{   r  rF   r7  r|   )r(   rG   r9   r}   r~   rh  s         r)   r   zPaint.toXML2  s     Ddnn&=&=	=Eh,-9e,$,,./It$#r+   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)rH  r   vs      r)   rI  z+Paint.iterPaintSubTables.<locals>.<genexpr>D  s.      Aq ''XQaHHs   %'r  )r~   r@   z not in colr.BaseGlyphList)r  r  r  	LayerListr   r   FirstLayerIndex	NumLayersr  r  r  r  r5  r   r  r  r  
tableClass
issubclassr  r,  r~   )r(   r  layersrd  r  r@   s         r)   iterPaintSubTableszPaint.iterPaintSubTables>  sL    ;;+555F~~)--%4//$2F2F2WX   ;;+444,,AA L##tzz1#11{&,,WWL
 $**/IJKK&&( 	KD*z$//4PT:/Vdii0--499EJJ	K!s&   A;F=F>AFAF1F=Fc                 ^    | j                  |      D cg c]  }|j                   c}S c c}w r#   )r  r@   )r(   r  ps      r)   getChildrenzPaint.getChildrenY  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#   r  paintr  s    r)   r   z Paint.traverse.<locals>.<lambda>c      %2J2J42P r+   iter_subtables_fnr)  N)callable	TypeErrorr   r@   )r(   r  callbackpathr  s    `   r)   traversezPaint.traverse]  sG    !788"$P
 	D HNNEUO		r+   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   	translater  scalescaleXscaleYr  centerXcenterYr  r  r  rotater   angler  r  skew
xSkewAngle
ySkewAngler  r@  r  )r(   r   s     r)   getTransformzPaint.getTransformh  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r+   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#   r  r  s    r)   r   z&Paint.computeClipBox.<locals>.<lambda>  r  r+   r  r)  c              3   P   K   | ]  }|j                   j                            y wr#   )r@   r  )rH  r  s     r)   rI  z'Paint.computeClipBox.<locals>.<genexpr>  s     <RXX**,<s   $&)r   r   r@   r  r  r  r   r   	transformr   r5  drawr   boundsrE  r  r<  rC  r	   xMinyMinxMaxyMax)	r(   r  r  r  penr  r  transformationcbs	    `       r)   r  zPaint.computeClipBox  s     x("$P
 
	ND HNNE||{555!'''<t<"
 %**<^+LM
	N ::Y,,-	-9#**l-S*"'27	r+   r8   r
  )r-   r.   r/   r  rM  r  r   r  r   r   r  r  r   r  r  r   r  r  r   rE  r  r0   r+   r)   r   r   )  s    JN
Kt K9P9P0Q K6@4= @	T 	)i )X HI$1AD	'	r+   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  rZ   r  r\   )LookupListIndexSubTableIndex	tableTyper  r  r  r  r  
LookupTyper   r   lookupTypesr  ExtSubTable)ttfoverflowRecordokr)  extTypelookupslookupsisubTableextSubTableClassextSubTables              r)   fixLookupOverFlowsr_    s   0 
B 00K##+!AoQ	6)		!	!V	+.**+11<<CCG[!F
//!

&
&
1
1W
<!Ao?I%	 //!

&
&
1
1W
< [#g,7 
2%' 'FC01 2!??2.#.~/G/G#H#Q .0%&"*2'&1#2	
2 
BIr+   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  rV   r  r   )r   r>  r   r   itemName	itemIndexr   )
oldSubTablenewSubTablerV  rW  
oldMappingoldLennewLenr   r  r   s
             r)   splitMultipleSubstri  B  s    	
B++1134J_F"== 1		 	 J	.  ))A-K66" %!}1g#'7C $	% Ir+   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   r  ra  rV   r  r   )	r  r  r   r  r   r   rb  rc  r   )
rd  re  rV  rW  oldAltsrg  rh  r   r  r   s
             r)   splitAlternateSubstrl  \  s    	
B{./'2'C'C$[++1134G\F"== 1		 	 N	2  ))A-K66" (qz1g&*1gs#""3'	( Ir+   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   ra  rV   r  r   )r   r  r   r   rb  rc  r   )
rd  re  rV  rW  oldLigsrg  rh  r   r  r   s
             r)   splitLigatureSubstro  y  s    	
B[**0023G\F"== 1		 	 M	1  ))A-K66" 'qz1g%)!Wc"!!#&	' Ir+   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ValueFormat2rV   TClass2Countr   )rs  r  rq  rr  c              3   4   K   | ]  \  }}|k\  s|  y wr#   r0   )rH  kr  oldCounts      r)   rI  zsplitPairPos.<locals>.<genexpr>  s     Ida1=Is   )r  r   PairSetr   r,  r  r  r   PairSetCountClass1Recordr  Class2Recordrs  	DontSharer  r  r   r   Class1Count)rd  re  rV  r  rW  r~   coverager  r  	newGlyphsr   ru  r  rv  s                @r)   splitPairPosr    s8   	B	B$++KQ3{':':#;a#?2 	CDKw{D'AB	C
  +33==?''..%%{**+q0&.y&9#%ix0&.xy&9#%hi0#&{':':#; #&{':':#; T IQ 
		q	 S)A)A%BQ%F{M2&)+*B*B1*E*R*R&SK#N 	CDKw{D'AB	C !%  +33==? + 5 5 ? ? A''..))33	**{//0A5Iioo&7II	2:&QQay>Pq&Q#&__.+
Q!h,AqD+
' $+9H#5 2:&MQa9nq&M#*3//*;+
"&!Qq8|AH+
' $+89#5 "%k&>&>"?"%k&>&>"?I# 'R+

 'N+
s0   	M$)M$M) M)	M/M/9M4M4c                 ^   | j                   }|dk  ry|dz  }||z
  }g g }}g g }	}t        | j                  j                  | j                  j
                        D ]n  \  }
}|j                  |k  r#|j                  |
       |j                  |       8|xj                  |z  c_        |j                  |
       |	j                  |       p g g }}| j                  j                  D ]l  }|j                         |j                         }}|j                  d | |_        |j                  |d  |_        |j                  |       |j                  |       n | j                  |_        || j                  _        | j                  j                         |_        ||j                  _        | j                  |_        || _         ||_         || j                  _        | j                  j                         |_        |	|j                  _        t        |      | j                  _        t        |	      |j                  _        || j                  _	        | j                  j                         |_        ||j                  _	        t        |      | j                  _        t        |      |j                  _        y)NrV   FT)
ClassCountr_  r
  r   rA  
MarkRecordr  r   	BaseArray
BaseRecordr  r   r  r  r   	MarkCount	BaseCount)rd  re  rV  
classCountoldClassCountnewClassCountoldMarkCoverageoldMarkRecordsnewMarkCoveragenewMarkRecordsr6  
markRecordoldBaseRecordsnewBaseRecordsr  oldBaseRecordnewBaseRecords                    r)   splitMarkBasePosr    s`   ''JA~!OM.M&("^O&("^O!$  '')>)>)I)I" 	.	: m+""9-!!*--""9-!!*-	. &(NN$$// -'*}}}#&>>.=#A #&>>-.#A m,m,- %++K&5K#*77AACK&5K#  +77K*K*K'5K$'11;;=K'5K$&).&9K#&).&9K#'5K$'11;;=K'5K$&).&9K#&).&9K#r+   )rV   rW   rR   )rV   rR   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{  TrT  SubTableCountr   z)Don't know how to split %s lookup type %sF)rQ  r  r  r  rO  rP  r  r  r{  rT  r  rR  rS  r  r  
splitTabler  r  errorrW  )rU  rV  r  rZ  subIndexsubtablesubTableTyper^  newExtSubTableClassnewExtSubTabletoInsertnewSubTableClassre  	splitFuncrW  s                  r)   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VarrW   )r   rV   rW   rR   rX   rY   rZ   r[   )	r   rV   rW   rR   rX   rY   rZ   r[   r\   rR   )r   r   rV   rR   rX   )r  r  mortmorxr  JSTFsizerv  zss%02dd   zcv%02d)buildConverters
converters)5rer  ro   globalsr   matchgroupr   r  r{  r  r   	NoVarTypeVarType_equivalentsr   ro  r  r  r  ContextSubstChainContextSubstExtensionSubstReverseChainSingleSubst	SinglePosPairPos
CursivePosMarkBasePos
MarkLigPosMarkMarkPos
ContextPosChainContextPosExtensionPosNoncontextualMorphRearrangementMorphContextualMorphLigatureMorphInsertionMorphrS  valuesrR  r  r  r   r	  r  otConvertersr  r\  r  r  r  convertersByName)r  r  	formatPat	namespacer~   r  	baseClassm
formatTyper  r  varType	noVarTypebaser  r  
lookupEnumenumr   r  r0  r  r  s                          r)   _buildClassesr  j  s   

89I	I  "e	OOD!771:D q!J8DIy ti\2.C'' $!IdO!"&  (a??5!c$i!mQRI8MoG!$qr(+I )G 'I( #((* "
d 	"C!IcN	""  &	
 

 !
 "!
3!KD &f-K!((* "
#))+ 	"ID#!CN	"" 	! 1f D*C(Q,'D1f I*H(Q,'I . UeOOD!88:LD&[FD/C3-!#')$+:59i+P(J(%/CNN6"+;C  ( D/C3B5)3T0CNC0!Ur+   c                 "    | g S | j                   S r#   )r   )r}  s    r)   rw  rw    s    	r+   )`__doc__rP  r  r   	functoolsr   mathr   	itertoolscollectionsr   r   !fontTools.ttLib.tables.otTraverser   fontTools.misc.arrayToolsr	   fontTools.misc.roundToolsr
   fontTools.misc.transformr   r   fontTools.misc.textToolsr   r   r   fontTools.pens.boundsPenr   fontTools.pens.transformPenr   otBaser   r   r   r   r    fontTools.feaLib.lookupDebugInfor   r   loggingr   typingr   r   r   r   r   fontTools.ttLib.ttGlyphSetr   	getLoggerr-   r  objectr!   r2   r6   rQ   r   r   r   r   r   r  r	  r  r  rT  r;  rZ  rg  ro  r  r  r  r  r  r  r1  r  r<  rE  r  rl  rq  r  r   r  r_  ri  rl  ro  r  r  r  r  r  rw  r0   r+   r)   <module>r     s        / < 2 - 8 = = 5 4  T   ? ?6 g!"F "v 
# #*R0y R0j>@I >@B! !J) JZD#9 D#NTI T	 		 		] 	V&' V&v   F57@ F5R1/	 1/h
I 
$M,* M,`H, HVg8' g8TC'- C'L\, \~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^ r+   