a
    èÝEbÀ„  ã                   @   s†  d dl mZ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	m
Z
mZ e 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sºJ dƒ‚G dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd „ d eƒZG d!d"„ d"eƒZ ee d#œZ!d$d%„ Z"g d&¢Z#d'd(„ Z$e$ƒ Z%G d)d*„ d*eƒZ&G d+d,„ d,eƒZ'dS )-é    )ÚTagÚ	bytesjoiné   )ÚDefaultTableN)ÚIteratorÚ
NamedTupleÚOptionalc                   @   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   ú]/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/ttLib/tables/otBase.pyÚ__init__   s
    



zOverflowErrorRecord.__init__c              
   C   s$   t | jd| jd| jd| jd| jf	ƒS )NzLookupIndex:zSubTableIndex:z	ItemName:z
ItemIndex:)Ústrr   r   r   r   r   ©r   r   r   r   Ú__repr__   s    zOverflowErrorRecord.__repr__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r	      s   r	   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚOTLOffsetOverflowErrorc                 C   s
   || _ d S ©N©Úvalue)r   ÚoverflowErrorRecordr   r   r   r      s    zOTLOffsetOverflowError.__init__c                 C   s
   t | jƒS r   )Úreprr   r   r   r   r   Ú__str__   s    zOTLOffsetOverflowError.__str__N)r   r   r   r   r"   r   r   r   r   r      s   r   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚBaseTTXConverterzÉGeneric 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%   ÚOTTableReaderr'   ÚgetattrÚtableÚ	decompile)r   ÚdataÚfontr%   ÚreaderÚ
tableClassr   r   r   r,   %   s
    zBaseTTXConverter.decompilec           	   
   C   sÒ   d}z$t | jd�}| j ||¡ | ¡ W S  tyÊ } zŠ||jkrD‚ |j}t d|¡ |}d}|j	du r€ddl
m} |||ƒ}nddl
m} |||ƒ}|s¶ddl
m} |||ƒ}|s¶‚ W Y d}~qd}~0 0 qdS )z=Compiles the table into binary. Called automatically on save.Nr&   z+Attempting to fix OTLOffsetOverflowError %sr   r   )ÚfixLookupOverFlows)ÚfixSubTableOverFlows)ÚOTTableWriterr'   r+   ÚcompileÚ
getAllDatar   r   ÚlogÚinfor   r%   r1   r2   )	r   r.   ZoverflowRecordÚwriterÚeZlastItemÚokr1   r2   r   r   r   r4   -   s,    




zBaseTTXConverter.compilec                 C   s   | j  ||¡ d S r   )r+   ÚtoXML2)r   r8   r.   r   r   r   ÚtoXMLe   s    zBaseTTXConverter.toXMLc                 C   sJ   ddl m} t| dƒs*t|| jƒ}|ƒ | _| j ||||¡ | j ¡  d S )Nr   r$   r+   )r(   r%   Úhasattrr*   r'   r+   ÚfromXMLÚpopulateDefaults)r   ÚnameÚattrsÚcontentr.   r%   r0   r   r   r   r>   h   s    
zBaseTTXConverter.fromXMLc                 C   s   | j jdd� d S )NT)Úrecurse)r+   ÚensureDecompiledr   r   r   r   rD   p   s    z!BaseTTXConverter.ensureDecompiledN)	r   r   r   Ú__doc__r,   r4   r<   r>   rD   r   r   r   r   r#      s   8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 ):r)   z5Helper class to retrieve data from an OpenType table.©r-   ÚoffsetÚposÚ
localStater'   Nr   c                 C   s"   || _ || _|| _|| _|| _d S r   rG   )r   r-   rJ   rH   r'   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__r-   rJ   rH   r'   rI   ©r   Úotherr   r   r   Úcopy‹   s    zOTTableReader.copyc                 C   s    | j | }|  | j| j|| j¡S r   )rH   rP   r-   rJ   r'   )r   rH   r   r   r   ÚgetSubReader�   s    
zOTTableReader.getSubReaderc                 C   s6   | j }|| }t d|› �| j||… ¡\}|| _ |S ©Nú>©rI   ÚstructÚunpackr-   )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   Úarrayr-   Ú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   ÚreadInt8¢   s    zOTTableReader.readInt8c                 C   s   | j dd|d�S )Nrf   r   ©r[   rM   ©re   rL   r   r   r   ÚreadInt8Array¤   s    zOTTableReader.readInt8Arrayc                 C   s   | j ddd�S )NÚhr
   rg   rh   r   r   r   r   Ú	readShort§   s    zOTTableReader.readShortc                 C   s   | j dd|d�S )Nrm   r
   rj   rk   rL   r   r   r   ÚreadShortArray©   s    zOTTableReader.readShortArrayc                 C   s   | j ddd�S )NrF   r   rg   rh   r   r   r   r   ÚreadLong¬   s    zOTTableReader.readLongc                 C   s   | j dd|d�S )NrF   r   rj   rk   rL   r   r   r   ÚreadLongArray®   s    zOTTableReader.readLongArrayc                 C   s   | j ddd�S )NÚBr   rg   rh   r   r   r   r   Ú	readUInt8±   s    zOTTableReader.readUInt8c                 C   s   | j dd|d�S )Nrr   r   rj   rk   rL   r   r   r   ÚreadUInt8Array³   s    zOTTableReader.readUInt8Arrayc                 C   s   | j ddd�S )NÚHr
   rg   rh   r   r   r   r   Ú
