a
    ׶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sJ edjdksJ 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                   @   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   m/Users/vegardjervell/Documents/master/model/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      s    zOTLOffsetOverflowError.__init__c                 C   s
   t | jS r   )reprr   r   r   r   r   __str__   s    zOTLOffsetOverflowError.__str__N)r   r   r   r   r   r   r   r   r   r      s   r   c                   @   s0   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y } z||jkrD |j}td| |}d}|j	du rddl
m} |||}nddl
m} |||}|sddl
m} |||}|s W Y d}~qd}~0 0 qdS )z=Compiles the table into binary. Called automatically on save.Nr#   z+Attempting to fix OTLOffsetOverflowError %sr   r   )fixLookupOverFlows)fixSubTableOverFlows)OTTableWriterr$   r(   compile
getAllDatar   r   loginfor   r"   r.   r/   )	r   r+   ZoverflowRecordwritereZlastItemokr.   r/   r   r   r   r1   ,   s,    




zBaseTTXConverter.compilec                 C   s   | j || d S r   )r(   toXML2)r   r5   r+   r   r   r   toXMLd   s    zBaseTTXConverter.toXMLc                 C   sJ   ddl m} t| ds*t|| j}| | _| j|||| | j  d S )Nr   r!   r(   )r%   r"   hasattrr'   r$   r(   fromXMLpopulateDefaults)r   nameattrscontentr+   r"   r-   r   r   r   r;   g   s    
zBaseTTXConverter.fromXMLN)r   r   r   __doc__r)   r1   r9   r;   r   r   r   r   r       s
   8r    ir	   z#Oops, file a bug against fonttools.c                   @   s   e Zd ZdZdZd9ddZdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 ZdS ):r&   z5Helper class to retrieve data from an OpenType table.r*   offsetpos
localStater$   Nr   c                 C   s"   || _ || _|| _|| _|| _d S r   rB   )r   r*   rE   rC   r$   r   r   r   r   z   s
    zOTTableReader.__init__c                 C   s   |  j |7  _ d S r   rD   r   countr   r   r   advance   s    zOTTableReader.advancec                 C   s
   || _ d S r   rF   )r   rD   r   r   r   seek   s    zOTTableReader.seekc                 C   s$   |  | j| j| j| j}| j|_|S r   )	__class__r*   rE   rC   r$   rD   r   otherr   r   r   copy   s    zOTTableReader.copyc                 C   s    | j | }| | j| j|| jS r   )rC   rK   r*   rE   r$   )r   rC   r   r   r   getSubReader   s    
zOTTableReader.getSubReaderc                 C   s6   | j }|| }td| | j|| \}|| _ |S N>rD   structunpackr*   )r   typecode
staticSizerD   newposr   r   r   r   	readValue   s
    zOTTableReader.readValuec                 C   sH   | j }|||  }t|| j|| }tjdkr:|  || _ | S Nbig)rD   arrayr*   sys	byteorderbyteswaptolist)r   rU   rV   rH   rD   rW   r   r   r   r   	readArray   s    zOTTableReader.readArrayc                 C   s   | j dddS )Nbr   rV   rX   r   r   r   r   readInt8   s    zOTTableReader.readInt8c                 C   s   | j dd|dS )Nra   r   rV   rH   r`   rG   r   r   r   readInt8Array   s    zOTTableReader.readInt8Arrayc                 C   s   | j dddS )Nhr   rb   rc   r   r   r   r   	readShort   s    zOTTableReader.readShortc                 C   s   | j dd|dS )Nrh   r   re   rf   rG   r   r   r   readShortArray   s    zOTTableReader.readShortArrayc                 C   s   | j dddS )NrA   r	   rb   rc   r   r   r   r   readLong   s    zOTTableReader.readLongc                 C   s   | j dd|dS )NrA   r	   re   rf   rG   r   r   r   readLongArray   s    zOTTableReader.readLongArrayc                 C   s   | j dddS )NBr   rb   rc   r   r   r   r   	readUInt8   s    zOTTableReader.readUInt8c                 C   s   | j dd|dS )Nrm   r   re   rf   rG   r   r   r   readUInt8Array   s    zOTTableReader.readUInt8Arrayc                 C   s   | j dddS )NHr   rb   rc   r   r   r   r   
readUShort   s    zOTTableReader.readUShortc                 C   s   | j dd|dS )Nrp   r   re   rf   rG   r   r   r   readUShortArray   s    zOTTableReader.readUShortArrayc                 C   s   | j dddS )NIr	   rb   rc   r   r   r   r   	readULong   s    zOTTableReader.readULongc                 C   s   | j dd|dS )Nrs   r	   re   rf   rG   r   r   r   readULongArray   s    zOTTableReader.readULongArrayc                 C   s4   | j }|d }tdd| j||  \}|| _ |S )Nr   z>l    rR   r   rD   rW   r   r   r   r   
readUInt24   s
    zOTTableReader.readUInt24c                    s    fddt |D S )Nc                    s   g | ]}   qS r   )rx   ).0_r   r   r   
<listcomp>       z1OTTableReader.readUInt24Array.<locals>.<listcomp>)rangerG   r   r   r   readUInt24Array   s    zOTTableReader.readUInt24Arrayc                 C   s>   | j }|d }t| j|| }t|dks4J ||| _ |S Nr	   )rD   r   r*   lenrw   r   r   r   readTag   s    zOTTableReader.readTagc                 C   s&   | j }|| }| j|| }|| _ |S r   )rD   r*   )r   rH   rD   rW   r   r   r   r   readData   s
    zOTTableReader.readDatac                 C   s(   | j r| j  nt }|||< || _ d S r   rE   rN   dictr   r=   r   stater   r   r   __setitem__   s    zOTTableReader.__setitem__c                 C   s   | j o| j | S r   rE   r   r=   r   r   r   __getitem__   s    zOTTableReader.__getitem__c                 C   s   | j o|| j v S r   r   r   r   r   r   __contains__   s    zOTTableReader.__contains__)Nr   N)r   r   r   r@   	__slots__r   rI   rJ   rN   rO   rX   r`   rd   rg   ri   rj   rk   rl   rn   ro   rq   rr   rt   ru   rx   r~   r   r   r   r   r   r   r   r   r   r&   t   s8   
