
    <`\{                     f   d dl mZmZ ddlmZ d dlZd dlZd dlZd dlZ ej        e	          Z
 G d de          Z G d de          Z G d	 d
e          Z e ej        dd                     dk    sJ  ej        d          j        dk    s
J d             G d de          Z G d de          Z G d de          Zd Zd Zd Zd Z G d de          Z G d de          Z G d de          ZeedZd Zg d Zd! Z  e             Z! G d" d#e          Z" G d$ d%e          Z#dS )&    )Tag	bytesjoin   )DefaultTableNc                       e Zd Zd Zd ZdS )OverflowErrorRecordc                     |d         | _         |d         | _        |d         | _        |d         | _        |d         | _        d S )Nr   r            )	tableTypeLookupListIndexSubTableIndexitemName	itemIndex)selfoverflowTuples     =lib/python3.11/site-packages/fontTools/ttLib/tables/otBase.py__init__zOverflowErrorRecord.__init__   sD     #$.&q)$$Q'$"$- #$...    c                 d    t          | j        d| j        d| j        d| j        d| j        f	          S )NzLookupIndex:zSubTableIndex:z	ItemName:z
ItemIndex:)strr   r   r   r   r   r   s    r   __repr__zOverflowErrorRecord.__repr__   sS    	dnnd.BDTVZVhjuw{  xE  GS  UY  Uc  d  
e  
e  er   N)__name__
__module____qualname__r   r    r   r   r   r   
   s7        $ $ $e e e e er   r   c                       e Zd Zd Zd ZdS )OTLOffsetOverflowErrorc                     || _         d S Nvalue)r   overflowErrorRecords     r   r   zOTLOffsetOverflowError.__init__   s    "$***r   c                 *    t          | j                  S r"   )reprr$   r   s    r   __str__zOTLOffsetOverflowError.__str__   s    	dj		r   N)r   r   r   r   r(   r   r   r   r    r       s2        # # #    r   r    c                   *    e Zd ZdZd Zd Zd Zd ZdS )BaseTTXConverterzGeneric base class for TTX table converters. It functions as an
	adapter between the TTX (ttLib actually) table model and the model
	we use for OpenType tables, which is necessarily subtly different.
	c                     ddl m} t          || j                  }t	          || j                  } |            | _        | j                            ||           d S )Nr   otTablestableTag) r-   OTTableReaderr/   getattrtable	decompile)r   datafontr-   reader
tableClasss         r   r4   zBaseTTXConverter.decompile$   sd    666&x//*z||$**vt$$$$$r   c                    d}	 	 t          | j                  }| j                            ||           |                                S # t
          $ r}||j        k    r |j        }t                              d|           |}d}|j	        ddl
m}  |||          }nddl
m}  |||          }|sddl
m}  |||          }|s Y d}~nd}~ww xY w)	a{   Create a top-level OTTableWriter for the GPOS/GSUB table.
			Call the compile method for the the table
				for each 'converter' record in the table converter list
					call converter's write method for each item in the value.
						- For simple items, the write method adds a string to the
						writer's self.items list.
						- For Struct/Table/Subtable items, it add first adds new writer to the
						to the writer's self.items, then calls the item's compile method.
						This creates a tree of writers, rooted at the GUSB/GPOS writer, with
						each writer representing a table, and the writer.items list containing
						the child data strings and writers.
			call the getAllData method
				call _doneWriting, which removes duplicates
				call _gatherTables. This traverses the tables, adding unique occurences to a flat list of tables
				Traverse the flat list of tables, calling getDataLength on each to update their position
				Traverse the flat list of tables again, calling getData each get the data in the table, now that
				pos's and offset are known.

				If a lookup subtable overflows an offset, we have to start all over.
		NTr.   z+Attempting to fix OTLOffsetOverflowError %sr   r   )fixLookupOverFlows)fixSubTableOverFlows)OTTableWriterr/   r3   compile
getAllDatar    r$   loginfor   r-   r:   r;   )	r   r6   overflowRecordwriterelastItemokr:   r;   s	            r   r=   zBaseTTXConverter.compile+   s:   * .DM222FJvt$$$
      
WNHH:A>>>H	
B&------

T>
2
2RR//////

t^
4
4R  .-----

T>
2
2R /s   AA	 	
CA5CCc                 <    | j                             ||           d S r"   )r3   toXML2)r   rB   r6   s      r   toXMLzBaseTTXConverter.toXMLa   s     *FD!!!!!r   c                     ddl m} t          | d          s$t          || j                  } |            | _        | j                            ||||           | j                                         d S )Nr   r,   r3   )r0   r-   hasattrr2   r/   r3   fromXMLpopulateDefaults)r   nameattrscontentr6   r-   r8   s          r   rK   zBaseTTXConverter.fromXMLd   sz    	w		 $-00:
4:*T5'4000*r   N)r   r   r   __doc__r4   r=   rH   rK   r   r   r   r*   r*      s[         
% % %4 4 4l" " "         r   r*   ir   z#Oops, file a bug against fonttools.c                       e Zd ZdZdZd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S ) r1   z5Helper class to retrieve data from an OpenType table.r5   offsetpos
localStater/   Nr   c                 L    || _         || _        || _        || _        || _        d S r"   rS   )r   r5   rV   rT   r/   s        r   r   zOTTableReader.__init__w   s)    $)$+$($/$---r   c                 &    | xj         |z  c_         d S r"   rU   r   counts     r   advancezOTTableReader.advance~   s    ((e((((r   c                     || _         d S r"   rY   )r   rU   s     r   seekzOTTableReader.seek   s    $(((r   c                 v    |                      | j        | j        | j        | j                  }| j        |_        |S r"   )	__class__r5   rV   rT   r/   rU   r   others     r   copyzOTTableReader.copy   s/    
..DOT[$-
P
P%h%)	,r   c                 d    | j         |z   }|                     | j        | j        || j                  S r"   )rT   r`   r5   rV   r/   )r   rT   s     r   getSubReaderzOTTableReader.getSubReader   s,    ;&		4?FDM	J	JJr   c                 z    | j         }||z   }t          j        d| | j        ||                   \  }|| _         |S N>rU   structunpackr5   )r   typecode
staticSizerU   newposr$   s         r   	readValuezOTTableReader.readValue   sC    #&=X3v:)>??&%$(	,r   c                     | j         }|||z  z   }t          j        || j        ||                   }t          j        dk    r|                                 || _         |                                S Nbig)rU   arrayr5   sys	byteorderbyteswaptolist)r   rl   rm   r[   rU   rn   r$   s          r   	readArrayzOTTableReader.readArray   se    ###&
+h	#f* 5
6
6%]eU^^---$(	r   c                 0    |                      dd          S )Nbr   rm   ro   r   s    r   readInt8zOTTableReader.readInt8       		*	**r   c                 2    |                      dd|          S )Nrz   r   rm   r[   rx   rZ   s     r   readInt8ArrayzOTTableReader.readInt8Array       		7	77r   c                 0    |                      dd          S )Nhr
   r{   r|   r   s    r   	readShortzOTTableReader.readShort   r~   r   c                 2    |                      dd|          S )Nr   r
   r   r   rZ   s     r   readShortArrayzOTTableReader.readShortArray   r   r   c                 0    |                      dd          S )NrQ   r   r{   r|   r   s    r   readLongzOTTableReader.readLong   r~   r   c                 2    |                      dd|          S )NrQ   r   r   r   rZ   s     r   readLongArrayzOTTableReader.readLongArray   r   r   c                 0    |                      dd          S )NBr   r{   r|   r   s    r   	readUInt8zOTTableReader.readUInt8   r~   r   c                 2    |                      dd|          S )Nr   r   r   r   rZ   s     r   readUInt8ArrayzOTTableReader.readUInt8Array   r   r   c                 0    |                      dd          S )NHr
   r{   r|   r   s    r   
readUShortzOTTableReader.readUShort   r~   r   c                 2    |                      dd|          S )Nr   r
   r   r   rZ   s     r   readUShortArrayzOTTableReader.readUShortArray   r   r   c                 0    |                      dd          S )NIr   r{   r|   r   s    r   	readULongzOTTableReader.readULong   r~   r   c                 2    |                      dd|          S )Nr   r   r   r   rZ   s     r   readULongArrayzOTTableReader.readULongArray   r   r   c                 z    | j         }|dz   }t          j        dd| j        ||         z             \  }|| _         |S )Nr   z>l    ri   r   rU   rn   r$   s       r   
