U
    Q»{jkÐ  ã                   @   sT  d dl mZ d dlmZmZ ddlmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlmZmZmZmZ e e¡Zd	Zzd dlZeeed
dƒƒZW n ek
r¶   Y nX ee› d� ZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!G dd„ deƒZ"e#e
 $dd ¡ƒdk�s t%‚e	 	d¡j&dk�s:t%dƒ‚G dd„ deƒZ'G dd„ deƒZ(G dd„ deƒZ)G dd„ deƒZ*dd „ Z+d!d"„ Z,d#d$„ Z-d%d&„ Z.G d'd(„ d(eƒZ/G d)d*„ d*e/ƒZ0G d+d,„ d,e0ƒZ1e0e1d-œZ2d.d/„ Z3eƒ dIe/ee4 ee5 d0œd1d2„ƒZ6d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBgZ7dCdD„ Z8e8ƒ Z9G dEdF„ dFeƒZ:G dGdH„ dHeƒZ;dS )Jé    )ÚOPTIONS)ÚTagÚ	bytesjoiné   )ÚDefaultTable)ÚIntEnumN)Ú	lru_cache)ÚIteratorÚ
NamedTupleÚOptionalÚTupleFÚrepackz:USE_HARFBUZZ_REPACKERc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚOverflowErrorRecordc                 C   s6   |d | _ |d | _|d | _|d | _|d | _d S )Nr   r   é   é   é   )Ú	tableTypeÚLookupListIndexÚSubTableIndexÚitemNameÚ	itemIndex)ÚselfZoverflowTuple© r   ú\/var/www/html/bwave/python/venv/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   W   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   `   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   ÚreadInt80  s    zOTTableReader.readInt8c                 C   s   | j dd|d�S )Nr…   r   ©rz   rl   ©r„   rk   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Š   rk   r   r   r   ÚreadShortArray9  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   Ú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Š   rk   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Š   rk   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Š   rk   r   r   r   ÚreadULongArrayQ  s    zOTTableReader.readULongArrayc                 C   s4   | j }|d }t dd| j||…  ¡\}|| _ |S )Nr   z>ló    rv   ©r   rh   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>\  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   ÚreadDataf  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__m  s    zOTTableReader.__setitem__c                 C   s   | j o| j | S r"   ©ri   ©r   r_   r   r   r   Ú__getitem__r  s    zOTTableReader.__getitem__c                 C   s   | j o|| j kS r"   rª   r«   r   r   r   Ú__contains__u  s    zOTTableReader.__contains__)Nr   N)r   r   r    rd   Ú	__slots__r   rm   rn   rr   rs   r|   r„   rˆ   r‹   r�   rŽ   r�   r�   r’   r“   r•   r–   r˜   r™   rœ   r¡   r¤   r¥   r©   r¬   r­   r   r   r   r   r2     s8   
	r2   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚOffsetToWriterc                 C   s   || _ || _d S r"   )Ú	subWriterÚ
offsetSize©r   r°   r±   r   r   r   r   z  s    zOffsetToWriter.__init__c                 C   s,   t | ƒt |ƒkrtS | j|jko*| j|jkS r"   )rR   ÚNotImplementedr°   r±   rp   r   r   r   Ú__eq__~  s    zOffsetToWriter.__eq__c                 C   s   t | j| jfƒS r"   )Úhashr°   r±   r   r   r   r   Ú__hash__ƒ  s    zOffsetToWriter.__hash__N)r   r   r    r   r´   r¶   r   r   r   r   r¯   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 )VrA   z=Helper class to gather and assemble data for OpenType tables.Nc                 C   s"   g | _ d | _|| _|| _d | _d S r"   )Úitemsrh   ri   r0   Úparent)r   ri   r0   r   r   r   r   ‹  s
    zOTTableWriter.__init__c                 C   s(   | j r| j  ¡ ntƒ }|||< || _ d S r"   r¦   r¨   r   r   r   r©   ’  s    zOTTableWriter.__setitem__c                 C   s
   | j | S r"   rª   r«   r   r   r   r¬   —  s    zOTTableWriter.__getitem__c                 C   s   | j |= d S r"   rª   r«   r   r   r   Ú__delitem__š  s    zOTTableWriter.__delitem__c                 C   sL   d}| j D ]<}t|dƒr$||j7 }q
t|dƒr:||j7 }q
|t|ƒ }q
|S )z<Return the length of this table in bytes, without subtables.r   ÚgetCountDatar°   )r·   r\   Úsizer±   r£   )r   ÚlÚitemr   r   r   ÚgetDataLengthŸ  s    


zOTTableWriter.getDataLengthc              	   C   sÚ   t | jƒ}| j}t|ƒ}t|ƒD ]°}|| }t|dƒr |jdkrVt|jj| ƒ||< q |jdkr¦zt	|jj| ƒ||< W qÐ t
jk
r¢   |  |j¡}t|ƒ‚Y qÐX q |jdkrÆt|jj| ƒ||< q t|jƒ‚q t|ƒS )z;Assemble the data for this writer/table, without subtables.r°   r   r   r   )Úlistr·   rh   r£   r    r\   r±   Ú	packULongr°   Ú
packUShortrw   ÚerrorÚgetOverflowErrorRecordr!   Ú
packUInt24rO   r   )r   r·   rh   ÚnumItemsre   r½   r%   r   r   r   ÚgetData«  s(    



ÿ
zOTTableWriter.getDatac                 C   sb   t | jƒ}tttdœ}t|ƒD ]:\}}t|dƒr|j|krN||j dƒ||< qt|jƒ‚qt	|ƒS )zFAssemble the data for this writer/table with all offset field set to 0)r   r   r   r°   r   )
r¿   r·   rÁ   rÄ   rÀ   Ú	enumerater\   r±   rO   r   )r   r·   Z	packFuncsre   r½   r   r   r   ÚgetDataForHarfbuzzÇ  s    


z OTTableWriter.getDataForHarfbuzzc                 C   s
   t | jƒS r"   )rµ   r·   r   r   r   r   r¶   Õ  s    zOTTableWriter.__hash__c                 C   s   |   |¡}|tkr|S | S r"   ©r´   r³   ©r   rq   Úresultr   r   r   Ú__ne__Ù  s    
zOTTableWriter.__ne__c                 C   s    t | ƒt |ƒkrtS | j|jkS r"   )rR   r³   r·   rp   r   r   r   r´   Ý  s    zOTTableWriter.__eq__Fc                 C   sš   t | dƒ}t | dƒ}|r |s i }| j}tt|ƒƒD ]X}|| }t |dƒrV| ¡ ||< q2t |dƒr2|jj||d� |s2| |j|j¡|| _q2t|ƒ| _d S )NÚ	ExtensionÚ	DontSharerº   r°   ©ÚshareExtension)	r\   r·   r    r£   rº   r°   Ú_doneWritingÚ
setdefaultÚtuple)r   ÚinternedTablesrÐ   ÚisExtensionZ	dontSharer·   re   r½   r   r   r   rÑ   â  s(    



 ÿ	 ÿzOTTableWriter._doneWritingc                 C   s:  d|t | ƒ< t| jƒ}tt|ƒƒ}| ¡  t| dƒ}|}|r\|d k	sLtdƒ‚|d i   }}}d}t| dƒrÆt|ƒD ]2}	| j|	 }
t|
dƒrrt|
j	dd ƒdkrrd} q¦qrt |
j	ƒ|krÆ|
j	 
|||¡ n |D ]`}	| j|	 }
t|
dƒsäqÊ|�r
|	d	k�r
t|
j	dd ƒdk�r
qÊt |
j	ƒ|krÊ|
j	 
|||¡ qÊqÊ| | ¡ d S )
NTrÍ   zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFÚsortCoverageLastr°   r_   ÚCoverager   )Úidr£   r·   r¿   r    Úreverser\   r@   r3   r°   Ú_gatherTablesÚappend)r   ÚtablesÚ	extTablesÚdonerÅ   ZiRangerÕ   Z
selfTablesrÖ   re   r½   r   r   r   rÚ   
  sN    	