r&   c                   @   sH  e Zd ZdZdMddZedd Zejdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdNdd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$dCdD Z%dOdEdFZ&dGdH Z'dIdJ Z(dKdL Z)dS )Pr0   z=Helper class to gather and assemble data for OpenType tables.Nr   c                 C   s(   g | _ d | _|| _|| _|| _d | _d S r   )itemsrD   rE   r$   
offsetSizeparent)r   rE   r$   r   r   r   r   r      s    zOTTableWriter.__init__c                 C   s
   | j dkS r   r   r   r   r   r   
longOffset   s    zOTTableWriter.longOffsetc                 C   s   |rdnd| _ d S )Nr	   r   r   r   r   r   r   r   r      s    c                 C   s(   | j r| j  nt }|||< || _ d S r   r   r   r   r   r   r      s    zOTTableWriter.__setitem__c                 C   s
   | j | S r   r   r   r   r   r   r      s    zOTTableWriter.__getitem__c                 C   s   | j |= d S r   r   r   r   r   r   __delitem__   s    zOTTableWriter.__delitem__c                 C   sL   d}| j D ]<}t|dr$||j7 }q
t|dr:||j7 }q
|t| }q
|S )z<Return the length of this table in bytes, without subtables.r   getCountDatagetData)r   r:   sizer   r   )r   litemr   r   r   getDataLength  s    


zOTTableWriter.getDataLengthc              	   C   s   t | j}| j}t|}t|D ]}|| }t|dr |jdkrTt|j| ||< q |jdkrzt|j| ||< W q t	j
y   | |}t|Y q0 q |jdkrt|j| ||< q t|jq t|S )z;Assemble the data for this writer/table, without subtables.r   r	   r   r   )listr   rD   r   r}   r:   r   	packULong
packUShortrS   errorgetOverflowErrorRecordr   
packUInt24
ValueErrorr   )r   r   rD   numItemsrA   r   r   r   r   r   r     s$    





zOTTableWriter.getDatac                 C   s
   t | jS r   )hashr   r   r   r   r   __hash__)  s    zOTTableWriter.__hash__c                 C   s   |  |}|tu r|S | S r   __eq__NotImplementedr   rM   resultr   r   r   __ne__-  s    
zOTTableWriter.__ne__c                 C   s,   t | t |krtS | j|jko*| j|jkS r   )typer   r   r   rL   r   r   r   r   1  s    zOTTableWriter.__eq__c                 C   s   t | d}t | d}|ri }| j}tt|D ]P}|| }t |drR| ||< q.t |dr.|| |s.||| ||< }q.t|| _d S )N	Extension	DontSharer   r   )r:   r   r}   r   r   _doneWriting
setdefaulttuple)r   internedTablesisExtensionZ	dontSharer   rA   r   r   r   r   r   6  s    