readUShort¶   s    zOTTableReader.readUShortc                 C   s   | j dd|d�S )Nru   r
   rj   rk   rL   r   r   r   ÚreadUShortArray¸   s    zOTTableReader.readUShortArrayc                 C   s   | j ddd�S )NÚIr   rg   rh   r   r   r   r   Ú	readULong»   s    zOTTableReader.readULongc                 C   s   | j dd|d�S )Nrx   r   rj   rk   rL   r   r   r   ÚreadULongArray½   s    zOTTableReader.readULongArrayc                 C   s4   | j }|d }t dd| j||…  ¡\}|| _ |S )Nr   z>ló    rW   ©r   rI   r\   r   r   r   r   Ú
readUInt24À   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   r-   Úlenr|   r   r   r   ÚreadTagÉ   s    zOTTableReader.readTagc                 C   s&   | j }|| }| j||… }|| _ |S r   )rI   r-   )r   rM   rI   r\   r   r   r   r   ÚreadDataÑ   s
    zOTTableReader.readDatac                 C   s(   | j r| j  ¡ ntƒ }|||< || _ d S r   ©rJ   rS   Údict©r   r@   r   Ústater   r   r   Ú__setitem__Ø   s    zOTTableReader.__setitem__c                 C   s   | j o| j | S r   ©rJ   ©r   r@   r   r   r   Ú__getitem__Ý   s    zOTTableReader.__getitem__c                 C   s   | j o|| j v S r   r�   rŽ   r   r   r   Ú__contains__à   s    zOTTableReader.__contains__)Nr   N)r   r   r   rE   Ú	__slots__r   rN   rO   rS   rT   r]   re   ri   rl   rn   ro   rp   rq   rs   rt   rv   rw   ry   rz   r}   rƒ   r†   r‡   rŒ   r�   r�   r   r   r   r   r)   x   s8   
r)   c                   @   sH  e Zd ZdZdMdd„Zedd„ ƒZejdd„ ƒZd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdNd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d9d:„ Z d;d<„ Z!d=d>„ Z"d?d@„ Z#dAdB„ Z$dCdD„ Z%dOdEdF„Z&dGdH„ Z'dIdJ„ Z(dKdL„ Z)dS )Pr3   z=Helper class to gather and assemble data for OpenType tables.Nr
   c                 C   s(   g | _ d | _|| _|| _|| _d | _d S r   )ÚitemsrI   rJ   r'   Ú
offsetSizeÚparent)r   rJ   r'   r“   r   r   r   r   è   s    zOTTableWriter.__init__c                 C   s
   | j dkS r„   ©r“   r   r   r   r   Ú
longOffsetò   s    zOTTableWriter.longOffsetc                 C   s   |rdnd| _ d S )Nr   r
   r•   ©r   r   r   r   r   r–   ö   s    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   ÚgetCountDataÚgetData)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rTt|j| ƒ||< q |jdkržzt|j| ƒ||< W qÆ t	j
yš   |  |¡}t|ƒ‚Y qÆ0 q |jdkr¼t|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“   Ú	packULongÚ
packUShortrX   ÚerrorÚgetOverflowErrorRecordr   Ú
packUInt24Ú
ValueErrorr   )r   r’   rI   ÚnumItemsrF   r�   r    r   r   r   rš     s$    





