U
    »mœdÛÍ  ã                   @   sD  d dl mZ d dlmZmZ ddlmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlmZmZmZmZ e e¡Zd	Zzd dlZeeed
dƒƒZW n ek
r¶   Y nX ee› d� ZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!G dd„ deƒZ"e#e
 $dd ¡ƒdk�s t%‚e	 	d¡j&dk�s:t%dƒ‚G dd„ deƒZ'G dd„ deƒZ(G dd„ deƒZ)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ƒ dGe.ee3 ee4 d.œd/d0„ƒZ5d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@gZ6dAdB„ Z7e7ƒ Z8G dCdD„ dDeƒZ9G dEdF„ dFeƒZ:dS )Hé    )Ú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/home/sam/Atlas/atlas_env/lib/python3.8/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 )Ú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.   ÚOTTableReaderr0   ÚgetattrÚtableÚ	decompile)r   ÚdataÚfontr.   ÚreaderÚ
tableClassr   r   r   r5   X   s
    zBaseTTXConverter.decompilec           
   
   C   sn  d}|j t }| jdkr`|dkr0t d| j¡ n0ts`|dkrFtdƒ‚n|dksRt‚t d| j¡ |dkr~tr~| jdkr~tj	}ntj
}d}d}zpt| jd	�}| j ||¡ |tj	krÀ|  ||¡W S |tj
krÖ|  |¡W S |tjkrú|  |¡ t d
¡ tj	}W qŒ tk
�rf } zJd}|  |||¡}	|j}|	�r6W Y ¢&qŒ|tj	k�rTt d¡ tj}n‚ W 5 d}~X Y qŒX qŒdS )z=Compiles the table into binary. Called automatically on save.N)ZGSUBZGPOSFz>hb.repack disabled, compiling '%s' with pure-python serializerTzNo module named 'uharfbuzz'z?uharfbuzz not found, compiling '%s' with pure-python serializer)NTr/   zXRe-enabling sharing between extensions and switching back to harfbuzz+fontTools packing.zrHarfbuzz packing out of resolutions, disabling sharing between extensions and switching to fontTools only packing.)ÚcfgÚUSE_HARFBUZZ_REPACKERr0   ÚlogÚdebugÚhave_uharfbuzzÚImportErrorÚAssertionErrorr(   r*   r)   ÚOTTableWriterr4   ÚcompileÚtryPackingHarfbuzzÚtryPackingFontToolsr+   r!   ÚtryResolveOverflowr$   )
r   r7   ÚoverflowRecordZuse_hb_repackÚstateÚhb_first_error_loggedÚlastOverflowRecordÚwriterÚeÚokr   r   r   rB   a   sf    

þ
þÿþý



ÿ
ÿzBaseTTXConverter.compilec              
   C   sš   zt  d| j¡ | | j¡W S  tttjfk
r” } zR|stt|ƒj	› }t
|ƒdkr`|d|› �7 }t  d| j|¡ d}|jdd� W Y ¢S d }~X Y nX d S )Nzserializing '%s' with hb.repackr1   z: z`hb.repack failed to serialize '%s', attempting fonttools resolutions ; the error message was: %sTF)Úremove_duplicate)r<   r=   r0   ÚgetAllDataUsingHarfbuzzÚ
ValueErrorÚMemoryErrorÚhbZRepackerErrorÚtyper   r   ÚwarningÚ
getAllData)r   rJ   rH   rK   Ú	error_msgr   r   r   rC   ¼   s    üz#BaseTTXConverter.tryPackingHarfbuzzc                 C   s   |  ¡ S r"   )rT   ©r   rJ   r   r   r   rD   Ò   s    z$BaseTTXConverter.tryPackingFontToolsc                 C   sz   d}||j kr|S |j }t d|¡ |jd krFddlm} |||ƒ}nddlm} |||ƒ}|rd|S ddlm} |||ƒS )Nr   z+Attempting to fix OTLOffsetOverflowError %sr   )ÚfixLookupOverFlows)ÚfixSubTableOverFlows)r$   r<   Úinfor   r.   rW   rX   )r   r7   rK   rI   rL   rF   rW   rX   r   r   r   rE   Õ   s    