readUInt24zOTTableReader.readUInt24   sA    #7&=uTYs6z%::;;&%$(	,r   c                 :      fdt          |          D             S )Nc                 8    g | ]}                                 S r   )r   ).0_r   s     r   
<listcomp>z1OTTableReader.readUInt24Array.<locals>.<listcomp>   s#    	2	2	2$//

	2	2	2r   )rangerZ   s   ` r   readUInt24ArrayzOTTableReader.readUInt24Array   s#    	2	2	2	2U5\\	2	2	22r   c                     | j         }|dz   }t          | j        ||                   }t          |          dk    s
J |            || _         |S Nr   )rU   r   r5   lenr   s       r   readTagzOTTableReader.readTag   sO    #7&
diF
#
$
$%	Uq%$(	,r   c                 J    | j         }||z   }| j        ||         }|| _         |S r"   )rU   r5   )r   r[   rU   rn   r$   s        r   readDatazOTTableReader.readData   s.    #;&
)CJ
%$(	,r   c                 z    | j         r| j                                         nt                      }|||<   || _         d S r"   rV   rc   dictr   rM   r$   states       r   __setitem__zOTTableReader.__setitem__   9    $(O
?$/


 
 
 %%+$///r   c                 *    | j         o| j         |         S r"   rV   r   rM   s     r   __getitem__zOTTableReader.__getitem__   s    		2T_T22r   c                 "    | j         o|| j         v S r"   r   r   s     r   __contains__zOTTableReader.__contains__   s    		4TT_44r   )Nr   N)r   r   r   rP   	__slots__r   r\   r^   rc   re   ro   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   q   s       <<@         
K K K    + + +8 8 8+ + +8 8 8+ + +8 8 8+ + +8 8 8+ + +8 8 8+ + +8 8 8  3 3 3      
3 3 35 5 5 5 5r   r1   c                       e Zd ZdZd)dZed             Zej        d             Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd*dZ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+d%Z&d& Z'd' Z(d( Z)dS ),r<   z=Helper class to gather and assemble data for OpenType tables.Nr
   c                 Z    g | _         d | _        || _        || _        || _        d | _        d S r"   )itemsrU   rV   r/   
offsetSizeparent)r   rV   r/   r   s       r   r   zOTTableWriter.__init__   s0    $*$($/$-$/$+++r   c                     | j         dk    S r   r   r   s    r   
longOffsetzOTTableWriter.longOffset   s    	A	r   c                     |rdnd| _         d S )Nr   r
   r   r   r$   s     r   r   zOTTableWriter.longOffset   s    %AAA$///r   c                 z    | j         r| j                                         nt                      }|||<   || _         d S r"   r   r   s       r   r   zOTTableWriter.__setitem__   r   r   c                     | j         |         S r"   r   r   s     r   r   zOTTableWriter.__getitem__   s    		r   c                     | j         |= d S r"   r   r   s     r   __delitem__zOTTableWriter.__delitem__   s    
odr   c                     d}| j         D ]J}t          |d          r||j        z  }t          |d          r||j        z  }8|t	          |          z   }K|S )z<Return the length of this table in bytes, without subtables.r   getCountDatagetData)r   rJ   sizer   r   )r   litems      r   getDataLengthzOTTableWriter.getDataLength   sm    !j  ddN## NAAi   AA	CIIAA	
(r   c                 D   t          | j                  }| j        }t          |          }t	          |          D ]}||         }t          |d          r|j        dk    rt          |j        |z
            ||<   @|j        dk    rS	 t          |j        |z
            ||<   g# t          j
        $ r% |                     |          }t          |          w xY w|j        dk    rt          |j        |z
            ||<   t          |j                  t          |          S )z;Assemble the data for this writer/table, without subtables.r   r   r
   r   )listr   rU   r   r   rJ   r   	packULong
packUShortrj   errorgetOverflowErrorRecordr    
packUInt24
ValueErrorr   )r   r   rU   numItemsrQ   r   r%   s          r   r   zOTTableWriter.getData  s1   
tz

%#ZZ(?? ' 'a
(4dI '!$(S.))U1XX	A		8DHsN++eAhhL 8 8 8 77=="#6777	8
 
A		48c>**U1XXdo&&&'  
5		s   B!!4Cc                 *    t          | j                  S r"   )hashr   r   s    r   __hash__zOTTableWriter.__hash__&  s    	dj		r   c                 H    |                      |          }|t          u r|n| S r"   __eq__NotImplementedr   rb   results      r   __ne__zOTTableWriter.__ne__*  )    ;;u&^++V;r   c                     t          |           t          |          k    rt          S | j        |j        k    o| j        |j        k    S r"   )typer   r   r   ra   s     r   r   zOTTableWriter.__eq__.  s=    	$ZZ4;;
	E,	,	Ju{1JJr   c                    t          | d          }t          | d          }|ri }| j        }t          t          |                    D ]t}||         }t          |d          r|                                ||<   2t          |d          r2|                    |           |s|                    ||          x||<   }ut          |          | _        d S )N	Extension	DontSharer   r   )rJ   r   r   r   r   _doneWriting
setdefaulttuple)r   internedTablesisExtension	dontSharer   rQ   r   s          r   r   zOTTableWriter._doneWriting3  s     k**+ dK(() >
*%U = =a
(4dN## =  ""E!HHi   =n%%% =%00t<<<U1XU||$***r   c                    d|t          |           <   t          | j                  }t          t	          |                    }|                                 t          | d          }|}|r|
J d            |d i }}}d}t          | d          rbt	          |          D ](}	| j        |	         }
t          |
dd           dk    rd} n)t          |
          |vr|
                    |||           n	 |D ]g}	| j        |	         }
t          |
d          s |r|	d	k    rt          |
dd           dk    r>t          |
          |vr|
                    |||           gh|	                    |            d S )
NTr   zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFsortCoverageLastrM   Coverager   r   )
idr   r   r   r   reverserJ   r2   _gatherTablesappend)r   tables	extTablesdoner   iRanger   
selfTablesr   rQ   r   s              r   r   zOTTableWriter._gatherTablesQ  s    $r$xx.__(h  &..k**+* 1


!x


&bd96 T%&& 	(OO  q:a=DtVT""j00
U 1 	hhdvy$//// 	 	 	a
*Q-4
$	
"
"  AqDDgdFD&A&AZ&O&Ohhdvy$//// 	Dr   c                 $   i }|                      |           g }g }i }|                     |||           |                                 |                                 d}|D ] }||_        ||                                z   }!|D ] }||_        ||                                z   }!g }|D ]+}|                                }|                    |           ,|D ]+}|                                }|                    |           ,t          |          S )z+Assemble all data, including all subtables.r   )r   r   r   rU   r   r   r   r   )	r   r   r   r   r   rU   r3   r5   	tableDatas	            r   r>   zOTTableWriter.getAllData  s:   .N###&)	$VY---.. 	
# % %e59	u""$$	$33 % %e59	u""$$	$33	$  e}}9;;y  e}}9;;y	4r   c                 X    |                      | j        | j        |          }| |_        |S )Nr   )r`   rV   r/   r   )r   r   	subwriters      r   getSubWriterzOTTableWriter.getSubWriter  s-    nnT_dm
nSS)) 
r   c                 f    | j                             t          j        d| |                     d S rg   r   r   rj   pack)r   rl   r$   s      r   
writeValuezOTTableWriter.writeValue  s0    *FKH6677777r   c                     t          j         ||          }t          j        dk    r|                                 | j                            |                                           d S rq   )rs   rt   ru   rv   r   r   tobytes)r   rl   valuesas       r   
writeArrayzOTTableWriter.writeArray  sP    k(F##!]eQZZ\\\*AIIKK     r   c                     d|cxk    rdk     sn J |            | j                             t          j        d|                     d S )Ni   z>br  r   s     r   	writeInt8zOTTableWriter.writeInt8  sW    										e			*FKe,,-----r   c                 2    |                      d|           d S )Nrz   r  r   r  s     r   writeInt8ArrayzOTTableWriter.writeInt8Array      //#vr   c                     d|cxk    rdk     sn J |            | j                             t          j        d|                     d S )Ni    z>hr  r   s     r   
writeShortzOTTableWriter.writeShort  sW    	5	 	 	 	 5	 	 	 	 	 %	 	 	 *FKe,,-----r   c                 2    |                      d|           d S )Nr   r  r  s     r   writeShortArrayzOTTableWriter.writeShortArray  r  r   c                 `    | j                             t          j        d|                     d S )Nz>ir  r   s     r   	writeLongzOTTableWriter.writeLong  *    *FKe,,-----r   c                 2    |                      d|           d S )NrQ   r  r  s     r   writeLongArrayzOTTableWriter.writeLongArray  r  r   c                     d|cxk    rdk     sn J |            | j                             t          j        d|                     d S )Nr      >Br  r   s     r   
writeUInt8zOTTableWriter.writeUInt8  sW    	
e				c					5			*FKe,,-----r   c                 2    |                      d|           d S )Nr   r  r  s     r   writeUInt8ArrayzOTTableWriter.writeUInt8Array  r  r   c                     d|cxk    rdk     sn J |            | j                             t          j        d|                     d S )Nr   i   >Hr  r   s     r   writeUShortzOTTableWriter.writeUShort  sW    	
e				g					u			*FKe,,-----r   c                 2    |                      d|           d S )Nr   r  r  s     r   writeUShortArrayzOTTableWriter.writeUShortArray  r  r   c                 `    | j                             t          j        d|                     d S )N>Ir  r   s     r   
writeULongzOTTableWriter.writeULong  r  r   c                 2    |                      d|           d S )Nr   r  r  s     r   writeULongArrayzOTTableWriter.writeULongArray  r  r   c                     d|cxk    rdk     sn J |            t          j        d|          }| j                            |dd                     d S )Nr      z>Lr   rj   r  r   r   )r   r$   rz   s      r   writeUInt24zOTTableWriter.writeUInt24  sd    	
e				i								k$!*AabbEr   c                 :    |D ]}|                      |           d S r"   )r.  )r   r  r$   s      r   writeUInt24ArrayzOTTableWriter.writeUInt24Array  s2      eE r   c                     t          |                                          }t          |          dk    s
J |            | j                            |           d S r   )r   r  r   r   r   )r   tags     r   writeTagzOTTableWriter.writeTag  sN    C#	SQ*Cr   c                 :    | j                             |           d S r"   r   r   )r   	subWriters     r   writeSubTablezOTTableWriter.writeSubTable  s    *Ir   c                 `    t          ||||          }| j                            |           |S )N)r   r$   )CountReferencer   r   )r   r3   rM   r   r$   refs         r   writeCountReferencez!OTTableWriter.writeCountReference  s3    udU;;;#*C	*r   c                 ^    t          j        |f|z    }| j                            |           d S r"   r-  )r   formatr  r5   s       r   writeStructzOTTableWriter.writeStruct  s1    	vi&(	)$*Dr   c                 :    | j                             |           d S r"   r5  )r   r5   s     r   	writeDatazOTTableWriter.writeData  s    *Dr   c                    d x}x}x}}| j         dk    r	|j        }n%| j         dk    r| j        }|j        }n
t          |dd          }t          |d          r|j        }| j         dk    r| j        j        }| j        }n| j         dk    r| j        j        j        }| j        j        }nd                    | j         |g          }| j        }|r7|j         d	vr.d                    |j         |g          }|j        }|r	|j         d	v.|r<|j         dk    r|j        j        j        }|j        j        }n|j        j        }|j        }t          | j        ||||f          S )
N
LookupListLookuprM   z<none>repeatIndexSubTableExtSubTable.)rF  rE  )rM   rD  r2   rJ   r   joinr   r/   )r   r   r   r   r   r   p1s          r   r   z$OTTableWriter.getOverflowErrorRecord  s   ;??/?M?Hy	Y,%??yH%?#==dFH--8dM"" ! I
i:k-O$MM	]""k(4OK+MMxxH-..H	B
  ;;;"'8,--X
)R   ;;; 
 %