ÿþ

ÿþ

ÿþýzOTTableWriter._gatherTablesc                 C   s†  g }g }|}|D ]}	|  dd|	f¡ qd}
d}t| dƒ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|j	ƒ|k�r|j	 |||||¡ }}n|t|j	ƒ }||j
|f}|  |¡ ||j
7 }q°|  | ¡ |  ||f¡ |d	7 }||t| ƒ< |
�r‚| ¡  |S )
Nr   FrÖ   r_   r×   Tr°   rº   r   )rÛ   r\   rÇ   r·   r3   rØ   Ú_gatherGraphForHarfbuzzr»   r£   r°   r±   Úpop)r   rÜ   Úobj_listrÞ   ÚobjidxÚvirtual_edgesZ
real_linksZvirtual_linksZitem_idxÚidxrÖ   Zcoverage_idxre   r½   Z	child_idxZ
offset_posrh   Z	real_edger   r   r   rß   J  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   ƒ  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¡}| |_|S r"   )ro   ri   r0   r¸   )r   Z	subwriterr   r   r   ÚgetSubWriterÇ  s    ÿzOTTableWriter.getSubWriterc                 C   s   | j  t d|› �|¡¡ d S rt   ©r·   rÛ   rw   Úpack)r   ry   r$   r   r   r   Ú
writeValueÑ  s    zOTTableWriter.writeValuec                 C   s2   t   ||¡}tjdkr| ¡  | j | ¡ ¡ d S r}   )r   r€   r�   r‚   r·   rÛ   Útobytes)r   ry   ÚvaluesÚar   r   r   Ú
writeArrayÔ  s    
zOTTableWriter.writeArrayc                 C   s6   d|  krdk sn t |ƒ‚| j t d|¡¡ d S )Ni€ÿÿÿé€   z>b©r@   r·   rÛ   rw   ré   ©r   r$   r   r   r   Ú	writeInt8Ú  s    zOTTableWriter.writeInt8c                 C   s   |   d|¡ d S )Nr…   ©rî   ©r   rì   r   r   r   ÚwriteInt8ArrayÞ  s    zOTTableWriter.writeInt8Arrayc                 C   s6   d|  krdk sn t |ƒ‚| j t d|¡¡ d S )Ni €ÿÿé €  z>hrð   rñ   r   r   r   Ú
writeShortá  s    zOTTableWriter.writeShortc                 C   s   |   d|¡ d S )NrŒ   ró   rô   r   r   r   ÚwriteShortArrayå  s    zOTTableWriter.writeShortArrayc                 C   s   | j  t d|¡¡ d S )Nz>irè   rñ   r   r   r   Ú	writeLongè  s    zOTTableWriter.writeLongc                 C   s   |   d|¡ d S )Nre   ró   rô   r   r   r   ÚwriteLongArrayë  s    zOTTableWriter.writeLongArrayc                 C   s6   d|  krdk sn t |ƒ‚| j t d|¡¡ d S )Nr   é   ú>Brð   rñ   r   r   r   Ú
writeUInt8î  s    zOTTableWriter.writeUInt8c                 C   s   |   d|¡ d S )Nr‘   ró   rô   r   r   r   ÚwriteUInt8Arrayò  s    zOTTableWriter.writeUInt8Arrayc                 C   s6   d|  krdk sn t |ƒ‚| j t d|¡¡ d S )Nr   i   ú>Hrð   rñ   r   r   r   ÚwriteUShortõ  s    zOTTableWriter.writeUShortc                 C   s   |   d|¡ d S )Nr”   ró   rô   r   r   r   ÚwriteUShortArrayù  s    zOTTableWriter.writeUShortArrayc                 C   s   | j  t d|¡¡ d S )Nú>Irè   rñ   r   r   r   Ú
writeULongü  s    zOTTableWriter.writeULongc                 C   s   |   d|¡ d S )Nr—   ró   rô   r   r   r   ÚwriteULongArrayÿ  s    zOTTableWriter.writeULongArrayc                 C   sB   d|  krdk sn t |ƒ‚t d|¡}| j |dd … ¡ d S )Nr   é   z>Lr   )r@   rw   ré   r·   rÛ   )r   r$   r…   r   r   r   ÚwriteUInt24  s    zOTTableWriter.writeUInt24c                 C   s   |D ]}|   |¡ qd S r"   )r  )r   rì   r$   r   r   r   ÚwriteUInt24Array  s    zOTTableWriter.writeUInt24Arrayc                 C   s0   t |ƒ ¡ }t|ƒdks t|ƒ‚| j |¡ d S r¢   )r   rë   r£   r@   r·   rÛ   )r   Útagr   r   r   ÚwriteTag  s    zOTTableWriter.writeTagc                 C   s   | j  t||ƒ¡ d S r"   )r·   rÛ   r¯   r²   r   r   r   ÚwriteSubTable  s    zOTTableWriter.writeSubTabler   c                 C   s    t ||||d�}| j |¡ |S )N)r»   r$   )ÚCountReferencer·   rÛ   )r   r4   r_   r»   r$   Úrefr   r   r   ÚwriteCountReference  s    z!OTTableWriter.writeCountReferencec                 C   s    t j|f| Ž }| j |¡ d S r"   )rw   ré   r·   rÛ   )r   Úformatrì   r6   r   r   r   ÚwriteStruct  s    zOTTableWriter.writeStructc                 C   s   | j  |¡ d S r"   )r·   rÛ   )r   r6   r   r   r   Ú	writeData  s    zOTTableWriter.writeDatac                 C   s  d  } } }}| j dkr"|j}nØ| j dkr:| j}|j}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)NN)F)T)r   N)*r   r   r    rd   r   r©   r¬   r¹   r¾   rÆ   rÈ   r¶   rÌ   r´   rÑ   rÚ   rß   rN   rT   rç   rê   rî   rò   rõ   r÷   rø   rù   rú   rý   rþ   r   r  r  r  r  r  r	  r
  r  r  r  rÃ   r   r   r   r   rA   ˆ  sN   

