a
    ZXh                     @   s6  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(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/Z0e/e0d-Z1d.d/ Z2e d:e.ee3 ee4 d0d1d2Z5g d3Z6d4d5 Z7e7 Z8G d6d7 d7eZ9G d8d9 d9eZ:dS );    )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   b/var/www/viveiro_mudafortebrasil/venv/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   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   W   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   `   sf    







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,   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"   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   readInt80  s    zOTTableReader.readInt8c                 C   s   | j dd|dS )Nr   r   ry   rk   r   rj   r   r   r   readInt8Array3  s    zOTTableReader.readInt8Arrayc                 C   s   | j dddS )Nhr   r   r   r   r   r   r   	readShort6  s    zOTTableReader.readShortc                 C   s   | j dd|dS )Nr   r   r   r   rj   r   r   r   readShortArray9  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   	readUInt8B  s    zOTTableReader.readUInt8c                 C   s   | j dd|dS )Nr   r   r   r   rj   r   r   r   readUInt8ArrayE  s    zOTTableReader.readUInt8Arrayc                 C   s   | j dddS )NHr   r   r   r   r   r   r   
readUShortH  s    zOTTableReader.readUShortc                 C   s   | j dd|dS )Nr   r   r   r   rj   r   r   r   readUShortArrayK  s    zOTTableReader.readUShortArrayc                 C   s   | j dddS )NIr   r   r   r   r   r   r   	readULongN  s    zOTTableReader.readULongc                 C   s   | j dd|dS )Nr   r   r   r   rj   r   r   r   readULongArrayQ  s    zOTTableReader.readULongArrayc                 C   s4   | j }|d }tdd| j||  \}|| _ |S )Nr   z>l    ru   r   rg   rz   r$   r   r   r   
readUInt24T  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   readUInt24Array[  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   readDataf  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__m  s    zOTTableReader.__setitem__c                 C   s   | j o| j | S r"   rh   r   r^   r   r   r   __getitem__r  s    zOTTableReader.__getitem__c                 C   s   | j o|| j v S r"   r   r   r   r   r   __contains__u  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                   @   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   z  s    zOffsetToWriter.__init__c                 C   s,   t | t |krtS | j|jko*| j|jkS r"   )rQ   NotImplementedr   r   ro   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   y  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 )Vr@   z=Helper class to gather and assemble data for OpenType tables.Nc                 C   s(   g | _ d | _|| _|| _d | _d| _d S )N<none>)itemsrg   rh   r0   parentr^   )r   rh   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y   | |j}t|Y q0 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   rg   r   r   r[   r   	packULongr   
packUShortrv   errorgetOverflowErrorRecordr!   
packUInt24rN   r   )r   r   rg   numItemsrd   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 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"   )r   r   r   r   r   r   r     s    zOTTableWriter.__hash__c                 C   s   |  |}|tu r|S | S r"   r   r   r   rp   resultr   r   r   __ne__  s    
zOTTableWriter.__ne__c                 C   s    t | t |krtS | j|jkS r"   )rQ   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 ]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   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 ]2}	| j|	 }
t|
drrt|
jdd dkrrd} qqrt |
j|vr|
j	||| n |D ]`}	| j|	 }
t|
dsq|r
|	d	kr
t|
jdd dkr
qt |
j|v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[   r3   r   _gatherTablesappend)r   tables	extTablesdoner   ZiRanger   Z
selfTablesr   rd   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||vr|||||| }}n|t| }| |  qqBd}d}t| jD ]\}}t|dr|}n&t|dr||j7 }qn|t| }qt|j	|v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_idxrd   r   Z	child_idxZ
offset_posrg   Z	real_edger   r   r   r   K  sV    










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     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     s0    
zOTTableWriter.getAllDatac                 C   s   |  | j| j}| |_|S r"   )rn   rh   r0   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   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 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"   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	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^   r   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    rc   r   r   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@     sN   