zOTTableWriter._doneWritingc                 C   s  d|t | < t| j}tt|}|  t| d}|}|r\|d usLJ d|d i   }}}d}t| drt|D ]&}	| j|	 }
t|
dd dkrrd} qqrt |
|vr|
||| n |D ]T}	| j|	 }
t|
dsq|r|	d	krt|
dd dkrqt |
|vr|
||| qq|	|  d S )
NTr   zUProgram or XML editing error. Extension subtables cannot contain extensions subtablesFsortCoverageLastr=   ZCoverager   r   )
idr   r   r   r}   reverser:   r'   _gatherTablesappend)r   tables	extTablesdoner   ZiRanger   Z
selfTablesr   rA   r   r   r   r   r   Z  s8    	





zOTTableWriter._gatherTablesc           	      C   s   i }|  | g }g }i }| ||| |  |  d}|D ]}||_||  }q@|D ]}||_||  }q\g }|D ]}| }|| q||D ]}| }|| qt|S )z+Assemble all data, including all subtables.r   )r   r   r   rD   r   r   r   r   )	r   r   r   r   r   rD   r(   r*   Z	tableDatar   r   r   r2     s.    
zOTTableWriter.getAllDatac                 C   s   | j | j| j|d}| |_|S )Nr   )rK   rE   r$   r   )r   r   Z	subwriterr   r   r   getSubWriter  s    zOTTableWriter.getSubWriterc                 C   s   | j td| | d S rP   r   r   rS   pack)r   rU   r   r   r   r   
writeValue  s    zOTTableWriter.writeValuec                 C   s2   t  ||}tjdkr|  | j|  d S rY   )r[   r\   r]   r^   r   r   tobytes)r   rU   valuesar   r   r   
writeArray  s    zOTTableWriter.writeArrayc                 C   s6   d|  krdk sn J || j td| d S )Ni   z>br   r   r   r   r   	writeInt8  s    zOTTableWriter.writeInt8c                 C   s   |  d| d S )Nra   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 )Nrh   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 )NrA   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 )Nrm   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 )Nrp   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 )Nrs   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   rS   r   r   r   )r   r   ra   r   r   r   writeUInt24  s    zOTTableWriter.writeUInt24c                 C   s   |D ]}|  | qd S r   )r   )r   r   r   r   r   r   writeUInt24Array  s    zOTTableWriter.writeUInt24Arrayc                 C   s0   t | }t|dks J || j| d S r   )r   r   r   r   r   )r   tagr   r   r   writeTag  s    zOTTableWriter.writeTagc                 C   s   | j | d S r   r   r   )r   	subWriterr   r   r   writeSubTable  s    zOTTableWriter.writeSubTablec                 C   s    t ||||d}| j| |S )N)r   r   )CountReferencer   r   )r   r(   r=   r   r   refr   r   r   writeCountReference  s    z!OTTableWriter.writeCountReferencec                 C   s    t j|f|  }| j| d S r   r   )r   formatr   r*   r   r   r   writeStruct  s    zOTTableWriter.writeStructc                 C   s   | j | d S r   r   )r   r*   r   r   r   	writeData  s    zOTTableWriter.writeDatac                 C   s  d  } } }}| j dkr"|j}n| j dkr:| j}|j}nt|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rd|j |g}|j}q|r|j dkr|jjj}|jj}n|jj}|j}t| j||||fS )
NZ
LookupListZLookupr=   z<none>repeatIndexSubTableExtSubTable.)r   r   )r=   r   r'   r:   r   joinr   r$   )r   r   r   r   r   r   p1r   r   r   r      s6    









z$OTTableWriter.getOverflowErrorRecord)NNr   )r   )r   N)*r   r   r   r@   r   propertyr   setterr   r   r   r   r   r   r   r   r   r   r2   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   r0      sP   



$7"

r0   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )r   z8A reference to a Count value, not a count of references.Nc                 C   s(   || _ || _|| _|d ur$| | d S r   )r(   r=   r   setValue)r   r(   r=   r   r   r   r   r   r   $  s
    zCountReference.__init__c                 C   sD   | j }| j}|| d u r"|||< n|| |ks@J ||| |fd S r   r(   r=   )r   r   r(   r=   r   r   r   r   *  s
    
zCountReference.setValuec                 C   s   | j | j S r   r   r   r   r   r   getValue1  s    zCountReference.getValuec                 C   s.   | j | j }|d u rd}tttd| j |S )Nr   )r   r   r	   )r(   r=   	packUInt8r   r   r   )r   vr   r   r   r   3  s    zCountReference.getCountData)NN)r   r   r   r@   r   r   r   r   r   r   r   r   r   "  s
   
