o
    tBh                     @   s  d dl mZ 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	d dl
mZmZmZ e	eZdZzd dlZdZW n	 eyF   Y nw ee d	 ZG d
d deZG dd deZG dd deZeedd dksrJ edjdks~J dG dd deZG dd deZG dd deZ dd Z!dd Z"dd Z#dd  Z$G d!d" d"eZ%G d#d$ d$e%Z&G d%d& d&e&Z'e&e'd'Z(d(d) Z)g d*Z*d+d, Z+e+ Z,G d-d. d.eZ-G d/d0 d0eZ.dS )1    )OPTIONS)Tag	bytesjoin   )DefaultTableN)Iterator
NamedTupleOptionalFTz:USE_HARFBUZZ_REPACKERc                   @      e Zd Zdd Zdd ZdS )OverflowErrorRecordc                 C   s6   |d | _ |d | _|d | _|d | _|d | _d S )Nr   r            )	tableTypeLookupListIndexSubTableIndexitemName	itemIndex)selfoverflowTuple r   t/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/fontTools/ttLib/tables/otBase.py__init__   s
   



zOverflowErrorRecord.__init__c              
   C   s$   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   r   r   r   __repr__   s   $zOverflowErrorRecord.__repr__N)__name__
__module____qualname__r   r   r   r   r   r   r      s    r   c                   @   r
   )OTLOffsetOverflowErrorc                 C   
   || _ d S Nvalue)r   overflowErrorRecordr   r   r   r   !      
zOTLOffsetOverflowError.__init__c                 C   
   t | jS r!   )reprr#   r   r   r   r   __str__$   r%   zOTLOffsetOverflowError.__str__N)r   r   r   r   r(   r   r   r   r   r           r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
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                 C   s@   ddl m} t|| jd}t|| j}| | _| j|| dS )zFCreate an object from the binary data. Called automatically on access.r   otTablestableTagN) r,   OTTableReaderr.   getattrtable	decompile)r   datafontr,   reader
tableClassr   r   r   r3   /   s
   zBaseTTXConverter.decompilec              
   C   s  d}|j t }| jdv r/|du rtd| j nts/|du r"td|du s(J td| j d}	 zgt| jd}| j	|| |d	v rtr| jdv rztd
| j |
 W W S  tttjfy } z,|st|j }t|dkry|d| 7 }td| j| d}|jddW  Y d}~W S d}~ww | W S  ty } zE||jkr |j}td| |}d}	|jdu rddlm}
 |
||}	nddlm} |||}	|	sddlm}
 |
||}	|	s W Y d}~nd}~ww q2)z=Compiles the table into binary. Called automatically on save.N)GSUBGPOSFz>hb.repack disabled, compiling '%s' with pure-python serializerTzNo module named 'uharfbuzz'z?uharfbuzz not found, compiling '%s' with pure-python serializerr-   )NTzserializing '%s' with hb.repackr/   z: zbhb.repack failed to serialize '%s', reverting to pure-python serializer; the error message was: %s)remove_duplicatez+Attempting to fix OTLOffsetOverflowError %sr   r   )fixLookupOverFlows)fixSubTableOverFlows)cfgUSE_HARFBUZZ_REPACKERr.   logdebughave_uharfbuzzImportErrorOTTableWriterr2   compilegetAllDataUsingHarfbuzz
ValueErrorMemoryErrorhbRepackerErrortyper   r   warning
getAllDatar   r#   infor   r,   r;   r<   )r   r5   overflowRecorduse_hb_repackhb_first_error_loggedwritere	error_msglastItemokr;   r<   r   r   r   rD   7   s~   