=  	(4oi+mm	-onm	t}o}hXab	d	ddr   )NNr
   )r
   )r
   N)*r   r   r   rP   r   propertyr   setterr   r   r   r   r   r   r   r   r   r   r>   r   r  r  r  r  r  r  r  r  r  r   r#  r%  r(  r*  r.  r0  r3  r7  r;  r>  r@  r   r   r   r   r<   r<      sz       DD      ( & & &  
    

 
 
  4  < < <K K K
  <5 5 5n  D   8 8 8! ! !
. . .  . . .  . . .  . . .  . . .  . . .        
     
    e e e e er   r<   c                   ,    e Zd ZdZddZd Zd Zd ZdS )r9  z8A reference to a Count value, not a count of references.Nc                 b    || _         || _        || _        ||                     |           d S d S r"   )r3   rM   r   setValue)r   r3   rM   r   r$   s        r   r   zCountReference.__init__  s=    $*$)$)
== r   c                 ~    | j         }| j        }||         |||<   d S ||         |k    sJ |||         |f            d S r"   r3   rM   )r   r$   r3   rM   s       r   rN  zCountReference.setValue!  sU    
*%	$
4[5;;;
+


uT{E :




r   c                 &    | j         | j                 S r"   rP  r   s    r   getValuezCountReference.getValue(  s    	DI	r   c                 ~    | j         | j                 }|d}t          t          t          d| j                 |          S )Nr   )r   r
   r   )r3   rM   	packUInt8r   r   r   )r   vs     r   r   zCountReference.getCountData*  s8    
