o
    ooi                  	   @   s*  d dl mZ d dlmZmZ ddl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 d dlmZmZmZmZ eeZd	Zzd dlZd
ZW n	 eyT   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G dd deZ e!e
"dd dksJ e		dj#dksJ dG dd deZ$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/ Z0e d<d0e,d1ee1 d2ee2 fd3d4Z3g d5Z4d6d7 Z5e5 Z6G d8d9 d9eZ7G d:d; d;eZ8dS )=    )OPTIONS)Tag	bytesjoin   )DefaultTable)IntEnumN)	lru_cache)Iterator
NamedTupleOptionalTupleFTz: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   Q/home/ubuntu/.local/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   2      
zOTLOffsetOverflowError.__init__c                 C   
   t | jS r$   )reprr&   r   r   r   r   __str__5   r(   zOTLOffsetOverflowError.__str__N)r   r    r!   r   r+   r   r   r   r   r"   1       r"   c                   @   s   e Zd ZdZdZdZdS )RepackerStater   r   r   N)r   r    r!   PURE_FTHB_FTFT_FALLBACKr   r   r   r   r-   9   s    
r-   c                   @   sR   e Zd Z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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) r3   OTTableReaderr5   getattrtable	decompile)r   datafontr3   reader
tableClassr   r   r   r:   T   s
   zBaseTTXConverter.decompilec           
   
   C   sj  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v r>tr>| jdv r>tj}ntj	}d}d}	 z8t
| jd	}| j|| |tjkr`| ||W S |tj	krk| |W S |tjkr}| | td
 tj}W n5 ty } z)d}| |||}	|j}|	rW Y d}~qE|tju rtd tj}n W Y d}~nd}~ww qF)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 serializer)NTr4   zXRe-enabling sharing between extensions and switching back to harfbuzz+fontTools packing.zrHarfbuzz packing out of resolutions, disabling sharing between extensions and switching to fontTools only packing.)cfgUSE_HARFBUZZ_REPACKERr5   logdebughave_uharfbuzzImportErrorr-   r/   r.   OTTableWriterr9   compiletryPackingHarfbuzztryPackingFontToolsr0   r"   tryResolveOverflowr&   )
r   r<   overflowRecorduse_hb_repackstatehb_first_error_loggedlastOverflowRecordwritereokr   r   r   rH   ]   sn   







zBaseTTXConverter.compilec              
   C   s   zt d| j || jW S  tttjfyI } z+|s9t|j	 }t
|dkr/|d| 7 }t d| j| d}|jddW  Y d }~S d }~ww )Nzserializing '%s' with hb.repackr6   z: z`hb.repack failed to serialize '%s', attempting fonttools resolutions ; the error message was: %sTF)remove_duplicate)rC   rD   r5   getAllDataUsingHarfbuzz
ValueErrorMemoryErrorhbRepackerErrortyper   r   warning
getAllData)r   rQ   rO   rR   	error_msgr   r   r   rI      s"   z#BaseTTXConverter.tryPackingHarfbuzzc                 C   s   |  S r$   )r\   r   rQ   r   r   r   rJ      s   z$BaseTTXConverter.tryPackingFontToolsc                 C   sz   d}||j kr	|S |j }td| |jd u r#ddlm} |||}nddlm} |||}|r2|S ddlm} |||S )Nr   z+Attempting to fix OTLOffsetOverflowError %sr   )fixLookupOverFlows)fixSubTableOverFlows)r&   rC   infor   r3   r_   r`   )r   r<   rR   rP   rS   rL   r_   r`   r   r   r   rK      s   