z#BaseTTXConverter.tryResolveOverflowc                 C   s   | j  ||¡ d S r"   )r4   ÚtoXML2)r   rJ   r7   r   r   r   ÚtoXMLñ   s    zBaseTTXConverter.toXMLc                 C   sJ   ddl m} t| dƒs*t|| jƒ}|ƒ | _| j ||||¡ | j ¡  d S )Nr   r-   r4   )r1   r.   Úhasattrr3   r0   r4   ÚfromXMLÚpopulateDefaults)r   ÚnameÚattrsÚcontentr7   r.   r9   r   r   r   r]   ô   s    
zBaseTTXConverter.fromXMLTc                 C   s   | j j|d� d S )N)Úrecurse)r4   ÚensureDecompiled)r   rb   r   r   r   rc   ý   s    z!BaseTTXConverter.ensureDecompiledN)T)r   r   r    Ú__doc__r5   rB   rC   rD   rE   r[   r]   rc   r   r   r   r   r,   Q   s   	[	r,   Úir   z#Oops, file a bug against fonttools.c                   @   sæ   e Zd ZdZdZd9dd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ ZdS ):r2   z5Helper class to retrieve data from an OpenType table.©r6   ÚoffsetÚposÚ
localStater0   Nr   c                 C   s"   || _ || _|| _|| _|| _d S r"   rf   )r   r6   ri   rg   r0   r   r   r   r     s
    zOTTableReader.__init__c                 C   s   |  j |7  _ d S r"   ©rh   ©r   Úcountr   r   r   Úadvance  s    zOTTableReader.advancec                 C   s
   || _ d S r"   rj   )r   rh   r   r   r   Úseek  s    zOTTableReader.seekc                 C   s$   |   | j| j| j| j¡}| j|_|S r"   )Ú	__class__r6   ri   rg   r0   rh   ©r   Úotherr   r   r   Úcopy  s    zOTTableReader.copyc                 C   s    | j | }|  | j| j|| j¡S r"   )rg   ro   r6   ri   r0   )r   rg   r   r   r   ÚgetSubReader  s    
zOTTableReader.getSubReaderc                 C   s6   | j }|| }t d|› �| j||… ¡\}|| _ |S ©Nú>©rh   ÚstructÚunpackr6   )r   ÚtypecodeÚ
staticSizerh   Únewposr$   r   r   r   Ú	readValue"  s
    zOTTableReader.readValuec                 C   sH   | j }|||  }t || j||… ¡}tjdkr:| ¡  || _ | ¡ S ©NÚbig)rh   Úarrayr6   ÚsysÚ	byteorderÚbyteswapÚtolist)r   ry   rz   rl   rh   r{   r$   r   r   r   Ú	readArray)  s    
zOTTableReader.readArrayc                 C   s   | j ddd�S )NÚbr   ©rz   ©r|   r   r   r   r   ÚreadInt82  s    zOTTableReader.readInt8c                 C   s   | j dd|d�S )Nr…   r   ©rz   rl   ©r„   rk   r   r   r   ÚreadInt8Array5  s    zOTTableReader.readInt8Arrayc                 C   s   | j ddd�S )NÚhr   r†   r‡   r   r   r   r   Ú	readShort8  s    zOTTableReader.readShortc                 C   s   | j dd|d�S )NrŒ   r   r‰   rŠ   rk   r   r   r   ÚreadShortArray;  s    zOTTableReader.readShortArrayc                 C   s   | j ddd�S )Nre   r   r†   r‡   r   r   r   r   ÚreadLong>  s    zOTTableReader.readLongc                 C   s   | j dd|d�S )Nre   r   r‰   rŠ   rk   r   r   r   ÚreadLongArrayA  s    zOTTableReader.readLongArrayc                 C   s   | j ddd�S )NÚBr   r†   r‡   r   r   r   r   Ú	readUInt8D  s    zOTTableReader.readUInt8c                 C   s   | j dd|d�S )Nr‘   r   r‰   rŠ   rk   r   r   r   ÚreadUInt8ArrayG  s    zOTTableReader.readUInt8Arrayc                 C   s   | j ddd�S )NÚHr   r†   r‡   r   r   r   r   Ú
readUShortJ  s    zOTTableReader.readUShortc                 C   s   | j dd|d�S )Nr”   r   r‰   rŠ   rk   r   r   r   ÚreadUShortArrayM  s    zOTTableReader.readUShortArrayc                 C   s   | j ddd�S )NÚIr   r†   r‡   r   r   r   r   Ú	readULongP  s    zOTTableReader.readULongc                 C   s   | j dd|d�S )Nr—   r   r‰   rŠ   rk   r   r   r   ÚreadULongArrayS  s    zOTTableReader.readULongArrayc                 C   s4   | j }|d }t dd| j||…  ¡\}|| _ |S )Nr   z>ló    rv   ©r   rh   r{   r$   r   r   r   Ú
readUInt24V  s
    zOTTableReader.readUInt24c                    s   ‡ fdd„t |ƒD ƒS )Nc                    s   g | ]}ˆ   ¡ ‘qS r   )rœ   )Ú.0Ú_r   r   r   Ú
