a
    w=ic                     @   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eeed
dZW n ey   Y n0 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sJ e		dj%dks8J 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+Z0d,d- Z1e d8e-ee2 ee3 d.d/d0Z4g d1Z5d2d3 Z6e6 Z7G d4d5 d5eZ8G d6d7 d7eZ9dS )9    )OPTIONS)Tag	bytesjoin   )DefaultTable)IntEnumN)	lru_cache)Iterator
NamedTupleOptionalTupleFrepackz:USE_HARFBUZZ_REPACKERc                   @   s   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)selfZoverflowTuple r   n/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/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                   @   s   e Zd Zdd Zdd ZdS )OTLOffsetOverflowErrorc                 C   s
   || _ d S Nvalue)r   overflowErrorRecordr   r   r   r   &   s    zOTLOffsetOverflowError.__init__c                 C   s
   t | jS r"   )reprr$   r   r   r   r   __str__)   s    zOTLOffsetOverflowError.__str__N)r   r   r    r   r'   r   r   r   r   r!   %   s   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(   ,   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) r.   OTTableReaderr0   getattrtable	decompile)r   datafontr.   reader
tableClassr   r   r   r5   G   s
    zBaseTTXConverter.decompilec           
   
   C   st  d}|j t }| jdv r`|du r0td| j n0ts`|du rFtdn|du sRJ td| j |dv r~tr~| jdv r~tj}ntj	}d}d}zpt
| jd	}| j|| |tjkr| ||W S |tj	kr| |W S |tjkr| | td
 tj}W q tyl } zVd}| |||}	|j}|	r8W Y d}~q|tju rVtd tj}n W Y d}~qd}~0 0 qdS )z=Compiles the table into binary. Called automatically on save.N)ZGSUBZGPOSFz>hb.repack disabled, compiling '%s' with pure-python serializerTzNo module named 'uharfbuzz'z?uharfbuzz not found, compiling '%s' with pure-python serializer)NTr/   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_REPACKERr0   logdebughave_uharfbuzzImportErrorr(   r*   r)   OTTableWriterr4   compiletryPackingHarfbuzztryPackingFontToolsr+   r!   tryResolveOverflowr$   )
r   r7   overflowRecordZuse_hb_repackstatehb_first_error_loggedlastOverflowRecordwritereokr   r   r   rA   O   s\    









zBaseTTXConverter.compilec              
   C   s   zt d| j || jW S  tttjfy } zV|srt|j	 }t
