o
    a}                     @   sr  d dl mZmZ ddlmZ d dlZd dlZd dlZd dlZee	Z
G dd deZG dd deZG d	d
 d
eZeedd dksGJ edjdksSJ dG dd deZG dd deZG dd deZdd Zdd Zdd Zdd ZG dd deZG dd deZG d d! d!eZeed"Zd#d$ Zg d%Zd&d' Z e  Z!G d(d) d)eZ"G d*d+ d+eZ#dS ),    )Tag	bytesjoin   )DefaultTableNc                   @      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   ?/usr/lib/python3/dist-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                   @   r   )OTLOffsetOverflowErrorc                 C   
   || _ d S Nvalue)r   overflowErrorRecordr   r   r   r         
zOTLOffsetOverflowError.__init__c                 C   
   t | jS r   )reprr   r   r   r   r   __str__   r    zOTLOffsetOverflowError.__str__N)r   r   r   r   r#   r   r   r   r   r          r   c                   @   0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )BaseTTXConverterzGeneric base class for TTX table converters. It functions as an
	adapter between the TTX (ttLib actually) table model and the model
	we use for OpenType tables, which is necessarily subtly different.
	c                 C   s@   ddl m} t|| jd}t|| j}| | _| j|| dS )zFCreate an object from the binary data. Called automatically on access.r   otTablestableTagN) r(   OTTableReaderr*   getattrtable	decompile)r   datafontr(   reader
tableClassr   r   r   r/   $   s
   zBaseTTXConverter.decompilec           	   
   C   s   d}	 zt | jd}| j|| | W S  tyf } zE||jkr# |j}td| |}d}|j	du rAddl
m} |||}nddl
m} |||}|s\ddl
m} |||}|s\ W Y d}~nd}~ww q)	z=Compiles the table into binary. Called automatically on save.NTr)   z+Attempting to fix OTLOffsetOverflowError %sr   r   )fixLookupOverFlows)fixSubTableOverFlows)OTTableWriterr*   r.   compile
getAllDatar   r   loginfor   r(   r4   r5   )	r   r1   ZoverflowRecordwritereZlastItemokr4   r5   r   r   r   r7   ,   s4   




zBaseTTXConverter.compilec                 C   s   | j || d S r   )r.   toXML2)r   r;   r1   r   r   r   toXMLd      zBaseTTXConverter.toXMLc                 C   sJ   ddl m} t| dst|| j}| | _| j|||| | j  d S )Nr   r'   r.   )r+   r(   hasattrr-   r*   r.   fromXMLpopulateDefaults)r   nameattrscontentr1   r(   r3   r   r   r   rB   g   s   
zBaseTTXConverter.fromXMLN)r   r   r   __doc__r/   r7   r?   rB   r   r   r   r   r&      s    8r&   ir
   z#Oops, file a bug against fonttools.c                   @   s   e Zd ZdZdZd9ddZdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 ZdS ):r,   z5Helper class to retrieve data from an OpenType table.r0   offsetpos
localStater*   Nr   c                 C   s"   || _ || _|| _|| _|| _d S r   rI   )r   r0   rL   rJ   r*   r   r   r   r   z   s
   
zOTTableReader.__init__c                 C   s   |  j |7  _ d S r   rK   r   countr   r   r   advance   r@   zOTTableReader.advancec                 C   r   r   rM   )r   rK   r   r   r   seek   r    zOTTableReader.seekc                 C   s$   |  | j| j| j| j}| j|_|S r   )	__class__r0   rL   rJ   r*   rK   r   otherr   r   r   copy   s   zOTTableReader.copyc                 C   s    | j | }| | j| j|| jS r   )rJ   rR   r0   rL   r*   )r   rJ   r   r   r   getSubReader   s   
zOTTableReader.getSubReaderc                 C   s6   | j }|| }td| | j|| \}|| _ |S N>rK   structunpackr0   )r   typecode
staticSizerK   newposr   r   r   r   	readValue   s
   zOTTableReader.readValuec                 C   sH   | j }|||  }t|| j|| }tjdkr|  || _ | S NZbig)rK   arrayr0   sys	byteorderbyteswaptolist)r   r\   r]   rO   rK   r^   r   r   r   r   	readArray   s   zOTTableReader.readArrayc                 C      | j dddS )Nbr   r]   r_   r   r   r   r   readInt8      zOTTableReader.readInt8c                 C      | j dd|dS )Nrh   r   r]   rO   rf   rN   r   r   r   readInt8Array      zOTTableReader.readInt8Arrayc                 C   rg   )Nhr   ri   rj   r   r   r   r   	readShort   rl   zOTTableReader.readShortc                 C   rm   )Nrr   r   rn   ro   rN   r   r   r   readShortArray   rq   zOTTableReader.readShortArrayc                 C   rg   )NrH   r
   ri   rj   r   r   r   r   readLong   rl   zOTTableReader.readLongc                 C   rm   )NrH   r
   rn   ro   rN   r   r   r   readLongArray   rq   zOTTableReader.readLongArrayc                 C   rg   )NBr   ri   rj   r   r   r   r   	readUInt8   rl   zOTTableReader.readUInt8c                 C   rm   )Nrw   r   rn   ro   rN   r   r   r   readUInt8Array   rq   zOTTableReader.readUInt8Arrayc                 C   rg   )NHr   ri   rj   r   r   r   r   
