U
    i2e                     @   sT  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k
r   Y nX 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 t%e		dj&dks:t%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/Z0G d+d, d,e0Z1e0e1d-Z2d.d/ Z3e dIe/ee4 ee5 d0d1d2Z6d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBgZ7dCdD Z8e8 Z9G dEdF dFeZ:G dGdH dHeZ;dS )J    )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   A/tmp/pip-unpacked-wheel-txsm8jh_/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   5   s    zOTLOffsetOverflowError.__init__c                 C   s
   t | jS r"   )reprr$   r   r   r   r   __str__8   s    zOTLOffsetOverflowError.__str__N)r   r   r    r   r'   r   r   r   r   r!   4   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   X   s
    zBaseTTXConverter.decompilec           
   
   C   sn  d}|j t }| jdkr`|dkr0td| j n0ts`|dkrFtdn|dksRttd| j |dkr~tr~| jdk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k
rf } zJd}| |||}	|j}|	r6W Y &q|tj	krTtd tj}n W 5 d}~X Y qX 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ImportErrorAssertionErrorr(   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   rB   a   sf    







zBaseTTXConverter.compilec              
   C   s   zt d| j || jW S  tttjfk
r } zR|stt|j	 }t
|dkr`|d| 7 }t d| j| d}|jdd W Y S d }~X Y nX 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   rJ   rH   rK   	error_msgr   r   r   rC      s    z#BaseTTXConverter.tryPackingHarfbuzzc                 C   s   |  S r"   )rT   r   rJ   r   r   r   rD      s    z$BaseTTXConverter.tryPackingFontToolsc                 C   sz   d}||j kr|S |j }td| |jd k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.   rW   rX   )r   r7   rK   rI   rL   rF   rW   rX   r   r   r   rE      s    


z#BaseTTXConverter.tryResolveOverflowc                 C   s   | j || d S r"   )r4   toXML2)r   rJ   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   rb   r   r   r   rc      s    z!BaseTTXConverter.ensureDecompiledN)T)r   r   r    __doc__r5   rB   rC   rD   rE   r[   r]   rc   r   r   r   r   r,   Q   s   	[	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"   rf   )r   r6   ri   rg   r0   r   r   r   r     s
    zOTTableReader.__init__c                 C   s   |  j |7  _ d S r"   rh   r   countr   r   r   advance  s    zOTTableReader.advancec                 C   s
   || _ d S r"   rj   )r   rh   r   r   r   seek  s    zOTTableReader.seekc                 C   s$   |  | j| j| j| j}| j|_|S r"   )	__class__r6   ri   rg   r0   rh   r   otherr   r   r   copy  s    zOTTableReader.copyc                 C   s    | j | }| | j| j|| jS r"   )rg   ro   r6   ri   r0   )r   rg   r   r   r   getSubReader  s    
zOTTableReader.getSubReaderc                 C   s6   | j }|| }td| | j|| \}|| _ |S N>rh   structunpackr6   )r   typecode
staticSizerh   newposr$   r   r   r   	readValue"  s
    zOTTableReader.readValuec                 C   sH   | j }|||  }t|| j|| }tjdkr:|  || _ | S Nbig)rh   arrayr6   sys	byteorderbyteswaptolist)r   ry   rz   rl   rh   r{   r$   r   r   r   	readArray)  s    
zOTTableReader.readArrayc                 C   s   | j dddS )Nbr   rz   r|   r   r   r   r   readInt82  s    zOTTableReader.readInt8c                 C   s   | j dd|dS )Nr   r   rz   rl   r   rk   r   r   r   readInt8Array5  s    zOTTableReader.readInt8Arrayc                 C   s   | j dddS )Nhr   r   r   r   r   r   r   	readShort8  s    zOTTableReader.readShortc                 C   s   | j dd|dS )Nr   r   r   r   rk   r   r   r   readShortArray;  s    zOTTableReader.readShortArrayc                 C   s   | j dddS )Nre   r   r   r   r   r   r   r   readLong>  s    zOTTableReader.readLongc                 C   s   | j dd|dS )Nre   r   r   r   rk   r   r   r   readLongArrayA  s    zOTTableReader.readLongArrayc                 C   s   | j dddS )NBr   r   r   r   r   r   r   	readUInt8D  s    zOTTableReader.readUInt8c                 C   s   | j dd|dS )Nr   r   r   r   rk   r   r   r   readUInt8ArrayG  s    zOTTableReader.readUInt8Arrayc                 C   s   | j dddS )NHr   r   r   r   r   r   r   
readUShortJ  s    zOTTableReader.readUShortc                 C   s   | j dd|dS )Nr   r   r   r   rk   r   r   r   readUShortArrayM  s    zOTTableReader.readUShortArrayc                 C   s   | j dddS )NIr   r   r   r   r   r   r   	readULongP  s    zOTTableReader.readULongc                 C   s   | j dd|dS )Nr   r   r   r   rk   r   r   r   readULongArrayS  s    zOTTableReader.readULongArrayc                 C   s4   | j }|d }tdd| j||  \}|| _ |S )Nr   z>l    rv   r   rh   r{   r$   r   r   r   
readUInt24V  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>)rangerk   r   r   r   readUInt24Array]  s    zOTTableReader.readUInt24Arrayc                 C   s>   | j }|d }t| j|| }t|dks4t||| _ |S Nr   )rh   r   r6   lenr@   r   r   r   r   readTag`  s    zOTTableReader.readTagc                 C   s&   | j }|| }| j|| }|| _ |S r"   )rh   r6   )r   rl   rh   r{   r$   r   r   r   readDatah  s
    zOTTableReader.readDatac                 C   s(   | j r| j  nt }|||< || _ d S r"   ri   rr   dictr   r_   r$   rG   r   r   r   __setitem__o  s    zOTTableReader.__setitem__c                 C   s   | j o| j | S r"   ri   r   r_   r   r   r   __getitem__t  s    zOTTableReader.__getitem__c                 C   s   | j o|| j kS r"   r   r   r   r   r   __contains__w  s    zOTTableReader.__contains__)Nr   N)r   r   r    rd   	__slots__r   rm   rn   rr   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   r2     s8   
	r2   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   |  s    zOffsetToWriter.__init__c                 C   s,   t | t |krtS | j|jko*| j|jkS r"   )rR   NotImplementedr   r   rp   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   {  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 )VrA   z=Helper class to gather and assemble data for OpenType tables.Nc                 C   s"   g | _ d | _|| _|| _d | _d S r"   )itemsrh   ri   r0   parent)r   ri   r0   r   r   r   r     s
    zOTTableWriter.__init__c                 C   s(   | j r| j  nt }|||< || _ d S r"   r   r   r   r   r   r     s    zOTTableWriter.__setitem__c                 C   s
   | j | S r"   r   r   r   r   r   r     s    zOTTableWriter.__getitem__c                 C   s   | j |= d S r"   r   r   r   r   r   __delitem__  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   getCountDatar   )r   r\   sizer   r   )r   litemr   r   r   getDataLength  s    