r   c                 C   s   t d| S )Nr   rS   r   r   r   r   r   r   9  s    r   c                 C   s   t d| S )Nr   r   r   r   r   r   r   <  s    r   c                 C   s*   d|   krdk sn J | t d| S )Nr   l        r   r   r   r   r   r   r   ?  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   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}|r4| `| j}| `| || t| |S t|d S Nr,   )__dict__getr,   r+   r)   r'   AttributeError)r   attrr,   r+   r   r   r   __getattr__L  s    
zBaseTable.__getattr__c                 C   s.   | j d}|r*| `| j}| `| || d S r   )r   r   r,   r+   r)   )r   r,   r+   r   r   r   ensureDecompiledW  s    zBaseTable.ensureDecompiledc                 C   sh   d}| j D ]X}||}|tu r(t  S d}|jrV|j|v rN||j |j }nt  S ||| 7 }q
|S )Nr   r   )
convertersgetRecordSizer   repeataux)clsr,   Z	totalSizeconvr   
countValuer   r   r   r   _  s    


zBaseTable.getRecordSizec                 C   s   | j S r   )r   r   r   r   r   getConvertersn  s    zBaseTable.getConvertersc                 C   s
   | j | S r   )convertersByNamer   r   r   r   getConverterByNameq  s    zBaseTable.getConverterByNameNc              	   C   s   |   D ]}|jrt| |js,t| |jg  tt| |j|j }z| |j}t| |j| W q t	y   |r|j|v r||j 
| Y q0 q|jrt|jd | jsqt| |jrqt|drt| |jd  qd S )NZwriteNullOffset)r  r   r:   r=   setattrr   r'   r   r  KeyErrorr   evalr   )r   Z
propagatorr   r  Z
count_convr   r   r   r<   t  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rt|jtr|j}n |j|v r||j }n
||j }||j	7 }|
||||||j< nH|j	rt|j	d |sW q||||||j< |jr4||j ||j< W q tyr } z"|j}|j|f |_ W Y d }~qd }~0 0 qt| d	r| || n| j| | `d S )
Nr   
LookupTyper   ZExtensionLookupTypeZFeatureParamsZ
FeatureTagZ	SubStructZ	MorphTypepostRead)
readFormatZ_BaseTable__rawTabler  r=   ZgetConverterr$   r   
isinstanceintr   r`   r  readisPropagated	Exceptionargsr:   r	  r   update)r   r,   r+   r(   r   r  r6   r=   r   r   r   r)     sP    







zBaseTable.decompilec                 C   s  |    t| dr8t| d }| |}|o4t| d}nd}| j }|  D ]0}|jrN|jrN||j	}t
|trN|||j	< qNt| drd|_t| drd|_t| jdr|d | jj | | |  D ]$}||j	}|jr|d u rg }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rt|jd |sqz| |||| 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[])#r   r:   r  r   rN   r  ZisCountr  r   r=   r  r   r   r   rK   r   r  writeFormatr   r   r   r  r   r  r  rV   r   r   r   r   ZisLookupTyper  writer   r  )r   r5   r+   ZdeleteFormatr(   r   r   r  r6   r   r=   r   r   r   r1     s|    






(




zBaseTable.compilec                 C   s   d S r   r   r   r,   r   r   r   r
    s    zBaseTable.readFormatc                 C   s   d S r   r   r   r5   r   r   r   r    s    zBaseTable.writeFormatc                 C   sl   |r|n| j j}|d u rg }t| dr6|d| jfg }||| |  | || || |  d S )Nr  )rK   r   r:   r  begintagnewliner8   endtag)r   	xmlWriterr+   r>   r=   Z	tableNamer   r   r   r9     s    

zBaseTable.toXMLc              
   C   s   |   D ]}|jrVt| |jg }tt|D ]&}|| }|||||jd|fg q,q|jrpt|jd t	| spqt| |jd }|||||jg  qd S )Nindex)
r  r   r'   r=   r}   r   ZxmlWriter   r  vars)r   r  r+   r   r   rA   r   r   r   r   r8   )  s    zBaseTable.toXML2c                 C   s~   z|  |}W n ty"    Y n0 ||||}|jrlt| |jd }|d u r`g }t| |j| || nt| |j| d S r   )r  r  ZxmlReadr   r'   r=   r  r   )r   r=   r>   r?   r+   r   r   seqr   r   r   r;   :  s    zBaseTable.fromXMLc                 C   s   |  |}|tu r|S | S r   r   r   r   r   r   r   I  s    
zBaseTable.__ne__c                 C   s0   t | t |krtS |   |  | j|jkS r   )r   r   r   r   rL   r   r   r   r   M  s
    zBaseTable.__eq__)N)NN)r   r   r   r@   r   r   classmethodr   r  r  r<   r)   r1   r
  r  r9   r8   r;   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   r,   r   r   r   r   \  s    z&FormatSwitchingBaseTable.getRecordSizec                 C   s   | j | jg S r   )r   r   r  r   r   r   r   r  `  s    z&FormatSwitchingBaseTable.getConvertersc                 C   s   | j | j | S r   )r  r  r   r   r   r   r  c  s    z+FormatSwitchingBaseTable.getConverterByNamec                 C   s   |  | _d S r   )rq   r  r  r   r   r   r
  f  s    z#FormatSwitchingBaseTable.readFormatc                 C   s   | | j d S r   )r   r  r  r   r   r   r  i  s    z$FormatSwitchingBaseTable.writeFormatNc                 C   s   t | |||| d S r   )r   r9   )r   r  r+   r>   r=   r   r   r   r9   l  s    zFormatSwitchingBaseTable.toXML)NN)r   r   r   r@   r  r   r  r  r
  r  r9   r   r   r   r   r   W  s   
r   c                   @   s   e Zd Zdd Zdd ZdS )UInt8FormatSwitchingBaseTablec                 C   s   |  | _d S r   )rn   r  r  r   r   r   r
  q  s    z(UInt8FormatSwitchingBaseTable.readFormatc                 C   s   | | j d S r   )r   r  r  r   r   r   r  t  s    z)UInt8FormatSwitchingBaseTable.writeFormatN)r   r   r   r
  r  r   r   r   r   r!  p  s   r!  )Zuint16Zuint8c                 C   s0   z
t |  W S  ty*   td| Y n0 d S )NzUnsupported format type: )formatSwitchingBaseTablesr  	TypeError)Z
formatTyper   r   r    getFormatSwitchingBaseTableClass}  s    
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maskr=   isDevicesignedr   r   r   
_buildDict  s    r.  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )ValueRecordFactoryz6Given a format code, this object convert ValueRecords.c                 C   s8   g }t D ]$\}}}}||@ r||||f q|| _d S r   )r)  r   r   )r   valueFormatr   r+  r=   r,  r-  r   r   r   r     s
    zValueRecordFactory.__init__c                 C   s
   t | jS r   )r   r   r   r   r   r   __len__  s    zValueRecordFactory.__len__c                 C   s   | j }|sd S t }|D ]h\}}}|r0| }n| }|rt|rpddlm}	 ||}
t|	| }||
| nd }t	||| q|S Nr   r!   )
r   ValueRecordri   rq   r%   r"   rO   r'   r)   r  )r   r,   r+   r   valueRecordr=   r,  r-  r   r"   Z	subReaderr   r   r   readValueRecord  s"    

z"ValueRecordFactory.readValueRecordc           	      C   sp   | j D ]d\}}}t||d}|rP|rD| }|| ||| qj|d q|r`|| q|| qd S Nr   )r   r'   r   r   r1   r   r   )	r   r5   r+   r4  r=   r,  r-  r   r   r   r   r   writeValueRecord  s    
z#ValueRecordFactory.writeValueRecordN)r   r   r   r@   r   r1  r5  r7  r   r   r   r   r/    s
   r/  c                   @   sH   e Zd ZdddZdd Zdd Zddd	Zd
