a
    ¥Q•hkÐ  ã                   @   s6  d dl mZ d dlmZmZ ddlmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlmZmZmZmZ e e¡Zd	Zzd dlZeeed
dƒƒZW n ey´   Y n0 ee› d� ZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!G dd„ deƒZ"e#e
 $dd ¡ƒdk�sJ ‚e	 	d¡j%dk�s8J dƒ‚G dd„ deƒZ&G dd„ deƒZ'G dd„ deƒZ(G dd„ deƒZ)dd „ Z*d!d"„ Z+d#d$„ Z,d%d&„ Z-G d'd(„ d(eƒZ.G d)d*„ d*e.ƒZ/G d+d,„ d,e/ƒZ0e/e0d-œZ1d.d/„ Z2eƒ d:e.ee3 ee4 d0œd1d2„ƒZ5g d3¢Z6d4d5„ Z7e7ƒ Z8G d6d7„ d7eƒZ9G d8d9„ d9eƒZ:dS );é    )ÚOPTIONS)ÚTagÚ	bytesjoiné   )ÚDefaultTable)ÚIntEnumN)Ú	lru_cache)ÚIteratorÚ
NamedTupleÚOptionalÚTupleFÚrepackz:USE_HARFBUZZ_REPACKERc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚOverflowErrorRecordc                 C   s6   |d | _ |d | _|d | _|d | _|d | _d S )Nr   r   é   é   é   )Ú	tableTypeÚLookupListIndexÚSubTableIndexÚitemNameÚ	itemIndex)ÚselfZoverflowTuple© r   úV/var/www/sistema_ama/venv/lib/python3.9/site-packages/fontTools/ttLib/tables/otBase.pyÚ__init__   s
    



zOverflowErrorRecord.__init__c              
   C   s$   t | jd| jd| jd| jd| jf	ƒS )NzLookupIndex:zSubTableIndex:z	ItemName:z
ItemIndex:)Ústrr   r   r   r   r   ©r   r   r   r   Ú__repr__$   s    ÷ÿzOverflowErrorRecord.__repr__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚOTLOffsetOverflowErrorc                 C   s
   || _ d S ©N©Úvalue)r   ÚoverflowErrorRecordr   r   r   r   5   s    zOTLOffsetOverflowError.__init__c                 C   s
   t | jƒS r"   )Úreprr$   r   r   r   r   Ú__str__8   s    zOTLOffsetOverflowError.__str__N)r   r   r    r   r'   r   r   r   r   r!   4   s   r!   c                   @   s   e Zd ZdZdZdZdS )ÚRepackerStater   r   r   N)r   r   r    ÚPURE_FTÚHB_FTÚFT_FALLBACKr   r   r   r   r(   <   s   
r(   c                   @   sR   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
ddd„ZdS )Ú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   st  d}|j t }| jdv r`|du r0t d| j¡ n0ts`|du rFtdƒ‚n|du sRJ ‚t d| j¡ |dv r~tr~| jdv r~tj}ntj	}d}d}zpt
| jd	�}| j ||¡ |tjkrÀ|  ||¡W S |tj	krÖ|  |¡W S |tjkrú|  |¡ t d
¡ tj}W qŒ t�yl } zVd}|  |||¡}	|j}|	�r8W Y d}~qŒ|tju �rVt d¡ tj}n‚ W Y d}~qŒd}~0 0 qŒdS )z=Compiles the table into binary. Called automatically on save.N)ÚGSUBÚGPOSFz>hb.repack disabled, compiling '%s' with pure-python serializerTzNo module named 'uharfbuzz'z?uharfbuzz not found, compiling '%s' with pure-python serializer)NTr/   zXRe-enabling sharing between extensions and switching back to harfbuzz+fontTools packing.zrHarfbuzz packing out of resolutions, disabling sharing between extensions and switching to fontTools only packing.)ÚcfgÚUSE_HARFBUZZ_REPACKERr0   ÚlogÚdebugÚhave_uharfbuzzÚImportErrorr(   r*   r)   ÚOTTableWriterr4   ÚcompileÚtryPackingHarfbuzzÚtryPackingFontToolsr+   r!   ÚtryResolveOverflowr$   )
r   r7   ÚoverflowRecordZuse_hb_repackÚstateÚhb_first_error_loggedÚlastOverflowRecordÚwriterÚeÚokr   r   r   rC   `   sf    

þ
þÿþý



ÿ
ÿzBaseTTXConverter.compilec              
   C   s˜   zt  d| j¡ | | j¡W S  tttjfy’ } zV|srt|ƒj	› }t
|ƒdkr^|d|› �7 }t  d| j|¡ d}|jdd�W  Y d }~S d }~0 0 d S )Nzserializing '%s' with hb.repackr1   z: z`hb.repack failed to serialize '%s', attempting fonttools resolutions ; the error message was: %sTF)Úremove_duplicate)r>   r?   r0   ÚgetAllDataUsingHarfbuzzÚ
ValueErrorÚMemoryErrorÚhbZRepackerErrorÚtyper   r   ÚwarningÚ
getAllData)r   rK   rI   rL   Ú	error_msgr   r   r   rD   »   s    üz#BaseTTXConverter.tryPackingHarfbuzzc                 C   s   |  ¡ S r"   )rU   ©r   rK   r   r   r   rE   Ñ   s    z$BaseTTXConverter.tryPackingFontToolsc                 C   sz   d}||j kr|S |j }t d|¡ |jd u rFddlm} |||ƒ}nddlm} |||ƒ}|rd|S ddlm} |||ƒS )Nr   z+Attempting to fix OTLOffsetOverflowError %sr   )ÚfixLookupOverFlows)ÚfixSubTableOverFlows)r$   r>   Úinfor   r.   rX   rY   )r   r7   rL   rJ   rM   rG   rX   rY   r   r   r   rF   Ô   s    