|dkr^|d| 7 }t d| j| d}|jddW  Y d }~S d }~0 0 d S )Nzserializing '%s' with hb.repackr1   z: z`hb.repack failed to serialize '%s', attempting fonttools resolutions ; the error message was: %sTF)remove_duplicate)r<   r=   r0   getAllDataUsingHarfbuzz
ValueErrorMemoryErrorhbZRepackerErrortyper   r   warning
getAllData)r   rI   rG   rJ   	error_msgr   r   r   rB      s    z#BaseTTXConverter.tryPackingHarfbuzzc                 C   s   |  S r"   )rS   r   rI   r   r   r   rC      s    z$BaseTTXConverter.tryPackingFontToolsc                 C   sz   d}||j kr|S |j }td| |jd u rFddlm} |||}nddlm} |||}|rd|S ddlm} |||S )Nr   z+Attempting to fix OTLOffsetOverflowError %sr   )fixLookupOverFlows)fixSubTableOverFlows)r$   r<   infor   r.   rV   rW   )r   r7   rJ   rH   rK   rE   rV   rW   r   r   r   rD      s    


z#BaseTTXConverter.tryResolveOverflowc                 C   s   | j || d S r"   )r4   toXML2)r   rI   r7   r   r   r   toXML   s    zBaseTTXConverter.toXMLc                 C   sJ   ddl m} t| ds*t|| j}| | _| j|||| | j  d S )Nr   r-   r4   )r1   r.   hasattrr3   r0   r4   fromXMLpopulateDefaults)r   nameattrscontentr7   r.   r9   r   r   r   r\      s    
zBaseTTXConverter.fromXMLTc                 C   s   | j j|d d S )N)recurse)r4   ensureDecompiled)r   ra   r   r   r   rb      s    z!BaseTTXConverter.ensureDecompiledN)T)r   r   r    __doc__r5   rA   rB   rC   rD   rZ   r\   rb   r   r   r   r   r,   @   s   U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 ):r2   z5Helper class to retrieve data from an OpenType table.r6   offsetpos
localStater0   Nr   c                 C   s"   || _ || _|| _|| _|| _d S r"   re   )r   r6   rh   rf   r0   r   r   r   r      s
    zOTTableReader.__init__c                 C   s   |  j |7  _ d S r"   rg   r   countr   r   r   advance   s    zOTTableReader.advancec                 C   s
   || _ d S r"   ri   )r   rg   r   r   r   seek   s    zOTTableReader.seekc                 C   s$   |  | j| j| j| j}| j|_|S r"   )	__class__r6   rh   rf   r0   rg   r   otherr   r   r   copy   s    zOTTableReader.copyc                 C   s    | j | }| | j| j|| jS r"   )rf   rn   r6   rh   r0   )r   rf   r   r   r   getSubReader  s    
zOTTableReader.getSubReaderc                 C   s6   | j }|| }td| | j|| \}|| _ |S N>rg   structunpackr6   )r   typecode
staticSizerg   newposr$   r   r   r   	readValue  s
    zOTTableReader.readValuec                 C   sH   | j }|||  }t|| j|| }tjdkr:|  || _ | S Nbig)rg   arrayr6   sys	byteorderbyteswaptolist)r   rx   ry   rk   rg   rz   r$   r   r   r   	readArray  s    zOTTableReader.readArrayc                 C   s   | j dddS )Nbr   ry   r{   r   r   r   r   readInt8  s    zOTTableReader.readInt8c                 C   s   | j dd|dS )Nr   r   ry   rk   r   rj   r   r   r   readInt8Array  s    zOTTableReader.readInt8Arrayc                 C   s   | j dddS )Nhr   r   r   r   r   r   r   	readShort  s    zOTTableReader.readShortc                 C   s   | j dd|dS )Nr   r   r   r   rj   r   r   r   readShortArray  s    zOTTableReader.readShortArrayc                 C   s   | j dddS )Nrd   r   r   r   r   r   r   r   readLong  s    zOTTableReader.readLongc                 C   s   | j dd|dS )Nrd   r   r   r   rj   r   r   r   readLongArray!  s    zOTTableReader.readLongArrayc                 C   s   | j dddS )NBr   r   r   r   r   r   r   	readUInt8$  s    zOTTableReader.readUInt8c                 C   s   | j dd|dS )Nr   r   r   r   rj   r   r   r   readUInt8Array&  s    zOTTableReader.readUInt8Arrayc                 C   s   | j dddS )NHr   r   r   r   r   r   r   
readUShort)  s    zOTTableReader.readUShortc                 C   s   | j dd|dS )Nr   r   r   r   rj   r   r   r   readUShortArray+  s    zOTTableReader.readUShortArrayc                 C   s   | j dddS )NIr   r   r   r   r   r   r   	readULong.  s    zOTTableReader.readULongc                 C   s   | j dd|dS )Nr   r   r   r   rj   r   r   r   readULongArray0  s    zOTTableReader.readULongArrayc                 C   s4   | j }|d }tdd| j||  \}|| _ |S )Nr   z>l    ru   r   rg   rz   r$   r   r   r   
readUInt243  s
    zOTTableReader.readUInt24c                    s    fddt |D S )Nc                    s   g | ]}   qS r   )r   ).0_r   r   r   
<listcomp>:      z1OTTableReader.readUInt24Array.<locals>.<listcomp>)rangerj   r   r   r   readUInt24Array9  s    zOTTableReader.readUInt24Arrayc                 C   s>   | j }|d }t| j|| }t|dks4J ||| _ |S Nr   )rg   r   r6   lenr   r   r   r   readTag<  s    zOTTableReader.readTagc                 C   s&   | j }|| }| j|| }|| _ |S r"   )rg   r6   )r   rk   rg   rz   r$   r   r   r   readDataD  s
    zOTTableReader.readDatac                 C   s(   | j r| j  nt }|||< || _ d S r"   rh   rq   dictr   r^   r$   rF   r   r   r   __setitem__K  s    zOTTableReader.__setitem__c                 C   s   | j o| j | S r"   rh   r   r^   r   r   r   __getitem__P  s    zOTTableReader.__getitem__c                 C   s   | j o|| j v S r"   r   r   r   r   r   __contains__S  s    zOTTableReader.__contains__)Nr   N)r   r   r    rc   	__slots__r   rl   rm   rq   rr   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   r2      s8   
r2   c                   @   sd  e Zd ZdZdUd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dVddZdd Zd d! Zd"d# ZdWd%d&ZdXd'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&dIdJ Z'dKdL Z(dYdMdNZ)dOdP Z*dQdR Z+dSdT Z,dS )Zr@   z=Helper class to gather and assemble data for OpenType tables.Nr   c                 C   s(   g | _ d | _|| _|| _|| _d | _d S r"   )itemsrg   rh   r0   
offsetSizeparent)r   rh   r0   r   r   r   r   r   [  s    zOTTableWriter.__init__c                 C   s
   | j dkS r   r   r   r   r   r   
longOffsete  s    zOTTableWriter.longOffsetc                 C   s   |rdnd| _ d S )Nr   r   r   r   r$   r   r   r   r   i  s    c                 C   s(   | j r| j  nt }|||< || _ d S r"   r   r   r   r   r   r   m  s    zOTTableWriter.__setitem__c                 C   s
   | j | S r"   r   r   r   r   r   r   r  s    zOTTableWriter.__getitem__c                 C   s   | j |= d S r"   r   r   r   r   r   __delitem__u  s    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   r[   sizer   r   )r   litemr   r   r   getDataLengthz  s    


zOTTableWriter.getDataLengthc              	   C   s   t | j}| j}t|}t|D ]}|| }t|dr |jdkrTt|j| ||< q |jdkrzt|j| ||< W q t	j
y   | |}t|Y q0 q |jdkrt|j| ||< q t|jq t|S )z;Assemble the data for this writer/table, without subtables.r   r   r   r   )listr   rg   r   r   r[   r   	packULong
packUShortrv   errorgetOverflowErrorRecordr!   
packUInt24rN   r   )r   r   rg   numItemsrd   r   r%   r   r   r   r     s$    





zOTTableWriter.getDatac                 C   sb   t | j}tttd}t|D ]:\}}t|dr|j|v rN||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   	enumerater[   r   rN   r   )r   r   Z	packFuncsrd   r   r   r   r   getDataForHarfbuzz  s    


z OTTableWriter.getDataForHarfbuzzc                 C   s
   t | jS r"   )hashr   r   r   r   r   __hash__  s    zOTTableWriter.__hash__c                 C   s   |  |}|tu r|S | S r"   __eq__NotImplementedr   rp   resultr   r   r   __ne__  s    
zOTTableWriter.__ne__c                 C   s,   t | t |krtS | j|jko*| j|jkS r"   )rQ   r   r   r   ro   r   r   r   r     s    zOTTableWriter.__eq__Fc                 C   s   t | d}t | d}|r |s i }| j}tt|D ]T}|| }t |drV| ||< q2t |dr2|j||d |s2||| ||< }q2t|| _d S )N	Extension	DontSharer   r   shareExtension)r[   r   r   r   r   _doneWriting
setdefaulttuple)r   internedTablesr   isExtensionZ	dontSharer   rd   r   r   r   r   r     s    



zOTTableWriter._doneWritingc                 C   s  d|t | < t| j}tt|}|  t| d}|}|r\|d usLJ d|d i   }}}d}t| drt|D ]&}	| j|	 }
t|
dd dkrrd} qqrt |
|vr|
||| n |D ]T}	| j|	 }
t|
dsq|r|	d	krt|
dd dkrqt |
|vr|
||| qq|	|  d S )
NTr   zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFsortCoverageLastr^   Coverager   r   )
idr   r   r   r   reverser[   r3   _gatherTablesappend)r   tables	extTablesdoner   ZiRanger   Z
selfTablesr   rd   r   r   r   r   r     s8    	





zOTTableWriter._gatherTablesc                 C   s  g }g }|}|D ]}	| dd|	f qd}
d}t| drt| jD ]Z\}}t|dd dkrBd}
t||vr|||||| }}n|t| }| |  qqBd}d}t| jD ]\}}t|dr|}n&t|dr||j7 }qn|t| }qt||vr|||||| }}n|t| }||j	|f}| | ||j	7 }q| |  | ||f |d	7 }||t| < |
r||
  |S )
Nr   Fr   r^   r   Tr   r   r   )r   r[   r   r   r3   r   _gatherGraphForHarfbuzzr   r   r   pop)r   r   obj_listr   objidxvirtual_edgesZ
real_linksZvirtual_linksZitem_idxidxr   Zcoverage_idxrd   r   Z	child_idxZ
offset_posrg   Z	real_edger   r   r   r     sN    






z%OTTableWriter._gatherGraphForHarfbuzzc                 C   s   i }| j |dd g }g }i }d}g }| ||||| d}|D ]}	||	_||	  }q@g }
|D ]}	|	 }|
| q`ttdrtt	||
|S t
|
|S d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   repack_with_tagN)r   r   rg   r   r   r   r[   rP   r   r   r   )r   r0   r   r   r   r   r   r   rg   r4   r6   	tableDatar   r   r   rM   K  s&    
z%OTTableWriter.getAllDataUsingHarfbuzzTc           
      C   s   |ri }|  | g }g }i }| ||| |  |  d}|D ]}||_||  }qD|D ]}||_||  }q`g }|D ]}| }	||	 q|D ]}| }	||	 qt|S )z+Assemble all data, including all subtables.r   )r   r   r   rg   r   r   r   r   )
r   rL   r   r   r   r   rg   r4   r6   r   r   r   r   rS   l  s0    
zOTTableWriter.getAllDatac                 C   s   | j | j| j|d}| |_|S )Nr   )rn   rh   r0   r   )r   r   Z	subwriterr   r   r   getSubWriter  s    zOTTableWriter.getSubWriterc                 C   s   | j td| | d S rs   r   r   rv   pack)r   rx   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   rx   valuesar   r   r   
writeArray  s    zOTTableWriter.writeArrayc                 C   s6   d|  krdk sn J || j td| d S )Ni   z>br   r   r   r   r   	writeInt8  s    zOTTableWriter.writeInt8c                 C   s   |  d| d S )Nr   r   r   r   r   r   r   writeInt8Array  s    zOTTableWriter.writeInt8Arrayc                 C   s6   d|  krdk sn J || j td| d S )Ni    z>hr   r   r   r   r   
writeShort  s    zOTTableWriter.writeShortc                 C   s   |  d| d S )Nr   r   r   r   r   r   writeShortArray  s    zOTTableWriter.writeShortArrayc                 C   s   | j td| d S )Nz>ir   r   r   r   r   	writeLong  s    zOTTableWriter.writeLongc                 C   s   |  d| d S )Nrd   r   r   r   r   r   writeLongArray  s    zOTTableWriter.writeLongArrayc                 C   s6   d|  krdk sn J || j td| d S )Nr      >Br   r   r   r   r   
writeUInt8  s    zOTTableWriter.writeUInt8c                 C   s   |  d| d S )Nr   r   r   r   r   r   writeUInt8Array  s    zOTTableWriter.writeUInt8Arrayc                 C   s6   d|  krdk sn J || j td| d S )Nr   i   >Hr   r   r   r   r   writeUShort  s    zOTTableWriter.writeUShortc                 C   s   |  d| d S )Nr   r   r   r   r   r   writeUShortArray  s    zOTTableWriter.writeUShortArrayc                 C   s   | j td| d S )N>Ir   r   r   r   r   
writeULong  s    zOTTableWriter.writeULongc                 C   s   |  d| d S )Nr   r   r   r   r   r   writeULongArray  s    zOTTableWriter.writeULongArrayc                 C   sB   d|  krdk sn J |t d|}| j|dd   d S )Nr      z>Lr   rv   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 | d S r"   r   r   )r   	subWriterr   r   r   writeSubTable  s    zOTTableWriter.writeSubTablec                 C   s    t ||||d}| j| |S )N)r   r$   )CountReferencer   r   )r   r4   r^   r   r$   refr   r   r   writeCountReference  s    z!OTTableWriter.writeCountReferencec                 C   s    t j|f|  }| j| d S r"   r  )r   formatr   r6   r   r   r   writeStruct  s    zOTTableWriter.writeStructc                 C   s   | j | d S r"   r	  )r   r6   r   r   r   	writeData  s    zOTTableWriter.writeDatac                 C   s  d  } } }}| j dkr"|j}n| j dkr:| j}|j}nt|dd}t|drV|j}| j dkrp| jj}| j}n| j dkr| jjj}| jj}nld| j |g}| j}|r|j d	vrd|j |g}|j}q|r|j dkr|jjj}|jj}n|jj}|j}t| j||||fS )
NZ
LookupListZLookupr^   z<none>repeatIndexSubTableExtSubTable.)r  r  )r^   r  r3   r[   r   joinr   r0   )r   r   r   r   r   r   p1r   r   r   r     s6    









z$OTTableWriter.getOverflowErrorRecord)NNr   )F)T)r   )r   N)-r   r   r    rc   r   propertyr   setterr   r   r   r   r   r   r   r   r   r   r   r   rM   rS   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   r@   W  sV   




$75!
#

r@   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 r"   )r4   r^   r   setValue)r   r4   r^   r   r$   r   r   r   r      s
    zCountReference.__init__c                 C   sD   | j }| j}|| d u r"|||< n|| |ks@J ||| |fd S r"   r4   r^   )r   r$   r4   r^   r   r   r   r    s
    
zCountReference.setValuec                 C   s   | j | j S r"   r  r   r   r   r   getValue  s    zCountReference.getValuec                 C   s.   | j | j }|d u rd}tttd| j |S )Nr   )r   r   r   )r4   r^   	packUInt8r   r   r   )r   vr   r   r   r     s    zCountReference.getCountData)NN)r   r   r    rc   r   r  r  r   r   r   r   r   r    s
   
r  c                 C   s   t d| S )Nr   rv   r   r#   r   r   r   r    s    r  c                 C   s   t d| S )Nr   r  r#   r   r   r   r     s    r   c                 C   s*   d|   krdk sn J | t d| S )Nr   l        r   r  r#   r   r   r   r     s    r   c                 C   s2   d|   krdk sn 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ee d$d%d&Zd'd( ZdS ),	BaseTablez0Generic base class for all OpenType (sub)tables.c                 C   s@   | j d}|r4| `| j}| `| || t| |S t|d S Nr8   )__dict__getr8   r7   r5   r3   AttributeError)r   attrr8   r7   r   r   r   __getattr__(  s    
zBaseTable.__getattr__Fc                 C   sL   | j d}|r*| `| j}| `| || |rH|  D ]}|j| q6d S r!  )r"  r#  r8   r7   r5   iterSubTablesr$   rb   )r   ra   r8   r7   Zsubtabler   r   r   rb   3  s    zBaseTable.ensureDecompiledc                 C   sh   d}| j D ]X}||}|tu r(t  S d}|jrV|j|v rN||j |j }nt  S ||| 7 }q
|S )Nr   r   )
convertersgetRecordSizer   repeataux)clsr8   Z	totalSizeconvr   
countValuer   r   r   r)  >  s    


zBaseTable.getRecordSizec                 C   s   | j S r"   )r(  r   r   r   r   getConvertersM  s    zBaseTable.getConvertersc                 C   s
   | j | S r"   )convertersByNamer   r   r   r   getConverterByNameP  s    zBaseTable.getConverterByNameNc              	   C   s   |   D ]}|jrt| |js,t| |jg  tt| |j|j }z| |j}t| |j| W q t	y   |r|j|v r||j 
| Y q0 q|jrt|jd | jsqt| |jrqt|drt| |jd  t|drt| |j|j qd S )NZwriteNullOffsetDEFAULT)r/  r*  r[   r^   setattrr   r3   r+  r1  KeyErrorr  evalr"  r2  )r   Z
propagatorr-  r.  Z
count_convr   r   r   r]   S  s&    

zBaseTable.populateDefaultsc                 C   s  |  | i }|| _|  D ]V}|jdkr>||j|d }|jdkrZ||j|d }|jdkrr||d }|jdkr||j|d }z|jrt|jtr|j}n |j|v r||j }n
||j }||j	7 }|
||||||j< nH|j	rt|j	d |sW q||||||j< |jr4||j ||j< W q tyr } z"|j}|j|f |_ W Y d }~qd }~0 0 qt| d	r| || n| j| | `d S )
Nr  
LookupTyper  ZExtensionLookupTypeZFeatureParamsZ
FeatureTagZ	SubStructZ	MorphTypepostRead)
readFormatZ_BaseTable__rawTabler/  r^   ZgetConverterr0   r*  
isinstanceintr+  r   r5  readisPropagated	Exceptionargsr[   r7  r"  update)r   r8   r7   r4   r-  r.  rJ   r^   r   r   r   r5   n  sP    







zBaseTable.decompilec                 C   s  |    t| dr8t| d }| |}|o4t| d}nd}| j }|  D ]0}|jrN|jrN||j	}t
|trN|||j	< qNt| drd|_t| drd|_t| jdr|d | jj | | |  D ]$}||j	}|jr|d u rg }t||j }t
|jtr:t||jkshJ d	|jt|f n.|j|v rXt||j|d
 n||j | z||||| W n< ty } z"|j|j	d f |_ W Y d }~n