z#BaseTTXConverter.tryResolveOverflowc                 C   s   | j || d S r$   )r9   toXML2)r   rQ   r<   r   r   r   toXML      zBaseTTXConverter.toXMLc                 C   sJ   ddl m} t| dst|| j}| | _| j|||| | j  d S )Nr   r2   r9   )r6   r3   hasattrr8   r5   r9   fromXMLpopulateDefaults)r   nameattrscontentr<   r3   r>   r   r   r   rf      s   
zBaseTTXConverter.fromXMLTc                 C   s   | j j|d d S )N)recurse)r9   ensureDecompiled)r   rk   r   r   r   rl      rd   z!BaseTTXConverter.ensureDecompiledNT)r   r    r!   __doc__r:   rH   rI   rJ   rK   rc   rf   rl   r   r   r   r   r1   N   s    	[	r1   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 ):r7   z5Helper class to retrieve data from an OpenType table.r;   offsetpos
localStater5   Nr   c                 C   s"   || _ || _|| _|| _|| _d S r$   rp   )r   r;   rs   rq   r5   r   r   r   r     s
   
zOTTableReader.__init__c                 C   s   |  j |7  _ d S r$   rr   r   countr   r   r   advance  rd   zOTTableReader.advancec                 C   r#   r$   rt   )r   rr   r   r   r   seek  r(   zOTTableReader.seekc                 C   s$   |  | j| j| j| j}| j|_|S r$   )	__class__r;   rs   rq   r5   rr   r   otherr   r   r   copy  s   zOTTableReader.copyc                 C   s    | j | }| | j| j|| jS r$   )rq   ry   r;   rs   r5   )r   rq   r   r   r   getSubReader  s   
zOTTableReader.getSubReaderc                 C   s6   | j }|| }td| | j|| \}|| _ |S N>rr   structunpackr;   )r   typecode
staticSizerr   newposr&   r   r   r   	readValue  s
   zOTTableReader.readValuec                 C   sH   | j }|||  }t|| j|| }tjdkr|  || _ | S Nbig)rr   arrayr;   sys	byteorderbyteswaptolist)r   r   r   rv   rr   r   r&   r   r   r   	readArray$  s   
zOTTableReader.readArrayc                 C      | j dddS )Nbr   r   r   r   r   r   r   readInt8-     zOTTableReader.readInt8c                 C      | j dd|dS )Nr   r   r   rv   r   ru   r   r   r   readInt8Array0     zOTTableReader.readInt8Arrayc                 C   r   )Nhr   r   r   r   r   r   r   	readShort3  r   zOTTableReader.readShortc                 C   r   )Nr   r   r   r   ru   r   r   r   readShortArray6  r   zOTTableReader.readShortArrayc                 C   r   )Nro   r   r   r   r   r   r   r   readLong9  r   zOTTableReader.readLongc                 C   r   )Nro   r   r   r   ru   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   ru   r   r   r   readUInt8ArrayB  r   zOTTableReader.readUInt8Arrayc                 C   r   )NHr   r   r   r   r   r   r   
readUShortE  r   zOTTableReader.readUShortc                 C   r   )Nr   r   r   r   ru   r   r   r   readUShortArrayH  r   zOTTableReader.readUShortArrayc                 C   r   )NIr   r   r   r   r   r   r   	readULongK  r   zOTTableReader.readULongc                 C   r   )Nr   r   r   r   ru   r   r   r   readULongArrayN  r   zOTTableReader.readULongArrayc                 C   s4   | j }|d }tdd| j||  \}|| _ |S )Nr   z>l    r   r   rr   r   r&   r   r   r   
readUInt24Q  s
   zOTTableReader.readUInt24c                    s    fddt |D S )Nc                    s   g | ]}   qS r   )r   ).0_r   r   r   
<listcomp>Y  s    z1OTTableReader.readUInt24Array.<locals>.<listcomp>)rangeru   r   r   r   readUInt24ArrayX     zOTTableReader.readUInt24Arrayc                 C   s>   | j }|d }t| j|| }t|dksJ ||| _ |S Nr   )rr   r   r;   lenr   r   r   r   readTag[  s   zOTTableReader.readTagc                 C   s&   | j }|| }| j|| }|| _ |S r$   )rr   r;   )r   rv   rr   r   r&   r   r   r   readDatac  s
   zOTTableReader.readDatac                 C   (   | j r| j  nt }|||< || _ d S r$   rs   r|   dictr   rh   r&   rN   r   r   r   __setitem__j     