z#BaseTTXConverter.tryResolveOverflowc                 C   s   | j  ||¡ d S r"   )r4   ÚtoXML2)r   rK   r7   r   r   r   ÚtoXMLð   s    zBaseTTXConverter.toXMLc                 C   sJ   ddl m} t| dƒs*t|| jƒ}|ƒ | _| j ||||¡ | j ¡  d S )Nr   r-   r4   )r1   r.   Úhasattrr3   r0   r4   ÚfromXMLÚpopulateDefaults)r   ÚnameÚattrsÚcontentr7   r.   r9   r   r   r   r^   ó   s    
zBaseTTXConverter.fromXMLTc                 C   s   | j j|d� d S )N)Úrecurse)r4   ÚensureDecompiled)r   rc   r   r   r   rd   ü   s    z!BaseTTXConverter.ensureDecompiledN)T)r   r   r    Ú__doc__r5   rC   rD   rE   rF   r\   r^   rd   r   r   r   r   r,   Q   s   	[	r,   Úir   z#Oops, file a bug against fonttools.c                   @   sæ   e Zd ZdZdZd9dd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ ZdS ):r2   z5Helper class to retrieve data from an OpenType table.©r6   ÚoffsetÚposÚ
localStater0   Nr   c                 C   s"   || _ || _|| _|| _|| _d S r"   rg   )r   r6   rj   rh   r0   r   r   r   r   
  s
    zOTTableReader.__init__c                 C   s   |  j |7  _ d S r"   ©ri   ©r   Úcountr   r   r   Úadvance  s    zOTTableReader.advancec                 C   s
   || _ d S r"   rk   )r   ri   r   r   r   Úseek  s    zOTTableReader.seekc                 C   s$   |   | j| j| j| j¡}| j|_|S r"   )Ú	__class__r6   rj   rh   r0   ri   ©r   Úotherr   r   r   Úcopy  s    zOTTableReader.copyc                 C   s    | j | }|  | j| j|| j¡S r"   )rh   rp   r6   rj   r0   )r   rh   r   r   r   ÚgetSubReader  s    
zOTTableReader.getSubReaderc                 C   s6   | j }|| }t d|› �| j||… ¡\}|| _ |S ©Nú>©ri   ÚstructÚunpackr6   )r   ÚtypecodeÚ
staticSizeri   Únewposr$   r   r   r   Ú	readValue   s
    zOTTableReader.readValuec                 C   sH   | j }|||  }t || j||… ¡}tjdkr:| ¡  || _ | ¡ S ©NÚbig)ri   Úarrayr6   ÚsysÚ	byteorderÚbyteswapÚtolist)r   rz   r{   rm   ri   r|   r$   r   r   r   Ú	readArray'  s    
zOTTableReader.readArrayc                 C   s   | j ddd�S )NÚbr   ©r{   ©r}   r   r   r   r   ÚreadInt80  s    zOTTableReader.readInt8c                 C   s   | j dd|d�S )Nr†   r   ©r{   rm   ©r…   rl   r   r   r   ÚreadInt8Array3  s    zOTTableReader.readInt8Arrayc                 C   s   | j ddd�S )NÚhr   r‡   rˆ   r   r   r   r   Ú	readShort6  s    zOTTableReader.readShortc                 C   s   | j dd|d�S )Nr�   r   rŠ   r‹   rl   r   r   r   ÚreadShortArray9  s    zOTTableReader.readShortArrayc                 C   s   | j ddd�S )Nrf   r   r‡   rˆ   r   r   r   r   ÚreadLong<  s    zOTTableReader.readLongc                 C   s   | j dd|d�S )Nrf   r   rŠ   r‹   rl   r   r   r   ÚreadLongArray?  s    zOTTableReader.readLongArrayc                 C   s   | j ddd�S )NÚBr   r‡   rˆ   r   r   r   r   Ú	readUInt8B  s    zOTTableReader.readUInt8c                 C   s   | j dd|d�S )Nr’   r   rŠ   r‹   rl   r   r   r   ÚreadUInt8ArrayE  s    zOTTableReader.readUInt8Arrayc                 C   s   | j ddd�S )NÚHr   r‡   rˆ   r   r   r   r   Ú
readUShortH  s    zOTTableReader.readUShortc                 C   s   | j dd|d�S )Nr•   r   rŠ   r‹   rl   r   r   r   ÚreadUShortArrayK  s    zOTTableReader.readUShortArrayc                 C   s   | j ddd�S )NÚIr   r‡   rˆ   r   r   r   r   Ú	readULongN  s    zOTTableReader.readULongc                 C   s   | j dd|d�S )Nr˜   r   rŠ   r‹   rl   r   r   r   ÚreadULongArrayQ  s    zOTTableReader.readULongArrayc                 C   s4   | j }|d }t dd| j||…  ¡\}|| _ |S )Nr   z>ló    rw   ©r   ri   r|   r$   r   r   r   Ú
readUInt24T  s
    zOTTableReader.readUInt24c                    s   ‡ fdd„t |ƒD ƒS )Nc                    s   g | ]}ˆ   ¡ ‘qS r   )r�   )Ú.0Ú_r   r   r   Ú