d }~0 0 q|jr&t
|tr|}	|j|	_||	 |	 ||j	< n|||j	|j}	d ||j	< |jr|	||j	< q|jrh|j	|vrDd ||j	< |||j	|j||j	 }	|	|d< q|jrt|jd |sqz| |||| W nN ty } z4|d ur|jj!n|j	}
|j|
f |_ W Y d }~n
d }~0 0 |jr|||j	< q|r| `"d S )NpreWriteFormatFr   r   r   Tr6  zexpected %d values, got %dr#   z[])#rb   r[   r@  r"  rq   r/  ZisCountr<  r#  r^   r9  r  r   r   rn   r  r6  writeFormatr*  r   r+  r:  r   r=  r>  ry   r   r  r  r  ZisLookupTyper5  writer   rA  )r   rI   r7   ZdeleteFormatr4   r-  r$   r.  rJ   r  r^   r   r   r   rA     s|    






(




zBaseTable.compilec                 C   s   d S r"   r   r   r8   r   r   r   r8    s    zBaseTable.readFormatc                 C   s   d S r"   r   rU   r   r   r   rB    s    zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d u rg }t| dr6|d| jfg }||| |  | || || |  d S )NrA  )rn   r   r[   rA  begintagnewlinerY   endtag)r   	xmlWriterr7   r_   r^   Z	tableNamer   r   r   rZ     s    

zBaseTable.toXMLc              
   C   s   |   D ]}|jrVt| |jg }tt|D ]&}|| }|||||jd|fg q,q|jrpt|jd t	| spqt| |jd }|||||jg  qd S )Nindex)
r/  r*  r3   r^   r   r   ZxmlWriter+  r5  vars)r   rH  r7   r-  r$   rd   r   r   r   r   rY     s    zBaseTable.toXML2c                 C   s~   z|  |}W n ty"    Y n0 ||||}|jrlt| |jd }|d u r`g }t| |j| || nt| |j| d S r"   )r1  r4  ZxmlReadr*  r3   r^   r3  r   )r   r^   r_   r`   r7   r-  r$   seqr   r   r   r\     s    zBaseTable.fromXMLc                 C   s   |  |}|tu r|S | S r"   r   r   r   r   r   r   +  s    
zBaseTable.__ne__c                 C   s0   t | t |krtS |   |  | j|jkS r"   )rQ   r   rb   r"  ro   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$   NrI  )	r   r   r    rc   r   __annotations__rI  r   r:  r   r   r   r   SubTableEntry8  s   
rM  )returnc                 #   sp     D ]b}|j t d}|du r(qt|trB |V  qt|tr 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 ))rI  N)r9  r   rM  )r   rd   r  r^   r   r   r   	<genexpr>Q  s   
z*BaseTable.iterSubTables.<locals>.<genexpr>)r/  r^   r3   r9  r   rM  r   r   )r   r-  r$   r   rO  r   r'  >  s    