readUShort   rl   zOTTableReader.readUShortc                 C   rm   )Nrz   r   rn   ro   rN   r   r   r   readUShortArray   rq   zOTTableReader.readUShortArrayc                 C   rg   )NIr
   ri   rj   r   r   r   r   	readULong   rl   zOTTableReader.readULongc                 C   rm   )Nr}   r
   rn   ro   rN   r   r   r   readULongArray   rq   zOTTableReader.readULongArrayc                 C   s4   | j }|d }tdd| j||  \}|| _ |S )Nr	   z>l    rY   r   rK   r^   r   r   r   r   
readUInt24   s
   zOTTableReader.readUInt24c                    s    fddt |D S )Nc                    s   g | ]}   qS r   )r   ).0_r   r   r   
<listcomp>   s    z1OTTableReader.readUInt24Array.<locals>.<listcomp>)rangerN   r   r   r   readUInt24Array      zOTTableReader.readUInt24Arrayc                 C   s>   | j }|d }t| j|| }t|dksJ ||| _ |S Nr
   )rK   r   r0   lenr   r   r   r   readTag   s   zOTTableReader.readTagc                 C   s&   | j }|| }| j|| }|| _ |S r   )rK   r0   )r   rO   rK   r^   r   r   r   r   readData   s
   zOTTableReader.readDatac                 C   (   | j r| j  nt }|||< || _ d S r   rL   rU   dictr   rD   r   stater   r   r   __setitem__      
zOTTableReader.__setitem__c                 C   s   | j o| j | S r   rL   r   rD   r   r   r   __getitem__   rq   zOTTableReader.__getitem__c                 C   s   | j o|| j v S r   r   r   r   r   r   __contains__   rq   zOTTableReader.__contains__)Nr   N)r   r   r   rG   	__slots__r   rP   rQ   rU   rV   r_   rf   rk   rp   rs   rt   ru   rv   rx   ry   r{   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r,   t   s:    
r,   c                   @   sH  e Zd ZdZdMddZedd Zejdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdNdd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$dCdD Z%dOdEdFZ&dGdH Z'dIdJ Z(dKdL Z)dS )Pr6   z=Helper class to gather and assemble data for OpenType tables.Nr   c                 C   s(   g | _ d | _|| _|| _|| _d | _d S r   )itemsrK   rL   r*   
offsetSizeparent)r   rL   r*   r   r   r   r   r      s   
zOTTableWriter.__init__c                 C   s
   | j dkS r   r   r   r   r   r   
longOffset      
zOTTableWriter.longOffsetc                 C   s   |rd| _ d S d| _ d S )Nr
   r   r   r   r   r   r   r   r      s   c                 C   r   r   r   r   r   r   r   r      r   zOTTableWriter.__setitem__c                 C   
   | j | S r   r   r   r   r   r   r      r    zOTTableWriter.__getitem__c                 C   s   | j |= d S r   r   r   r   r   r   __delitem__      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   rA   sizer   r   )r   litemr   r   r   getDataLength  s   