zBaseTTXConverter.compilec                 C   s   | j || d S r!   )r2   toXML2)r   rQ   r5   r   r   r   toXML      zBaseTTXConverter.toXMLc                 C   sJ   ddl m} t| dst|| j}| | _| j|||| | j  d S )Nr   r+   r2   )r/   r,   hasattrr1   r.   r2   fromXMLpopulateDefaults)r   nameattrscontentr5   r,   r7   r   r   r   rZ      s   
zBaseTTXConverter.fromXMLc                 C   s   | j jdd d S )NT)recurse)r2   ensureDecompiledr   r   r   r   r`      rX   z!BaseTTXConverter.ensureDecompiledN)	r   r   r   __doc__r3   rD   rW   rZ   r`   r   r   r   r   r*   (   s    er*   ir   z#Oops, file a bug against fonttools.c                   @   s   e Zd ZdZdZd9ddZdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 ZdS ):r0   z5Helper class to retrieve data from an OpenType table.r4   offsetpos
localStater.   Nr   c                 C   s"   || _ || _|| _|| _|| _d S r!   rc   )r   r4   rf   rd   r.   r   r   r   r      s
   
zOTTableReader.__init__c                 C   s   |  j |7  _ d S r!   re   r   countr   r   r   advance   rX   zOTTableReader.advancec                 C   r    r!   rg   )r   re   r   r   r   seek   r%   zOTTableReader.seekc                 C   s$   |  | j| j| j| j}| j|_|S r!   )	__class__r4   rf   rd   r.   re   r   otherr   r   r   copy   s   zOTTableReader.copyc                 C   s    | j | }| | j| j|| jS r!   )rd   rl   r4   rf   r.   )r   rd   r   r   r   getSubReader   s   
zOTTableReader.getSubReaderc                 C   s6   | j }|| }td| | j|| \}|| _ |S N>re   structunpackr4   )r   typecode
staticSizere   newposr#   r   r   r   	readValue   s
   zOTTableReader.readValuec                 C   sH   | j }|||  }t|| j|| }tjdkr|  || _ | S Nbig)re   arrayr4   sys	byteorderbyteswaptolist)r   rv   rw   ri   re   rx   r#   r   r   r   	readArray   s   zOTTableReader.readArrayc                 C      | j dddS )Nbr   rw   ry   r   r   r   r   readInt8      zOTTableReader.readInt8c                 C      | j dd|dS )Nr   r   rw   ri   r   rh   r   r   r   readInt8Array      zOTTableReader.readInt8Arrayc                 C   r   )Nhr   r   r   r   r   r   r   	readShort   r   zOTTableReader.readShortc                 C   r   )Nr   r   r   r   rh   r   r   r   readShortArray   r   zOTTableReader.readShortArrayc                 C   r   )Nrb   r   r   r   r   r   r   r   readLong   r   zOTTableReader.readLongc                 C   r   )Nrb   r   r   r   rh   r   r   r   readLongArray   r   zOTTableReader.readLongArrayc                 C   r   )NBr   r   r   r   r   r   r   	readUInt8   r   zOTTableReader.readUInt8c                 C   r   )Nr   r   r   r   rh   r   r   r   readUInt8Array   r   zOTTableReader.readUInt8Arrayc                 C   r   )NHr   r   r   r   r   r   r   
readUShort   r   zOTTableReader.readUShortc                 C   r   )Nr   r   r   r   rh   r   r   r   readUShortArray   r   zOTTableReader.readUShortArrayc                 C   r   )NIr   r   r   r   r   r   r   	readULong   r   zOTTableReader.readULongc                 C   r   )Nr   r   r   r   rh   r   r   r   readULongArray   r   zOTTableReader.readULongArrayc                 C   s4   | j }|d }tdd| j||  \}|| _ |S )Nr   z>l    rs   r   re   rx   r#   r   r   r   
readUInt24   s
   zOTTableReader.readUInt24c                    s    fddt |D S )Nc                    s   g | ]}   qS r   )r   ).0_r   r   r   
<listcomp>   s    z1OTTableReader.readUInt24Array.<locals>.<listcomp>)rangerh   r   r   r   readUInt24Array      zOTTableReader.readUInt24Arrayc                 C   s>   | j }|d }t| j|| }t|dksJ ||| _ |S Nr   )re   r   r4   lenr   r   r   r   readTag   s   zOTTableReader.readTagc                 C   s&   | j }|| }| j|| }|| _ |S r!   )re   r4   )r   ri   re   rx   r#   r   r   r   readData  s
   zOTTableReader.readDatac                 C   (   | j r| j  nt }|||< || _ d S r!   rf   ro   dictr   r\   r#   stater   r   r   __setitem__     