zOTTableReader.__setitem__c                 C   s   | j o| j | S r$   rs   r   rh   r   r   r   __getitem__o  r   zOTTableReader.__getitem__c                 C   s   | j o|| j v S r$   r   r   r   r   r   __contains__r  r   zOTTableReader.__contains__)Nr   N)r   r    r!   rn   	__slots__r   rw   rx   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   r7     s:    
	r7   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )OffsetToWriterc                 C   s   || _ || _d S r$   )	subWriter
offsetSizer   r   r   r   r   r   r   w  s   
zOffsetToWriter.__init__c                 C   s,   t | t |kr
tS | j|jko| j|jkS r$   )rZ   NotImplementedr   r   rz   r   r   r   __eq__{  s   zOffsetToWriter.__eq__c                 C   s   t | j| jfS r$   )hashr   r   r   r   r   r   __hash__  s   zOffsetToWriter.__hash__N)r   r    r!   r   r   r   r   r   r   r   r   v  s    r   c                   @   sH  e Zd ZdZdRd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dSddZdd Zdd Zdd ZdTd!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d9d: Zd;d< Zd=d> Z d?d@ Z!dAdB Z"dCdD Z#dEdF Z$dGdH Z%dUdJdKZ&dLdM Z'dNdO Z(dPdQ Z)dS )VrG   z=Helper class to gather and assemble data for OpenType tables.Nc                 C   s(   g | _ d | _|| _|| _d | _d| _d S )N<none>)itemsrr   rs   r5   parentrh   )r   rs   r5   r   r   r   r     s   
zOTTableWriter.__init__c                 C   r   r$   r   r   r   r   r   r     r   zOTTableWriter.__setitem__c                 C   
   | j | S r$   r   r   r   r   r   r     r(   zOTTableWriter.__getitem__c                 C   s   | j |= d S r$   r   r   r   r   r   __delitem__     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   getCountDatar   )r   re   sizer   r   )r   litemr   r   r   getDataLength  s   


zOTTableWriter.getDataLengthc              	   C   s   t | j}| j}t|}t|D ]T}|| }t|drd|jdkr+t|jj| ||< q|jdkrOzt	|jj| ||< W q t
jyN   | |j}t|w |jdkr_t|jj| ||< qt|jqt|S )z;Assemble the data for this writer/table, without subtables.r   r   r   r   )listr   rr   r   r   re   r   	packULongr   
packUShortr   errorgetOverflowErrorRecordr"   
packUInt24rV   r   )r   r   rr   numItemsro   r   r'   r   r   r   getData  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   	enumeratere   r   rV   r   )r   r   	packFuncsro   r   r   r   r   getDataForHarfbuzz  s   



z OTTableWriter.getDataForHarfbuzzc                 C   r)   r$   )r   r   r   r   r   r   r     s   
zOTTableWriter.__hash__c                 C      |  |}|tu r|S | S r$   r   r   r   r{   resultr   r   r   __ne__     
zOTTableWriter.__ne__c                 C       t | t |kr
tS | j|jkS r$   )rZ   r   r   rz   r   r   r   r        zOTTableWriter.__eq__Fc                 C   s   t | d}t | d}|r|si }| j}t|D ]*\}}t |dr'| ||< qt |drA|jj||d |sA||j|j|| _qt|| _d S )N	Extension	DontSharer   r   shareExtension)re   r   r   r   r   _doneWriting
setdefaulttuple)r   internedTablesr   isExtension	dontSharer   ro   r   r   r   r   r     s$   



	
zOTTableWriter._doneWritingc                 C   s8  d|t | < t| j}tt|}|  t| d}|}|r.|d us&J d|d i }}}d}t| drdt|D ]}	| j|	 }
t|
drRt|
jdd dkrRd} nq9t |
j|vrc|
j	||| n	 |D ].}	| j|	 }
t|
dssqf|r|	d	krt|
jdd dkrqft |
j|vr|
j	||| qf	 qf|
|  d S )
NTr   zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFsortCoverageLastr   rh   Coverager   )idr   r   r   r   reversere   r8   r   _gatherTablesappend)r   tables	extTablesdoner   iRanger   
selfTablesr   ro   r   r   r   r   r     sJ   	