j!YAy	1	1$)	<Q	?	??r   NN)r   r   r   rP   r   rN  rR  r   r   r   r   r9  r9    s`        ??   ; ; ;  @ @ @ @ @r   r9  c                 ,    t          j        d|           S )Nr  rj   r  r#   s    r   rT  rT  0      D%   r   c                 ,    t          j        d|           S )Nr"  rX  r#   s    r   r   r   3  rY  r   c                 ^    d| cxk    rdk     sn J |             t          j        d|           S )Nr   l        r'  rX  r#   s    r   r   r   6  sA    	U    [     %   D%   r   c                 n    d| cxk    rdk     sn J |             t          j        d|           dd          S )Nr   r,  r'  r   rX  r#   s    r   r   r   :  sJ    	UYD%  $$r   c                       e Zd ZdZd Zd Zed             Zd Zd Z	ddZ
d	 Zd
 Zd Zd ZddZd Zd Zd Zd ZdS )	BaseTablez0Generic base class for all OpenType (sub)tables.c                     | j                             d          }|r1| `| j        }| `|                     ||           t          | |          S t          |          Nr7   )__dict__getr7   r6   r4   r2   AttributeError)r   attrr7   r6   s       r   __getattr__zBaseTable.__getattr__C  sb    =X&&& {
)4y>>&$
$

tr   c                     | j                             d          }|r#| `| j        }| `|                     ||           d S d S r`  )ra  rb  r7   r6   r4   )r   r7   r6   s      r   ensureDecompiledzBaseTable.ensureDecompiledN  sT    =X&&&  {
)4y>>&$	   r   c                     d}| j         D ]b}|                    |          }|t          u r	t          c S d}|j        r(|j        |v r||j                 |j        z   }n	t          c S |||z  z  }c|S )Nr   r   )
convertersgetRecordSizer   repeataux)clsr7   	totalSizeconvr   
countValues         r   rj  zBaseTable.getRecordSizeV  s    )n 	" 	"d