zOTTableWriter.getDataLengthc              	   C   s   t | j}| j}t|}t|D ]P}|| }t|dr`|jdkr*t|j| ||< q|jdkrLzt|j| ||< W q t	j
yK   | |}t|w |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   rK   r   r   rA   r   	packULong
packUShortrZ   errorgetOverflowErrorRecordr   
packUInt24
ValueErrorr   )r   r   rK   numItemsrH   r   r   r   r   r   r     s(   






zOTTableWriter.getDatac                 C   r!   r   )hashr   r   r   r   r   __hash__)  r   zOTTableWriter.__hash__c                 C      |  |}|tu r|S | S r   __eq__NotImplementedr   rT   resultr   r   r   __ne__-     
zOTTableWriter.__ne__c                 C   s,   t | t |kr
tS | j|jko| j|jkS r   )typer   r   r   rS   r   r   r   r   1  s   zOTTableWriter.__eq__c                 C   s   t | d}t | d}|ri }| j}tt|D ](}|| }t |dr)| ||< qt |dr?|| |s?||| ||< }qt|| _d S )N	Extension	DontSharer   r   )rA   r   r   r   r   _doneWriting
setdefaulttuple)r   internedTablesisExtensionZ	dontSharer   rH   r   r   r   r   r   6  s   




zOTTableWriter._doneWritingc                 C   s"  d|t | < t| j}tt|}|  t| d}|}|r.|d us&J d|d i }}}d}t| dr\t|D ]}	| j|	 }
t|
dd dkrLd} nq9t |
|vr[|
||| n	 |D ]+}	| j|	 }
t|
dskq^|rz|	d	krzt|
dd dkrzq^t |
|vr|
||| q^	 q^|	|  d S )
NTr   zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFsortCoverageLastrD   ZCoverager   r   )
idr   r   r   r   reverserA   r-   _gatherTablesappend)r   tables	extTablesdoner   ZiRanger   Z
selfTablesr   rH   r   r   r   r   r   Z  s<   	





zOTTableWriter._gatherTablesc           	      C   s   i }|  | g }g }i }| ||| |  |  d}|D ]}||_||  }q |D ]}||_||  }q.g }|D ]}| }|| q>|D ]}| }|| qLt|S )z+Assemble all data, including all subtables.r   )r   r   r   rK   r   r   r   r   )	r   r   r   r   r   rK   r.   r0   Z	tableDatar   r   r   r8     s.   
zOTTableWriter.getAllDatac                 C   s   | j | j| j|d}| |_|S )Nr   )rR   rL   r*   r   )r   r   Z	subwriterr   r   r   getSubWriter  s   zOTTableWriter.getSubWriterc                 C   s   | j td| | d S rW   r   r   rZ   pack)r   r\   r   r   r   r   
writeValue  s   zOTTableWriter.writeValuec                 C   s2   t  ||}tjdkr|  | j|  d S r`   )ra   rb   rc   rd   r   r   tobytes)r   r\   valuesar   r   r   
writeArray  s   zOTTableWriter.writeArrayc                 C   <   d|  krdk sJ | J || j td| d S )Ni   z>br   r   r   r   r   	writeInt8     $zOTTableWriter.writeInt8c                 C      |  d| d S )Nrh   r   r   r   r   r   r   writeInt8Array  rq   zOTTableWriter.writeInt8Arrayc                 C   r   )Ni    z>hr   r   r   r   r   
writeShort  r   zOTTableWriter.writeShortc                 C   r   )Nrr   r   r   r   r   r   writeShortArray  rq   zOTTableWriter.writeShortArrayc                 C      | j td| d S )Nz>ir   r   r   r   r   	writeLong     zOTTableWriter.writeLongc                 C   r   )NrH   r   r   r   r   r   writeLongArray  rq   zOTTableWriter.writeLongArrayc                 C   r   )Nr      >Br   r   r   r   r   
writeUInt8  r   zOTTableWriter.writeUInt8c                 C   r   )Nrw   r   r   r   r   r   writeUInt8Array  rq   zOTTableWriter.writeUInt8Arrayc                 C   r   )Nr   i   >Hr   r   r   r   r   writeUShort  r   zOTTableWriter.writeUShortc                 C   r   )Nrz   r   r   r   r   r   writeUShortArray  rq   zOTTableWriter.writeUShortArrayc                 C   r   )N>Ir   r   r   r   r   
writeULong  r   zOTTableWriter.writeULongc                 C   r   )Nr}   r   r   r   r   r   writeULongArray  rq   zOTTableWriter.writeULongArrayc                 C   sH   d|  krdk sJ | J |t d|}| j|dd   d S )Nr      z>Lr   rZ   r   r   r   )r   r   rh   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      | j | d S r   r   r   )r   	subWriterr   r   r   writeSubTable  rq   zOTTableWriter.writeSubTablec                 C   s    t ||||d}| j| |S )N)r   r   )CountReferencer   r   )r   r.   rD   r   r   refr   r   r   writeCountReference  s   z!OTTableWriter.writeCountReferencec                 C   s    t j|f|  }| j| d S r   r   )r   formatr   r0   r   r   r   writeStruct  s   zOTTableWriter.writeStructc                 C   r   r   r   )r   r0   r   r   r   	writeData  rq   zOTTableWriter.writeDatac                 C   s  d  } } }}| j dkr|j}nr| j dkr| j}|j}nft|dd}t|dr+|j}| j dkr8| jj}| j}nK| j dkrG| jjj}| jj}n<d| j |g}| j}|rk|j d	vrkd|j |g}|j}|rk|j d	vsY|r|j dkr||jjj}|jj}n|jj}|j}t| j||||fS )
NZ
LookupListZLookuprD   z<none>repeatIndexSubTableExtSubTable.)r   r   )rD   r   r-   rA   r   joinr   r*   )r   r   r   r   r   r   Zp1r   r   r   r      s8   