(@9!
#

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   G  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  N  s
    
zCountReference.setValuec                 C   s   | j | j S r"   r  r   r   r   r   getValueV  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   Y  s    zCountReference.getCountData)NN)r   r   r    rc   r   r  r  r   r   r   r   r   r  D  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   d  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   h  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   m  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__u  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     s    zBaseTable.ensureDecompiledc                 C   s0   d| j v r*| j  }| j d  |d< |S | j S r  )r   rq   )r   rF   r   r   r   __getstate__  s
    

zBaseTable.__getstate__c                 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   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	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*  r0  KeyErrorr  evalr   r1  )r   Z
propagatorr,  r-  Z
count_convr   r   r   r]     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   r4  readisPropagated	Exceptionargsr[   r6  r   update)r   r8   r7   r4   r,  r-  rJ   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 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   Tr5  zexpected %d values, got %dr#   z[])#rb   r[   r?  r   rq   r.  ZisCountr;  r!  r^   r8  r  r   r   rn   r  r5  writeFormatr)  r   r*  r9  r   r<  r=  ry   r   r  r  r  ZisLookupTyper4  writer   r@  )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   r7  T  s    zBaseTable.readFormatc                 C   s   d S r"   r   rU   r   r   r   rA  W  s    zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d u rg }t| dr6|d| jfg }||| |  | || || |  d S )Nr@  )rn   r   r[   r@  begintagnewlinerY   endtag)r   	xmlWriterr7   r_   r^   Z	tableNamer   r   r   rZ   Z  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*  r4  vars)r   rG  r7   r,  r$   rd   r   r   r   r   rY   f  s    zBaseTable.toXML2c                 C   s   z|  |}W n ty"    Y n0 ||||}|jd urpt| |jd }|d u rdg }t| |j| || nt| |j| d S r"   )r0  r3  ZxmlReadr)  r3   r^   r2  r   )r   r^   r_   r`   r7   r,  r$   seqr   r   r   r\   x  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$   NrH  )	r   r   r    rc   r   __annotations__rH  r   r9  r   r   r   r   SubTableEntry  s   
rL  )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 )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 ))rH  N)r8  r  rL  )r   rd   r  r^   r   r   r   	<genexpr>  s   
z*BaseTable.iterSubTables.<locals>.<genexpr>)r.  r^   r3   r8  r  rL  r   r   )r   r,  r$   r   rN  r   r%    s    

zBaseTable.iterSubTablesc                 C   s
   t | jS r"   )getVariableAttrsrn   r   r   r   r   rP    s    zBaseTable.getVariableAttrs)F)N)NN)r   r   r    rc   r$  rb   r&  classmethodr(  r.  r0  r]   r5   rA   r7  rA  rZ   rY   r\   r   r   r
   rL  r	   r%  rP  r   r   r   r   r  r  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   s2   z
| j }W n ty    g  Y S 0 | 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   r0    s    z+FormatSwitchingBaseTable.getConverterByNamec                 C   s   |  | _d S r"   )r   r@  rC  r   r   r   r7    s    z#FormatSwitchingBaseTable.readFormatc                 C   s   | | j d S r"   )r   r@  rU   r   r   r   rA    s    z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t | |||| d S r"   )r  rZ   )r   rG  r7   r_   r^   r   r   r   rZ     s    zFormatSwitchingBaseTable.toXMLc                 C   s   t | j| jS r"   )rP  rn   r@  r   r   r   r   rP    s    z)FormatSwitchingBaseTable.getVariableAttrs)NN)r   r   r    rc   rQ  r(  r.  r0  r7  rA  rZ   rP  r   r   r   r   rR    s   

rR  c                   @   s   e Zd Zdd Zdd ZdS )UInt8FormatSwitchingBaseTablec                 C   s   |  | _d S r"   )r   r@  rC  r   r   r   r7    s    z(UInt8FormatSwitchingBaseTable.readFormatc                 C   s   | | j d S r"   )r   r@  rU   r   r   r   rA    s    z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r   r    r7  rA  r   r   r   r   rT    s   rT  )Zuint16Zuint8c                 C   s0   z
t |  W S  ty*   td| Y n0 d S )NzUnsupported format type: )formatSwitchingBaseTablesr3  	TypeError)Z
formatTyper   r   r    getFormatSwitchingBaseTableClass  s    
rW  )r+  rS  rM  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  rV  rR  r   r/  r   ZgetVarIndexOffsetr   sortedr   )r+  rS  r'  ZvarAttrsr^   r,  rf   r   r   r   rP    s    


rP  ))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    rd  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  ra  r^   rb  rc  r   r   r   r   ;  s
    zValueRecordFactory.__init__c                 C   s
   t | jS r"   )r   r  r   r   r   r   __len__B  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   r2  )r   r8   r7   r  valueRecordr^   rb  rc  r$   r.   Z	subReaderr   r   r   readValueRecordE  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  rA   r   r   )	r   rI   r7   rj  r^   rb  rc  r$   r   r   r   r   writeValueRecord[  s    z#ValueRecordFactory.writeValueRecordN)r   r   r    rc   r   rg  rk  rl  r   r   r   r   re  8  s
   re  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 )ri  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 Nr   )r_  r2  r   r   r[   rq   )	r   rf  srcra  r^   rb  rc  rX  valr   r   r   r   n  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   rq  )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   rD  rE  rZ   rF  Z	simpletag)r   rG  r7   Z	valueNamer_   ZsimpleItemsra  r^   rb  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 rh  )	r1   r.   r   r2  r9  r8  r   r3   r\   )r   r^   r_   r`   r7   r.   kr  elementr$   Zelem2Zname2Zattrs2Zcontent2r   r   r   r\     s    



zValueRecord.fromXMLc                 C   s   |  |}|tu 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"   )rQ   r   r   ro   r   r   r   r     s    zValueRecord.__eq__)NN)N)
r   r   r    r   rr  rs  rZ   r\   r   r   r   r   r   r   ri  k  s   

ri  )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   r  rR  rT  rU  rW  r9  r   rP  r_  rd  rq  re  ri  r   r   r   r   <module>   sf   
 1t   ?  L$	!3