V
$
$4
n^333:
k {f%0ZZz!!99	r   c                     | j         S r"   )ri  r   s    r   getConverterszBaseTable.getConverterse  s
    	r   c                     | j         |         S r"   )convertersByNamer   s     r   getConverterByNamezBaseTable.getConverterByNameh  s    		t	$$r   Nc                    |                                  D ],}|j        rt          | |j                  st	          | |j        g            t          t          | |j                            |j        z
  }	 |                     |j                  }t	          | |j        |           # t          $ r. |r)|j        |v r ||j                 
                    |           Y w xY w|j        rt          |j        d | j                  st          | |j                  rt          |d          rt	          | |j        d            .d S )NwriteNullOffset)rr  rk  rJ   rM   setattrr   r2   rl  ru  KeyErrorrN  evalra  )r   
propagatorro  rp  
count_convs        r   rL   zBaseTable.populateDefaultsk  s[     "" $ $d
k $4## "T49b!!!WT49--..9J3))$+66ZT4;
++++ 3 3 3 3t{j00&&z2223
 x TXtT];; tTY t&'' $T49d###%$ $s   50B&&5CCc                 H   |                      |           i }|| _        |                                 D ]}|j        dk    r!|                    |j        |d                   }|j        dk    r!|                    |j        |d                   }|j        dk    r|                    |d                   }|j        dk    r!|                    |j        |d                   }	 |j        rqt          |j        t                    r|j        }n$|j        |v r||j                 }n||j                 }||j	        z  }|
                    ||||          ||j        <   nZ|j	        rt          |j	        d |          sE|                    |||          ||j        <   |j        r||j                 ||j        <   # t          $ r}|j        }|j        |fz   |_         d }~ww xY wt!          | d	          r|                     ||           n| j                            |           | `d S )
NrE  
LookupTyperF  ExtensionLookupTypeFeatureParams
FeatureTag	SubStruct	MorphTypepostRead)
readFormat_BaseTable__rawTablerr  rM   getConverterr/   rk  
isinstanceintrl  rx   rz  readisPropagated	ExceptionargsrJ   r  ra  update)r   r7   r6   r3   ro  rp  rC   rM   s           r   r4   zBaseTable.decompile  sM   //&
%$/  ""  
  