(@9!
#

rA   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )r  z8A reference to a Count value, not a count of references.Nc                 C   s(   || _ || _|| _|d k	r$|  |¡ d S r"   )r4   r_   r»   ÚsetValue)r   r4   r_   r»   r$   r   r   r   r   F  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  M  s
    
zCountReference.setValuec                 C   s   | j | j S r"   )r4   r_   r   r   r   r   ÚgetValueU  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º   X  s    zCountReference.getCountData)NN)r   r   r    rd   r   r  r  rº   r   r   r   r   r  C  s
   
r  c                 C   s   t  d| ¡S )Nrü   ©rw   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 t | ƒ‚t d| ¡S )Nr   l        r  ©r@   rw   ré   r#   r   r   r   rÀ   g  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Ä   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$   rc   )r   rb   r8   r7   Zsubtabler   r   r   rc     s    zBaseTable.ensureDecompiledc                 C   s0   d| j kr*| j  ¡ }| j d  ¡ |d< |S | j S r  )r  rr   )r   rG   r   r   r   Ú__getstate__Š  s
    

zBaseTable.__getstate__c                 C   sh   d}| j D ]X}| |¡}|tkr(t  S d}|jrV|j|krN||j |j }nt  S ||| 7 }q
|S )Nr   r   )Ú
convertersÚgetRecordSizer³   ÚrepeatÚaux)Úclsr8   Z	totalSizeÚconvr»   Ú
countValuer   r   r   r'  “  s    