zOTTableWriter.getDataLengthc              	   C   s   t | j}| j}t|}t|D ]}|| }t|dr |jdkrVt|jj| ||< q |jdkrzt	|jj| ||< W q t
jk
r   | |j}t|Y qX q |jdkrt|jj| ||< q t|jq t|S )z;Assemble the data for this writer/table, without subtables.r   r   r   r   )listr   rh   r   r   r\   r   	packULongr   
packUShortrw   errorgetOverflowErrorRecordr!   
packUInt24rO   r   )r   r   rh   numItemsre   r   r%   r   r   r   getData  s(    




zOTTableWriter.getDatac                 C   sb   t | j}tttd}t|D ]:\}}t|dr|j|k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   rO   r   )r   r   Z	packFuncsre   r   r   r   r   getDataForHarfbuzz  s    


z OTTableWriter.getDataForHarfbuzzc                 C   s
   t | jS r"   )r   r   r   r   r   r   r     s    zOTTableWriter.__hash__c                 C   s   |  |}|tkr|S | S r"   r   r   r   rq   resultr   r   r   __ne__  s    
zOTTableWriter.__ne__c                 C   s    t | t |krtS | j|jkS r"   )rR   r   r   rp   r   r   r   r     s    zOTTableWriter.__eq__Fc                 C   s   t | d}t | d}|r |s i }| j}tt|D ]X}|| }t |drV| ||< q2t |dr2|jj||d |s2||j|j|| _q2t|| _d S )N	Extension	DontSharer   r   shareExtension)	r\   r   r   r   r   r   _doneWriting
setdefaulttuple)r   internedTablesr   isExtensionZ	dontSharer   re   r   r   r   r   r     s(    



 	 zOTTableWriter._doneWritingc                 C   s:  d|t | < t| j}tt|}|  t| d}|}|r\|d k	sLtd|d i   }}}d}t| drt|D ]2}	| j|	 }