<listcomp>\  ó    z1OTTableReader.readUInt24Array.<locals>.<listcomp>)Úrangerl   r   r   r   ÚreadUInt24Array[  s    zOTTableReader.readUInt24Arrayc                 C   s>   | j }|d }t| j||… ƒ}t|ƒdks4J |ƒ‚|| _ |S ©Nr   )ri   r   r6   Úlenrœ   r   r   r   ÚreadTag^  s    zOTTableReader.readTagc                 C   s&   | j }|| }| j||… }|| _ |S r"   )ri   r6   )r   rm   ri   r|   r$   r   r   r   ÚreadDataf  s
    zOTTableReader.readDatac                 C   s(   | j r| j  ¡ ntƒ }|||< || _ d S r"   ©rj   rs   Údict©r   r`   r$   rH   r   r   r   Ú__setitem__m  s    zOTTableReader.__setitem__c                 C   s   | j o| j | S r"   ©rj   ©r   r`   r   r   r   Ú__getitem__r  s    zOTTableReader.__getitem__c                 C   s   | j o|| j v S r"   r¬   r­   r   r   r   Ú__contains__u  s    zOTTableReader.__contains__)Nr   N)r   r   r    re   Ú	__slots__r   rn   ro   rs   rt   r}   r…   r‰   rŒ   rŽ   r�   r�   r‘   r“   r”   r–   r—   r™   rš   r�   r£   r¦   r§   r«   r®   r¯   r   r   r   r   r2     s8   
	r2   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚOffsetToWriterc                 C   s   || _ || _d S r"   )Ú	subWriterÚ
offsetSize©r   r²   r³   r   r   r   r   z  s    zOffsetToWriter.__init__c                 C   s,   t | ƒt |ƒkrtS | j|jko*| j|jkS r"   )rS   ÚNotImplementedr²   r³   rq   r   r   r   Ú__eq__~  s    zOffsetToWriter.__eq__c                 C   s   t | j| jfƒS r"   )Úhashr²   r³   r   r   r   r   Ú__hash__ƒ  s    zOffsetToWriter.__hash__N)r   r   r    r   r¶   r¸   r   r   r   r   r±   y  s   r±   c                   @   sH  e Zd ZdZdRdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdSdd„Zdd„ Zdd„ Zdd„ ZdTd!d"„Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Z d?d@„ Z!dAdB„ Z"dCdD„ Z#dEdF„ Z$dGdH„ Z%dUdJdK„Z&dLdM„ Z'dNdO„ Z(dPdQ„ Z)dS )VrB   z=Helper class to gather and assemble data for OpenType tables.Nc                 C   s"   g | _ d | _|| _|| _d | _d S r"   )Úitemsri   rj   r0   Úparent)r   rj   r0   r   r   r   r   ‹  s
    zOTTableWriter.__init__c                 C   s(   | j r| j  ¡ ntƒ }|||< || _ d S r"   r¨   rª   r   r   r   r«   ’  s    zOTTableWriter.__setitem__c                 C   s
   | j | S r"   r¬   r­   r   r   r   r®   —  s    zOTTableWriter.__getitem__c                 C   s   | j |= d S r"   r¬   r­   r   r   r   Ú__delitem__š  s    zOTTableWriter.__delitem__c                 C   sL   d}| j D ]<}t|dƒr$||j7 }q
t|dƒr:||j7 }q
|t|ƒ }q
|S )z<Return the length of this table in bytes, without subtables.r   ÚgetCountDatar²   )r¹   r]   Úsizer³   r¥   )r   ÚlÚitemr   r   r   ÚgetDataLengthŸ  s    


zOTTableWriter.getDataLengthc              	   C   sØ   t | jƒ}| j}t|ƒ}t|ƒD ]®}|| }t|dƒr |jdkrVt|jj| ƒ||< q |jdkr¤zt	|jj| ƒ||< W qÎ t
jy    |  |j¡}t|ƒ‚Y qÎ0 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¹   ri   r¥   r¢   r]   r³   Ú	packULongr²   Ú
packUShortrx   ÚerrorÚgetOverflowErrorRecordr!   Ú
packUInt24rP   r   )r   r¹   ri   ÚnumItemsrf   r¿   r%   r   r   r   ÚgetData«  s(    



ÿ
zOTTableWriter.getDatac                 C   sb   t | jƒ}tttdœ}t|ƒD ]:\}}t|dƒr|j|v rN||j dƒ||< qt|jƒ‚qt	|ƒS )zFAssemble the data for this writer/table with all offset field set to 0)r   r   r   r²   r   )
rÁ   r¹   rÃ   rÆ   rÂ   Ú	enumerater]   r³   rP   r   )r   r¹   Z	packFuncsrf   r¿   r   r   r   ÚgetDataForHarfbuzzÇ  s    


z OTTableWriter.getDataForHarfbuzzc                 C   s
   t | jƒS r"   )r·   r¹   r   r   r   r   r¸   Õ  s    zOTTableWriter.__hash__c                 C   s   |   |¡}|tu r|S | S r"   ©r¶   rµ   ©r   rr   Úresultr   r   r   Ú__ne__Ù  s    
zOTTableWriter.__ne__c                 C   s    t | ƒt |ƒkrtS | j|jkS r"   )rS   rµ   r¹   rq   r   r   r   r¶   Ý  s    zOTTableWriter.__eq__Fc                 C   sš   t | dƒ}t | dƒ}|r |s i }| j}tt|ƒƒD ]X}|| }t |dƒrV| ¡ ||< q2t |dƒr2|jj||d� |s2| |j|j¡|| _q2t|ƒ| _d S )NÚ	ExtensionÚ	DontSharer¼   r²   ©ÚshareExtension)	r]   r¹   r¢   r¥   r¼   r²   Ú_doneWritingÚ
setdefaultÚtuple)r   ÚinternedTablesrÒ   ÚisExtensionZ	dontSharer¹   rf   r¿   r   r   r   rÓ   â  s$    



ÿ	ÿzOTTableWriter._doneWritingc                 C   s:  d|t | ƒ< t| jƒ}tt|ƒƒ}| ¡  t| dƒ}|}|r\|d usLJ dƒ‚|d i   }}}d}t| dƒrÆt|ƒD ]2}	| j|	 }
t|
dƒrrt|
jdd ƒdkrrd} q¦qrt |
jƒ|vrÆ|
j 	|||¡ n |D ]`}	| j|	 }
t|
dƒsäqÊ|�r
|	d	k�r
t|
jdd ƒdk�r
qÊt |
jƒ|v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]   r3   r²   Ú_gatherTablesÚappend)r   ÚtablesÚ	extTablesÚdonerÇ   ZiRanger×   Z
selfTablesrØ   rf   r¿   r   r   r   rÜ   
  sN    	