zBaseTable.getRecordSizec                 C   s   | j S r"   )r&  r   r   r   r   ÚgetConverters£  s    zBaseTable.getConvertersc                 C   s
   | j | S r"   )ÚconvertersByNamer«   r   r   r   ÚgetConverterByName¦  s    zBaseTable.getConverterByNameNc              	   C   sô   |   ¡ D ]æ}|j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)r-  r(  r\   r_   Úsetattrr£   r3   r)  r/  ÚKeyErrorr  Úevalr  r0  )r   Z
propagatorr+  r,  Z
count_convr   r   r   r^   ©  s&    

zBaseTable.populateDefaultsc                 C   s¢  |   |¡ i }|| _|  ¡ D �]T}|jdkr>| |j|d ¡}|jdkrZ| |j|d ¡}|jdkrr| |d ¡}|jdkrŽ| |j|d ¡}z¨|j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__rawTabler-  r_   ZgetConverterr0   r(  Ú
isinstanceÚintr)  r„   r3  ÚreadÚisPropagatedÚ	ExceptionÚargsr\   r5  r  Úupdate)r   r8   r7   r4   r+  r,  rK   r_   r   r   r   r5   Ä  sD    







zBaseTable.decompilec                 C   s  |   ¡  t| dƒr8t| dƒ }|  |¡}|o4t| dƒ}nd}| j ¡ }|  ¡ D ]0}|jrN|jrN| |j	¡}t
|tƒrN|||j	< qNt| dƒ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Î   Tr4  zexpected %d values, got %dr#   z[])$rc   r\   r>  r  rr   r-  ZisCountr:  r   r_   r7  r  rÖ   rÎ   ro   r  r4  ÚwriteFormatr(  r£   r)  r8  r@   rî   r;  r<  rz   r»   r  r  r  ZisLookupTyper3  Úwriter   r?  )r   rJ   r7   ZdeleteFormatr4   r+  r$   r,  rK   r  r_   r   r   r   rB   î  s�    