zBaseTable.iterSubTablesc                 C   s
   t | jS r"   )getVariableAttrsrn   r   r   r   r   rQ  X  s    zBaseTable.getVariableAttrs)F)N)NN)r   r   r    rc   r&  rb   classmethodr)  r/  r1  r]   r5   rA   r8  rB  rZ   rY   r\   r   r   r
   rM  r	   r'  rQ  r   r   r   r   r   $  s(   


-^
	r   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 )FormatSwitchingBaseTablezsMinor specialization of BaseTable, for tables that have multiple
	formats, eg. CoverageFormat1 vs. CoverageFormat2.c                 C   s   t S r"   )r   )r,  r8   r   r   r   r)  a  s    z&FormatSwitchingBaseTable.getRecordSizec                 C   s2   z
| j }W n ty    g  Y S 0 | j| j g S r"   )rA  r$  r(  r#  )r   fmtr   r   r   r/  e  s
    

z&FormatSwitchingBaseTable.getConvertersc                 C   s   | j | j | S r"   )r0  rA  r   r   r   r   r1  q  s    z+FormatSwitchingBaseTable.getConverterByNamec                 C   s   |  | _d S r"   )r   rA  rD  r   r   r   r8  t  s    z#FormatSwitchingBaseTable.readFormatc                 C   s   | | j d S r"   )r   rA  rU   r   r   r   rB  w  s    z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t | |||| d S r"   )r   rZ   )r   rH  r7   r_   r^   r   r   r   rZ   z  s    zFormatSwitchingBaseTable.toXMLc                 C   s   t | j| jS r"   )rQ  rn   rA  r   r   r   r   rQ  }  s    z)FormatSwitchingBaseTable.getVariableAttrs)NN)r   r   r    rc   rR  r)  r/  r1  r8  rB  rZ   rQ  r   r   r   r   rS  \  s   