z$OTTableWriter.getOverflowErrorRecord)NNr   )r   )r   N)*r   r   r   rG   r   propertyr   setterr   r   r   r   r   r   r   r   r   r   r8   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   r6      sR    



$7
"
r6   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 d S r   )r.   rD   r   setValue)r   r.   rD   r   r   r   r   r   r   $  s   zCountReference.__init__c                 C   sF   | j }| j}|| d u r|||< d S || |ks!J ||| |fd S r   r.   rD   )r   r   r.   rD   r   r   r   r  *  s
   "zCountReference.setValuec                 C   s   | j | j S r   r  r   r   r   r   getValue1  r   zCountReference.getValuec                 C   s.   | j | j }|d u rd}tttd| j |S )Nr   )r   r   r
   )r.   rD   	packUInt8r   r   r   )r   vr   r   r   r   3  s   zCountReference.getCountDataNN)r   r   r   rG   r   r  r  r   r   r   r   r   r   "  s    
r   c                 C      t d| S )Nr   rZ   r   r   r   r   r   r  9  r   r  c                 C   r	  )Nr   r
  r   r   r   r   r   <  r   r   c                 C   s0   d|   krdk sJ |  J | t d| S )Nr   l        r   r
  r   r   r   r   r   ?  s   $r   c                 C   s8   d|   krdk sJ |  J | t d| dd  S )Nr   r   r   r   r
  r   r   r   r   r   C  s   $r   c                   @   s   e Zd ZdZ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dS )#	BaseTablez0Generic base class for all OpenType (sub)tables.c                 C   s<   | j d}|r| `| j}| `| || t| |S t|Nr2   )__dict__getr2   r1   r/   r-   AttributeError)r   attrr2   r1   r   r   r   __getattr__L  s   
zBaseTable.__getattr__c                 C   s2   | j d}|r| `| j}| `| || d S d S r  )r  r  r2   r1   r/   )r   r2   r1   r   r   r   ensureDecompiledW  s   zBaseTable.ensureDecompiledc                 C   sh   d}| j D ],}||}|tu rt  S d}|jr+|j|v r'||j |j }nt  S ||| 7 }q|S )Nr   r   )
convertersgetRecordSizer   repeataux)clsr2   Z	totalSizeconvr   
countValuer   r   r   r  _  s   


zBaseTable.getRecordSizec                 C   s   | j S r   )r  r   r   r   r   getConvertersn  s   zBaseTable.getConvertersc                 C   r   r   )convertersByNamer   r   r   r   getConverterByNameq  r    zBaseTable.getConverterByNameNc              	   C   s   |   D ]d}|jrIt| |jst| |jg  tt| |j|j }z| |j}t| |j| W q t	yH   |rF|j|v rF||j 
| Y qw |jrUt|jd | jsUqt| |jr\qt|drht| |jd  qd S )NZwriteNullOffset)r  r  rA   rD   setattrr   r-   r  r  KeyErrorr  evalr  )r   Z
propagatorr  r  Z
count_convr   r   r   rC   t  s*   
zBaseTable.populateDefaultsc                 C   s  |  | i }|| _|  D ]}|jdkr||j|d }|jdkr,||j|d }|jdkr8||d }|jdkrF||j|d }zQ|jrut|jtrT|j}n|j|v r_||j }n||j }||j	7 }|
||||||j< n!|j	rt|j	d |sW q||||||j< |jr||j ||j< W q ty } z|j}|j|f |_ d }~ww t| d	r| || | `d S | j| | `d S )
Nr   
LookupTyper   ZExtensionLookupTypeZFeatureParamsZ
FeatureTagZ	SubStructZ	MorphTypepostRead)
readFormatZ_BaseTable__rawTabler  rD   ZgetConverterr*   r  
isinstanceintr  rf   r  readisPropagated	ExceptionargsrA   r!  r  update)r   r2   r1   r.   r  r  r<   rD   r   r   r   r/     sX   