ÿþ




   ÿ
zBaseTable.compilec                 C   s   d S r"   r   ©r   r8   r   r   r   r6  S  s    zBaseTable.readFormatc                 C   s   d S r"   r   rV   r   r   r   r@  V  s    zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d krg }t| dƒr6|d| jfg }| ||¡ | ¡  |  ||¡ | |¡ | ¡  d S )Nr?  )ro   r   r\   r?  ÚbegintagÚnewlinerZ   Úendtag)r   Ú	xmlWriterr7   r`   r_   Z	tableNamer   r   r   r[   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)
r-  r(  r3   r_   r    r£   ZxmlWriter)  r3  Úvars)r   rF  r7   r+  r$   re   r½   r   r   r   rZ   e  s      ÿzBaseTable.toXML2c                 C   s„   z|   |¡}W n tk
r$   ‚ Y nX | |||¡}|jd k	rrt| |jd ƒ}|d krfg }t| |j|ƒ | |¡ nt| |j|ƒ d S r"   )r/  r2  ZxmlReadr(  r3   r_   r1  rÛ   )r   r_   r`   ra   r7   r+  r$   Úseqr   r   r   r]   w  s    
zBaseTable.fromXMLc                 C   s   |   |¡}|tkr|S | S r"   rÉ   rÊ   r   r   r   rÌ   ‰  s    
zBaseTable.__ne__c                 C   s0   t | ƒt |ƒkrtS |  ¡  | ¡  | j|jkS r"   )rR   r³   rc   r  rp   r   r   r   r´   �  s
    zBaseTable.__eq__c                   @   s2   e Zd ZU dZeed< ded< dZee ed< dS )zBaseTable.SubTableEntryzSee BaseTable.iterSubTables()r_   r  r$   NrG  )	r   r   r    rd   r   Ú__annotations__rG  r   r8  r   r   r   r   ÚSubTableEntry–  s   
rK  )Úreturnc                 #   sp   ˆ  ¡ D ]b}|j‰ tˆˆ dƒ}|dkr(qt|tƒrBˆ ˆ |¡V  qt|tƒr‡ ‡fdd„t|ƒD ƒE dH  qdS )a7  Yield (name, value, index) namedtuples for all subtables of current table.

        A sub-table is an instance of BaseTable (or subclass thereof) that is a child
        of self, the current parent table.
        The tuples also contain the attribute name (str) of the of parent table to get
        a subtable, and optionally, for lists of subtables (i.e. attributes associated
        with a converter that has a 'repeat'), an index into the list containing the
        given subtable value.
        This method can be useful to traverse trees of otTables.
        Nc                 3   s,   | ]$\}}t |tƒrˆjˆ ||d �V  qdS ))rG  N)r7  r  rK  )r�   re   r  ©r_   r   r   r   Ú	<genexpr>°  s   