zOTTableWriter._gatherTablesc                 C   s  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 ]I\}}t|drd|}nt|dro||j7 }qX|t| }qXt|j	|vr|j	||||| }}n|t|j	 }||j
|f}| | ||j
7 }qX| |  | ||f |d	7 }||t| < |
r|  |S )
Nr   Fr   rh   r   Tr   r   r   )r   re   r   r   r8   r   _gatherGraphForHarfbuzzr   r   r   r   pop)r   r   obj_listr   objidxvirtual_edges
real_linksvirtual_linksitem_idxidxr   coverage_idxro   r   	child_idx
offset_posrr   	real_edger   r   r   r   G  sX   










z%OTTableWriter._gatherGraphForHarfbuzzc                 C   s   i }| j |dd g }g }i }d}g }| ||||| d}|D ]}	||	_||	  }q g }
|D ]}	|	 }|
| q0t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
        Tr   r   )	r   r   rr   r   r   r   rX   serialize_with_tagr   )r   r5   r   r   r   r   r   r   rr   r9   r;   	tableDatar   r   r   rU     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   rr   r   r   r   r   )
r   rT   r   r   r   r   rr   r9   r;   r	  r   r   r   r\     s0   
zOTTableWriter.getAllDatac                 C   s   |  | j| j}| |_|S r$   )ry   rs   r5   r   )r   	subwriterr   r   r   getSubWriter  s   zOTTableWriter.getSubWriterc                 C   s   | j td| | d S r~   r   r   r   pack)r   r   r&   r   r   r   
writeValue  s   zOTTableWriter.writeValuec                 C   s2   t  ||}tjdkr|  | j|  d S r   )r   r   r   r   r   r   tobytes)r   r   valuesar   r   r   
writeArray  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   r   	writeInt8     $zOTTableWriter.writeInt8c                 C      |  d| d S )Nr   r  r   r  r   r   r   writeInt8Array  r   zOTTableWriter.writeInt8Arrayc                 C   r  )Ni    z>hr  r  r   r   r   
writeShort  r  zOTTableWriter.writeShortc                 C   r  )Nr   r  r  r   r   r   writeShortArray  r   zOTTableWriter.writeShortArrayc                 C      | j td| d S )Nz>ir  r  r   r   r   	writeLong     zOTTableWriter.writeLongc                 C   r  )Nro   r  r  r   r   r   writeLongArray  r   zOTTableWriter.writeLongArrayc                 C   r  )Nr      >Br  r  r   r   r   
writeUInt8  r  zOTTableWriter.writeUInt8c                 C   r  )Nr   r  r  r   r   r   writeUInt8Array  r   zOTTableWriter.writeUInt8Arrayc                 C   r  )Nr   i   >Hr  r  r   r   r   writeUShort  r  zOTTableWriter.writeUShortc                 C   r  )Nr   r  r  r   r   r   writeUShortArray  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   r   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   s   | j t|| d S r$   )r   r   r   r   r   r   r   writeSubTable
  r   zOTTableWriter.writeSubTabler   c                 C   s    t ||||d}| j| |S )N)r   r&   )CountReferencer   r   )r   r9   rh   r   r&   refr   r   r   writeCountReference  s   z!OTTableWriter.writeCountReferencec                 C   s    t j|f|  }| j| d S r$   r.  )r   formatr  r;   r   r   r   writeStruct  s   zOTTableWriter.writeStructc                 C   s   | j | d S r$   )r   r   )r   r;   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Lookuprh   r   repeatIndexSubTableExtSubTable.)r>  r=  )rh   r<  r8   re   r   joinr   r5   )r   r   r   r   r   r   p1r   r   r   r     s<   