t|
drrt|
j	dd dkrrd} qqrt |
j	|kr|
j	
||| n |D ]`}	| j|	 }
t|
dsq|r
|	d	kr
t|
j	dd dkr
qt |
j	|kr|
j	
||| qq||  d S )
NTr   zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFsortCoverageLastr   r_   Coverager   )idr   r   r   r   reverser\   r@   r3   r   _gatherTablesappend)r   tables	extTablesdoner   ZiRanger   Z
selfTablesr   re   r   r   r   r   r     sN    	





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||kr|||||| }}n|t| }| |  qqBd}d}t| jD ]\}}t|dr|}n&t|dr||j7 }qn|t| }qt|j	|kr|j	||||| }}n|t|j	 }||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   r   pop)r   r   obj_listr   objidxvirtual_edgesZ
real_linksZvirtual_linksZitem_idxidxr   Zcoverage_idxre   r   Z	child_idxZ
offset_posrh   Z	real_edger   r   r   r   M  sf    
    




    


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   rh   r   r   r   r\   rQ   r   r   r   )r   r0   r   r   r   r   r   r   rh   r4   r6   	tableDatar   r   r   rN     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   rh   r   r   r   r   )
r   rM   r   r   r   r   rh   r4   r6   r   r   r   r   rT     s0    
zOTTableWriter.getAllDatac                 C   s   |  | j| j}| |_|S r"   )ro   ri   r0   r   )r   Z	subwriterr   r   r   getSubWriter  s    zOTTableWriter.getSubWriterc                 C   s   | j td| | d S rt   r   r   rw   pack)r   ry   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   ry   valuesar   r   r   
writeArray  s    
zOTTableWriter.writeArrayc                 C   s6   d|  krdk sn t || jtd| d S )Ni   z>br@   r   r   rw   r   r   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 t || 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 )Nre   r   r   r   r   r   writeLongArray  s    zOTTableWriter.writeLongArrayc                 C   s6   d|  krdk sn t || 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 t || 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 t |td|}| j|dd   d S )Nr      z>Lr   )r@   rw   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 t|| j| d S r   )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  s    zOTTableWriter.writeSubTabler   c                 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"   )rw   r   r   r   )r   formatr   r6   r   r   r   writeStruct  s    zOTTableWriter.writeStructc                 C   s   | j | d S r"   )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	k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   "  s:    









z$OTTableWriter.getOverflowErrorRecord)NN)F)T)r   N)*r   r   r    rd   r   r   r   r   r   r   r   r   r   r   r   r   r   rN   rT   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   rA     sN   

(@9!
#

rA   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 k	r$| | d S r"   )r4   r_   r   setValue)r   r4   r_   r   r$   r   r   r   r   I  s
    zCountReference.__init__c                 C   sD   | j }| j}|| d kr"|||< n|| |ks@t||| |fd S r"   )r4   r_   r@   )r   r$   r4   r_   r   r   r   r  P  s
    
zCountReference.setValuec                 C   s   | j | j S r"   )r4   r_   r   r   r   r   getValueX  s    zCountReference.getValuec                 C   s.   | j | j }|d k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    rd   r   r  r  r   r   r   r   r   r  F  s
   
r  c                 C   s   t d| S )Nr   rw   r   r#   r   r   r   r  b  s    r  c                 C   s   t d| S )Nr   r  r#   r   r   r   r   f  s    r   c                 C   s*   d|   krdk sn t | td| S )Nr   l        r  r@   rw   r   r#   r   r   r   r   j  s    r   c                 C   s2   d|   krdk sn t | td| dd  S )Nr   r  r  r   r  r#   r   r   r   r   o  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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__x  s    
zBaseTable.__getattr__Fc                 C   sL   | j d}|r*| `| j}| `| || |rH|  D ]}|j| q6d S r  )r  r   r8   r7   r5   iterSubTablesr$   rc   )r   rb   r8   r7   Zsubtabler   r   r   rc     s    zBaseTable.ensureDecompiledc                 C   s0   d| j kr*| j  }| j d  |d< |S | j S r  )r  rr   )r   rG   r   r   r   __getstate__  s
    

zBaseTable.__getstate__c                 C   sh   d}| j D ]X}||}|tkr(t  S d}|jrV|j|k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   getConverters  s    zBaseTable.getConvertersc                 C   s
   | j | S r"   )convertersByNamer   r   r   r   getConverterByName  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	k
r   |r|j|kr||j 
| Y qX 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)  r/  KeyErrorr  evalr  r0  )r   Z
propagatorr+  r,  Z
count_convr   r   r   r^     s&    

zBaseTable.populateDefaultsc                 C   s  |  | i }|| _|  D ]T}|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|kr||j }n
||j }||j	7 }|
||||||j< nH|j	rt|j	d |sW q||||||j< |jr4||j ||j< W q tk
rp } z|j}|j|f |_ W 5 d }~X Y qX 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   r3  readisPropagated	Exceptionargsr\   r5  r  update)r   r8   r7   r4   r+  r,  rK   r_   r   r   r   r5     sD    







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 krg }t||j }t
|jtr:t||jkshtd	|jt|f n.|j|krXt||j|d
 n||j | z||||| W n: tk
r } z|j|j	d f |_ W 5 d }~X Y nX q|jr$t
|tr|}	|j|	_||	 |	 ||j	< n|||j	|j}	d ||j	< |jr|	||j	< q|jrf|j	|krBd ||j	< |||j	|j||j	 }	|	|d< q|jrt |jd |sqz|!|||| W nL tk
r } z,|d k	r|jj"n|j	}
|j|
f |_ W 5 d }~X Y nX |jr|||j	< q|r| `#d S )NpreWriteFormatFr   r   r   Tr4  zexpected %d values, got %dr#   z[])$rc   r\   r>  r  rr   r-  ZisCountr:  r   r_   r7  r  r   r   ro   r  r4  writeFormatr(  r   r)  r8  r@   r   r;  r<  rz   r   r  r  r  ZisLookupTyper3  writer   r?  )r   rJ   r7   ZdeleteFormatr4   r+  r$   r,  rK   r  r_   r   r   r   rB     s    











   
zBaseTable.compilec                 C   s   d S r"   r   r   r8   r   r   r   r6  W  s    zBaseTable.readFormatc                 C   s   d S r"   r   rV   r   r   r   r@  Z  s    zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d krg }t| dr6|d| jfg }||| |  | || || |  d S )Nr?  )ro   r   r\   r?  begintagnewlinerZ   endtag)r   	xmlWriterr7   r`   r_   Z	tableNamer   r   r   r[   ]  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)  r3  vars)r   rF  r7   r+  r$   re   r   r   r   r   rZ   i  s      zBaseTable.toXML2c                 C   s   z|  |}W n tk
r$    Y nX ||||}|jrnt| |jd }|d krbg }t| |j| || nt| |j| d S r"   )r/  r2  ZxmlReadr(  r3   r_   r1  r   )r   r_   r`   ra   r7   r+  r$   seqr   r   r   r]   {  s    zBaseTable.fromXMLc                 C   s   |  |}|tk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"   )rR   r   rc   r  rp   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$   NrG  )	r   r   r    rd   r   __annotations__rG  r   r8  r   r   r   r   SubTableEntry  s   
rK  )returnc                 #   sp     D ]b}|j t d}|dkr(qt|trB |V  qt|tr 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 ))rG  N)r7  r  rK  )r   re   r  r_   r   r   r   	<genexpr>  s   
z*BaseTable.iterSubTables.<locals>.<genexpr>)r-  r_   r3   r7  r  rK  r   r   )r   r+  r$   r   rM  r   r$    s    