þz*BaseTable.iterSubTables.<locals>.<genexpr>)r-  r_   r3   r7  r  rK  r¿   rÇ   )r   r+  r$   r   rM  r   r$  �  s    

þzBaseTable.iterSubTablesc                 C   s
   t | jƒS r"   )ÚgetVariableAttrsro   r   r   r   r   rO  ·  s    zBaseTable.getVariableAttrs)F)N)NN)r   r   r    rd   r#  rc   r%  Úclassmethodr'  r-  r/  r^   r5   rB   r6  r@  r[   rZ   r]   rÌ   r´   r
   rK  r	   r$  rO  r   r   r   r   r  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   s4   z
| j }W n tk
r"   g  Y S X | j | j g ¡S r"   )r?  r!  r&  r   )r   Úfmtr   r   r   r-  Ã  s
    

z&FormatSwitchingBaseTable.getConvertersc                 C   s   | j | j | S r"   )r.  r?  r«   r   r   r   r/  Ï  s    z+FormatSwitchingBaseTable.getConverterByNamec                 C   s   |  ¡ | _d S r"   )r•   r?  rB  r   r   r   r6  Ò  s    z#FormatSwitchingBaseTable.readFormatc                 C   s   |  | j¡ d S r"   )r   r?  rV   r   r   r   r@  Õ  s    z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t  | ||||¡ d S r"   )r  r[   )r   rF  r7   r`   r_   r   r   r   r[   Ø  s    zFormatSwitchingBaseTable.toXMLc                 C   s   t | j| jƒS r"   )rO  ro   r?  r   r   r   r   rO  Û  s    z)FormatSwitchingBaseTable.getVariableAttrs)NN)r   r   r    rd   rP  r'  r-  r/  r6  r@  r[   rO  r   r   r   r   rQ  »  s   

rQ  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚUInt8FormatSwitchingBaseTablec                 C   s   |  ¡ | _d S r"   )r’   r?  rB  r   r   r   r6  à  s    z(UInt8FormatSwitchingBaseTable.readFormatc                 C   s   |  | j¡ d S r"   )rý   r?  rV   r   r   r   r@  ã  s    z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r   r    r6  r@  r   r   r   r   rS  ß  s   rS  )Zuint16Zuint8c                 C   s2   z
t |  W S  tk
r,   td| ›�ƒ‚Y nX d S )NzUnsupported format type: )ÚformatSwitchingBaseTablesr2  Ú	TypeError)Z
formatTyper   r   r   Ú getFormatSwitchingBaseTableClassí  s    
rV  )r*  rR  rL  c                 C   s’   t | tƒst| ƒ‚t | tƒr@|dkr4td| j› �ƒ‚| j| }n| j}d|krRdS i }| ¡ D ] \}}| ¡ }|dk	r^|||< q^tt	||j
d�ƒS )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  rU  rQ  r   r.  r·   ZgetVarIndexOffsetrÓ   Úsortedr¬   )r*  rR  r&  ZvarAttrsr_   r+  rg   r   r   r   rO  õ  s    


rO  )r   Z
XPlacementr   r   )r   Z
YPlacementr   r   )r   ZXAdvancer   r   )é   ZYAdvancer   r   )é   Z
XPlaDevicer   r   )é    Z
YPlaDevicer   r   )é@   Z
XAdvDevicer   r   )rï   Z
YAdvDevicer   r   )rû   Z	Reserved1r   r   )i   Z	Reserved2r   r   )i   Z	Reserved3r   r   )i   Z	Reserved4r   r   )i   Z	Reserved5r   r   )i    Z	Reserved6r   r   )i @  Z	Reserved7r   r   )rö   Z	Reserved8r   r   c                  C   s(   i } t D ]\}}}}|||f| |< q| S r"   )ÚvalueRecordFormat)ÚdÚmaskr_   ÚisDeviceÚsignedr   r   r   Ú
_buildDict-  s    rc  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚValueRecordFactoryz6Given a format code, this object convert ValueRecords.c                 C   s8   g }t D ]$\}}}}||@ r| |||f¡ q|| _d S r"   )r^  rÛ   r  )r   ÚvalueFormatr  r`  r_   ra  rb  r   r   r   r   :  s
    zValueRecordFactory.__init__c                 C   s
   t | jƒS r"   )r£   r  r   r   r   r   Ú__len__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.   rs   r3   r5   r1  )r   r8   r7   r  ÚvalueRecordr_   ra  rb  r$   r.   Z	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
  rB   r   r÷   )	r   rJ   r7   ri  r_   ra  rb  r$   r°   r   r   r   ÚwriteValueRecordZ  s    z#ValueRecordFactory.writeValueRecordN)r   r   r    rd   r   rf  rj  rk  r   r   r   r   rd  7  s
   rd  c                   @   sH   e Zd Zddd„Zdd„ Zdd„ Zddd	„Zd