zOTTableWriter.getDatac                 C   s
   t | jƒS r   )Úhashr’   r   r   r   r   Ú__hash__-  s    zOTTableWriter.__hash__c                 C   s   |   |¡}|tu r|S | S r   ©Ú__eq__ÚNotImplemented©r   rR   Úresultr   r   r   Ú__ne__1  s    
zOTTableWriter.__ne__c                 C   s,   t | ƒt |ƒkrtS | j|jko*| j|jkS r   )Útyper«   r“   r’   rQ   r   r   r   rª   5  s    zOTTableWriter.__eq__c                 C   sŽ   t | dƒ}t | dƒ}|ri }| j}tt|ƒƒD ]P}|| }t |dƒrR| ¡ ||< q.t |dƒr.| |¡ |s.| ||¡ ||< }q.t|ƒ| _d S )NÚ	ExtensionÚ	DontSharer™   rš   )r=   r’   r‚   r…   r™   Ú_doneWritingÚ
setdefaultÚtuple)r   ÚinternedTablesÚ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ƒr¶t|ƒD ]&}	| j|	 }
t|
dd ƒdkrrd} qšqrt |
ƒ|vr¶|
 |||¡ n |D ]T}	| j|	 }
t|
dƒsÔqº|rò|	d	kròt|
dd ƒdkròqºt |
ƒ|vrº|
 |||¡ qºqº| 	| ¡ d S )
NTr°   zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFÚsortCoverageLastr@   ZCoveragerš   r   )
Úidr…   r’   rŸ   r‚   Úreverser=   r*   Ú_gatherTablesÚappend)r   ÚtablesÚ	extTablesÚdoner¦   ZiRanger¶   Z
selfTablesr·   rF   r�   r   r   r   rº   ^  s8    	





zOTTableWriter._gatherTablesc           	      C   s¸   i }|   |¡ g }g }i }|  |||¡ | ¡  | ¡  d}|D ]}||_|| ¡  }q@|D ]}||_|| ¡  }q\g }|D ]}| ¡ }| |¡ q||D ]}| ¡ }| |¡ q˜t|ƒS )z+Assemble all data, including all subtables.r   )r²   rº   r¹   rI   rž   rš   r»   r   )	r   rµ   r¼   r½   r¾   rI   r+   r-   Z	tableDatar   r   r   r5   •  s.    
zOTTableWriter.getAllDatac                 C   s   | j | j| j|d�}| |_|S )Nr•   )rP   rJ   r'   r”   )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`   ra   rb   rc   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   Ú	writeInt8Æ  s    zOTTableWriter.writeInt8c                 C   s   |   d|¡ d S )Nrf   ©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 )Nrm   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 )Nrr   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 )Nru   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 )Nrx   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   rf   r   r   r   ÚwriteUInt24è  s    zOTTableWriter.writeUInt24c                 C   s   |D ]}|   |¡ qd S r   )rÝ   )r   rÄ   r   r   r   r   ÚwriteUInt24Arrayì  s    zOTTableWriter.writeUInt24Arrayc                 C   s0   t |ƒ ¡ }t|ƒdks J |ƒ‚| j |¡ d S r„   )r   rÃ   r…   r’   r»   )r   Útagr   r   r   ÚwriteTagð  s    zOTTableWriter.writeTagc                 C   s   | j  |¡ d S r   ©r’   r»   )r   Ú	subWriterr   r   r   ÚwriteSubTableõ  s    zOTTableWriter.writeSubTablec                 C   s    t ||||d�}| j |¡ |S )N)r›   r   )ÚCountReferencer’   r»   )r   r+   r@   r›   r   Úrefr   r   r   ÚwriteCountReferenceø  s    z!OTTableWriter.writeCountReferencec                 C   s    t j|f| Ž }| j |¡ d S r   rÜ   )r   ÚformatrÄ   r-   r   r   r   ÚwriteStructý  s    zOTTableWriter.writeStructc                 C   s   | j  |¡ d S r   rá   )r   r-   r   r   r   Ú	writeData  s    zOTTableWriter.writeDatac                 C   s  d  } } }}| j dkr"|j}nØ| j dkr:| j}|j}nÀt|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rÊd |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ê   r*   r=   r”   Újoinr	   r'   )r   r�   r   r   r   r   Úp1r   r   r   r£     s6    