ÿþ

ÿþ

ÿþýzOTTableWriter._gatherTablesc                 C   s†  g }g }|}|D ]}	|  dd|	f¡ qd}
d}t| dƒržt| jƒD ]Z\}}t|dd ƒdkrBd}
t|ƒ|vr‚| |||||¡ }}n|t|ƒ }|  |¡  qžqBd}d}t| jƒD ]–\}}t|dƒrÈ|}n&t|dƒrà||j7 }q°n|t|ƒ }q°t|j	ƒ|v�r|j	 |||||¡ }}n|t|j	ƒ }||j
|f}|  |¡ ||j
7 }q°|  | ¡ |  ||f¡ |d	7 }||t| ƒ< |
�r‚| ¡  |S )
Nr   FrØ   r`   rÙ   Tr²   r¼   r   )rÝ   r]   rÉ   r¹   r3   rÚ   Ú_gatherGraphForHarfbuzzr½   r¥   r²   r³   Úpop)r   rÞ   Úobj_listrà   ÚobjidxÚvirtual_edgesZ
real_linksZvirtual_linksZitem_idxÚidxrØ   Zcoverage_idxrf   r¿   Z	child_idxZ
offset_posri   Z	real_edger   r   r   rá   J  sV    

ÿ





ÿ


z%OTTableWriter._gatherGraphForHarfbuzzc                 C   s¤   i }| j |dd� g }g }i }d}g }|  |||||¡ d}|D ]}	||	_||	 ¡  }q@g }
|D ]}	|	 ¡ }|
 |¡ q`ttdƒ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á   ri   rÀ   rÊ   rÝ   r]   rR   rç   r   r   )r   r0   rÖ   rÞ   rã   rà   rä   rå   ri   r4   r6   Ú	tableDatar   r   r   rO   ƒ  s&    