zOTTableReader.__setitem__c                 C   s   | j o| j | S r!   rf   r   r\   r   r   r   __getitem__  r   zOTTableReader.__getitem__c                 C   s   | j o|| j v S r!   r   r   r   r   r   __contains__  r   zOTTableReader.__contains__)Nr   N)r   r   r   ra   	__slots__r   rj   rk   ro   rp   ry   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      s:    
r0   c                   @   sb  e Zd ZdZdTddZedd Zejdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" ZdUd$d%ZdVd&d'Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dWdLdMZ)dNdO Z*dPdQ Z+dRdS Z,dS )XrC   z=Helper class to gather and assemble data for OpenType tables.Nr   c                 C   s(   g | _ d | _|| _|| _|| _d | _d S r!   )itemsre   rf   r.   
offsetSizeparent)r   rf   r.   r   r   r   r   r     s   
zOTTableWriter.__init__c                 C   s
   | j dkS r   r   r   r   r   r   
longOffset)     
zOTTableWriter.longOffsetc                 C   s   |rd| _ d S d| _ d S )Nr   r   r   r   r#   r   r   r   r   -  s   c                 C   r   r!   r   r   r   r   r   r   1  r   zOTTableWriter.__setitem__c                 C   
   | j | S r!   r   r   r   r   r   r   6  r%   zOTTableWriter.__getitem__c                 C   s   | j |= d S r!   r   r   r   r   r   __delitem__9     zOTTableWriter.__delitem__c                 C   sL   d}| j D ]}t|dr||j7 }qt|dr||j7 }q|t| }q|S )z<Return the length of this table in bytes, without subtables.r   getCountDatagetData)r   rY   sizer   r   )r   litemr   r   r   getDataLength>  s   