zBaseTable.decompilec                 C   s  |    t| drt| d }| |}|ot| d}nd}| j }|  D ]}|jr?|jr?||j	}t
|tr?|||j	< q't| drHd|_t| drPd|_t| jdr_|d | jj | | |  D ] }||j	}|jr|d u rzg }t||j }t
|jtrt||jksJ d	|jt|f n|j|v rt||j|d
 n||j | z
||||| W qh ty } z|j|j	d f |_ d }~ww |jrt
|tr|}	|j|	_||	 |	 ||j	< n|||j	|j}	d ||j	< |jr|	||j	< qh|jr'|j	|vrd ||j	< |||j	|j||j	 }	|	|d< qh|jr4t|jd |s4qhz
| |||| W n! ty_ } z|d urP|jj!n|j	}
|j|
f |_ d }~ww |jri|||j	< qh|rq| `"d S d S )NpreWriteFormatFr   r   r   Tr   zexpected %d values, got %dr   z[])#r  rA   r*  r  rU   r  ZisCountr&  r  rD   r#  r   r   r   rR   r  r   writeFormatr  r   r  r$  r   r'  r(  r]   r   r   r  r   ZisLookupTyper  writer   r+  )r   r;   r1   ZdeleteFormatr.   r  r   r  r<   r   rD   r   r   r   r7     s   







&








zBaseTable.compilec                 C      d S r   r   r   r2   r   r   r   r"       zBaseTable.readFormatc                 C   r.  r   r   r   r;   r   r   r   r,    r0  zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d u rg }t| dr|d| jfg }||| |  | || || |  d S )Nr+  )rR   r   rA   r+  begintagnewliner>   endtag)r   	xmlWriterr1   rE   rD   Z	tableNamer   r   r   r?     s   

zBaseTable.toXMLc              
   C   s   |   D ]E}|jr+t| |jg }tt|D ]}|| }|||||jd|fg qq|jr8t|jd t	| s8qt| |jd }|||||jg  qd S )Nindex)
r  r  r-   rD   r   r   ZxmlWriter  r  vars)r   r5  r1   r  r   rH   r   r   r   r   r>   )  s   zBaseTable.toXML2c                 C   s|   z|  |}W n ty    w ||||}|jr5t| |jd }|d u r.g }t| |j| || d S t| |j| d S r   )r  r  ZxmlReadr  r-   rD   r  r   )r   rD   rE   rF   r1   r  r   seqr   r   r   rB   :  s   zBaseTable.fromXMLc                 C   r   r   r   r   r   r   r   r   I  r   zBaseTable.__ne__c                 C   s0   t | t |kr
tS |   |  | j|jkS r   )r   r   r  r  rS   r   r   r   r   M  s
   zBaseTable.__eq__r   r  )r   r   r   rG   r  r  classmethodr  r  r  rC   r/   r7   r"  r,  r?   r>   rB   r   r   r   r   r   r   r  H  s$    

-^
r  c                   @   sF   e Zd ZdZedd Zdd Zdd Zdd	 Zd
d Z	dddZ
dS )FormatSwitchingBaseTablezsMinor specialization of BaseTable, for tables that have multiple
	formats, eg. CoverageFormat1 vs. CoverageFormat2.c                 C   s   t S r   )r   )r  r2   r   r   r   r  \  s   z&FormatSwitchingBaseTable.getRecordSizec                 C   s   | j | jg S r   )r  r  r+  r   r   r   r   r  `  rq   z&FormatSwitchingBaseTable.getConvertersc                 C   s   | j | j | S r   )r  r+  r   r   r   r   r  c  rq   z+FormatSwitchingBaseTable.getConverterByNamec                 C      |  | _d S r   )r{   r+  r/  r   r   r   r"  f  rl   z#FormatSwitchingBaseTable.readFormatc                 C      | | j d S r   )r   r+  r1  r   r   r   r,  i  rq   z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t | |||| d S r   )r  r?   )r   r5  r1   rE   rD   r   r   r   r?   l  r   zFormatSwitchingBaseTable.toXMLr  )r   r   r   rG   r9  r  r  r  r"  r,  r?   r   r   r   r   r:  W  s    
r:  c                   @   r   )UInt8FormatSwitchingBaseTablec                 C   r;  r   )rx   r+  r/  r   r   r   r"  q  rl   z(UInt8FormatSwitchingBaseTable.readFormatc                 C   r<  r   )r   r+  r1  r   r   r   r,  t  rq   z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r   r   r"  r,  r   r   r   r   r=  p  r$   r=  )Zuint16Zuint8c                 C   s(   zt |  W S  ty   td| w )NzUnsupported format type: )formatSwitchingBaseTablesr  	TypeError)Z
formatTyper   r   r    getFormatSwitchingBaseTableClass}  s
   