z%OTTableWriter.getAllDataUsingHarfbuzzTc           
      C   s¼   |ri }|   |¡ g }g }i }|  |||¡ | ¡  | ¡  d}|D ]}||_|| ¡  }qD|D ]}||_|| ¡  }q`g }|D ]}| ¡ }	| |	¡ q€|D ]}| ¡ }	| |	¡ qœt|ƒS )z+Assemble all data, including all subtables.r   )rÓ   rÜ   rÛ   ri   rÀ   rÈ   rÝ   r   )
r   rN   rÖ   rÞ   rß   rà   ri   r4   r6   rè   r   r   r   rU   ¤  s0    
zOTTableWriter.getAllDatac                 C   s   |   | j| j¡}| |_|S r"   )rp   rj   r0   rº   )r   Z	subwriterr   r   r   ÚgetSubWriterÇ  s    ÿzOTTableWriter.getSubWriterc                 C   s   | j  t d|› �|¡¡ d S ru   ©r¹   rÝ   rx   Úpack)r   rz   r$   r   r   r   Ú
writeValueÑ  s    zOTTableWriter.writeValuec                 C   s2   t   ||¡}tjdkr| ¡  | j | ¡ ¡ d S r~   )r€   r�   r‚   rƒ   r¹   rÝ   Útobytes)r   rz   ÚvaluesÚar   r   r   Ú
writeArrayÔ  s    
zOTTableWriter.writeArrayc                 C   s6   d|  krdk sn J |ƒ‚| j  t d|¡¡ d S )Ni€ÿÿÿé€   z>brê   ©r   r$   r   r   r   Ú	writeInt8Ú  s    zOTTableWriter.writeInt8c                 C   s   |   d|¡ d S )Nr†   ©rð   ©r   rî   r   r   r   ÚwriteInt8ArrayÞ  s    zOTTableWriter.writeInt8Arrayc                 C   s6   d|  krdk sn J |ƒ‚| j  t d|¡¡ d S )Ni €ÿÿé €  z>hrê   rò   r   r   r   Ú
writeShortá  s    zOTTableWriter.writeShortc                 C   s   |   d|¡ d S )Nr�   rô   rõ   r   r   r   ÚwriteShortArrayå  s    zOTTableWriter.writeShortArrayc                 C   s   | j  t d|¡¡ d S )Nz>irê   rò   r   r   r   Ú	writeLongè  s    zOTTableWriter.writeLongc                 C   s   |   d|¡ d S )Nrf   rô   rõ   r   r   r   ÚwriteLongArrayë  s    zOTTableWriter.writeLongArrayc                 C   s6   d|  krdk sn J |ƒ‚| j  t d|¡¡ d S )Nr   é   ú>Brê   rò   r   r   r   Ú
writeUInt8î  s    zOTTableWriter.writeUInt8c                 C   s   |   d|¡ d S )Nr’   rô   rõ   r   r   r   ÚwriteUInt8Arrayò  s    zOTTableWriter.writeUInt8Arrayc                 C   s6   d|  krdk sn J |ƒ‚| j  t d|¡¡ d S )Nr   i   ú>Hrê   rò   r   r   r   ÚwriteUShortõ  s    zOTTableWriter.writeUShortc                 C   s   |   d|¡ d S )Nr•   rô   rõ   r   r   r   ÚwriteUShortArrayù  s    zOTTableWriter.writeUShortArrayc                 C   s   | j  t d|¡¡ d S )Nú>Irê   rò   r   r   r   Ú
writeULongü  s    zOTTableWriter.writeULongc                 C   s   |   d|¡ d S )Nr˜   rô   rõ   r   r   r   ÚwriteULongArrayÿ  s    zOTTableWriter.writeULongArrayc                 C   sB   d|  krdk sn J |ƒ‚t  d|¡}| j |dd … ¡ d S )Nr   é   z>Lr   ©rx   rë   r¹   rÝ   )r   r$   r†   r   r   r   ÚwriteUInt24  s    zOTTableWriter.writeUInt24c                 C   s   |D ]}|   |¡ qd S r"   )r  )r   rî   r$   r   r   r   ÚwriteUInt24Array  s    zOTTableWriter.writeUInt24Arrayc                 C   s0   t |ƒ ¡ }t|ƒdks J |ƒ‚| j |¡ d S r¤   )r   rí   r¥   r¹   rÝ   )r   Útagr   r   r   ÚwriteTag  s    zOTTableWriter.writeTagc                 C   s   | j  t||ƒ¡ d S r"   )r¹   rÝ   r±   r´   r   r   r   ÚwriteSubTable  s    zOTTableWriter.writeSubTabler   c                 C   s    t ||||d�}| j |¡ |S )N)r½   r$   )ÚCountReferencer¹   rÝ   )r   r4   r`   r½   r$   Úrefr   r   r   ÚwriteCountReference  s    z!OTTableWriter.writeCountReferencec                 C   s    t j|f| Ž }| j |¡ d S r"   r  )r   Úformatrî   r6   r   r   r   ÚwriteStruct  s    zOTTableWriter.writeStructc                 C   s   | j  |¡ d S r"   )r¹   rÝ   )r   r6   r   r   r   Ú	writeData  s    zOTTableWriter.writeDatac                 C   s  d  } } }}| j dkr"|j}nØ| j dkr:| j}|j}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 )
NÚ
LookupListÚLookupr`   z<none>ÚrepeatIndexÚSubTableÚExtSubTableÚ.)r  r  )r`   r  r3   r]   rº   Újoinr   r0   )r   r¿   r   r   r   r   Úp1r   r   r   rÅ     s:    









ÿz$OTTableWriter.getOverflowErrorRecord)NN)F)T)r   N)*r   r   r    re   r   r«   r®   r»   rÀ   rÈ   rÊ   r¸   rÎ   r¶   rÓ   rÜ   rá   rO   rU   ré   rì   rð   ró   rö   rø   rù   rú   rû   rþ   rÿ   r  r  r  r  r  r	  r  r  r  r  r  rÅ   r   r   r   r   rB   ˆ  sN   

(@9!
#

rB   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )r  z8A reference to a Count value, not a count of references.Nc                 C   s(   || _ || _|| _|d ur$|  |¡ d S r"   )r4   r`   r½   ÚsetValue)r   r4   r`   r½   r$   r   r   r   r   F  s
    zCountReference.__init__c                 C   sD   | j }| j}|| d u r"|||< n|| |ks@J ||| |fƒ‚d S r"   ©r4   r`   )r   r$   r4   r`   r   r   r   r  M  s
    
zCountReference.setValuec                 C   s   | j | j S r"   r  r   r   r   r   ÚgetValueU  s    zCountReference.getValuec                 C   s.   | j | j }|d u rd}tttdœ| j |ƒS )Nr   )r   r   r   )r4   r`   Ú	packUInt8rÃ   rÂ   r½   )r   Úvr   r   r   r¼   X  s    zCountReference.getCountData)NN)r   r   r    re   r   r  r  r¼   r   r   r   r   r  C  s
   