d
i:V_L D
i=  V_!"$ $D
i?""VL122D
i;V_";/1 1D
{ +4;$$ ';jj
+

%jj $+&j48ZvtUJGGU49 dhe44 		&$66U49 +	*fTY
 
 
 
9DVtgAF	

 T: ===
ooos   !BF58;F55
G?GGc                    |                                   t          | d          r9t          | d           }|                     |          }|ot          | d          }nd}| j                                        }|                                 D ]I}|j        r@|j        r9|                    |j	                  }t          |t                    r
|||j	        <   Jt          | d          rd|_        t          | d          rd|_        t          | j        d          r%|d                             | j        j                   |                     |           |                                 D ]}|                    |j	                  }|j        r|g }t'          |          |j        z
  }t          |j        t*                    r:t'          |          |j        k    s!J d	|j        t'          |          fz              nA|j        |v rt          ||j        |
           n ||j                                     |           	 |                    ||||           # t.          $ r}|j        |j	        dz   fz   |_         d }~ww xY w|j        rt          |t                    r@|}	|j        |	_        |                    |	           |	                                ||j	        <   n+|                    ||j	        |j                  }	d ||j	        <   |j        r
|	||j	        <   |j        rG|j	        |vr
d ||j	        <   |                    ||j	        |j        ||j	                           }	|	|d<   |j        rt?          |j        d |          s 	 |                     ||||           n8# t.          $ r+}||j        j!        n|j	        }
|j        |
fz   |_         d }~ww xY w|j        r
|||j	        <   |r| `"d S d S )NpreWriteFormatFr   r   r   Tr~  zexpected %d values, got %dr#   z[])#rg  rJ   r  ra  rc   rr  isCountr  rb  rM   r  r9  r   r   r`   rN  r~  writeFormatrk  r   rl  r  r  r  r  rm   r   r@  rR  r;  isLookupTyperz  writer   r  )r   rB   r6   deleteFormatr3   ro  r$   rp  rC   r:  rM   s              r   r=   zBaseTable.compile  sE    T:  dH---<==5:74#:#:<<<=5   ""  d
l t( IIdi  E%(( VDIT%&& 6T; 6T^\** <	,  !:;;;6  "" 8 8d99TY5
k 6}UUdh&J$+s## .JJ$+%%%'Ct{TWX]T^T^F_'_%%%%			E4;j99999 DK!!*---	__VT5%0000   f	$((QV
 	 & %(( SSXcU49%%eTYHHSU49 VDI  yU49

$
$UDItdiHX
Y
YCF<x TXtU33 	ZZeU++++   (-(9EO$$tyTfwQV
  VDI {{{ s0   =I
I> I99I>	N""
O,&OOc                     d S r"   r   r   r7   s     r   r  zBaseTable.readFormat      $r   c                     d S r"   r   r   rB   s     r   r  zBaseTable.writeFormat  r  r   c                 :   |r|n| j         j        }|g }t          | d          r|d| j        fgz   }|                    ||           |                                 |                     ||           |                    |           |                                 d S )Nr  )r`   r   rJ   r  begintagnewlinerG   endtag)r   	xmlWriterr6   rN   rM   	tableNames         r   rH   zBaseTable.toXML  s    7dd 7)
]5T8 -Xt{+,,5Y&&&++i9r   c           
         |                                  D ]}|j        r_t          | |j        g           }t	          t          |                    D ]+}||         }|                    ||||j        d|fg           ,h|j        r$t          |j        d t          |                     st          | |j        d           }|                    ||||j        g            d S )Nindex)
rr  rk  r2   rM   r   r   xmlWriterl  rz  vars)r   r  r6   ro  r$   rQ   r   s          r   rG   zBaseTable.toXML2   s       "" 9 9d
k 
9D$)R((E3u::  !HT	]]9dD$)	!~   
 x TXtT$ZZ88 D$)T**EMM)T5$)R88889 9r   c                 H   	 |                      |          }n# t          $ r  w xY w|                    |||          }|j        rGt	          | |j        d           }|g }t          | |j        |           |                    |           d S t          | |j        |           d S r"   )ru  ry  xmlReadrk  r2   rM   rx  r   )r   rM   rN   rO   r6   ro  r$   seqs           r   rK   zBaseTable.fromXML1  s    	

!
!$
'
'44	 	 	 		
,,ugt
,
,%	[ #	ty$	'	'3	k
CD$)S!!!::e
4E"""""s    $c                 H    |                      |          }|t          u r|n| S r"   r   r   s      r   r   zBaseTable.__ne__@  r   r   c                     t          |           t          |          k    rt          S |                                  |                                 | j        |j        k    S r"   )r   r   rg  ra  ra   s     r   r   zBaseTable.__eq__D  sR    	$ZZ4;;
	%.	((r   r"   rV  )r   r   r   rP   re  rg  classmethodrj  rr  ru  rL   r4   r=   r  r  rH   rG   rK   r   r   r   r   r   r^  r^  ?  s       77	 	 	        +  % % %$ $ $ $0+ + +Z\ \ \|    
 
 
 
9 9 9"# # #< < <) ) ) ) )r   r^  c                   H    e Zd ZdZed             Zd Zd Zd Zd Z	d	dZ
dS )
FormatSwitchingBaseTablezsMinor specialization of BaseTable, for tables that have multiple
	formats, eg. CoverageFormat1 vs. CoverageFormat2.c                     t           S r"   )r   )rm  r7   s     r   rj  z&FormatSwitchingBaseTable.getRecordSizeS  s    	r   c                 B    | j                             | j        g           S r"   )ri  rb  r  r   s    r   rr  z&FormatSwitchingBaseTable.getConvertersW  s    			T["	-	--r   c                 2    | j         | j                 |         S r"   )rt  r  r   s     r   ru  z+FormatSwitchingBaseTable.getConverterByNameZ  s    		t{	+D	11r   c                 8    |                                 | _        d S r"   )r   r  r  s     r   r  z#FormatSwitchingBaseTable.readFormat]  s    !!##$+++r   c                 :    |                     | j                   d S r"   )r#  r  r  s     r   r  z$FormatSwitchingBaseTable.writeFormat`  s    T[!!!!!r   Nc                 B    t                               | ||||           d S r"   )r^  rH   )r   r  r6   rN   rM   s        r   rH   zFormatSwitchingBaseTable.toXMLc  s"    //$	455555r   rV  )r   r   r   rP   r  rj  rr  ru  r  r  rH   r   r   r   r  r  N  s        6 6   +. . .2 2 2$ $ $" " "6 6 6 6 6 6r   r  c                       e Zd Zd Zd ZdS )UInt8FormatSwitchingBaseTablec                 8    |                                 | _        d S r"   )r   r  r  s     r   r  z(UInt8FormatSwitchingBaseTable.readFormath  s      ""$+++r   c                 :    |                     | j                   d S r"   )r  r  r  s     r   r  z)UInt8FormatSwitchingBaseTable.writeFormatk  s    DK     r   N)r   r   r   r  r  r   r   r   r  r  g  s2        # # #! ! ! ! !r   r  )uint16uint8c                 ^    	 t           |          S # t          $ r t          d|           w xY w)NzUnsupported format type: )formatSwitchingBaseTablesry  	TypeError)
formatTypes    r    getFormatSwitchingBaseTableClassr  t  sD    >	":	.. > > ><j<<===>s    ,))r   
XPlacementr   r   )r
   
YPlacementr   r   )r   XAdvancer   r   )   YAdvancer   r   )   
XPlaDevicer   r   )    
YPlaDevicer   r   )@   
XAdvDevicer   r   )r
  