zOTTableWriter.getDataLengthc              	   C   s   t | j}| j}t|}t|D ]P}|| }t|dr`|jdkr*t|j| ||< q|jdkrLzt|j| ||< W q t	j
yK   | |}t|w |jdkr[t|j| ||< qt|jqt|S )z;Assemble the data for this writer/table, without subtables.r   r   r   r   )listr   re   r   r   rY   r   	packULong
packUShortrt   errorgetOverflowErrorRecordr   
packUInt24rF   r   )r   r   re   numItemsrb   r   r$   r   r   r   r   J  s(   






zOTTableWriter.getDatac                 C   sb   t | j}tttd}t|D ]\}}t|dr,|j|v r'||j d||< qt|jqt	|S )zFAssemble the data for this writer/table with all offset field set to 0)r   r   r   r   r   )
r   r   r   r   r   	enumeraterY   r   rF   r   )r   r   	packFuncsrb   r   r   r   r   getDataForHarfbuzzd  s   



z OTTableWriter.getDataForHarfbuzzc                 C   r&   r!   )hashr   r   r   r   r   __hash__r  r   zOTTableWriter.__hash__c                 C      |  |}|tu r|S | S r!   __eq__NotImplementedr   rn   resultr   r   r   __ne__v     
zOTTableWriter.__ne__c                 C   s,   t | t |kr
tS | j|jko| j|jkS r!   )rJ   r   r   r   rm   r   r   r   r   z  s   zOTTableWriter.__eq__c                 C   s   t | d}t | d}|ri }| j}tt|D ](}|| }t |dr)| ||< qt |dr?|| |s?||| ||< }qt|| _d S )N	Extension	DontSharer   r   )rY   r   r   r   r   _doneWriting
setdefaulttuple)r   internedTablesisExtension	dontSharer   rb   r   r   r   r   r     s   




zOTTableWriter._doneWritingc                 C   s"  d|t | < t| j}tt|}|  t| d}|}|r.|d us&J d|d i }}}d}t| dr\t|D ]}	| j|	 }
t|
dd dkrLd} nq9t |
|vr[|
||| n	 |D ]+}	| j|	 }
t|
dskq^|rz|	d	krzt|
dd dkrzq^t |
|vr|
||| q^	 q^|	|  d S )
NTr   zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFsortCoverageLastr\   Coverager   r   )
idr   r   r   r   reverserY   r1   _gatherTablesappend)r   tables	extTablesdoner   iRanger   
selfTablesr   rb   r   r   r   r   r     s<   	





zOTTableWriter._gatherTablesc                 C   sz  g }g }|}|D ]
}	| dd|	f qd}
d}t| drOt| jD ]-\}}t|dd dkrNd}
t||vrA|||||| }}n|t| }| |  nq!d}d}t| jD ]F\}}t|drd|}nt|dro||j7 }qX|t| }qXt||vr|||||| }}n|t| }||j	|f}| | ||j	7 }qX| |  | ||f |d	7 }||t| < |
r|
  |S )
Nr   Fr   r\   r   Tr   r   r   )r   rY   r   r   r1   r   _gatherGraphForHarfbuzzr   r   r   pop)r   r   obj_listr   objidxvirtual_edges
real_linksvirtual_linksitem_idxidxr   coverage_idxrb   r   	child_idx
offset_posre   	real_edger   r   r   r     sP   

	




z%OTTableWriter._gatherGraphForHarfbuzzc                 C   s   i }|  | g }g }i }d}g }| ||||| d}|D ]}||_||  }qg }	|D ]}| }
|	|
 q.t|	|S )a  The Whole table is represented as a Graph.
                Assemble graph data and call Harfbuzz repacker to pack the table.
                Harfbuzz repacker is faster and retain as much sub-table sharing as possible, see also:
                https://github.com/harfbuzz/harfbuzz/blob/main/docs/repacker.md
                The input format for hb.repack() method is explained here:
                https://github.com/harfbuzz/uharfbuzz/blob/main/src/uharfbuzz/_harfbuzz.pyx#L1149
                r   )r   r   re   r   r   r   rH   repack)r   r   r   r   r   r   r   re   r2   r4   	tableDatar   r   r   rE     s"   
z%OTTableWriter.getAllDataUsingHarfbuzzTc           
      C   s   |r	i }|  | g }g }i }| ||| |  |  d}|D ]}||_||  }q"|D ]}||_||  }q0g }|D ]}| }	||	 q@|D ]}| }	||	 qNt|S )z+Assemble all data, including all subtables.r   )r   r   r   re   r   r   r   r   )
r   r:   r   r   r   r   re   r2   r4   r   r   r   r   rL   -  s0   
zOTTableWriter.getAllDatac                 C   s   | j | j| j|d}| |_|S )Nr   )rl   rf   r.   r   )r   r   	subwriterr   r   r   getSubWriterP  s   zOTTableWriter.getSubWriterc                 C   s   | j td| | d S rq   r   r   rt   pack)r   rv   r#   r   r   r   
writeValueX  s   zOTTableWriter.writeValuec                 C   s2   t  ||}tjdkr|  | j|  d S rz   )r|   r}   r~   r   r   r   tobytes)r   rv   valuesar   r   r   
writeArrayZ  s   zOTTableWriter.writeArrayc                 C   <   d|  krdk sJ | J || j td| d S )Ni   z>br   r   r   r   r   	writeInt8_     $zOTTableWriter.writeInt8c                 C      |  d| d S )Nr   r  r   r   r   r   r   writeInt8Arrayb  r   zOTTableWriter.writeInt8Arrayc                 C   r  )Ni    z>hr   r   r   r   r   
writeShorte  r  zOTTableWriter.writeShortc                 C   r  )Nr   r  r	  r   r   r   writeShortArrayh  r   zOTTableWriter.writeShortArrayc                 C      | j td| d S )Nz>ir   r   r   r   r   	writeLongk     zOTTableWriter.writeLongc                 C   r  )Nrb   r  r	  r   r   r   writeLongArraym  r   zOTTableWriter.writeLongArrayc                 C   r  )Nr      >Br   r   r   r   r   
writeUInt8p  r  zOTTableWriter.writeUInt8c                 C   r  )Nr   r  r	  r   r   r   writeUInt8Arrays  r   zOTTableWriter.writeUInt8Arrayc                 C   r  )Nr   i   >Hr   r   r   r   r   writeUShortv  r  zOTTableWriter.writeUShortc                 C   r  )Nr   r  r	  r   r   r   writeUShortArrayy  r   zOTTableWriter.writeUShortArrayc                 C   r  )N>Ir   r   r   r   r   
writeULong|  r  zOTTableWriter.writeULongc                 C   r  )Nr   r  r	  r   r   r   writeULongArray~  r   zOTTableWriter.writeULongArrayc                 C   sH   d|  krdk sJ | J |t d|}| j|dd   d S )Nr      z>Lr   rt   r   r   r   )r   r#   r   r   r   r   writeUInt24  s   $zOTTableWriter.writeUInt24c                 C   s   |D ]}|  | qd S r!   )r  )r   r   r#   r   r   r   writeUInt24Array  s   zOTTableWriter.writeUInt24Arrayc                 C   s0   t | }t|dksJ || j| d S r   )r   r   r   r   r   )r   tagr   r   r   writeTag  s   zOTTableWriter.writeTagc                 C      | j | d S r!   r   r   )r   	subWriterr   r   r   writeSubTable  r   zOTTableWriter.writeSubTablec                 C   s    t ||||d}| j| |S )N)r   r#   )CountReferencer   r   )r   r2   r\   r   r#   refr   r   r   writeCountReference  s   z!OTTableWriter.writeCountReferencec                 C   s    t j|f|  }| j| d S r!   r  )r   formatr   r4   r   r   r   writeStruct  s   zOTTableWriter.writeStructc                 C   r"  r!   r#  )r   r4   r   r   r   	writeData  r   zOTTableWriter.writeDatac                 C   s  d  } } }}| j dkr|j}nr| j dkr| j}|j}nft|dd}t|dr+|j}| j dkr8| jj}| j}nK| j dkrG| jjj}| jj}n<d| j |g}| j}|rk|j d	vrkd|j |g}|j}|rk|j d	vsY|r|j dkr||jjj}|jj}n|jj}|j}t| j||||fS )
N
LookupListLookupr\   z<none>repeatIndexSubTableExtSubTable.)r0  r/  )r\   r.  r1   rY   r   joinr   r.   )r   r   r   r   r   r   p1r   r   r   r     s8   









z$OTTableWriter.getOverflowErrorRecord)NNr   )T)r   )r   N)-r   r   r   ra   r   propertyr   setterr   r   r   r   r   r   r   r   r   r   r   r   rE   rL   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   r   rC     sX    



$75

#
rC   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )r&  z8A reference to a Count value, not a count of references.Nc                 C   s,   || _ || _|| _|d ur| | d S d S r!   )r2   r\   r   setValue)r   r2   r\   r   r#   r   r   r   r     s   zCountReference.__init__c                 C   sF   | j }| j}|| d u r|||< d S || |ks!J ||| |fd S r!   r2   r\   )r   r#   r2   r\   r   r   r   r6    s
   "zCountReference.setValuec                 C   s   | j | j S r!   r7  r   r   r   r   getValue  r   zCountReference.getValuec                 C   s.   | j | j }|d u rd}tttd| j |S )Nr   )r   r   r   )r2   r\   	packUInt8r   r   r   )r   vr   r   r   r     s   zCountReference.getCountDataNN)r   r   r   ra   r   r6  r8  r   r   r   r   r   r&    s    
r&  c                 C      t d| S )Nr  rt   r   r"   r   r   r   r9    r   r9  c                 C   r<  )Nr  r=  r"   r   r   r   r     r   r   c                 C   s0   d|   krdk sJ |  J | t d| S )Nr   l        r  r=  r"   r   r   r   r     s   $r   c                 C   s8   d|   krdk sJ |  J | t d| dd  S )Nr   r  r  r   r=  r"   r   r   r   r     s   $r   c                   @   s   e Zd ZdZdd Zd'ddZedd Zd	d
 Zdd Z	d(ddZ
dd Zdd Zdd Zdd Zd)ddZdd Zdd Zdd Zd d! ZG d"d# d#eZd$ee fd%d&ZdS )*	BaseTablez0Generic base class for all OpenType (sub)tables.c                 C   s<   | j d}|r| `| j}| `| || t| |S t|Nr6   )__dict__getr6   r5   r3   r1   AttributeError)r   attrr6   r5   r   r   r   __getattr__  s   
zBaseTable.__getattr__Fc                 C   sP   | j d}|r| `| j}| `| || |r$|  D ]
}|j| qd S d S r?  )r@  rA  r6   r5   r3   iterSubTablesr#   r`   )r   r_   r6   r5   subtabler   r   r   r`     s   zBaseTable.ensureDecompiledc                 C   sh   d}| j D ],}||}|tu rt  S d}|jr+|j|v r'||j |j }nt  S ||| 7 }q|S )Nr   r   )
convertersgetRecordSizer   repeataux)clsr6   	totalSizeconvr   
countValuer   r   r   rH    s   


zBaseTable.getRecordSizec                 C   s   | j S r!   )rG  r   r   r   r   getConverters  s   zBaseTable.getConvertersc                 C   r   r!   )convertersByNamer   r   r   r   getConverterByName  r%   zBaseTable.getConverterByNameNc              	   C   s   |   D ]d}|jrIt| |jst| |jg  tt| |j|j }z| |j}t| |j| W q t	yH   |rF|j|v rF||j 
| Y qw |jrUt|jd | jsUqt| |jr\qt|drht| |jd  qd S )NwriteNullOffset)rO  rI  rY   r\   setattrr   r1   rJ  rQ  KeyErrorr6  evalr@  )r   
propagatorrM  rN  
count_convr   r   r   r[     s*   
zBaseTable.populateDefaultsc                 C   s  |  | i }|| _|  D ]}|jdkr||j|d }|jdkr,||j|d }|jdkr8||d }|jdkrF||j|d }zQ|jrut|jtrT|j}n|j|v r_||j }n||j }||j	7 }|
||||||j< n!|j	rt|j	d |sW q||||||j< |jr||j ||j< W q ty } z|j}|j|f |_ d }~ww t| d	r| || | `d S | j| | `d S )
Nr/  
LookupTyper0  ExtensionLookupTypeFeatureParams
FeatureTag	SubStruct	MorphTypepostRead)
readFormat_BaseTable__rawTablerO  r\   getConverterr.   rI  
isinstanceintrJ  r   rU  readisPropagated	ExceptionargsrY   r^  r@  update)r   r6   r5   r2   rM  rN  rR   r\   r   r   r   r3   ,  sX   








zBaseTable.decompilec                 C   s  |    t| drt| d }| |}|ot| d}nd}| j }|  D ]}|jr?|jr?||j	}t
|tr?|||j	< q't| drHd|_t| drPd|_t| jdr_|d | jj | | |  D ] }||j	}|jr|d u rzg }t||j }t
|jtrt||jksJ d	|jt|f n|j|v rt||j|d
 n||j | z
||||| W qh ty } z|j|j	d f |_ d }~ww |jrt
|tr|}	|j|	_||	 |	 ||j	< n|||j	|j}	d ||j	< |jr|	||j	< qh|jr'|j	|vrd ||j	< |||j	|j||j	 }	|	|d< qh|jr4t|jd |s4qhz
| |||| W n! ty_ } z|d urP|jj!n|j	}
|j|
f |_ d }~ww |jri|||j	< qh|rq| `"d S d S )NpreWriteFormatFr   r   r   TrX  zexpected %d values, got %dr"   z[])#r`   rY   ri  r@  ro   rO  isCountre  rA  r\   rb  r&  r   r   rl   r6  rX  writeFormatrI  r   rJ  rc  r  rf  rg  rw   r   r+  r8  r(  isLookupTyperU  writer   rj  )r   rQ   r5   deleteFormatr2   rM  r#   rN  rR   r'  r\   r   r   r   rD   Y  s   