<listcomp>^  s     z1OTTableReader.readUInt24Array.<locals>.<listcomp>)Úrangerk   r   r   r   ÚreadUInt24Array]  s    zOTTableReader.readUInt24Arrayc                 C   s>   | j }|d }t| j||… ƒ}t|ƒdks4t|ƒ‚|| _ |S ©Nr   )rh   r   r6   Úlenr@   r›   r   r   r   ÚreadTag`  s    zOTTableReader.readTagc                 C   s&   | j }|| }| j||… }|| _ |S r"   )rh   r6   )r   rl   rh   r{   r$   r   r   r   ÚreadDatah  s
    zOTTableReader.readDatac                 C   s(   | j r| j  ¡ ntƒ }|||< || _ d S r"   ©ri   rr   Údict©r   r_   r$   rG   r   r   r   Ú__setitem__o  s    zOTTableReader.__setitem__c                 C   s   | j o| j | S r"   ©ri   ©r   r_   r   r   r   Ú__getitem__t  s    zOTTableReader.__getitem__c                 C   s   | j o|| j kS r"   rª   r«   r   r   r   Ú__contains__w  s    zOTTableReader.__contains__)Nr   N)r   r   r    rd   Ú	__slots__r   rm   rn   rr   rs   r|   r„   rˆ   r‹   r�   rŽ   r�   r�   r’   r“   r•   r–   r˜   r™   rœ   r¡   r¤   r¥   r©   r¬   r­   r   r   r   r   r2     s8   
	r2   c                   @   sd  e Zd ZdZdUdd„Zedd„ ƒZejdd„ ƒZd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdVdd„Zdd„ Zd d!„ Zd"d#„ ZdWd%d&„ZdXd'd(„Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dYdMdN„Z)dOdP„ Z*dQdR„ Z+dSdT„ Z,dS )ZrA   z=Helper class to gather and assemble data for OpenType tables.Nr   c                 C   s(   g | _ d | _|| _|| _|| _d | _d S r"   )Úitemsrh   ri   r0   Ú
offsetSizeÚparent)r   ri   r0   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
k
rœ   |  |¡}t|ƒ‚Y qÈX 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¯   rh   r£   r    r\   r°   Ú	packULongÚ
packUShortrw   ÚerrorÚgetOverflowErrorRecordr!   Ú
packUInt24rO   r   )r   r¯   rh   ÚnumItemsre   rº   r%   r   r   r   r·   ª  s$    





zOTTableWriter.getDatac                 C   sb   t | jƒ}tttdœ}t|ƒD ]:\}}t|dƒr|j|krN||j dƒ||< qt|jƒ‚qt	|ƒS )zFAssemble the data for this writer/table with all offset field set to 0)r   r   r   r·   r   )
r¼   r¯   r¾   rÁ   r½   Ú	enumerater\   r°   rO   r   )r   r¯   Z	packFuncsre   rº   r   r   r   ÚgetDataForHarfbuzzÄ  s    


z OTTableWriter.getDataForHarfbuzzc                 C   s
   t | jƒS r"   )Úhashr¯   r   r   r   r   Ú__hash__Ò  s    zOTTableWriter.__hash__c                 C   s   |   |¡}|tkr|S | S r"   ©Ú__eq__ÚNotImplemented©r   rq   Úresultr   r   r   Ú__ne__Ö  s    
zOTTableWriter.__ne__c                 C   s,   t | ƒt |ƒkrtS | j|jko*| j|jkS r"   )rR   rÉ   r°   r¯   rp   r   r   r   rÈ   Ú  s    zOTTableWriter.__eq__Fc                 C   s–   t | dƒ}t | dƒ}|r |s i }| j}tt|ƒƒD ]T}|| }t |dƒrV| ¡ ||< q2t |dƒr2|j||d� |s2| ||¡ ||< }q2t|ƒ| _d S )NÚ	ExtensionÚ	DontSharer¶   r·   ©ÚshareExtension)r\   r¯   r    r£   r¶   Ú_doneWritingÚ
setdefaultÚtuple)r   ÚinternedTablesrÐ   ÚisExtensionZ	dontSharer¯   re   rº   r   r   r   rÑ   ß  s    



zOTTableWriter._doneWritingc                 C   s  d|t | ƒ< t| jƒ}tt|ƒƒ}| ¡  t| dƒ}|}|r\|d k	sLtdƒ‚|d i   }}}d}t| dƒr¶t|ƒD ]&}	| j|	 }
t|
dd ƒdkrrd} qšqrt |
ƒ|kr¶|
 	|||¡ n |D ]T}	| j|	 }
t|
dƒsÔqº|rò|	d	kròt|
dd ƒdkròqºt |
ƒ|krº|
 	|||¡ qºqº| 
| ¡ d S )
NTrÍ   zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFÚsortCoverageLastr_   ÚCoverager·   r   )Úidr£   r¯   r¼   r    Úreverser\   r@   r3   Ú_gatherTablesÚappend)r   ÚtablesÚ	extTablesÚdonerÂ   ZiRangerÕ   Z
selfTablesrÖ   re   rº   r   r   r   rÚ     sH    	

ÿþ



ÿþýzOTTableWriter._gatherTablesc                 C   s€  g }g }|}|D ]}	|  dd|	f¡ qd}
d}t| dƒržt| jƒD ]Z\}}t|dd ƒdkrBd}
t|ƒ|kr‚| |||||¡ }}n|t|ƒ }|  |¡  qžqBd}d}t| jƒD ]�\}}t|dƒrÈ|}n&t|dƒrà||j7 }q°n|t|ƒ }q°t|ƒ|k�r| |||||¡ }}n|t|ƒ }||j	|f}|  |¡ ||j	7 }q°|  | ¡ |  ||f¡ |d	7 }||t| ƒ< |
�r|| 
¡  |S )
Nr   FrÖ   r_   r×   Tr·   r¶   r   )rÛ   r\   rÃ   r¯   r3   rØ   Ú_gatherGraphForHarfbuzzr¸   r£   r°   Úpop)r   rÜ   Úobj_listrÞ   ÚobjidxÚvirtual_edgesZ
real_linksZvirtual_linksZitem_idxÚidxrÖ   Zcoverage_idxre   rº   Z	child_idxZ
offset_posrh   Z	real_edger   r   r   rß   @  sf    
    ÿ




    ÿ


z%OTTableWriter._gatherGraphForHarfbuzzc                 C   s¤   i }| j |dd� g }g }i }d}g }|  |||||¡ d}|D ]}	||	_||	 ¡  }q@g }
|D ]}	|	 ¡ }|
 |¡ q`ttdƒr”t t	|ƒ|