r  c                 C   s   t  d| ¡S )Nrý   ©rx   rë   r#   r   r   r   r  _  s    r  c                 C   s   t  d| ¡S )Nr   r   r#   r   r   r   rÃ   c  s    rÃ   c                 C   s*   d|   krdk sn J | ƒ‚t  d| ¡S )Nr   l        r  r   r#   r   r   r   rÂ   g  s    rÂ   c                 C   s2   d|   krdk sn J | ƒ‚t  d| ¡dd … S )Nr   r  r  r   r   r#   r   r   r   rÆ   l  s    rÆ   c                   @   sÄ   e Zd ZdZdd„ Zd+dd„Zdd„ Zed	d
„ ƒZdd„ Z	dd„ Z
d,dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd-dd„Zdd„ Zdd„ Zd d!„ Zd"d#„ ZG d$d%„ d%eƒZee d&œd'd(„Zd)d*„ ZdS ).Ú	BaseTablez0Generic base class for all OpenType (sub)tables.c                 C   s@   | j  d¡}|r4| `| j}| `|  ||¡ t| |ƒS t|ƒ‚d S ©Nr8   )Ú__dict__Úgetr8   r7   r5   r3   ÚAttributeError)r   Úattrr8   r7   r   r   r   Ú__getattr__t  s    
zBaseTable.__getattr__Fc                 C   sL   | j  d¡}|r*| `| j}| `|  ||¡ |rH|  ¡ D ]}|j |¡ q6d S r"  )r#  r$  r8   r7   r5   ÚiterSubTablesr$   rd   )r   rc   r8   r7   Úsubtabler   r   r   rd     s    zBaseTable.ensureDecompiledc                 C   s0   d| j v r*| j  ¡ }| j d  ¡ |d< |S | j S r"  )r#  rs   )r   rH   r   r   r   Ú__getstate__Š  s
    

zBaseTable.__getstate__c                 C   sh   d}| j D ]X}| |¡}|tu r(t  S d}|jrV|j|v rN||j |j }nt  S ||| 7 }q
|S )Nr   r   )Ú
convertersÚgetRecordSizerµ   ÚrepeatÚaux)Úclsr8   Z	totalSizeÚconvr½   Ú
countValuer   r   r   r,  “  s    


zBaseTable.getRecordSizec                 C   s   | j S r"   )r+  r   r   r   r   ÚgetConverters£  s    zBaseTable.getConvertersc                 C   s
   | j | S r"   )ÚconvertersByNamer­   r   r   r   ÚgetConverterByName¦  s    zBaseTable.getConverterByNameNc              	   C   sò   |   ¡ D ]ä}|j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 ƒ t|dƒrt| |j|jƒ qd S )NZwriteNullOffsetÚDEFAULT)r2  r-  r]   r`   Úsetattrr¥   r3   r.  r4  ÚKeyErrorr  Úevalr#  r5  )r   Ú
propagatorr0  r1  Z
count_convr   r   r   r_   ©  s&    

zBaseTable.populateDefaultsc                 C   s¤  |   |¡ i }|| _|  ¡ D �]V}|jdkr>| |j|d ¡}|jdkrZ| |j|d ¡}|jdkrr| |d ¡}|jdkrŽ| |j|d ¡}z¨|j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ExtensionLookupTypeÚFeatureParamsÚ
FeatureTagZ	SubStructZ	MorphTypeÚpostRead)Ú
readFormatZ_BaseTable__rawTabler2  r`   ZgetConverterr0   r-  Ú
isinstanceÚintr.  r…   r8  ÚreadÚisPropagatedÚ	ExceptionÚargsr]   r=  r#  Úupdate)r   r8   r7   r4   r0  r1  rL   r`   r   r   r   r5   Ä  sD    







zBaseTable.decompilec                 C   s  |   ¡  t| dƒr8t| dƒ }|  |¡}|o4t| dƒ}nd}| j ¡ }|  ¡ D ]0}|jrN|jrN| |j	¡}t
|tƒrN|||j	< qNt| dƒ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]   rF  r#  rs   r2  ZisCountrB  r$  r`   r?  r  rØ   rÐ   rp   r  r:  ÚwriteFormatr-  r¥   r.  r@  rð   rC  rD  r{   r½   r  r  r  ZisLookupTyper8  Úwriter   rG  )r   rK   r7   ZdeleteFormatr4   r0  r$   r1  rL   r  r`   r   r   r   rC   î  sŠ    






ÿþ




ÿ
zBaseTable.compilec                 C   s   d S r"   r   ©r   r8   r   r   r   r>  S  s    zBaseTable.readFormatc                 C   s   d S r"   r   rW   r   r   r   rH  V  s    zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d u rg }t| dƒr6|d| jfg }| ||¡ | ¡  |  ||¡ | |¡ | ¡  d S )NrG  )rp   r   r]   rG  ÚbegintagÚnewliner[   Úendtag)r   Ú	xmlWriterr7   ra   r`   Ú	tableNamer   r   r   r\   Y  s    

zBaseTable.toXMLc              
   C   s˜   |   ¡ D ]Š}|jrVt| |jg ƒ}tt|ƒƒD ]&}|| }| ||||jd|fg¡ q,q|jrpt|jd t	| ƒƒspqt| |jd ƒ}| ||||jg ¡ qd S )NÚindex)
r2  r-  r3   r`   r¢   r¥   ÚxmlWriter.  r8  Úvars)r   rN  r7   r0  r$   rf   r¿   r   r   r   r[   e  s    ÿzBaseTable.toXML2c                 C   s‚   z|   |¡}W n ty"   ‚ Y n0 | |||¡}|jd urpt| |jd ƒ}|d u rdg }t| |j|ƒ | |¡ nt| |j|ƒ d S r"   )r4  r7  ZxmlReadr-  r3   r`   r6  rÝ   )r   r`   ra   rb   r7   r0  r$   Úseqr   r   r   r^   w  s    
zBaseTable.fromXMLc                 C   s   |   |¡}|tu r|S | S r"   rË   rÌ   r   r   r   rÎ   ‰  s    
zBaseTable.__ne__c                 C   s0   t | ƒt |ƒkrtS |  ¡  | ¡  | j|jkS r"   )rS   rµ   rd   r#  rq   r   r   r   r¶   �  s
    zBaseTable.__eq__c                   @   s2   e Zd ZU dZeed< ded< dZee ed< dS )zBaseTable.SubTableEntryzSee BaseTable.iterSubTables()r`   r!  r$   NrP  )	r   r   r    re   r   Ú__annotations__rP  r   r@  r   r   r   r   ÚSubTableEntry–  s   
rU  )Úreturnc                 #   sp   ˆ  ¡ D ]b}|j‰ tˆˆ dƒ}|du r(qt|tƒrBˆ ˆ |¡V  qt|tƒr‡ ‡fdd„t|ƒD ƒE dH  qdS )a7  Yield (name, value, index) namedtuples for all subtables of current table.

        A sub-table is an instance of BaseTable (or subclass thereof) that is a child
        of self, the current parent table.
        The tuples also contain the attribute name (str) of the of parent table to get
        a subtable, and optionally, for lists of subtables (i.e. attributes associated
        with a converter that has a 'repeat'), an index into the list containing the
        given subtable value.
        This method can be useful to traverse trees of otTables.
        Nc                 3   s,   | ]$\}}t |tƒrˆjˆ ||d �V  qdS ))rP  N)r?  r!  rU  )rž   rf   r  ©r`   r   r   r   Ú	<genexpr>°  s   