z$OTTableWriter.getOverflowErrorRecordNNFrm   )r   N)*r   r    r!   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   rU   r\   r  r  r  r  r  r  r  r   r"  r%  r&  r(  r)  r+  r,  r/  r0  r2  r3  r6  r8  r9  r   r   r   r   r   rG     sP    

'@9
#

rG   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )r4  z8A reference to a Count value, not a count of references.Nc                 C   s,   || _ || _|| _|d ur| | d S d S r$   )r9   rh   r   setValue)r   r9   rh   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$   r9   rh   )r   r&   r9   rh   r   r   r   rD  G  s
   "zCountReference.setValuec                 C   s   | j | j S r$   rE  r   r   r   r   getValueO  r   zCountReference.getValuec                 C   s.   | j | j }|d u rd}tttd| j |S )Nr   )r   r   r   )r9   rh   	packUInt8r   r   r   )r   vr   r   r   r   R  s   zCountReference.getCountDatarB  )r   r    r!   rn   r   rD  rF  r   r   r   r   r   r4  =  s    
r4  c                 C      t d| S )Nr$  r   r  r%   r   r   r   rG  Y  r   rG  c                 C   rI  )Nr'  rJ  r%   r   r   r   r   ]  r   r   c                 C   s0   d|   krdk sJ |  J | t d| S )Nr   l        r*  rJ  r%   r   r   r   r   a  s   $r   c                 C   s8   d|   krdk sJ |  J | t d| dd  S )Nr   r-  r*  r   rJ  r%   r   r   r   r   f  s   $r   c                   @   s   e Zd ZdZdd Zd+ddZ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)d* ZdS ).	BaseTablez0Generic base class for all OpenType (sub)tables.c                 C   s<   | j d}|r| `| j}| `| || t| |S t|Nr=   )__dict__getr=   r<   r:   r8   AttributeError)r   attrr=   r<   r   r   r   __getattr__n  s   
zBaseTable.__getattr__Fc                 C   sP   | j d}|r| `| j}| `| || |r$|  D ]
}|j| qd S d S rL  )rM  rN  r=   r<   r:   iterSubTablesr&   rl   )r   rk   r=   r<   subtabler   r   r   rl   y  s   zBaseTable.ensureDecompiledc                 C   s0   d| j v r| j  }| j d  |d< |S | j S rL  )rM  r|   )r   rN   r   r   r   __getstate__  s
   

zBaseTable.__getstate__c                 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)clsr=   	totalSizeconvr   
countValuer   r   r   rV    s   


zBaseTable.getRecordSizec                 C   s   | j S r$   )rU  r   r   r   r   getConverters  s   zBaseTable.getConvertersc                 C   r   r$   )convertersByNamer   r   r   r   getConverterByName  r(   zBaseTable.getConverterByNameNc              	   C   s   |   D ]q}|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  t|drut| |j|j qd S )NwriteNullOffsetDEFAULT)r]  rW  re   rh   setattrr   r8   rX  r_  KeyErrorrD  evalrM  ra  )r   
propagatorr[  r\  
count_convr   r   r   rg     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=  
LookupTyper>  ExtensionLookupTypeFeatureParams
FeatureTag	SubStruct	MorphTypepostRead)
readFormat_BaseTable__rawTabler]  rh   getConverterr5   rW  
isinstanceintrX  r   rd  readisPropagated	Exceptionargsre   rm  rM  update)r   r=   r<   r9   r[  r\  rR   rh   r   r   r   r:     sL   








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   Trg  zexpected %d values, got %dr%   z[])#rl   re   rx  rM  r|   r]  isCountrt  rN  rh   rq  r4  r   r   ry   rD  rg  writeFormatrW  r   rX  rr  r  ru  rv  r   r   r9  rF  r6  isLookupTyperd  writer   ry  )r   rQ   r<   deleteFormatr9   r[  r&   r\  rR   r5  rh   r   r   r   rH     s   

