|¡S t 
|
|¡S dS )aÂ  The Whole table is represented as a Graph.
        Assemble graph data and call Harfbuzz repacker to pack the table.
        Harfbuzz repacker is faster and retain as much sub-table sharing as possible, see also:
        https://github.com/harfbuzz/harfbuzz/blob/main/docs/repacker.md
        The input format for hb.repack() method is explained here:
        https://github.com/harfbuzz/uharfbuzz/blob/main/src/uharfbuzz/_harfbuzz.pyx#L1149
        TrÏ   r   Úrepack_with_tagN)rÑ   rß   rh   r»   rÄ   rÛ   r\   rQ   rå   r   r   )r   r0   rÔ   rÜ   rá   rÞ   râ   rã   rh   r4   r6   Ú	tableDatar   r   r   rN   y  s&    
z%OTTableWriter.getAllDataUsingHarfbuzzTc           
      C   s¼   |ri }|   |¡ g }g }i }|  |||¡ | ¡  | ¡  d}|D ]}||_|| ¡  }qD|D ]}||_|| ¡  }q`g }|D ]}| ¡ }	| |	¡ q€|D ]}| ¡ }	| |	¡ qœt|ƒS )z+Assemble all data, including all subtables.r   )rÑ   rÚ   rÙ   rh   r»   r·   rÛ   r   )
r   rM   rÔ   rÜ   rÝ   rÞ   rh   r4   r6   ræ   r   r   r   rT   š  s0    
zOTTableWriter.getAllDatac                 C   s   | j | j| j|d�}| |_|S )Nr²   )ro   ri   r0   r±   )r   r°   Z	subwriterr   r   r   ÚgetSubWriter½  s      ÿÿzOTTableWriter.getSubWriterc                 C   s   | j  t d|› �|¡¡ d S rt   ©r¯   rÛ   rw   Úpack)r   ry   r$   r   r   r   Ú
writeValueÉ  s    zOTTableWriter.writeValuec                 C   s2   t   ||¡}tjdkr| ¡  | j | ¡ ¡ d S r}   )r   r€   r�   r‚   r¯   rÛ   Útobytes)r   ry   ÚvaluesÚar   r   r   Ú
writeArrayÌ  s    
zOTTableWriter.writeArrayc                 C   s6   d|  krdk sn t |ƒ‚| j t d|¡¡ d S )Ni€ÿÿÿé€   z>b©r@   r¯   rÛ   rw   ré   r´   r   r   r   Ú	writeInt8Ò  s    zOTTableWriter.writeInt8c                 C   s   |   d|¡ d S )Nr…   ©rî   ©r   rì   r   r   r   ÚwriteInt8ArrayÖ  s    zOTTableWriter.writeInt8Arrayc                 C   s6   d|  krdk sn t |ƒ‚| j t d|¡¡ d S )Ni €ÿÿé €  z>hrð   r´   r   r   r   Ú
writeShortÙ  s    zOTTableWriter.writeShortc                 C   s   |   d|¡ d S )NrŒ   rò   ró   r   r   r   ÚwriteShortArrayÝ  s    zOTTableWriter.writeShortArrayc                 C   s   | j  t d|¡¡ d S )Nz>irè   r´   r   r   r   Ú	writeLongà  s    zOTTableWriter.writeLongc                 C   s   |   d|¡ d S )Nre   rò   ró   r   r   r   ÚwriteLongArrayã  s    zOTTableWriter.writeLongArrayc                 C   s6   d|  krdk sn t |ƒ‚| j t d|¡¡ d S )Nr   é   ú>Brð   r´   r   r   r   Ú
writeUInt8æ  s    zOTTableWriter.writeUInt8c                 C   s   |   d|¡ d S )Nr‘   rò   ró   r   r   r   ÚwriteUInt8Arrayê  s    zOTTableWriter.writeUInt8Arrayc                 C   s6   d|  krdk sn t |ƒ‚| j t d|¡¡ d S )Nr   i   ú>Hrð   r´   r   r   r   ÚwriteUShortí  s    zOTTableWriter.writeUShortc                 C   s   |   d|¡ d S )Nr”   rò   ró   r   r   r   ÚwriteUShortArrayñ  s    zOTTableWriter.writeUShortArrayc                 C   s   | j  t d|¡¡ d S )Nú>Irè   r´   r   r   r   Ú
writeULongô  s    zOTTableWriter.writeULongc                 C   s   |   d|¡ d S )Nr—   rò   ró   r   r   r   ÚwriteULongArray÷  s    zOTTableWriter.writeULongArrayc                 C   sB   d|  krdk sn t |ƒ‚t d|¡}| j |dd … ¡ d S )Nr   é   z>Lr   )r@   rw   ré   r¯   rÛ   )r   r$   r…   r   r   r   ÚwriteUInt24ú  s    zOTTableWriter.writeUInt24c                 C   s   |D ]}|   |¡ qd S r"   )r  )r   rì   r$   r   r   r   ÚwriteUInt24Arrayÿ  s    zOTTableWriter.writeUInt24Arrayc                 C   s0   t |ƒ ¡ }t|ƒdks t|ƒ‚| j |¡ d S r¢   )r   rë   r£   r@   r¯   rÛ   )r   Útagr   r   r   ÚwriteTag  s    zOTTableWriter.writeTagc                 C   s   | j  |¡ d S r"   ©r¯   rÛ   )r   Ú	subWriterr   r   r   ÚwriteSubTable  s    zOTTableWriter.writeSubTablec                 C   s    t ||||d�}| j |¡ |S )N)r¸   r$   )ÚCountReferencer¯   rÛ   )r   r4   r_   r¸   r$   Úrefr   r   r   ÚwriteCountReference  s    z!OTTableWriter.writeCountReferencec                 C   s    t j|f| Ž }| j |¡ d S r"   )rw   ré   r¯   rÛ   )r   Úformatrì   r6   r   r   r   ÚwriteStruct  s    zOTTableWriter.writeStructc                 C   s   | j  |¡ d S r"   r	  )r   r6   r   r   r   Ú	writeData  s    zOTTableWriter.writeDatac                 C   s  d  } } }}| j dkr"|j}nØ| j dkr:| j}|j}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	k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  r3   r\   r±   Újoinr   r0   )r   rº   r   r   r   r   Úp1r   r   r   rÀ     s:    









ÿz$OTTableWriter.getOverflowErrorRecord)NNr   )F)T)r   )r   N)-r   r   r    rd   r   Úpropertyr³   Úsetterr©   r¬   rµ   r»   r·   rÄ   rÆ   rÌ   rÈ   rÑ   rÚ   rß   rN   rT   rç   rê   rî   rñ   rô   rö   r÷   rø   rù   rü   rý   rÿ   r   r  r  r  r  r  r  r  r  r  rÀ   r   r   r   r   rA   {  sV   




$=9!
#

rA   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )r  z8A reference to a Count value, not a count of references.Nc                 C   s(   || _ || _|| _|d k	r$|  |¡ d S r"   )r4   r_   r¸   ÚsetValue)r   r4   r_   r¸   r$   r   r   r   r   >  s
    zCountReference.__init__c                 C   sD   | j }| j}|| d kr"|||< n|| |ks@t||| |fƒ‚d S r"   )r4   r_   r@   )r   r$   r4   r_   r   r   r   r  E  s
    
zCountReference.setValuec                 C   s   | j | j S r"   )r4   r_   r   r   r   r   ÚgetValueM  s    zCountReference.getValuec                 C   s.   | j | j }|d krd}tttdœ| j |ƒS )Nr   )r   r   r   )r4   r_   Ú	packUInt8r¾   r½   r¸   )r   Úvr   r   r   r¶   P  s    zCountReference.getCountData)NN)r   r   r    rd   r   r  r  r¶   r   r   r   r   r  ;  s
   
r  c                 C   s   t  d| ¡S )Nrû   ©rw   ré   r#   r   r   r   r  W  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 t | ƒ‚t d| ¡S )Nr   l        r  ©r@   rw   ré   r#   r   r   r   r½   _  s    r½   c                 C   s2   d|   krdk sn t | ƒ‚t d| ¡dd … S )Nr   r  r  r   r  r#   r   r   r   rÁ   d  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__m  s    
zBaseTable.__getattr__Fc                 C   sL   | j  d¡}|r*| `| j}| `|  ||¡ |rH|  ¡ D ]}|j |¡ q6d S r!  )r"  r#  r8   r7   r5   ÚiterSubTablesr$   rc   )r   rb   r8   r7   Zsubtabler   r   r   rc   x  s    zBaseTable.ensureDecompiledc                 C   s0   d| j kr*| j  ¡ }| j d  ¡ |d< |S | j S r!  )r"  rr   )r   rG   r   r   r   Ú__getstate__ƒ  s
    

zBaseTable.__getstate__c                 C   sh   d}| j D ]X}| |¡}|tkr(t  S d}|jrV|j|krN||j |j }nt  S ||| 7 }q
|S )Nr   r   )Ú
convertersÚgetRecordSizerÉ   ÚrepeatÚaux)Úclsr8   Z	totalSizeÚconvr¸   Ú
countValuer   r   r   r*  Œ  s    


zBaseTable.getRecordSizec                 C   s   | j S r"   )r)  r   r   r   r   ÚgetConvertersœ  s    zBaseTable.getConvertersc                 C   s
   | j | S r"   )ÚconvertersByNamer«   r   r   r   ÚgetConverterByNameŸ  s    zBaseTable.getConverterByNameNc              	   C   sô   |   ¡ D ]æ}|jr–t| |jƒs,t| |jg ƒ tt| |jƒƒ|j }z|  |j¡}t| |j|ƒ W qî t	k
r’   |rŽ|j|krŽ||j  
|¡ Y qîX q|jr®t|jd | jƒs®qt| |jƒr¼qt|dƒrÔt| |jd ƒ t|dƒrt| |j|jƒ qd S )NZwriteNullOffsetÚDEFAULT)r0  r+  r\   r_   Úsetattrr£   r3   r,  r2  ÚKeyErrorr  Úevalr"  r3  )r   Z
propagatorr.  r/  Z
count_convr   r   r   r^   ¢  s&    

zBaseTable.populateDefaultsc                 C   s¢  |   |¡ i }|| _|  ¡ D �]T}|jdkr>| |j|d ¡}|jdkrZ| |j|d ¡}|jdkrr| |d ¡}|jdkrŽ| |j|d ¡}z¨|jrìt|jtƒrª|j}n |j|krÀ||j }n
||j }||j	7 }| 
||||¡||j< nH|j	�rt|j	d |ƒ�sW q| |||¡||j< |j�r4||j ||j< W q tk
�rp } z|j}|j|f |_‚ W 5 d }~X Y qX qt| d	ƒ�rŽ|  ||¡ n| j |¡ | `d S )
Nr  Ú
LookupTyper  ZExtensionLookupTypeZFeatureParamsZ
FeatureTagZ	SubStructZ	MorphTypeÚpostRead)Ú
readFormatZ_BaseTable__rawTabler0  r_   ZgetConverterr0   r+  Ú
isinstanceÚintr,  r„   r6  ÚreadÚisPropagatedÚ	ExceptionÚargsr\   r8  r"  Úupdate)r   r8   r7   r4   r.  r/  rK   r_   r   r   r   r5   ½  sD    