&








zBaseTable.compilec                 C      d S r!   r   r   r6   r   r   r   r_       zBaseTable.readFormatc                 C   rp  r!   r   r   rQ   r   r   r   rl    rr  zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d u rg }t| dr|d| jfg }||| |  | || || |  d S )Nrj  )rl   r   rY   rj  begintagnewlinerV   endtag)r   	xmlWriterr5   r]   r\   	tableNamer   r   r   rW     s   

zBaseTable.toXMLc              
   C   s   |   D ]E}|jr+t| |jg }tt|D ]}|| }|||||jd|fg qq|jr8t|jd t	| s8qt| |jd }|||||jg  qd S )Nindex)
rO  rI  r1   r\   r   r   xmlWriterJ  rU  vars)r   rw  r5   rM  r#   rb   r   r   r   r   rV     s   zBaseTable.toXML2c                 C   s|   z|  |}W n ty    w ||||}|jr5t| |jd }|d u r.g }t| |j| || d S t| |j| d S r!   )rQ  rT  xmlReadrI  r1   r\   rS  r   )r   r\   r]   r^   r5   rM  r#   seqr   r   r   rZ     s   zBaseTable.fromXMLc                 C   r   r!   r   r   r   r   r   r     r   zBaseTable.__ne__c                 C   s0   t | t |kr
tS |   |  | j|jkS r!   )rJ   r   r`   r@  rm   r   r   r   r     s
   zBaseTable.__eq__c                   @   s2   e Zd ZU dZeed< ded< dZee ed< dS )zBaseTable.SubTableEntryzSee BaseTable.iterSubTables()r\   r>  r#   Nry  )	r   r   r   ra   r   __annotations__ry  r	   rc  r   r   r   r   SubTableEntry  s
   
 r  returnc                 #   sr      D ]1}|j t d}|du rqt|tr" |V  qt|tr6 fddt|D E dH  qdS )a  Yield (name, value, index) namedtuples for all subtables of current table.

		A sub-table is an instance of BaseTable (or subclass thereof) that is a child
		of self, the current parent table.
		The tuples also contain the attribute name (str) of the of parent table to get
		a subtable, and optionally, for lists of subtables (i.e. attributes associated
		with a converter that has a 'repeat'), an index into the list containing the
		given subtable value.
		This method can be useful to traverse trees of otTables.
		Nc                 3   s.    | ]\}}t |trj ||d V  qdS ))ry  N)rb  r>  r  )r   rb   r:  r\   r   r   r   	<genexpr>  s    
z*BaseTable.iterSubTables.<locals>.<genexpr>)rO  r\   r1   rb  r>  r  r   r   )r   rM  r#   r   r  r   rE    s   

zBaseTable.iterSubTables)Fr!   r;  )r   r   r   ra   rD  r`   classmethodrH  rO  rQ  r[   r3   rD   r_  rl  rW   rV   rZ   r   r   r   r  r   rE  r   r   r   r   r>    s(    


-^
	r>  c                   @   sF   e Zd ZdZedd Zdd Zdd Zdd	 Zd
d Z	dddZ
dS )FormatSwitchingBaseTablezsMinor specialization of BaseTable, for tables that have multiple
	formats, eg. CoverageFormat1 vs. CoverageFormat2.c                 C   s   t S r!   )r   )rK  r6   r   r   r   rH    s   z&FormatSwitchingBaseTable.getRecordSizec                 C   s2   z| j }W n ty   g  Y S w | j| j g S r!   )rj  rB  rG  rA  )r   fmtr   r   r   rO    s   