YAdvDevicer   r   )r  	Reserved1r   r   )i   	Reserved2r   r   )i   	Reserved3r   r   )i   	Reserved4r   r   )i   	Reserved5r   r   )i    	Reserved6r   r   )i @  	Reserved7r   r   )r  	Reserved8r   r   c                  8    i } t           D ]\  }}}}|||f| |<   | S r"   )valueRecordFormat)dmaskrM   isDevicesigneds        r   
_buildDictr    s6    %6 # #!T46(F"!D''	r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )ValueRecordFactoryz6Given a format code, this object convert ValueRecords.c                 p    g }t           D ]$\  }}}}||z  r|                    |||f           %|| _        d S r"   )r  r   r=  )r   valueFormatr=  r  rM   r  r  s          r   r   zValueRecordFactory.__init__  sQ    &&7 , ,"dD(FD ,
MM46*+++$+++r   c                 *    t          | j                  S r"   )r   r=  r   s    r   __len__zValueRecordFactory.__len__  s    	T[		r   c                 b   | j         }|sd S t                      }|D ]\  }}}|r|                                }n|                                }|rN|rJddlm}	 |                    |          }
 t          |	|                      }|                    |
|           nd }t          |||           |S Nr   r,   )
r=  ValueRecordr   r   r0   r-   re   r2   r4   rx  )r   r7   r6   r=  valueRecordrM   r  r  r$   r-   	subReaders              r   readValueRecordz"ValueRecordFactory.readValueRecord  s    ;&	 
$+ & % %dHf  EEE  $$U++Y$WXt$$&&U
__Y%%%%U
;e$$$$	r   c                 R   | j         D ]\  }}}t          ||d          }|rX|r@|                                }|                    |           |                    ||           [|                    d           q|r|                    |           |                    |           d S Nr   )r=  r2   r   r7  r=   r#  r  )	r   rB   r6   r  rM   r  r  r$   r6  s	            r   writeValueRecordz#ValueRecordFactory.writeValueRecord  s     $  dHf;a((5 
 $$&&Y)$$$
]]9d#### 
e
u r   N)r   r   r   rP   r   r  r  r  r   r   r   r  r    sV        ==      *    r   r  c                   <    e Zd Zd	dZd Zd Zd
dZd Zd Zd Z	dS )r  Nc                 .   |pt           D ]!\  }}}}||z  rt          | ||rd nd           "|A|j                                        D ])\  }}t	          | |          st          | ||           (d S d S | |j                                        | _        d S d S r  )r  rx  ra  r   rJ   rc   )	r   r  srcr  rM   r  r  keyvals	            r   r   zValueRecord.__init__  s    '8 2 2#tT8VT 2T40q111	o<%%''  CD# T3	 o  <$$&&4=== r   c                 n    d}| j                                         D ]}|t          |         d         z  }|S r  )ra  keysvalueRecordFormatDict)r   r=  rM   s      r   	getFormatzValueRecord.getFormat  s@    &m  "" 4 4d*403366	-r   c                 x    d}| j                                         D ]\  }}|r|t          |         d         z  }|S r  )ra  r   r  )r   r=  rM   r$   s       r   getEffectiveFormatzValueRecord.getEffectiveFormat  sK    &M'')) 5 5jd5 5+D1!44F	-r   c                    |g }nt          |          }t          d d         D ]<\  }}}}	t          | |          r%|                    |t	          | |          f           =g }
t          dd         D ]@\  }}}}	t          | |          r)t	          | |          }||
                    ||f           A|
