a
    Qhk                     @   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   V/var/www/sistema_ama/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)GSUBGPOSFz>hb.repack disabled, compiling '%s' with pure-python serializerTzNo module named 'uharfbuzz'z?uharfbuzz not found, compiling '%s' with pure-python serializer)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   rC   `   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   rK   rI   rL   	error_msgr   r   r   rD      s    z#BaseTTXConverter.tryPackingHarfbuzzc                 C   s   |  S r"   )rU   r   rK   r   r   r   rE      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.   rX   rY   )r   r7   rL   rJ   rM   rG   rX   rY   r   r   r   rF      s    


z#BaseTTXConverter.tryResolveOverflowc                 C   s   | j || d S r"   )r4   toXML2)r   rK   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   rc   r   r   r   rd      s    z!BaseTTXConverter.ensureDecompiledN)T)r   r   r    __doc__r5   rC   rD   rE   rF   r\   r^   rd   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"   rg   )r   r6   rj   rh   r0   r   r   r   r   
  s
    zOTTableReader.__init__c                 C   s   |  j |7  _ d S r"   ri   r   countr   r   r   advance  s    zOTTableReader.advancec                 C   s
   || _ d S r"   rk   )r   ri   r   r   r   seek  s    zOTTableReader.seekc                 C   s$   |  | j| j| j| j}| j|_|S r"   )	__class__r6   rj   rh   r0   ri   r   otherr   r   r   copy  s    zOTTableReader.copyc                 C   s    | j | }| | j| j|| jS r"   )rh   rp   r6   rj   r0   )r   rh   r   r   r   getSubReader  s    
zOTTableReader.getSubReaderc                 C   s6   | j }|| }td| | j|| \}|| _ |S N>ri   structunpackr6   )r   typecode
staticSizeri   newposr$   r   r   r   	readValue   s
    zOTTableReader.readValuec                 C   sH   | j }|||  }t|| j|| }tjdkr:|  || _ | S Nbig)ri   arrayr6   sys	byteorderbyteswaptolist)r   rz   r{   rm   ri   r|   r$   r   r   r   	readArray'  s    
zOTTableReader.readArrayc                 C   s   | j dddS )Nbr   r{   r}   r   r   r   r   readInt80  s    zOTTableReader.readInt8c                 C   s   | j dd|dS )Nr   r   r{   rm   r   rl   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   rl   r   r   r   readShortArray9  s    zOTTableReader.readShortArrayc                 C   s   | j dddS )Nrf   r   r   r   r   r   r   r   readLong<  s    zOTTableReader.readLongc                 C   s   | j dd|dS )Nrf   r   r   r   rl   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   rl   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   rl   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   rl   r   r   r   readULongArrayQ  s    zOTTableReader.readULongArrayc                 C   s4   | j }|d }tdd| j||  \}|| _ |S )Nr   z>l    rw   r   ri   r|   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>)rangerl   r   r   r   readUInt24Array[  s    zOTTableReader.readUInt24Arrayc                 C   s>   | j }|d }t| j|| }t|dks4J ||| _ |S Nr   )ri   r   r6   lenr   r   r   r   readTag^  s    zOTTableReader.readTagc                 C   s&   | j }|| }| j|| }|| _ |S r"   )ri   r6   )r   rm   ri   r|   r$   r   r   r   readDataf  s
    zOTTableReader.readDatac                 C   s(   | j r| j  nt }|||< || _ d S r"   rj   rs   dictr   r`   r$   rH   r   r   r   __setitem__m  s    zOTTableReader.__setitem__c                 C   s   | j o| j | S r"   rj   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    re   	__slots__r   rn   ro   rs   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   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"   )rS   NotImplementedr   r   rq   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 )VrB   z=Helper class to gather and assemble data for OpenType tables.Nc                 C   s"   g | _ d | _|| _|| _d | _d S r"   )itemsri   rj   r0   parent)r   rj   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   ri   r   r   r]   r   	packULongr   