z$OTTableWriter.getOverflowErrorRecord)NNr
   )r
   )r
   N)*r   r   r   rE   r   Úpropertyr–   ÚsetterrŒ   r�   r˜   rž   rš   r¨   r®   rª   r²   rº   r5   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   r3   ä   sP   



$7"

r3   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   )r+   r@   r›   ÚsetValue)r   r+   r@   r›   r   r   r   r   r   (  s
    zCountReference.__init__c                 C   sD   | j }| j}|| d u r"|||< n|| |ks@J ||| |fƒ‚d S r   ©r+   r@   )r   r   r+   r@   r   r   r   rò   .  s
    
zCountReference.setValuec                 C   s   | j | j S r   ró   r   r   r   r   ÚgetValue5  s    zCountReference.getValuec                 C   s.   | j | j }|d u rd}tttdœ| j |ƒS )Nr   )r   r
   r   )r+   r@   Ú	packUInt8r¡   r    r›   )r   Úvr   r   r   r™   7  s    zCountReference.getCountData)NN)r   r   r   rE   r   rò   rô   r™   r   r   r   r   rä   &  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¡   @  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    C  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¤   G  s    r¤   c                   @   s´   e Zd ZdZdd„ Zd'dd„Zedd„ ƒZd	d
„ Zdd„ Z	d(dd„Z
dd„ Zdd„ Zdd„ Zdd„ Zd)dd„Zdd„ Zdd„ Zdd„ Zd d!„ ZG d"d#„ d#eƒZee d$œd%d&„ZdS )*Ú	BaseTablez0Generic base class for all OpenType (sub)tables.c                 C   s@   | j  d¡}|r4| `| j}| `|  ||¡ t| |ƒS t|ƒ‚d S ©Nr/   )Ú__dict__Úgetr/   r.   r,   r*   ÚAttributeError)r   Úattrr/   r.   r   r   r   Ú__getattr__P  s    
zBaseTable.__getattr__Fc                 C   sL   | j  d¡}|r*| `| j}| `|  ||¡ |rH|  ¡ D ]}|j |¡ q6d S rù   )rú   rû   r/   r.   r,   ÚiterSubTablesr   rD   )r   rC   r/   r.   Zsubtabler   r   r   rD   [  s    zBaseTable.ensureDecompiledc                 C   sh   d}| j D ]X}| |¡}|tu r(t  S d}|jrV|j|v rN||j |j }nt  S ||| 7 }q
|S )Nr   r   )Ú
convertersÚgetRecordSizer«   ÚrepeatÚaux)Úclsr/   Z	totalSizeÚconvr›   Ú
countValuer   r   r   r  f  s    


zBaseTable.getRecordSizec                 C   s   | j S r   )r   r   r   r   r   ÚgetConvertersu  s    zBaseTable.getConvertersc                 C   s
   | j | S r   )ÚconvertersByNamerŽ   r   r   r   ÚgetConverterByNamex  s    zBaseTable.getConverterByNameNc              	   C   sØ   |   ¡ D ]Ê}|jr”t| |jƒs,t| |jg ƒ tt| |jƒƒ|j }z|  |j¡}t| |j|ƒ W qÒ t	y�   |rŒ|j|v rŒ||j  
|¡ Y qÒ0 q|jr¬t|jd | jƒs¬qt| |jƒrºqt|dƒrt| |jd ƒ qd S )NZwriteNullOffset)r  r  r=   r@   Úsetattrr…   r*   r  r	  ÚKeyErrorrò   Úevalrú   )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rìt|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getConverterr'   r  Ú
isinstanceÚintr  re   r  ÚreadÚisPropagatedÚ	ExceptionÚargsr=   r  rú   Úupdate)r   r/   r.   r+   r  r  r9   r@   r   r   r   r,   “  sP    

ÿ
ÿ

ÿ