d Zdd Zdd Z	dS )r3  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 r6  )r)  r  r   r   r:   rN   )	r   r0  srcr+  r=   r,  r-  keyvalr   r   r   r     s    
zValueRecord.__init__c                 C   s(   d}| j  D ]}|t| d B }q|S r6  )r   keysvalueRecordFormatDict)r   r   r=   r   r   r   	getFormat  s    zValueRecord.getFormatc                 C   s0   d}| j  D ]\}}|r|t| d B }q|S r6  )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	   r%  )r=   )
r   r)  r:   r   r'   r  r  r9   r  Z	simpletag)r   r  r+   Z	valueNamer>   ZsimpleItemsr+  r=   r,  r   ZdeviceItemsZdeviceZdeviceRecordr   r   r   r9     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 r2  )	r%   r"   r   r  r  r  r   r'   r;   )r   r=   r>   r?   r+   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   )r   r   r   rL   r   r   r   r   )  s    zValueRecord.__eq__)NN)N)
r   r   r   r   r=  r>  r9   r;   r   r   r   r   r   r   r3    s   

r3  )$ZfontTools.misc.textToolsr   r   r   r\   r[   rS   logging	getLoggerr   r3   objectr   r  r   r    r   r   itemsizer&   r0   r   r   r   r   r   r   r   r!  r"  r$  r)  r.  r<  r/  r3  r   r   r   r   <module>   sD   
Tl  D  	3