rS  c                   @   s   e Zd Zdd Zdd ZdS )UInt8FormatSwitchingBaseTablec                 C   s   |  | _d S r"   )r   rA  rD  r   r   r   r8    s    z(UInt8FormatSwitchingBaseTable.readFormatc                 C   s   | | j d S r"   )r   rA  rU   r   r   r   rB    s    z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r   r    r8  rB  r   r   r   r   rU    s   rU  )Zuint16Zuint8c                 C   s0   z
t |  W S  ty*   td| Y n0 d S )NzUnsupported format type: )formatSwitchingBaseTablesr4  	TypeError)Z
formatTyper   r   r    getFormatSwitchingBaseTableClass  s    
rX  )r,  rT  rN  c                 C   s   t | tst| t | tr@|du r4td| j | j| }n| j}d|vrRd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 ZVarIndexBaser   )key)
issubclassr   rW  rS  r   r0  r   ZgetVarIndexOffsetr   sortedr   )r,  rT  r(  ZvarAttrsr^   r-  rf   r   r   r   rQ    s    


rQ  ))r   Z
XPlacementr   r   )r   Z
YPlacementr   r   )r   ZXAdvancer   r   )   ZYAdvancer   r   )   Z
XPlaDevicer   r   )    Z
YPlaDevicer   r   )@   Z
XAdvDevicer   r   )r   Z
YAdvDevicer   r   )r   Z	Reserved1r   r   )i   Z	Reserved2r   r   )i   Z	Reserved3r   r   )i   Z	Reserved4r   r   )i   Z	Reserved5r   r   )i    Z	Reserved6r   r   )i @  Z	Reserved7r   r   )r   Z	Reserved8r   r   c                  C   s(   i } t D ]\}}}}|||f| |< q| S r"   )valueRecordFormat)dmaskr^   isDevicesignedr   r   r   
_buildDict  s    re  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  rb  r^   rc  rd  r   r   r   r     s
    zValueRecordFactory.__init__c                 C   s
   t | jS r"   )r   r  r   r   r   r   __len__  s    zValueRecordFactory.__len__c                 C   s   | j }|sd S t }|D ]h\}}}|r0| }n| }|rt|rpddlm}	 ||}