r@  ))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maskrD   isDevicesignedr   r   r   
_buildDict  s   rJ  c                   @   r%   )ValueRecordFactoryz6Given a format code, this object convert ValueRecords.c                 C   s8   g }t D ]\}}}}||@ r||||f q|| _d S r   )rE  r   r   )r   valueFormatr   rG  rD   rH  rI  r   r   r   r     s   
zValueRecordFactory.__init__c                 C   r!   r   )r   r   r   r   r   r   __len__  r    zValueRecordFactory.__len__c                 C   s   | j }|sd S t }|D ]4\}}}|r| }n| }|r:|r8ddlm}	 ||}
t|	| }||
| nd }t	||| q|S Nr   r'   )
r   ValueRecordrs   r{   r+   r(   rV   r-   r/   r  )r   r2   r1   r   valueRecordrD   rH  rI  r   r(   Z	subReaderr   r   r   readValueRecord  s"   

z"ValueRecordFactory.readValueRecordc           	      C   sp   | j D ]2\}}}t||d}|r(|r"| }|| ||| q|d q|r0|| q|| qd S Nr   )r   r-   r   r   r7   r   r   )	r   r;   r1   rP  rD   rH  rI  r   r   r   r   r   writeValueRecord  s   
z#ValueRecordFactory.writeValueRecordN)r   r   r   rG   r   rM  rQ  rS  r   r   r   r   rK    s    rK  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 )rO  Nc           	      C   s   |d ur9t D ]\}}}}||@ rt| ||rd nd q|d ur5|j D ]\}}t| |s.q$t| || q$d S d S |d urE|j | _d S d S rR  )rE  r  r  r   rA   rU   )	r   rL  srcrG  rD   rH  rI  keyvalr   r   r   r     s   
zValueRecord.__init__c                 C   s(   d}| j  D ]
}|t| d B }q|S rR  )r  keysvalueRecordFormatDict)r   r   rD   r   r   r   	getFormat  s   zValueRecord.getFormatc                 C   s0   d}| j  D ]\}}|r|t| d B }q|S rR  )r  r   rX  )r   r   rD   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 ]\}}}}	t| |rJt| |}|d urJ|
||f q/|
ru||| |  |
D ]\}}|d uri|j|||d qY|| |  d S |	|| |  d S )Nr
   rA  )rD   )
r   rE  rA   r   r-   r2  r3  r?   r4  Z	simpletag)r   r5  r1   Z	valueNamerE   ZsimpleItemsrG  rD   rH  r   ZdeviceItemsZdeviceZdeviceRecordr   r   r   r?     s2   



zValueRecord.toXMLc                 C   s   ddl m} | D ]\}}t| |t| q
|D ]1}t|ts!q|\}}}t|| }	|D ]}
t|
ts6q.|
\}}}|	|||| q.t| ||	 qd S rN  )	r+   r(   r   r  r$  r#  r   r-   rB   )r   rD   rE   rF   r1   r(   kr  elementr   Zelem2Zname2Zattrs2Zcontent2r   r   r   rB     s   



zValueRecord.fromXMLc                 C   r   r   r   r   r   r   r   r   %  r   zValueRecord.__ne__c                 C   s    t | t |kr
tS | j|jkS r   )r   r   r  rS   r   r   r   r   )  s   zValueRecord.__eq__r  r   )
r   r   r   r   rY  rZ  r?   rB   r   r   r   r   r   r   rO    s    

rO  )$ZfontTools.misc.textToolsr   r   r   rb   ra   rZ   ZloggingZ	getLoggerr   r9   objectr   r'  r   r&   r   r   itemsizer,   r6   r   r  r   r   r   r  r:  r=  r>  r@  rE  rJ  rX  rK  rO  r   r   r   r   <module>   sF    
Tl  D  	3