z&FormatSwitchingBaseTable.getConvertersc                 C   s   | j | j | S r!   )rP  rj  r   r   r   r   rQ  +  r   z+FormatSwitchingBaseTable.getConverterByNamec                 C      |  | _d S r!   )r   rj  rq  r   r   r   r_  .  r   z#FormatSwitchingBaseTable.readFormatc                 C      | | j d S r!   )r  rj  rs  r   r   r   rl  1  r   z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t | |||| d S r!   )r>  rW   )r   rw  r5   r]   r\   r   r   r   rW   4  r   zFormatSwitchingBaseTable.toXMLr;  )r   r   r   ra   r  rH  rO  rQ  r_  rl  rW   r   r   r   r   r    s    
r  c                   @   r
   )UInt8FormatSwitchingBaseTablec                 C   r  r!   )r   rj  rq  r   r   r   r_  9  r   z(UInt8FormatSwitchingBaseTable.readFormatc                 C   r  r!   )r  rj  rs  r   r   r   rl  <  r   z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r   r   r_  rl  r   r   r   r   r  8  r)   r  )uint16uint8c                 C   s(   zt |  W S  ty   td| w )NzUnsupported format type: )formatSwitchingBaseTablesrT  	TypeError)
formatTyper   r   r    getFormatSwitchingBaseTableClassE  s
   