t|	| }||
| nd }t	||| q|S Nr   r-   )
r  ValueRecordr   r   r1   r.   rr   r3   r5   r3  )r   r8   r7   r  valueRecordr^   rc  rd  r$   r.   Z	subReaderr   r   r   readValueRecord  s"    

z"ValueRecordFactory.readValueRecordc           	      C   sp   | j D ]d\}}}t||d}|rP|rD| }|| ||| qj|d q|r`|| q|| qd S Nr   )r  r3   r   r  rA   r   r   )	r   rI   r7   rk  r^   rc  rd  r$   r
  r   r   r   writeValueRecord  s    
z#ValueRecordFactory.writeValueRecordN)r   r   r    rc   r   rh  rl  rn  r   r   r   r   rf    s
   rf  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 )rj  Nc           	      C   s   |d urlt D ](\}}}}||@ rt| ||r.d nd q|d ur|j D ] \}}t| |s\qHt| || qHn|d ur|j | _d S rm  )r`  r3  r"  r   r[   rq   )	r   rg  srcrb  r^   rc  rd  rY  valr   r   r   r     s    
zValueRecord.__init__c                 C   s(   d}| j  D ]}|t| d B }q|S rm  )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 rm  )r"  r   rr  )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 ]6\}}}}	t| |r^t| |}|d ur^|
||f q^|
r||| |  |
D ] \}}|d ur|j|||d q|| |  n|	|| |  d S )Nr   r\  )r^   )
r   r`  r[   r   r3   rE  rF  rZ   rG  Z	simpletag)r   rH  r7   Z	valueNamer_   ZsimpleItemsrb  r^   rc  r  ZdeviceItemsZdeviceZdeviceRecordr   r   r   rZ   '  s,    