þz*BaseTable.iterSubTables.<locals>.<genexpr>)r2  r`   r3   r?  r!  rU  rÁ   rÉ   )r   r0  r$   r   rW  r   r(  �  s    

þzBaseTable.iterSubTablesc                 C   s
   t | jƒS r"   )ÚgetVariableAttrsrp   r   r   r   r   rY  ·  s    zBaseTable.getVariableAttrs)F)N)NN)r   r   r    re   r'  rd   r*  Úclassmethodr,  r2  r4  r_   r5   rC   r>  rH  r\   r[   r^   rÎ   r¶   r
   rU  r	   r(  rY  r   r   r   r   r!  q  s*   
	

*e
	r!  c                   @   sN   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
d„ Z	ddd„Z
dd„ ZdS )ÚFormatSwitchingBaseTablezvMinor specialization of BaseTable, for tables that have multiple
    formats, eg. CoverageFormat1 vs. CoverageFormat2.c                 C   s   t S r"   )rµ   )r/  r8   r   r   r   r,  ¿  s    z&FormatSwitchingBaseTable.getRecordSizec                 C   s2   z
| j }W n ty    g  Y S 0 | j | j g ¡S r"   )rG  r%  r+  r$  )r   Úfmtr   r   r   r2  Ã  s
    

z&FormatSwitchingBaseTable.getConvertersc                 C   s   | j | j | S r"   )r3  rG  r­   r   r   r   r4  Ï  s    z+FormatSwitchingBaseTable.getConverterByNamec                 C   s   |  ¡ | _d S r"   )r–   rG  rJ  r   r   r   r>  Ò  s    z#FormatSwitchingBaseTable.readFormatc                 C   s   |  | j¡ d S r"   )r  rG  rW   r   r   r   rH  Õ  s    z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t  | ||||¡ d S r"   )r!  r\   )r   rN  r7   ra   r`   r   r   r   r\   Ø  s    zFormatSwitchingBaseTable.toXMLc                 C   s   t | j| jƒS r"   )rY  rp   rG  r   r   r   r   rY  Û  s    z)FormatSwitchingBaseTable.getVariableAttrs)NN)r   r   r    re   rZ  r,  r2  r4  r>  rH  r\   rY  r   r   r   r   r[  »  s   

r[  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚUInt8FormatSwitchingBaseTablec                 C   s   |  ¡ | _d S r"   )r“   rG  rJ  r   r   r   r>  à  s    z(UInt8FormatSwitchingBaseTable.readFormatc                 C   s   |  | j¡ d S r"   )rþ   rG  rW   r   r   r   rH  ã  s    z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r   r    r>  rH  r   r   r   r   r]  ß  s   r]  )Zuint16Úuint8c                 C   s0   z
t |  W S  ty*   td| ›�ƒ‚Y n0 d S )NzUnsupported format type: )ÚformatSwitchingBaseTablesr7  Ú	TypeError)Ú
formatTyper   r   r   Ú getFormatSwitchingBaseTableClassí  s    
rb  )r/  r\  rV  c                 C   s’   t | tƒst| ƒ‚t | tƒr@|du r4td| j› �ƒ‚| j| }n| j}d|vrRdS i }| ¡ D ] \}}| ¡ }|dur^|||< q^tt	||j
d�ƒS )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!  r`  r[  r   r3  r¹   ZgetVarIndexOffsetrÕ   Úsortedr®   )r/  r\  r+  ZvarAttrsr`   r0  rh   r   r   r   rY  õ  s    