zBaseTable.iterSubTablesc                 C   s
   t | jS r"   )getVariableAttrsro   r   r   r   r   rO    s    zBaseTable.getVariableAttrs)F)N)NN)r   r   r    rd   r#  rc   r%  classmethodr'  r-  r/  r^   r5   rB   r6  r@  r[   rZ   r]   r   r   r
   rK  r	   r$  rO  r   r   r   r   r  t  s*   
	

*e
	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 )FormatSwitchingBaseTablezvMinor 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'    s    z&FormatSwitchingBaseTable.getRecordSizec                 C   s4   z
| j }W n tk
r"   g  Y S X | j| j g S r"   )r?  r!  r&  r   )r   fmtr   r   r   r-    s
    

z&FormatSwitchingBaseTable.getConvertersc                 C   s   | j | j | S r"   )r.  r?  r   r   r   r   r/    s    z+FormatSwitchingBaseTable.getConverterByNamec                 C   s   |  | _d S r"   )r   r?  rB  r   r   r   r6    s    z#FormatSwitchingBaseTable.readFormatc                 C   s   | | j d S r"   )r   r?  rV   r   r   r   r@    s    z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t | |||| d S r"   )r  r[   )r   rF  r7   r`   r_   r   r   r   r[     s    zFormatSwitchingBaseTable.toXMLc                 C   s   t | j| jS r"   )rO  ro   r?  r   r   r   r   rO    s    z)FormatSwitchingBaseTable.getVariableAttrs)NN)r   r   r    rd   rP  r'  r-  r/  r6  r@  r[   rO  r   r   r   r   rQ    s   