packUShortrx   errorgetOverflowErrorRecordr!   
packUInt24rP   r   )r   r   ri   numItemsrf   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   rP   r   )r   r   Z	packFuncsrf   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   rr   resultr   r   r   __ne__  s    
zOTTableWriter.__ne__c                 C   s    t | t |krtS | j|jkS r"   )rS   r   r   rq   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   rf   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   rf   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_idxrf   r   Z	child_idxZ
offset_posri   Z	real_edger   r   r   r   J  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   ri   r   r   r   r]   rR   r   r   r   )r   r0   r   r   r   r   r   r   ri   r4   r6   	tableDatar   r   r   rO     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   ri   r   r   r   r   )
r   rN   r   r   r   r   ri   r4   r6   r   r   r   r   rU     s0    
zOTTableWriter.getAllDatac                 C   s   |  | j| j}| |_|S r"   )rp   rj   r0   r   )r   Z	subwriterr   r   r   getSubWriter  s    zOTTableWriter.getSubWriterc                 C   s   | j td| | d S ru   r   r   rx   pack)r   rz   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   rz   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 )Nrf   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   rx   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 )
N
LookupList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    re   r   r   r   r   r   r   r   r   r   r   r   r   r   rO   rU   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   rB     sN   

(@9!
#

rB   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   F  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  M  s
    
zCountReference.setValuec                 C   s   | j | j S r"   r  r   r   r   r   getValueU  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   X  s    zCountReference.getCountData)NN)r   r   r    re   r   r  r  r   r   r   r   r   r  C  s
   
r  c                 C   s   t d| S )Nr   rx   r   r#   r   r   r   r  _  s    r  c                 C   s   t d| S )Nr   r   r#   r   r   r   r   c  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   g  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   l  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__t  s    
zBaseTable.__getattr__Fc                 C   sL   | j d}|r*| `| j}| `| || |rH|  D ]}|j| q6d S r"  )r#  r$  r8   r7   r5   iterSubTablesr$   rd   )r   rc   r8   r7   subtabler   r   r   rd     s    zBaseTable.ensureDecompiledc                 C   s0   d| j v r*| j  }| j d  |d< |S | j S r"  )r#  rs   )r   rH   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)r2  r-  r]   r`   setattrr   r3   r.  r4  KeyErrorr  evalr#  r5  )r   
propagatorr0  r1  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ExtensionLookupTypeFeatureParams
FeatureTagZ	SubStructZ	MorphTypepostRead)
readFormatZ_BaseTable__rawTabler2  r`   ZgetConverterr0   r-  
isinstanceintr.  r   r8  readisPropagated	Exceptionargsr]   r=  r#  update)r   r8   r7   r4   r0  r1  rL   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   Tr:  zexpected %d values, got %dr#   z[])#rd   r]   rF  r#  rs   r2  ZisCountrB  r$  r`   r?  r  r   r   rp   r  r:  writeFormatr-  r   r.  r@  r   rC  rD  r{   r   r  r  r  ZisLookupTyper8  writer   rG  )r   rK   r7   ZdeleteFormatr4   r0  r$   r1  rL   r  r`   r   r   r   rC     s    












zBaseTable.compilec                 C   s   d S r"   r   r   r8   r   r   r   r>  S  s    zBaseTable.readFormatc                 C   s   d S r"   r   rW   r   r   r   rH  V  s    zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d u rg }t| dr6|d| jfg }||| |  | || || |  d S )NrG  )rp   r   r]   rG  begintagnewliner[   endtag)r   	xmlWriterr7   ra   r`   	tableNamer   r   r   r\   Y  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)
r2  r-  r3   r`   r   r   xmlWriter.  r8  vars)r   rN  r7   r0  r$   rf   r   r   r   r   r[   e  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"   )r4  r7  ZxmlReadr-  r3   r`   r6  r   )r   r`   ra   rb   r7   r0  r$   seqr   r   r   r^   w  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"   )rS   r   rd   r#  rq   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$   NrP  )	r   r   r    re   r   __annotations__rP  r   r@  r   r   r   r   SubTableEntry  s   
rU  )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 ))rP  N)r?  r!  rU  )r   rf   r  r`   r   r   r   	<genexpr>  s   
z*BaseTable.iterSubTables.<locals>.<genexpr>)r2  r`   r3   r?  r!  rU  r   r   )r   r0  r$   r   rW  r   r(    s    

zBaseTable.iterSubTablesc                 C   s
   t | jS r"   )getVariableAttrsrp   r   r   r   r   rY    s    zBaseTable.getVariableAttrs)F)N)NN)r   r   r    re   r'  rd   r*  classmethodr,  r2  r4  r_   r5   rC   r>  rH  r\   r[   r^   r   r   r
   rU  r	   r(  rY  r   r   r   r   r!  q  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"   )rG  r%  r+  r$  )r   fmtr   r   r   r2    s
    

z&FormatSwitchingBaseTable.getConvertersc                 C   s   | j | j | S r"   )r3  rG  r   r   r   r   r4    s    z+FormatSwitchingBaseTable.getConverterByNamec                 C   s   |  | _d S r"   )r   rG  rJ  r   r   r   r>    s    z#FormatSwitchingBaseTable.readFormatc                 C   s   | | j d S r"   )r  rG  rW   r   r   r   rH    s    z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t | |||| d S r"   )r!  r\   )r   rN  r7   ra   r`   r   r   r   r\     s    zFormatSwitchingBaseTable.toXMLc                 C   s   t | j| jS r"   )rY  rp   rG  r   r   r   r   rY    s    z)FormatSwitchingBaseTable.getVariableAttrs)NN)r   r   r    re   rZ  r,  r2  r4  r>  rH  r\   rY  r   r   r   r   r[    s   