zBaseTable.decompilec                 C   s  |   ¡  t| dƒr8t| dƒ }|  |¡}|o4t| dƒ}nd}| j ¡ }|  ¡ D ]0}|jrN|jrN| |j	¡}t
|tƒrN|||j	< qNt| dƒr�d|_t| dƒr d|_t| jdƒr¾|d  | jj¡ |  |¡ |  ¡ D �] }| |j	¡}|j�rº|d krög }t|ƒ|j }t
|jtƒ�r:t|ƒ|jk�shtd	|jt|ƒf ƒ‚n.|j|k�rXt||j|d
� n||j  |¡ z| ||||¡ W n: tk
�r¶ } z|j|j	d f |_‚ W 5 d }~X Y nX qÐ|j�r$t
|tƒ�rô|}	|j|	_| |	¡ |	 ¡ ||j	< n| ||j	|j¡}	d ||j	< |j�rò|	||j	< qÐ|j�rf|j	|k�rBd ||j	< | ||j	|j||j	 ¡}	|	|d< qÐ|j�r€t |jd |ƒ�s€qÐz| !||||¡ W nL tk
�rà } z,|d k	�rº|jj"n|j	}
|j|
f |_‚ W 5 d }~X Y nX |jrÐ|||j	< qÐ|�rþ| `#d S )NÚpreWriteÚFormatFrÖ   r   rÎ   Tr7  zexpected %d values, got %dr#   z[])$rc   r\   rA  r"  rr   r0  ZisCountr=  r#  r_   r:  r  rÖ   rÎ   ro   r  r7  ÚwriteFormatr+  r£   r,  r;  r@   rî   r>  r?  rz   r¸   r  r  r  ZisLookupTyper6  Úwriter   rB  )r   rJ   r7   ZdeleteFormatr4   r.  r$   r/  rK   r  r_   r   r   r   rB   ç  s�    






ÿþ




   ÿ
zBaseTable.compilec                 C   s   d S r"   r   ©r   r8   r   r   r   r9  L  s    zBaseTable.readFormatc                 C   s   d S r"   r   rV   r   r   r   rC  O  s    zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d krg }t| dƒr6|d| jfg }| ||¡ | ¡  |  ||¡ | |¡ | ¡  d S )NrB  )ro   r   r\   rB  ÚbegintagÚnewlinerZ   Úendtag)r   Ú	xmlWriterr7   r`   r_   Z	tableNamer   r   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)
r0  r+  r3   r_   r    r£   ZxmlWriter,  r6  Úvars)r   rI  r7   r.  r$   re   rº   r   r   r   rZ   ^  s      ÿzBaseTable.toXML2c                 C   s€   z|   |¡}W n tk
r$   ‚ Y nX | |||¡}|jrnt| |jd ƒ}|d krbg }t| |j|ƒ | |¡ nt| |j|ƒ d S r"   )r2  r5  ZxmlReadr+  r3   r_   r4  rÛ   )r   r_   r`   ra   r7   r.  r$   Úseqr   r   r   r]   p  s    zBaseTable.fromXMLc                 C   s   |   |¡}|tkr|S | S r"   rÇ   rÊ   r   r   r   rÌ     s    
zBaseTable.__ne__c                 C   s0   t | ƒt |ƒkrtS |  ¡  | ¡  | j|jkS r"   )rR   rÉ   rc   r"  rp   r   r   r   rÈ   ƒ  s
    zBaseTable.__eq__c                   @   s2   e Zd ZU dZeed< ded< dZee ed< dS )zBaseTable.SubTableEntryzSee BaseTable.iterSubTables()r_   r   r$   NrJ  )	r   r   r    rd   r   Ú__annotations__rJ  r   r;  r   r   r   r   ÚSubTableEntryŒ  s   