zBaseTable.decompilec                 C   s  |   ¡  t| dƒr8t| dƒ }|  |¡}|o4t| dƒ}nd}| j ¡ }|  ¡ D ]0}|jrN|jrN| |j	¡}t
|tƒrN|||j	< qNt| dƒr�d|_t| dƒr d|_t| jdƒr¾|d  | jj¡ |  |¡ |  ¡ D �]$}| |j	¡}|j�r¼|d u rög }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�r‚t|jd |ƒ�s‚qÐz|  ||||¡ 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=   r  rú   rS   r  ZisCountr  rû   r@   r  rä   r·   r±   rP   rò   r  ÚwriteFormatr  r…   r  r  rÆ   r  r  r[   r›   ré   rô   ræ   ZisLookupTyper  Úwriter   r  )r   r8   r.   ZdeleteFormatr+   r  r   r  r9   rå   r@   r   r   r   r4   À  s|    






(




zBaseTable.compilec                 C   s   d S r   r   ©r   r/   r   r   r   r    s    zBaseTable.readFormatc                 C   s   d S r   r   ©r   r8   r   r   r   r  !  s    zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d u rg }t| dƒr6|d| jfg }| ||¡ | ¡  |  ||¡ | |¡ | ¡  d S )Nr  )rP   r   r=   r  ÚbegintagÚnewliner;   Úendtag)r   Ú	xmlWriterr.   rA   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  r*   r@   r‚   r…   ZxmlWriter  r  Úvars)r   r   r.   r  r   rF   r�   r   r   r   r;   0  s    ÿzBaseTable.toXML2c                 C   s~   z|   |¡}W n ty"   ‚ Y n0 | |||¡}|jrlt| |jd ƒ}|d u r`g }t| |j|ƒ | |¡ nt| |j|ƒ d S r   )r	  r  ZxmlReadr  r*   r@   r
  r»   )r   r@   rA   rB   r.   r  r   Úseqr   r   r   r>   A  s    zBaseTable.fromXMLc                 C   s   |   |¡}|tu r|S | S r   r©   r¬   r   r   r   r®   P  s    
zBaseTable.__ne__c                 C   s0   t | ƒt |ƒkrtS |  ¡  | ¡  | j|jkS r   )r¯   r«   rD   rú   rQ   r   r   r   rª   T  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   Nr!  )	r   r   r   rE   r   Ú__annotations__r!  r   r  r   r   r   r   ÚSubTableEntry]  s   
r%  )Úreturnc                 #   sp   ˆ  ¡ D ]b}|j‰ tˆˆ dƒ}|du r(qt|tƒrBˆ ˆ |¡V  qt|tƒr‡ ‡fdd„t|ƒD ƒE dH  qdS )a  Yield (name, value, index) namedtuples for all subtables of current table.

		A sub-table is an instance of BaseTable (or subclass thereof) that is a child
		of self, the current parent table.
		The tuples also contain the attribute name (str) of the of parent table to get
		a subtable, and optionally, for lists of subtables (i.e. attributes associated
		with a converter that has a 'repeat'), an index into the list containing the
		given subtable value.
		This method can be useful to traverse trees of otTables.
		Nc                 3   s,   | ]$\}}t |tƒrˆjˆ ||d �V  qdS ))r!  N)r  rø   r%  )r~   rF   rö   ©r@   r   r   r   Ú	<genexpr>v  s   
þz*BaseTable.iterSubTables.<locals>.<genexpr>)r  r@   r*   r  rø   r%  rŸ   Ú	enumerate)r   r  r   r   r'  r   rÿ   c  s    

þzBaseTable.iterSubTables)F)N)NN)r   r   r   rE   rþ   rD   Úclassmethodr  r  r	  r?   r,   r4   r  r  r<   r;   r>   r®   rª   r   r%  r   rÿ   r   r   r   r   rø   L  s&   


-^
	rø   c                   @   sF   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S )ÚFormatSwitchingBaseTablezsMinor specialization of BaseTable, for tables that have multiple
	formats, eg. CoverageFormat1 vs. CoverageFormat2.c                 C   s   t S r   )r«   )r  r/   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   r	  ’  s    z+FormatSwitchingBaseTable.getConverterByNamec                 C   s   |  ¡ | _d S r   )rv   r  r  r   r   r   r  •  s    z#FormatSwitchingBaseTable.readFormatc                 C   s   |  | j¡ d S r   )rÖ   r  r  r   r   r   r  ˜  s    z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t  | ||||¡ d S r   )rø   r<   )r   r   r.   rA   r@   r   r   r   r<   ›  s    zFormatSwitchingBaseTable.toXML)NN)r   r   r   rE   r*  r  r  r	  r  r  r<   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   )rs   r  r  r   r   r   r     s    z(UInt8FormatSwitchingBaseTable.readFormatc                 C   s   |  | j¡ d S r   )rÓ   r  r  r   r   r   r  £  s    z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r   r   r  r  r   r   r   r   r-  Ÿ  s   r-  )Zuint16Zuint8c                 C   s0   z