rw|                    ||           |                                 |
D ]\  }}||                    |||            |                    |           |                                 d S |	                    ||           |                                 d S )Nr   r  )rM   )
r   r  rJ   r   r2   r  r  rH   r  	simpletag)r   r  r6   	valueNamerN   simpleItemsr  rM   r  r=  deviceItemsdevicedeviceRecords                r   rH   zValueRecord.toXML  s   
];;e;&7&; 4 4"dD(FdD 4gdD112333+&7!&< ( ("dD(FdD (T4  Fv''' 
i---( 4 4t\	4d333Iy+...r   c                    ddl m} |                                D ]#\  }}t          | |t	          |                     $|D ]}t          |t                    s|\  }}} t          ||                      }	|D ]6}
t          |
t                    s|
\  }}}|	                    ||||           7t          | ||	           d S r  )	r0   r-   r   rx  r  r  r   r2   rK   )r   rM   rN   rO   r6   r-   krU  elementr$   elem2name2attrs2content2s                 r   rK   zValueRecord.fromXML  s    kkmm  da
4CFF 
 
g
We
$
$ !4"78T""$$5 1 1ueU## #E68	MM%40000
4u
 
r   c                 H    |                      |          }|t          u r|n| S r"   r   r   s      r   r   zValueRecord.__ne__  r   r   c                 p    t          |           t          |          k    rt          S | j        |j        k    S r"   )r   r   ra  ra   s     r   r   zValueRecord.__eq__   s.    	$ZZ4;;
	%.	((r   rV  r"   )
r   r   r   r   r  r  rH   rK   r   r   r   r   r   r  r    s        ' ' ' '       4   < < <) ) ) ) )r   r  )$fontTools.misc.py23r   r   r   rt   rs   rj   logging	getLoggerr   r?   objectr   r  r    r*   r   r  itemsizer1   r<   r9  rT  r   r   r   r^  r  r  r  r  r  r  r  r  r  r   r   r   <module>r	     sh   . . . . . . . . & & & & & & 



   g!!	e 	e 	e 	e 	e& 	e 	e 	e    Y   M  M  M  M  M | M  M  M b s;6;sA1$$$$u{3 A%%%'L%%%i5 i5 i5 i5 i5F i5 i5 i5Xye ye ye ye yeF ye ye yex	@ @ @ @ @V @ @ @.! ! !! ! !! ! !% % %
L) L) L) L) L) L) L) L)^6 6 6 6 6y 6 6 62! ! ! ! !$< ! ! ! $
'  
> > >   *
 
 
 #
 0 0 0 0 0 0 0 0fO) O) O) O) O)& O) O) O) O) O)r   