rN  )Úreturnc                 #   sp   ˆ  ¡ D ]b}|j‰ tˆˆ dƒ}|dkr(qt|tƒrBˆ ˆ |¡V  qt|tƒr‡ ‡fdd„t|ƒD ƒE dH  qdS )a7  Yield (name, value, index) namedtuples for all subtables of current table.

        A sub-table is an instance of BaseTable (or subclass thereof) that is a child
        of self, the current parent table.
        The tuples also contain the attribute name (str) of the of parent table to get
        a subtable, and optionally, for lists of subtables (i.e. attributes associated
        with a converter that has a 'repeat'), an index into the list containing the
        given subtable value.
        This method can be useful to traverse trees of otTables.
        Nc                 3   s,   | ]$\}}t |tƒrˆjˆ ||d �V  qdS ))rJ  N)r:  r   rN  )r�   re   r  ©r_   r   r   r   Ú	<genexpr>¦  s   
þz*BaseTable.iterSubTables.<locals>.<genexpr>)r0  r_   r3   r:  r   rN  r¼   rÃ   )r   r.  r$   r   rP  r   r'  “  s    

þzBaseTable.iterSubTablesc                 C   s
   t | jƒS r"   )ÚgetVariableAttrsro   r   r   r   r   rR  ­  s    zBaseTable.getVariableAttrs)F)N)NN)r   r   r    rd   r&  rc   r(  Úclassmethodr*  r0  r2  r^   r5   rB   r9  rC  r[   rZ   r]   rÌ   rÈ   r
   rN  r	   r'  rR  r   r   r   r   r   i  s*   
	