r[  c                   @   s   e Zd Zdd Zdd ZdS )UInt8FormatSwitchingBaseTablec                 C   s   |  | _d S r"   )r   rG  rJ  r   r   r   r>    s    z(UInt8FormatSwitchingBaseTable.readFormatc                 C   s   | | j d S r"   )r   rG  rW   r   r   r   rH    s    z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r   r    r>  rH  r   r   r   r   r]    s   r]  )Zuint16uint8c                 C   s0   z
t |  W S  ty*   td| Y n0 d S )NzUnsupported format type: )formatSwitchingBaseTablesr7  	TypeError)
formatTyper   r   r    getFormatSwitchingBaseTableClass  s    
rb  )r/  r\  rV  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!  r`  r[  r   r3  r   ZgetVarIndexOffsetr   sortedr   )r/  r\  r+  ZvarAttrsr`   r0  rh   r   r   r   rY    s    


rY  ))r   Z
XPlacementr   r   )r   Z
YPlacementr   r   )r   ZXAdvancer   r   )   ZYAdvancer   r   )   
XPlaDevicer   r   )    
YPlaDevicer   r   )@   
XAdvDevicer   r   )r   
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    rs  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"   )rn  r   r  )r   valueFormatr  rp  r`   rq  rr  r   r   r   r   :  s
    zValueRecordFactory.__init__c                 C   s
   t | jS r"   )r   r  r   r   r   r   __len__A  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.   rt   r3   r5   r6  )r   r8   r7   r  valueRecordr`   rq  rr  r$   r.   	subReaderr   r   r   readValueRecordD  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  rC   r  r   )	r   rK   r7   ry  r`   rq  rr  r$   r   r   r   r   writeValueRecordZ  s    z#ValueRecordFactory.writeValueRecordN)r   r   r    re   r   rv  r{  r|  r   r   r   r   rt  7  s
   rt  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 )rx  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   )rn  r6  r#  r   r]   rs   )	r   ru  srcrp  r`   rq  rr  rc  valr   r   r   r   m  s    
zValueRecord.__init__c                 C   s(   d}| j  D ]}|t| d B }q|S r}  )r#  keysvalueRecordFormatDict)r   r  r`   r   r   r   	getFormatz  s    zValueRecord.getFormatc                 C   s0   d}| j  D ]\}}|r|t| d B }q|S r}  )r#  r   r  )r   r  r`   r$   r   r   r   getEffectiveFormat  s
    zValueRecord.getEffectiveFormatc                 C   s   |d u rg }nt |}td d D ]*\}}}}	t| |r"||t| |f q"g }
tdd D ]6\}}}}	t| |r^t| |}|d ur^|
||f q^|
r||| |  |
D ] \}}|d ur|j|||d q|| |  n|	|| |  d S )Nr   rf  )r`   )
r   rn  r]   r   r3   rK  rL  r\   rM  	simpletag)r   rN  r7   Z	valueNamera   ZsimpleItemsrp  r`   rq  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 rw  )	r1   r.   r   r6  r@  r?  r   r3   r^   )r   r`   ra   rb   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"   )rS   r   r#  rq   r   r   r   r     s    zValueRecord.__eq__)NN)N)
r   r   r    r   r  r  r\   r^   r   r   r   r   r   r   rx  j  s   

rx  )N);fontTools.configr   fontTools.misc.textToolsr   r   r   enumr   r   r   rx   logging	functoolsr   typingr	   r
   r   r   	getLoggerr   r>   r@   Z	uharfbuzzrR   callabler3   rA   r=   objectr   rC  r!   r(   r,   r   r   itemsizer2   r   rB   r  r  r   r   r   r!  r[  r]  r_  rb  r@  r   rY  rn  rs  r  rt  rx  r   r   r   r   <module>   sf   
 1t   >  L$	!3