rQ  c                   @   s   e Zd Zdd Zdd ZdS )UInt8FormatSwitchingBaseTablec                 C   s   |  | _d S r"   )r   r?  rB  r   r   r   r6    s    z(UInt8FormatSwitchingBaseTable.readFormatc                 C   s   | | j d S r"   )r   r?  rV   r   r   r   r@    s    z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r   r    r6  r@  r   r   r   r   rS    s   rS  )Zuint16Zuint8c                 C   s2   z
t |  W S  tk
r,   td| Y nX d S )NzUnsupported format type: )formatSwitchingBaseTablesr2  	TypeError)Z
formatTyper   r   r    getFormatSwitchingBaseTableClass  s    
rV  )r*  rR  rL  c                 C   s   t | tst| t | tr@|dkr4td| j | j| }n| j}d|krRdS i }| D ] \}}| }|dk	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  rU  rQ  r   r.  r   ZgetVarIndexOffsetr   sortedr   )r*  rR  r&  ZvarAttrsr_   r+  rg   r   r   r   rO    s    


rO  )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    rc  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_   ra  rb  r   r   r   r   =  s
    zValueRecordFactory.__init__c                 C   s
   t | jS r"   )r   r  r   r   r   r   __len__D  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.   rs   r3   r5   r1  )r   r8   r7   r  valueRecordr_   ra  rb  r$   r.   Z	subReaderr   r   r   readValueRecordG  s"    

z"ValueRecordFactory.readValueRecordc           	      C   st   | j D ]h\}}}t||d}|rT|rH| }|j|dd ||| qn|d q|rd|| q|| qd S )Nr   r   )r   )r  r3   r   r
  rB   r   r   )	r   rJ   r7   ri  r_   ra  rb  r$   r   r   r   r   writeValueRecord]  s    z#ValueRecordFactory.writeValueRecordN)r   r   r    rd   r   rf  rj  rk  r   r   r   r   rd  9  s
   rd  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 )rh  Nc           	      C   s   |d k	rlt D ](\}}}}||@ rt| ||r.d nd q|d k	r|j D ] \}}t| |s\qHt| || qHn|d k	r|j | _d S Nr   )r^  r1  r  r   r\   rr   )	r   re  srcr`  r_   ra  rb  rW  valr   r   r   r   p  s    
zValueRecord.__init__c                 C   s(   d}| j  D ]}|t| d B }q|S rl  )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 rl  )r  r   rp  )r   r  r_   r$   r   r   r   getEffectiveFormat  s
    zValueRecord.getEffectiveFormatc                 C   s   |d krg }nt |}td d D ]*\}}}}	t| |r"||t| |f q"g }
tdd D ]6\}}}}	t| |r^t| |}|d k	r^|
||f q^|
r||| |  |
D ] \}}|d k	r|j|||d q|| |  n|	|| |  d S )Nr   rZ  )r_   )
r   r^  r\   r   r3   rC  rD  r[   rE  Z	simpletag)r   rF  r7   Z	valueNamer`   ZsimpleItemsr`  r_   ra  r  ZdeviceItemsZdeviceZdeviceRecordr   r   r   r[     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 rg  )	r1   r.   r   r1  r8  r7  r   r3   r]   )r   r_   r`   ra   r7   r.   kr  elementr$   Zelem2Zname2Zattrs2Zcontent2r   r   r   r]     s    



zValueRecord.fromXMLc                 C   s   |  |}|tkr|S | S r"   r   r   r   r   r   r     s    
zValueRecord.__ne__c                 C   s    t | t |krtS | j|jkS r"   )rR   r   r  rp   r   r   r   r     s    zValueRecord.__eq__)NN)N)
r   r   r    r   rq  rr  r[   r]   r   r   r   r   r   r   rh  m  s   

rh  )N)<ZfontTools.configr   ZfontTools.misc.textToolsr   r   r   enumr   r   r   rw   logging	functoolsr   typingr	   r
   r   r   	getLoggerr   r<   r>   Z	uharfbuzzrQ   callabler3   r?   r;   objectr   r;  r!   r(   r,   r   r   r@   itemsizer2   r   rA   r  r  r   r   r   r  rQ  rS  rT  rV  r8  r   rO  r^  rc  rp  rd  rh  r   r   r   r   <module>   s   
 2u   ?  J%	#4