*e
	r   c                   @   sN   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
d„ Z	ddd„Z
dd„ ZdS )ÚFormatSwitchingBaseTablezvMinor specialization of BaseTable, for tables that have multiple
    formats, eg. CoverageFormat1 vs. CoverageFormat2.c                 C   s   t S r"   )rÉ   )r-  r8   r   r   r   r*  ¶  s    z&FormatSwitchingBaseTable.getRecordSizec                 C   s4   z
| j }W n tk
r"   g  Y S X | j | j g ¡S r"   )rB  r$  r)  r#  )r   Úfmtr   r   r   r0  º  s
    

z&FormatSwitchingBaseTable.getConvertersc                 C   s   | j | j | S r"   )r1  rB  r«   r   r   r   r2  Æ  s    z+FormatSwitchingBaseTable.getConverterByNamec                 C   s   |  ¡ | _d S r"   )r•   rB  rE  r   r   r   r9  É  s    z#FormatSwitchingBaseTable.readFormatc                 C   s   |  | j¡ d S r"   )rÿ   rB  rV   r   r   r   rC  Ì  s    z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t  | ||||¡ d S r"   )r   r[   )r   rI  r7   r`   r_   r   r   r   r[   Ï  s    zFormatSwitchingBaseTable.toXMLc                 C   s   t | j| jƒS r"   )rR  ro   rB  r   r   r   r   rR  Ò  s    z)FormatSwitchingBaseTable.getVariableAttrs)NN)r   r   r    rd   rS  r*  r0  r2  r9  rC  r[   rR  r   r   r   r   rT  ±  s   