rY  ))r   Z
XPlacementr   r   )r   Z
YPlacementr   r   )r   ZXAdvancer   r   )é   ZYAdvancer   r   )é   Ú
XPlaDevicer   r   )é    Ú
YPlaDevicer   r   )é@   Ú
XAdvDevicer   r   )rñ   Ú
YAdvDevicer   r   )rü   Z	Reserved1r   r   )i   Z	Reserved2r   r   )i   Z	Reserved3r   r   )i   Z	Reserved4r   r   )i   Z	Reserved5r   r   )i    Z	Reserved6r   r   )i @  Z	Reserved7r   r   )r÷   Z	Reserved8r   r   c                  C   s(   i } t D ]\}}}}|||f| |< q| S r"   )ÚvalueRecordFormat)ÚdÚmaskr`   ÚisDeviceÚsignedr   r   r   Ú
_buildDict-  s    rs  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚValueRecordFactoryz6Given a format code, this object convert ValueRecords.c                 C   s8   g }t D ]$\}}}}||@ r| |||f¡ q|| _d S r"   )rn  rÝ   r  )r   ÚvalueFormatr  rp  r`   rq  rr  r   r   r   r   :  s
    zValueRecordFactory.__init__c                 C   s
   t | jƒS r"   )r¥   r  r   r   r   r   Ú__len__A  s    zValueRecordFactory.__len__c                 C   s†   | j }|sd S tƒ }|D ]h\}}}|r0| ¡ }n| ¡ }|rt|rpddlm}	 | |¡}
t|	|ƒƒ }| |
|¡ nd }t	|||ƒ q|S ©Nr   r-   )
r  ÚValueRecordrŽ   r–   r1   r.   rt   r3   r5   r6  )r   r8   r7   r  ÚvalueRecordr`   rq  rr  r$   r.   Ú	subReaderr   r   r   ÚreadValueRecordD  s"    

z"ValueRecordFactory.readValueRecordc           	      C   st   | j D ]h\}}}t||dƒ}|rT|rH| ¡ }|j|dd� | ||¡ qn| d¡ q|rd| |¡ q| |¡ qd S )Nr   r   )r³   )r  r3   ré   r  rC   r  rø   )	r   rK   r7   ry  r`   rq  rr  r$   r²   r   r   r   ÚwriteValueRecordZ  s    z#ValueRecordFactory.writeValueRecordN)r   r   r    re   r   rv  r{  r|  r   r   r   r   rt  7  s
   rt  c                   @   sH   e Zd Zddd„Zdd„ Zdd„ Zddd	„Zd
d„ Zdd„ Zdd„ Z	dS )rx  Nc           	      C   s„   |d urlt D ](\}}}}||@ rt| ||r.d ndƒ q|d ur€|j ¡ D ] \}}t| |ƒs\qHt| ||ƒ qHn|d ur€|j ¡ | _d S ©Nr   )rn  r6  r#  r¹   r]   rs   )	r   ru  Úsrcrp  r`   rq  rr  rc  Úvalr   r   r   r   m  s    
zValueRecord.__init__c                 C   s(   d}| j  ¡ D ]}|t| d B }q|S r}  )r#  ÚkeysÚvalueRecordFormatDict)r   r  r`   r   r   r   Ú	getFormatz  s    zValueRecord.getFormatc                 C   s0   d}| j  ¡ D ]\}}|r|t| d B }q|S r}  )r#  r¹   r�  )r   r  r`   r$   r   r   r   ÚgetEffectiveFormat€  s
    zValueRecord.getEffectiveFormatc                 C   s   |d u rg }nt |ƒ}td d… D ]*\}}}}	t| |ƒr"| |t| |ƒf¡ q"g }
tdd… D ]6\}}}}	t| |ƒr^t| |ƒ}|d ur^|
 ||f¡ q^|
rè| ||¡ | ¡  |
D ] \}}|d ur²|j|||d� q²| |¡ | ¡  n| 	||¡ | ¡  d S )Nr   rf  )r`   )
rÁ   rn  r]   rÝ   r3   rK  rL  r\   rM  Ú	simpletag)r   rN  r7   Z	valueNamera   ZsimpleItemsrp  r`   rq  r  ZdeviceItemsZdeviceZdeviceRecordr   r   r   r\   ‡  s,    




zValueRecord.toXMLc                 C   sš   ddl m} | ¡ D ]\}}t| |t|ƒƒ q|D ]b}t|tƒsBq2|\}}}t||ƒƒ }	|D ]*}
t|
tƒslq\|
\}}}|	 ||||¡ q\t| ||	ƒ q2d S rw  )	r1   r.   r¹   r6  r@  r?  rÕ   r3   r^   )r   r`   ra   rb   r7   r.   Úkr  Úelementr$   Zelem2Zname2Zattrs2Zcontent2r   r   r   r^   ¡  s    



zValueRecord.fromXMLc                 C   s   |   |¡}|tu r|S | S r"   rË   rÌ   r   r   r   rÎ   ²  s    
zValueRecord.__ne__c                 C   s    t | ƒt |ƒkrtS | j|jkS r"   )rS   rµ   r#  rq   r   r   r   r¶   ¶  s    zValueRecord.__eq__)NN)N)
r   r   r    r   r‚  rƒ  r\   r^   rÎ   r¶   r   r   r   r   rx  j  s   

rx  )N);ÚfontTools.configr   ÚfontTools.misc.textToolsr   r   r   Úenumr   r�   r€   rx   ÚloggingÚ	functoolsr   Útypingr	   r
   r   r   Ú	getLoggerr   r>   r@   Z	uharfbuzzrR   Úcallabler3   rA   r=   Úobjectr   rC  r!   r(   r,   r¥   rë   Úitemsizer2   r±   rB   r  r  rÃ   rÂ   rÆ   r!  r[  r]  r_  rb  r@  r   rY  rn  rs  r�  rt  rx  r   r   r   r   Ú<module>   sf   
 1t   >  L$	þ!3