zBaseTable.compilec                 C      d S r$   r   r   r=   r   r   r   rn  M     zBaseTable.readFormatc                 C   r  r$   r   r^   r   r   r   r{  P  r  zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d u rg }t| dr|d| jfg }||| |  | || || |  d S )Nry  )ry   r   re   ry  begintagnewlinerb   endtag)r   	xmlWriterr<   ri   rh   	tableNamer   r   r   rc   S  s   

zBaseTable.toXMLc              
   C   s   |   D ]A}|jr't| |jg }t|D ]\}}|||||jd|fg qq|jr4t|jd t| s4qt| |jd }|||||jg  qd S )Nindex)	r]  rW  r8   rh   r   xmlWriterX  rd  vars)r   r  r<   r[  r&   ro   r   r   r   r   rb   _  s   zBaseTable.toXML2c                 C   s   z|  |}W n ty    w ||||}|jd ur7t| |jd }|d u r0g }t| |j| || d S t| |j| d S r$   )r_  rc  xmlReadrW  r8   rh   rb  r   )r   rh   ri   rj   r<   r[  r&   seqr   r   r   rf   p  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$   )rZ   r   rl   rM  rz   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()rh   rK  r&   Nr  )	r   r    r!   rn   r   __annotations__r  r   rr  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 )a7  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 ))r  N)rq  rK  r  )r   ro   rH  rh   r   r   r   	<genexpr>  s    
z*BaseTable.iterSubTables.<locals>.<genexpr>)r]  rh   r8   rq  rK  r  r   r   )r   r[  r&   r   r  r   rR    s   

zBaseTable.iterSubTablesc                 C   r)   r$   )getVariableAttrsry   r   r   r   r   r    r(   zBaseTable.getVariableAttrsrC  r$   rB  )r   r    r!   rn   rQ  rl   rT  classmethodrV  r]  r_  rg   r:   rH   rn  r{  rc   rb   rf   r   r   r
   r  r	   rR  r  r   r   r   r   rK  k  s,    
	

*e
	rK  c                   @   sN   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d ZdS )FormatSwitchingBaseTablezvMinor specialization of BaseTable, for tables that have multiple
    formats, eg. CoverageFormat1 vs. CoverageFormat2.c                 C   s   t S r$   )r   )rY  r=   r   r   r   rV    s   z&FormatSwitchingBaseTable.getRecordSizec                 C   s2   z| j }W n ty   g  Y S w | j| j g S r$   )ry  rO  rU  rN  )r   fmtr   r   r   r]    s   
z&FormatSwitchingBaseTable.getConvertersc                 C   s   | j | j | S r$   )r^  ry  r   r   r   r   r_    r   z+FormatSwitchingBaseTable.getConverterByNamec                 C      |  | _d S r$   )r   ry  r  r   r   r   rn    r   z#FormatSwitchingBaseTable.readFormatc                 C      | | j d S r$   )r(  ry  r^   r   r   r   r{    r   z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t | |||| d S r$   )rK  rc   )r   r  r<   ri   rh   r   r   r   rc     r   zFormatSwitchingBaseTable.toXMLc                 C   s   t | j| jS r$   )r  ry   ry  r   r   r   r   r    r   z)FormatSwitchingBaseTable.getVariableAttrsrB  )r   r    r!   rn   r  rV  r]  r_  rn  r{  rc   r  r   r   r   r   r    s    