t |  W S  ty*   td| ›�ƒ‚Y n0 d S )NzUnsupported format type: )ÚformatSwitchingBaseTablesr  Ú	TypeError)Z
formatTyper   r   r   Ú getFormatSwitchingBaseTableClass¬  s    
r0  ))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    r:  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚValueRecordFactoryz6Given a format code, this object convert ValueRecords.c                 C   s8   g }t D ]$\}}}}||@ r| |||f¡ q|| _d S r   )r5  r»   rç   )r   ÚvalueFormatrç   r7  r@   r8  r9  r   r   r   r   Ý  s
    zValueRecordFactory.__init__c                 C   s
   t | jƒS r   )r…   rç   r   r   r   r   Ú__len__ä  s    zValueRecordFactory.__len__c                 C   s†   | j }|sd S tƒ }|D ]h\}}}|r0| ¡ }n| ¡ }|rt|rpddlm}	 | |¡}
t|	|ƒƒ }| |
|¡ nd }t	|||ƒ q|S ©Nr   r$   )
rç   ÚValueRecordrn   rv   r(   r%   rT   r*   r,   r
  )r   r/   r.   rç   ÚvalueRecordr@   r8  r9  r   r%   Z	subReaderr   r   r   ÚreadValueRecordç  s"    

z"ValueRecordFactory.readValueRecordc           	      C   sp   | j D ]d\}}}t||dƒ}|rP|rD| ¡ }| |¡ | ||¡ qj| d¡ q|r`| |¡ q| |¡ qd S ©Nr   )rç   r*   r¿   rã   r4   rÖ   rÍ   )	r   r8   r.   r@  r@   r8  r9  r   râ   r   r   r   ÚwriteValueRecordü  s    
z#ValueRecordFactory.writeValueRecordN)r   r   r   rE   r   r=  rA  rC  r   r   r   r   r;  Ù  s
   r;  c                   @   sH   e Zd Zddd„Zdd„ Zdd„ Zddd	„Zd
d„ Zdd„ Zdd„ Z	dS )r?  Nc           	      C   s„   |d urlt D ](\}}}}||@ rt| ||r.d ndƒ q|d ur€|j ¡ D ] \}}t| |ƒs\qHt| ||ƒ qHn|d ur€|j ¡ | _d S rB  )r5  r
  rú   r’   r=   rS   )	r   r<  Úsrcr7  r@   r8  r9  ÚkeyÚvalr   r   r   r     s    
zValueRecord.__init__c                 C   s(   d}| j  ¡ D ]}|t| d B }q|S rB  )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 rB  )rú   r’   rH  )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   r1  )r@   )
rŸ   r5  r=   r»   r*   r  r  r<   r  Z	simpletag)r   r   r.   Z	valueNamerA   ZsimpleItemsr7  r@   r8  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 r>  )	r(   r%   r’   r
  r  r  r´   r*   r>   )r   r@   rA   rB   r.   r%   Úkrö   Úelementr   Zelem2Zname2Zattrs2Zcontent2r   r   r   r>   D  s    



zValueRecord.fromXMLc                 C   s   |   |¡}|tu r|S | S r   r©   r¬   r   r   r   r®   T  s    
zValueRecord.__ne__c                 C   s    t | ƒt |ƒkrtS | j|jkS r   )r¯   r«   rú   rQ   r   r   r   rª   X  s    zValueRecord.__eq__)NN)N)
r   r   r   r   rI  rJ  r<   r>   r®   rª   r   r   r   r   r?    s   

r?  )(ZfontTools.misc.textToolsr   r   r   ra   r`   rX   ÚloggingÚtypingr   r   r   Ú	getLoggerr   r6   Úobjectr	   r  r   r#   r…   rÁ   Úitemsizer)   r3   rä   rõ   r¡   r    r¤   rø   r+  r-  r.  r0  r5  r:  rH  r;  r?  r   r   r   r   Ú<module>   sF   
Wl  D  3"	þ3