r  ))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                  C   s(   i } t D ]\}}}}|||f| |< q| S r!   )valueRecordFormat)dmaskr\   isDevicesignedr   r   r   
_buildDicti  s   r  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )ValueRecordFactoryz6Given a format code, this object convert ValueRecords.c                 C   s8   g }t D ]\}}}}||@ r||||f q|| _d S r!   )r  r   r)  )r   valueFormatr)  r  r\   r  r  r   r   r   r   v  s   
zValueRecordFactory.__init__c                 C   r&   r!   )r   r)  r   r   r   r   __len__}  r%   zValueRecordFactory.__len__c                 C   s   | j }|sd S t }|D ]4\}}}|r| }n| }|r:|r8ddlm}	 ||}
t|	| }||
| nd }t	||| q|S Nr   r+   )
r)  ValueRecordr   r   r/   r,   rp   r1   r3   rS  )r   r6   r5   r)  valueRecordr\   r  r  r#   r,   	subReaderr   r   r   readValueRecord  s"   

z"ValueRecordFactory.readValueRecordc           	      C   sp   | j D ]2\}}}t||d}|r(|r"| }|| ||| q|d q|r0|| q|| qd S Nr   )r)  r1   r   r%  rD   r  r  )	r   rQ   r5   r  r\   r  r  r#   r$  r   r   r   writeValueRecord  s   
z#ValueRecordFactory.writeValueRecordN)r   r   r   ra   r   r  r  r  r   r   r   r   r  r  s    r  c                   @   sH   e Zd ZdddZdd Zdd Zddd	Zd
d Zdd Zdd Z	dS )r  Nc           	      C   s   |d ur9t D ]\}}}}||@ rt| ||rd nd q|d ur5|j D ]\}}t| |s.q$t| || q$d S d S |d urE|j | _d S d S r  )r  rS  r@  r   rY   ro   )	r   r  srcr  r\   r  r  keyvalr   r   r   r     s   
zValueRecord.__init__c                 C   s(   d}| j  D ]
}|t| d B }q|S r  )r@  keysvalueRecordFormatDict)r   r)  r\   r   r   r   	getFormat  s   zValueRecord.getFormatc                 C   s0   d}| j  D ]\}}|r|t| d B }q|S r  )r@  r   r  )r   r)  r\   r#   r   r   r   getEffectiveFormat  s   zValueRecord.getEffectiveFormatc                 C   s  |d u rg }nt |}td d D ]\}}}}	t| |r&||t| |f qg }
tdd D ]\}}}}	t| |rJt| |}|d urJ|
||f q/|
ru||| |  |
D ]\}}|d uri|j|||d qY|| |  d S |	|| |  d S )Nr   r  )r\   )
r   r  rY   r   r1   rt  ru  rW   rv  	simpletag)r   rw  r5   	valueNamer]   simpleItemsr  r\   r  r)  deviceItemsdevicedeviceRecordr   r   r   rW     s2   



zValueRecord.toXMLc                 C   s   ddl m} | D ]\}}t| |t| q
|D ]1}t|ts!q|\}}}t|| }	|D ]}
t|
ts6q.|
\}}}|	|||| q.t| ||	 qd S r  )	r/   r,   r   rS  rc  rb  r   r1   rZ   )r   r\   r]   r^   r5   r,   kr:  elementr#   elem2name2attrs2content2r   r   r   rZ     s   



zValueRecord.fromXMLc                 C   r   r!   r   r   r   r   r   r     r   zValueRecord.__ne__c                 C   s    t | t |kr
tS | j|jkS r!   )rJ   r   r@  rm   r   r   r   r     s   zValueRecord.__eq__r;  r!   )
r   r   r   r   r  r  rW   rZ   r   r   r   r   r   r   r    s    

r  )/fontTools.configr   fontTools.misc.textToolsr   r   r   r}   r|   rt   loggingtypingr   r   r	   	getLoggerr   r?   rA   	uharfbuzzrH   rB   r>   objectr   rf  r   r*   r   r   itemsizer0   rC   r&  r9  r   r   r   r>  r  r  r  r  r  r  r  r  r  r   r   r   r   <module>   s^    
 l   '  3"	3