r  c                   @   r   )UInt8FormatSwitchingBaseTablec                 C   r  r$   )r   ry  r  r   r   r   rn    r   z(UInt8FormatSwitchingBaseTable.readFormatc                 C   r  r$   )r%  ry  r^   r   r   r   r{    r   z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r    r!   rn  r{  r   r   r   r   r    r,   r  )uint16uint8c                 C   s(   zt |  W S  ty   td| w )NzUnsupported format type: )formatSwitchingBaseTablesrc  	TypeError)
formatTyper   r   r    getFormatSwitchingBaseTableClass  s
   
r  rY  r  r  c                 C   s   t | ts	t| t | tr |du rtd| j | j| }n| j}d|vr)dS i }| D ]\}}| }|dur?|||< q/tt	||j
dS )zReturn sequence of variable table field names (can be empty).

    Attributes are deemed "variable" when their otData.py's description contain
    'VarIndexBase + {offset}', e.g. COLRv1 PaintVar* tables.
    Nz''fmt' is required for format-switching VarIndexBaser   )key)
issubclassrK  r  r  r   r^  r   getVarIndexOffsetr   sortedr   )rY  r  rU  varAttrsrh   r[  rq   r   r   r   r    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maskrh   isDevicesignedr   r   r   
_buildDict&  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   r7  )r   valueFormatr7  r  rh   r  r  r   r   r   r   3  s   
zValueRecordFactory.__init__c                 C   r)   r$   )r   r7  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   r2   )
r7  ValueRecordr   r   r6   r3   r}   r8   r:   rb  )r   r=   r<   r7  valueRecordrh   r  r  r&   r3   	subReaderr   r   r   readValueRecord=  s"   

z"ValueRecordFactory.readValueRecordc           	      C   st   | j D ]4\}}}t||d}|r*|r$| }|j|dd ||| q|d q|r2|| q|| qd S )Nr   r   )r   )r7  r8   r  r3  rH   r(  r  )	r   rQ   r<   r  rh   r  r  r&   r   r   r   r   writeValueRecordS  s   z#ValueRecordFactory.writeValueRecordN)r   r    r!   rn   r   r  r  r  r   r   r   r   r  0  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 Nr   )r  rb  rM  r   re   r|   )	r   r  srcr  rh   r  r  r  valr   r   r   r   f  s   
zValueRecord.__init__c                 C   s(   d}| j  D ]
}|t| d B }q|S r  )rM  keysvalueRecordFormatDict)r   r7  rh   r   r   r   	getFormats  s   zValueRecord.getFormatc                 C   s0   d}| j  D ]\}}|r|t| d B }q|S r  )rM  r   r  )r   r7  rh   r&   r   r   r   getEffectiveFormaty  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  )rh   )
r   r  re   r   r8   r  r  rc   r  	simpletag)r   r  r<   	valueNameri   simpleItemsr  rh   r  r7  deviceItemsdevicedeviceRecordr   r   r   rc     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  )	r6   r3   r   rb  rr  rq  r   r8   rf   )r   rh   ri   rj   r<   r3   krH  elementr&   elem2name2attrs2content2r   r   r   rf     s   



zValueRecord.fromXMLc                 C   r   r$   r   r   r   r   r   r     r   zValueRecord.__ne__c                 C   r   r$   )rZ   r   rM  rz   r   r   r   r     r   zValueRecord.__eq__rB  r$   )
r   r    r!   r   r  r  rc   rf   r   r   r   r   r   r   r  c  s    

r  r$   )9fontTools.configr   fontTools.misc.textToolsr   r   r   enumr   r   r   r   logging	functoolsr   typingr	   r
   r   r   	getLoggerr   rC   rE   	uharfbuzzrX   rF   rB   objectr   ru  r"   r-   r1   r   r  itemsizer7   r   rG   r4  rG  r   r   r   rK  r  r  r  r  rr  r   r  r  r  r  r  r  r   r   r   r   <module>   sj    
 1t   ;  K$	"!3