zValueRecord.toXMLc                 C   s   ddl m} | D ]\}}t| |t| q|D ]b}t|tsBq2|\}}}t|| }	|D ]*}
t|
tslq\|
\}}}|	|||| q\t| ||	 q2d S ri  )	r1   r.   r   r3  r:  r9  r   r3   r\   )r   r^   r_   r`   r7   r.   kr  elementr$   Zelem2Zname2Zattrs2Zcontent2r   r   r   r\   A  s    



zValueRecord.fromXMLc                 C   s   |  |}|tu r|S | S r"   r   r   r   r   r   r   Q  s    
zValueRecord.__ne__c                 C   s    t | t |krtS | j|jkS r"   )rQ   r   r"  ro   r   r   r   r   U  s    zValueRecord.__eq__)NN)N)
r   r   r    r   rs  rt  rZ   r\   r   r   r   r   r   r   rj  	  s   

rj  )N):ZfontTools.configr   ZfontTools.misc.textToolsr   r   r   enumr   r   r~   rv   logging	functoolsr   typingr	   r
   r   r   	getLoggerr   r<   r>   Z	uharfbuzzrP   callabler3   r?   r;   objectr   r=  r!   r(   r,   r   r   itemsizer2   r@   r  r  r   r   r   r   rS  rU  rV  rX  r:  r   rQ  r`  re  rr  rf  rj  r   r   r   r   <module>   sd   
 )l   *  :%	!3