rT  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚUInt8FormatSwitchingBaseTablec                 C   s   |  ¡ | _d S r"   )r’   rB  rE  r   r   r   r9  ×  s    z(UInt8FormatSwitchingBaseTable.readFormatc                 C   s   |  | j¡ d S r"   )rü   rB  rV   r   r   r   rC  Ú  s    z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r   r    r9  rC  r   r   r   r   rV  Ö  s   rV  )Zuint16Zuint8c                 C   s2   z
t |  W S  tk
r,   td| ›�ƒ‚Y nX d S )NzUnsupported format type: )ÚformatSwitchingBaseTablesr5  Ú	TypeError)Z
formatTyper   r   r   Ú getFormatSwitchingBaseTableClassä  s    
rY  )r-  rU  rO  c                 C   s’   t | tƒst| ƒ‚t | tƒr@|dkr4td| j› �ƒ‚| j| }n| j}d|krRdS i }| ¡ D ] \}}| ¡ }|dk	r^|||< q^tt	||j
d�ƒS )zÐReturn 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   rX  rT  r   r1  r¯   ZgetVarIndexOffsetrÓ   Úsortedr¬   )r-  rU  r)  ZvarAttrsr_   r.  rg   r   r   r   rR  ì  s    


rR  )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    rf  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"   )ra  rÛ   r  )r   ÚvalueFormatr  rc  r_   rd  re  r   r   r   r   2  s
    zValueRecordFactory.__init__c                 C   s
   t | jƒS r"   )r£   r  r   r   r   r   Ú__len__9  s    zValueRecordFactory.__len__c                 C   s†   | j }|sd S tƒ }|D ]h\}}}|r0| ¡ }n| ¡ }|rt|rpddlm}	 | |¡}
t|	|ƒƒ }| |
|¡ nd }t	|||ƒ q|S ©Nr   r-   )
r  ÚValueRecordr�   r•   r1   r.   rs   r3   r5   r4  )r   r8   r7   r  ÚvalueRecordr_   rd  re  r$   r.   Z	subReaderr   r   r   ÚreadValueRecord<  s"    

z"ValueRecordFactory.readValueRecordc           	      C   sp   | j D ]d\}}}t||dƒ}|rP|rD| ¡ }| |¡ | ||¡ qj| d¡ q|r`| |¡ q| |¡ qd S ©Nr   )r  r3   rç   r  rB   rÿ   rö   )	r   rJ   r7   rl  r_   rd  re  r$   r
  r   r   r   ÚwriteValueRecordR  s    
z#ValueRecordFactory.writeValueRecordN)r   r   r    rd   r   ri  rm  ro  r   r   r   r   rg  .  s
   rg  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 )rk  Nc           	      C   s„   |d k	rlt D ](\}}}}||@ rt| ||r.d ndƒ q|d k	r€|j ¡ D ] \}}t| |ƒs\qHt| ||ƒ qHn|d k	r€|j ¡ | _d S rn  )ra  r4  r"  r¯   r\   rr   )	r   rh  Úsrcrc  r_   rd  re  rZ  Úvalr   r   r   r   f  s    
zValueRecord.__init__c                 C   s(   d}| j  ¡ D ]}|t| d B }q|S rn  )r"  ÚkeysÚvalueRecordFormatDict)r   r  r_   r   r   r   Ú	getFormats  s    zValueRecord.getFormatc                 C   s0   d}| j  ¡ D ]\}}|r|t| d B }q|S rn  )r"  r¯   rs  )r   r  r_   r$   r   r   r   ÚgetEffectiveFormaty  s
    zValueRecord.getEffectiveFormatc                 C   s   |d krg }nt |ƒ}td d… D ]*\}}}}	t| |ƒr"| |t| |ƒf¡ q"g }
tdd… D ]6\}}}}	t| |ƒr^t| |ƒ}|d k	r^|
 ||f¡ q^|
rè| ||¡ | ¡  |
D ] \}}|d k	r²|j|||d� q²| |¡ | ¡  n| 	||¡ | ¡  d S )Nr   r]  )r_   )
r¼   ra  r\   rÛ   r3   rF  rG  r[   rH  Z	simpletag)r   rI  r7   Z	valueNamer`   ZsimpleItemsrc  r_   rd  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 rj  )	r1   r.   r¯   r4  r;  r:  rÓ   r3   r]   )r   r_   r`   ra   r7   r.   Úkr  Úelementr$   Zelem2Zname2Zattrs2Zcontent2r   r   r   r]   š  s    



zValueRecord.fromXMLc                 C   s   |   |¡}|tkr|S | S r"   rÇ   rÊ   r   r   r   rÌ   «  s    
zValueRecord.__ne__c                 C   s    t | ƒt |ƒkrtS | j|jkS r"   )rR   rÉ   r"  rp   r   r   r   rÈ   ¯  s    zValueRecord.__eq__)NN)N)
r   r   r    r   rt  ru  r[   r]   rÌ   rÈ   r   r   r   r   rk  b  s   

rk  )N);ZfontTools.configr   ZfontTools.misc.textToolsr   r   r   Úenumr   r€   r   rw   ÚloggingÚ	functoolsr   Útypingr	   r
   r   r   Ú	getLoggerr   r<   r>   Z	uharfbuzzrQ   Úcallabler3   r?   r;   Úobjectr   r>  r!   r(   r,   r£   ré   r@   Úitemsizer2   rA   r  r  r¾   r½   rÁ   r   rT  rV  rW  rY  r;  r   rR  ra  rf  rs  rg  rk  r   r   r   r   Ú<module>   s„   
 2u   C  J%	þ#î4