d„ Zdd„ Zdd„ Z	dS )rh  Nc           	      C   s„   |d k	rlt D ](\}}}}||@ rt| ||r.d ndƒ q|d k	r€|j ¡ D ] \}}t| |ƒs\qHt| ||ƒ qHn|d k	r€|j ¡ | _d S ©Nr   )r^  r1  r  r·   r\   rr   )	r   re  Úsrcr`  r_   ra  rb  rW  Úvalr   r   r   r   m  s    
zValueRecord.__init__c                 C   s(   d}| j  ¡ D ]}|t| d B }q|S rl  )r  ÚkeysÚvalueRecordFormatDict)r   r  r_   r   r   r   Ú	getFormatz  s    zValueRecord.getFormatc                 C   s0   d}| j  ¡ D ]\}}|r|t| d B }q|S rl  )r  r·   rp  )r   r  r_   r$   r   r   r   ÚgetEffectiveFormat€  s
    zValueRecord.getEffectiveFormatc                 C   s   |d krg }nt |ƒ}td d… D ]*\}}}}	t| |ƒr"| |t| |ƒf¡ q"g }
tdd… D ]6\}}}}	t| |ƒr^t| |ƒ}|d k	r^|
 ||f¡ q^|
rè| ||¡ | ¡  |
D ] \}}|d k	r²|j|||d� q²| |¡ | ¡  n| 	||¡ | ¡  d S )Nr   rZ  )r_   )
r¿   r^  r\   rÛ   r3   rC  rD  r[   rE  Z	simpletag)r   rF  r7   Z	valueNamer`   ZsimpleItemsr`  r_   ra  r  ZdeviceItemsZdeviceZdeviceRecordr   r   r   r[   ‡  s,    




zValueRecord.toXMLc                 C   sš   ddl m} | ¡ D ]\}}t| |t|ƒƒ q|D ]b}t|tƒsBq2|\}}}t||ƒƒ }	|D ]*}
t|
tƒslq\|
\}}}|	 ||||¡ q\t| ||	ƒ q2d S rg  )	r1   r.   r·   r1  r8  r7  rÓ   r3   r]   )r   r_   r`   ra   r7   r.   Úkr  Úelementr$   Zelem2Zname2Zattrs2Zcontent2r   r   r   r]   ¡  s    



zValueRecord.fromXMLc                 C   s   |   |¡}|tkr|S | S r"   rÉ   rÊ   r   r   r   rÌ   ²  s    
zValueRecord.__ne__c                 C   s    t | ƒt |ƒkrtS | j|jkS r"   )rR   r³   r  rp   r   r   r   r´   ¶  s    zValueRecord.__eq__)NN)N)
r   r   r    r   rq  rr  r[   r]   rÌ   r´   r   r   r   r   rh  j  s   

rh  )N)<ZfontTools.configr   ZfontTools.misc.textToolsr   r   r   Úenumr   r€   r   rw   ÚloggingÚ	functoolsr   Útypingr	   r
   r   r   Ú	getLoggerr   r<   r>   Z	uharfbuzzrQ   Úcallabler3   r?   r;   Úobjectr   r;  r!   r(   r,   r£   ré   r@   Úitemsizer2   r¯   rA   r  r  rÁ   rÀ   rÄ   r  rQ  rS  rT  rV  r8  r   rO  r^  rc  rp  rd  rh  r   r   r   r   Ú<module>   s†   
 1t   >  L$	þ#î3