U
    Dvf                   @   s  d Z ddlmZ ddlmZ ddlmZmZ ddlmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlZddlZddlZejd ZeeZdZdZ G dd de!Z"G dd dej#Z$G dd de%Z&G dd de%Z'd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,G d!d" d"e)Z-G d#d$ d$e-Z.G d%d& d&e-Z/G d'd( d(e%Z0G d)d* d*e0Z1G d+d, d,e1Z2G d-d. d.e0Z3G d/d0 d0e0Z4G d1d2 d2e%Z5G d3d4 d4e%Z6G d5d6 d6e%Z7d7d8 Z8d9d: Z9d;d< Z:d=d> Z;d?d@ Z<dAdB Z=dCdD Z>dEdF Z?dGdH Z@dIdJ ZAdKdL ZBdMdN ZCdOdP ZDdQdR ZEG dSdT dTe%ZFG dUdV dVeFZGG dWdX dXeFZHdYdZ ZId[d\ ZJG d]d^ d^eFZKG d_d` d`eFZLG dadb dbeFZMG dcdd ddeMZNG dedf dfeMZOG dgdh dheMZPG didj djeFZQG dkdl dle%ZRdmdn ZSdodp ZTdqdr ZUdsdt ZVdudv ZWdwdx ZXdydz ZYG d{d| d|e%ZZG d}d~ d~eFZ[dd Z\dd Z]dd Z^dd Z_G dd deMZ`G dd deFZaG dd deFZbdd Zcdd Zddd ZeG dd de%ZfG dd de%ZgG dd deFZhdddddeh fddddddeH fddddeH fddddeH fddddeH fddddeH fddddddddddddddddgdfddddddddgdfdddddddddddddeQ fddddde[ fddddeN fdd4ddea fdddde` fdd6ddeP fddddeb fg$Ziddddddddddgdfdd4ddea fdddde` fdd6ddeP fddddeb fgZjdZkdZldelekdddfdddddddddddddddddddddddeO fgZmdelekdddfdddddddddddddddddeO fgZndd Zoeoem eoei G dd dejpZqG dd dejpZrG dd de%Zsdd ZtG dd desZuG dd desZvG dd desZwG dd de%ZxG dd dexZyG dd dexZzG dd dexZ{G d d de%Z|dddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddÐdĐdŐdƐdǐdȐdɐdʐdːd̐d͐dΐdϐdАdѐdҐdӐdԐdՐd֐dאdؐdِdڐdېdܐdݐdސdߐddddddddddddddddddddddddddddddddd ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddgZ}dZ~ee}e~ksti Zee~D ]Zeee}e < q$dddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddÐdĐdŐdƐdǐdȐdɐdʐdːd̐d͐dΐdϐdАdѐdҐdӐdԐdՐd֐dאdؐdِdڐdېdܐdݐdސdߐdddddddgZdZeeekstddddddddddddddddedddddddddddddddddd ddddddddd	d
dddodpdddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@ddddAdBdCdDdEdFdGdHddddIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|gZdZeeekstddddddddddddeddddddddddddddddd ddddddddd	d
dddodpdddddd.d/d0d3d<d=ddddBdCdDdEdFdGdHddddIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\gWZdZeeekstdS (  a+  cffLib: read/write Adobe CFF fonts

OpenType fonts with PostScript outlines contain a completely independent
font file, Adobe's *Compact Font Format*. So dealing with OpenType fonts
requires also dealing with CFF. This module allows you to read and write
fonts written in the CFF format.

In 2016, OpenType 1.8 introduced the `CFF2 <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2>`_
format which, along with other changes, extended the CFF format to deal with
the demands of variable fonts. This module parses both original CFF and CFF2.

    )sstruct)psCharStrings)	unionRectintRect)bytechrbyteord	bytesjointobytestostrsafeEval)TTFont)OTTableWriter)OTTableReader)otTables)BytesION   z%
	major:   B
	minor:   B
	hdrSize: B
i  c                   @   s   e Zd ZdS )StopHintCountEventN)__name__
__module____qualname__ r   r   =/tmp/pip-unpacked-wheel-qlge9rch/fontTools/cffLib/__init__.pyr   0   s   r   c                   @   sJ   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )_DesubroutinizingT2Decompiler)op_hintmaskZop_cntrmaskZ
op_rmovetoZ
op_hmovetoZ
op_vmovetoNc                 C   s   t j| ||| d S N)r   SimpleT2Decompiler__init__)self
localSubrsglobalSubrsprivater   r   r   r   =   s       z&_DesubroutinizingT2Decompiler.__init__c                 C   sh  d| _ | jD ]}t| || j qt|drj| j rf| jrfztj| | W n t	k
rd   | jd= Y nX d S g |_
tj| | |jd d  }t|j
D ]t\}}|dkst||d  dkst||d  t||d  tkst|d dkr|d d }|||d |< q| jjsZd|kr8|d |dd  }n"t|rP|d dkrZ|d ||_|`
d S )	NT_desubroutinized   r   )ZcallsubrZ	callgsubrreturnendchar)need_hintcountstop_hintcount_opssetattrstop_hint_counthasattrcallingStackr   r   executer   _patchesprogramreversedAssertionErrortypeintr    in_cff2indexlenappendr!   )r   
charStringop_nameZdesubroutinizedidxZ	expansionr   r   r   r,   B   s>    





z%_DesubroutinizingT2Decompiler.executec                 C   s4   | j | jd | j  }tj| | | || d S Nr"   )r   operandStackZ	localBiasr   r   op_callsubrprocessSubrr   r4   subrr   r   r   r<   m   s    z)_DesubroutinizingT2Decompiler.op_callsubrc                 C   s4   | j | jd | j  }tj| | | || d S r:   )r   r;   Z
globalBiasr   r   op_callgsubrr=   r>   r   r   r   r@   r   s    z*_DesubroutinizingT2Decompiler.op_callgsubrc                 G   s<   d| _ | jD ]}t| |d  q| jd }t|dr8t d S )NFr"   r!   )r&   r'   r(   r+   r*   r   )r   argsr8   csr   r   r   r)   w   s    


z-_DesubroutinizingT2Decompiler.stop_hint_countc                 C   s    t j| | | jr|   d S r   )r   r   r   r&   r)   r   r4   r   r   r   r      s    z)_DesubroutinizingT2Decompiler.op_hintmaskc                 C   s*   | j d }t|ds&|j||jf d S )Nr"   r!   )r+   r*   r-   r6   r!   )r   r4   r?   rB   r   r   r   r=      s    

z)_DesubroutinizingT2Decompiler.processSubr)N)r   r   r   r'   r   r,   r<   r@   r)   r   r=   r   r   r   r   r   4   s   
+r   c                   @   sf   e Zd Z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dZdd Zdd ZdS )
CFFFontSetan  A CFF font "file" can contain more than one font, although this is
    extremely rare (and not allowed within OpenType fonts).

    This class is the entry point for parsing a CFF table. To actually
    manipulate the data inside the CFF font, you will want to access the
    ``CFFFontSet``'s :class:`TopDict` object. To do this, a ``CFFFontSet``
    object can either be treated as a dictionary (with appropriate
    ``keys()`` and ``values()`` methods) mapping font names to :class:`TopDict`
    objects, or as a list.

    .. code:: python

            from fontTools import ttLib
            tt = ttLib.TTFont("Tests/cffLib/data/LinLibertine_RBI.otf")
            tt["CFF "].cff
            # <fontTools.cffLib.CFFFontSet object at 0x101e24c90>
            tt["CFF "].cff[0] # Here's your actual font data
            # <fontTools.cffLib.TopDict object at 0x1020f1fd0>

    Nc                 C   s8  || _ tt|d|  |dk	rL|r*dnd}| j|krhtd|| jf n| jdks^td| jdk}|std|dd	 | _	|
| j td
d t||dD | _t||d| _t|| _nLtd|dd	 | _|
| j dg| _|j}t||| j|d| _d| _t||d| _| j| j_| j| j_dS )a  Parse a binary CFF file into an internal representation. ``file``
        should be a file handle object. ``otFont`` is the top-level
        :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

        If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
        library makes an assertion that the CFF header is of the appropriate
        version.
           Nr#   r   2Invalid CFF 'major' version: expected %d, found %dr   r#   Unknown CFF formatBr   c                 s   s   | ]}t |V  qd S r   r
   .0sr   r   r   	<genexpr>   s     z'CFFFontSet.decompile.<locals>.<genexpr>isCFF2>HCFF2Font)otFontr   unpackcffHeaderFormatreadmajor
ValueErrorr0   structoffSizeseekhdrSizelistIndex	fontNamesTopDictIndextopDictIndexIndexedStringsstringstopDictSizegetGlyphOrderGlobalSubrsIndexGlobalSubrs)r   filerS   rP   expected_majorcff2GetGlyphOrderr   r   r   	decompile   s@    


   
zCFFFontSet.decompilec                 C   s
   t | jS r   )r5   r_   r   r   r   r   __len__   s    zCFFFontSet.__len__c                 C   s
   t | jS r   )r]   r_   rl   r   r   r   keys   s    zCFFFontSet.keysc                 C   s   | j S r   )ra   rl   r   r   r   values   s    zCFFFontSet.valuesc                 C   sd   t |dr| }nFt|trR|}z| j|}W qZ tk
rN   t|Y qZX nt|| j	| S )z{Return TopDict instance identified by name (str) or index (int
        or any object that implements `__index__`).
        	__index__)
r*   rp   
isinstancestrr_   r4   rX   KeyError	TypeErrorra   )r   ZnameOrIndexr4   namer   r   r   __getitem__   s    


zCFFFontSet.__getitem__c                 C   s  || _ |dk	r8|rdnd}| j|krTtd|| jf n| jdksJtd| jdk}|jrr|sr| jD ]}|  qd|s~t }nd}t|}| jj	|| |d}|rd| _
|tt|  | | _|td	| j n2d
| _
d
| _|tt|  |td| j |sDt }	| jD ]}
|	|
 q||	j	|| |d || |sb||	  || jj	|| |d | jD ],}t|dr|jdkr| }||_q||}|D ]}|| q|| dS )a  Write the object back into binary representation onto the given file.
        ``file`` should be a file handle object. ``otFont`` is the top-level
        :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

        If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
        library makes an assertion that the CFF header is of the appropriate
        version.
        Nr#   r   rF   rG   rH   rO      rQ      rI   charset)rS   rW   rX   r0   ZrecalcBBoxesra   recalcFontBBoxrb   	CFFWritergetCompilerr\   addr   packrU   getDataLengthrd   rY   rZ   r^   r_   r6   rg   r*   ry   re   getChildrentoFile)r   rh   rS   rP   ri   topDictrc   writerZtopCompilerr_   ru   ry   childrenchildr   r   r   compile   sZ    	










zCFFFontSet.compilec                 C   s   |j d| jd |  |j d| jd |  | jD ]B}|jdt|d |  | | }|| |d |  q6|  |d |  | j	| |d |  dS )zWrite the object into XML representation onto the given
        :class:`fontTools.misc.xmlWriter.XMLWriter`.

        .. code:: python

                writer = xmlWriter.XMLWriter(sys.stdout)
                tt["CFF "].cff.toXML(writer)

        rW   valueminorCFFFontru   rg   N)
	simpletagrW   newliner   r_   begintagr
   toXMLendtagrg   )r   	xmlWriterfontNamefontr   r   r   r   &  s"    





zCFFFontSet.toXMLc                 C   s8  || _ t| dsd| _t| ds&d| _|dkr| jdkrt| dsJd| _t| dsZd| _t| d	slt | _t| d
sg | _t	 | _
|d }| j| t| jd}d|_nb| jdkrt| dsd| _t| d	st | _t| d
sdg| _| j j}t| j|d}t	d|| _
| j
| |D ].}t|tr2q|\}}}|||| qt|dr4|jd jdkr4|j}	|	D ]}
t|
drv|j|
j_qvn|d	krtj}t| d	st | _|D ]@}t|trҐq|\}}}| }|||| | j| qn2|dkrt|d | _n|dkr4t|d | _dS )z?Reads data from the XML element into the ``CFFFontSet`` object.rW   r   r   r   r   rZ   rx   r\   rg   r_   ru   )rg   Nr#   rw   rR   )rg   rj   VarStorePrivater   )rS   r*   rW   r   rZ   r\   rf   rg   r_   r`   ra   r6   TopDictry   re   rq   rr   fromXMLFDArrayvstorer   r   r   T2CharStringr2   )r   ru   attrscontentrS   r   r   rj   elementfdArrayfontDictZsubrCharStringClassr?   r   r   r   r   C  sv    










 




zCFFFontSet.fromXMLc                 C   s8  d| _ | jj}td|}| jj|_|| _|d }t|drB|j}nd}tt	}||_
||_tD ]:}|d }||kr^||jkr|j|= t||r^t|| q^t|dsVt  }	|_d|	_|j|	_|	|j_|j}
|
jr|	|
j_n|	|
_t }|d |	| ||_tt}tD ]B}|d }||kr||jkr:|j|= t||rt|| qn|j}	tt}|	D ]}|d |j D ]0}||j
kr|j|= t||rt|| q|j}tD ]B}|d }||kr||jkr|j|= t||rt|| qqht }| j||dd |d | j ||dd dS )	zConverts this object from CFF format to CFF2 format. This conversion
        is done 'in-place'. The conversion cannot be reversed.

        This assumes a decompiled CFF table. (i.e. that the object has been
        filled via :meth:`decompile`.)r#   Nr   r   r   r   TrO   )!rW   rS   re   r`   ra   itemsr*   r   
buildOrdertopDictOperators2orderrj   topDictOperatorsrawDictdelattrFDArrayIndexr   rc   rg   r   CharStringscharStringsAreIndexedcharStringsIndexFontDictsetCFF2r6   privateDictOperators2privateDictOperatorsrn   r   r   r[   rk   )r   rS   rj   ZtopDictDatar   ZprivateDictZopOrderentrykeyr   charStringsr   ZprivateOpOrderrh   r   r   r   convertCFFToCFF2  sz    











zCFFFontSet.convertCFFToCFF2c                 C   s   | j D ]}| | }|j}|jD ]N}||\}}|  t|jdg }t||j|j}|	| |j
|_|`
qt|dr|jD ]*}	|	j}
t|
dr|
`d|
jkr~|
jd= q~q|j}
t|
dr|
`d|
jkr|
jd= q| j  d S )NSubrsr   )r_   r   ry   getItemAndSelectorrk   getattrr    r   r   r,   r!   r.   r*   r   r   r   r   rg   clear)r   r   r   rB   gc_ZsubrsZ
decompilerfdpdr   r   r   desubroutinize  s8    

  







zCFFFontSet.desubroutinize)N)N)N)r   r   r   __doc__rk   rm   rn   ro   rv   r   r   r   r   r   r   r   r   r   rD      s   
-
@
DPrD   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r{   zXHelper class for serializing CFF data to binary. Used by
    :meth:`CFFFontSet.compile`.c                 C   s   g | _ || _d S r   )datarP   r   rP   r   r   r   r     s    zCFFWriter.__init__c                 C   s   | j | d S r   )r   r6   )r   tabler   r   r   r}     s    zCFFWriter.addc           	      C   sR  d }d}t  td| |d }d}|g}| jD ]f}t|drd||  }t|trp|jrp| | _n|t	| }t|dr|
|| |}|| q.||krq|}qt  td | }| jrtd| j| jd< n"t|d | _td	| j| jd< dg}| jD ]:}t|d
r || n
|| || |  q||ksNtd S )Nr   z CFFWriter.toFile() iteration: %dr   r   setPosz#CFFWriter.toFile() writing to file.rQ   r"   rI   r   )logDEBUGr   r*   r   rq   TopDictIndexCompilerrP   rd   r5   r   r6   tellrY   r~   calcOffSizerZ   r   writer0   )	r   rh   ZlastPosListcountposZposListitemendPosbeginr   r   r   r     s@    




zCFFWriter.toFileN)r   r   r   r   r   r}   r   r   r   r   r   r{     s   r{   c                 C   s2   | dk rd}n | dk rd}n| dk r*d}nd}|S )N   r   i   r#   i   rE   rx   r   )ZlargestOffsetrZ   r   r   r   r   )  s    r   c                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )IndexCompilerzBase class for writing CFF `INDEX data <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#5-index-data>`_
    to binary.Nc                 C   sB   |d kr$t |dr$|j}|d k	s$t|| _| ||| _|| _d S NrP   )r*   rP   r0   getItemsr   parent)r   r   rc   r   rP   r   r   r   r   9  s    zIndexCompiler.__init__c                 C   s   |S r   r   r   r   rc   r   r   r   r   A  s    zIndexCompiler.getItemsc                 C   sT   | j rLd}|g}| j D ]2}t|dr2||  }n|t| }|| qng }|S )Nr   r   )r   r*   r   r5   r6   )r   r   offsetsr   r   r   r   
getOffsetsD  s    

zIndexCompiler.getOffsetsc                 C   sV   | j rd}nd}| jrN|  d }t|}|d t| jd |  | d }n|}|S )Nrx   r#   r"   r   )rP   r   r   r   r5   )r   Z	countSizeZ
lastOffsetrZ   
dataLengthr   r   r   r   S  s$    	zIndexCompiler.getDataLengthc           	      C   s   |   }| jr t|t| j nt|t| j | jrt|d }t|| | }tj	}|D ]2}|d||d  }t|| kst
|| q\| jD ]0}t|dr|| qt|dd}|| qd S )Nr"   >lr   latin1encoding)r   rP   writeCard32r5   r   writeCard16r   
writeCard8rY   r~   r0   r   r*   r   r	   )	r   rh   r   rZ   r~   offset	binOffsetr   r   r   r   r   r   i  s$    


zIndexCompiler.toFile)N)	r   r   r   r   r   r   r   r   r   r   r   r   r   r   5  s   
r   c                   @   s   e Zd Zdd ZdS )IndexedStringsCompilerc                 C   s   |j S r   rc   r   r   r   r   r     s    zIndexedStringsCompiler.getItemsN)r   r   r   r   r   r   r   r   r     s   r   c                       sH   e Zd ZdZdd Zdd Z fddZ fdd	Z fd
dZ  Z	S )r   z/Helper class for writing the TopDict to binary.c                 C   s$   g }|D ]}| |||  q|S r   r6   r|   r   r   rc   outr   r   r   r   r     s    zTopDictIndexCompiler.getItemsc                 C   s$   g }| j D ]}||| q
|S r   r   extendr   )r   rc   r   r   r   r   r   r     s    
z TopDictIndexCompiler.getChildrenc                    s.   | j rd| jd  g}|S tt|  S d S Nr   )rP   r   r   superr   r   )r   r   	__class__r   r   r     s    zTopDictIndexCompiler.getOffsetsc                    s*   | j r| jd  }|S tt|  S d S r   )rP   r   r   r   r   )r   r   r   r   r   r     s    z"TopDictIndexCompiler.getDataLengthc                    s,   | j r| jd | ntt| | d S r   )rP   r   r   r   r   r   rh   r   r   r   r     s    zTopDictIndexCompiler.toFile)
r   r   r   r   r   r   r   r   r   __classcell__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 )FDArrayIndexCompilerzHelper class for writing the
    `Font DICT INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#10-font-dict-index-font-dicts-and-fdselect>`_
    to binary.c                 C   s$   g }|D ]}| |||  q|S r   r   r   r   r   r   r     s    zFDArrayIndexCompiler.getItemsc                 C   s$   g }| j D ]}||| q
|S r   r   )r   rc   r   r   r   r   r   r     s    
z FDArrayIndexCompiler.getChildrenc                 C   s   |   }| jr t|t| j nt|t| j t|d }t|| | }tj	}|D ]2}|d||d  }t|| ks~t
|| qV| jD ]$}t|dr|| q|| qd S )Nr"   r   r   )r   rP   r   r5   r   r   r   r   rY   r~   r0   r   r*   r   )r   rh   r   rZ   r~   r   r   r   r   r   r   r     s     


zFDArrayIndexCompiler.toFilec                 C   s   || j jd< d S )Nr   r   r   r   r   r   r   r   r   r     s    zFDArrayIndexCompiler.setPosN)r   r   r   r   r   r   r   r   r   r   r   r   r     s
   r   c                   @   s   e Zd ZdZdd ZdS )GlobalSubrsCompilerzHelper class for writing the `global subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                 C   s*   g }|D ]}| | j ||j q|S r   r   rP   r6   bytecoder   r   rc   r   rB   r   r   r   r     s
    zGlobalSubrsCompiler.getItemsN)r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdd ZdS )SubrsCompilerzHelper class for writing the `local subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                 C   s   || j j }|| j jd< d S Nr   )r   r   r   )r   r   r   r   r   r   r   r     s    zSubrsCompiler.setPosN)r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )CharStringsCompilerzHelper class for writing the `CharStrings INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                 C   s*   g }|D ]}| | j ||j q|S r   r   r   r   r   r   r     s
    zCharStringsCompiler.getItemsc                 C   s   || j jd< d S Nr   r   r   r   r   r   r     s    zCharStringsCompiler.setPosN)r   r   r   r   r   r   r   r   r   r   r     s   r   c                   @   sX   e Zd ZdZeZdddZdd Zdd Zd	d
 Z	dd Z
dd ZdddZdd ZdS )r^   zThis class represents what the CFF spec calls an INDEX (an array of
    variable-sized objects). `Index` items can be addressed and set using
    Python list indexing.Nc                 C   s8  |d k|d kkst g | _| jj}|d kr.d S || _ttd||  || _|r\t	|}nt
|}|dkrpd S d g| | _t|}ttd|| |dkst d| g  | _}dd|  }t|d D ]2}||}	||	 }	td|	\}
|t|
 q| d | _|| j|d	   ttd
||  d S )Nloading %s at %sr   z    index count: %s offSize: %srx   zoffSize too large: %s    r   >Lr"       end of %s at %s)r0   r   r   r   _isCFF2r   r   r   rh   
readCard32
readCard16	readCard8r   rangerV   rY   rT   r6   r2   
offsetBaser[   )r   rh   rP   ru   r   rZ   r   padr4   chunkr   r   r   r   r     s6    


zIndex.__init__c                 C   s
   t | jS r   )r5   r   rl   r   r   r   rm     s    zIndex.__len__c                 C   s   | j | }|d k	r|S | j| | j }| j|d  | j|  }| j}|| ||}t||ksht| ||||}|| j |< |S Nr   )	r   r   r   rh   r[   rV   r5   r0   produceItem)r   r4   r   r   sizerh   r   r   r   r   rv     s    



zIndex.__getitem__c                 C   s   || j |< d S r   r   )r   r4   r   r   r   r   __setitem__-  s    zIndex.__setitem__c                 C   s   |S r   r   )r   r4   r   rh   r   r   r   r   r  0  s    zIndex.produceItemc                 C   s   | j | dS )zAdd an item to an INDEX.N)r   r6   )r   r   r   r   r   r6   3  s    zIndex.appendc                 C   s   | j | |||dS NrO   compilerClassr   rc   r   rP   r   r   r   r|   7  s    zIndex.getCompilerc                 C   s   | j dd= dS )zEmpty the INDEX.Nr  rl   r   r   r   r   :  s    zIndex.clear)NN)N)r   r   r   r   r   r
  r   rm   rv   r  r  r6   r|   r   r   r   r   r   r^     s   

r^   c                       sR   e Zd ZdZeZejZejZ	d fdd	Z
dd Zdd Zd	d
 Zdd Z  ZS )rf   ay  This index contains all the global subroutines in the font. A global
    subroutine is a set of ``CharString`` data which is accessible to any
    glyph in the font, and are used to store repeated instructions - for
    example, components may be encoded as global subroutines, but so could
    hinting instructions.

    Remember that when interpreting a ``callgsubr`` instruction (or indeed
    a ``callsubr`` instruction) that you will need to add the "subroutine
    number bias" to number given:

    .. code:: python

            tt = ttLib.TTFont("Almendra-Bold.otf")
            u = tt["CFF "].cff[0].CharStrings["udieresis"]
            u.decompile()

            u.toXML(XMLWriter(sys.stdout))
            # <some stuff>
            # -64 callgsubr <-- Subroutine which implements the dieresis mark
            # <other stuff>

            tt["CFF "].cff[0].GlobalSubrs[-64] # <-- WRONG
            # <T2CharString (bytecode) at 103451d10>

            tt["CFF "].cff[0].GlobalSubrs[-64 + 107] # <-- RIGHT
            # <T2CharString (source) at 103451390>

    ("The bias applied depends on the number of subrs (gsubrs). If the number of
    subrs (gsubrs) is less than 1240, the bias is 107. Otherwise if it is less
    than 33900, it is 1131; otherwise it is 32768.",
    `Subroutine Operators <https://docs.microsoft.com/en-us/typography/opentype/otspec180/cff2charstr#section4.4>`)
    Nc                    s8   t t| j||d || _|| _|r*|| _|r4|| _d S r  )r   rf   r   r   r    fdSelectr   )r   rh   r   r    r  r   rP   r   r   r   r   e  s    	zGlobalSubrsIndex.__init__c                 C   sn   | j d k	r| j }nJt| drX| jd k	rXt| drF| jd k	rF| j| }nd}| j| j}nd }| j||| jdS )Nr   r  r   r    r   )r    r*   r   r  r   	subrClassr   )r   r4   r   rh   r   r    fdIndexr   r   r   r  v  s    
zGlobalSubrsIndex.produceItemc                 C   s|   | d |  tt| D ]X}| | }| rD|jd|dd n|jd|d |  || |d |  qdS )a  Write the subroutines index into XML representation onto the given
        :class:`fontTools.misc.xmlWriter.XMLWriter`.

        .. code:: python

                writer = xmlWriter.XMLWriter(sys.stdout)
                tt["CFF "].cff[0].GlobalSubrs.toXML(writer)

        zDThe 'index' attribute is only for humans; it is ignored when parsed.
CharStringr   )r4   rawr4   N)commentr   r   r5   needsDecompilationr   r   r   )r   r   ir?   r   r   r   r     s    


zGlobalSubrsIndex.toXMLc                 C   s0   |dkrd S |   }|||| | | d S )Nr  )r  r   r6   )r   ru   r   r   r?   r   r   r   r     s
    zGlobalSubrsIndex.fromXMLc                 C   s$   d }t | dr| j| }| | |fS )Nr  )r*   r  )r   r4   selr   r   r   r     s    

z#GlobalSubrsIndex.getItemAndSelector)NNNNNN)r   r   r   r   r   r
  r   r   r  charStringClassr   r  r   r   r   r   r   r   r   r   rf   ?  s   !      rf   c                   @   s   e Zd ZdZeZdS )
SubrsIndexzThis index contains a glyph's local subroutines. A local subroutine is a
    private set of ``CharString`` data which is accessible only to the glyph to
    which the index is attached.N)r   r   r   r   r   r
  r   r   r   r   r    s   r  c                       s6   e Zd ZdZeZd
 fdd	Zdd Zdd	 Z  Z	S )r`   a  This index represents the array of ``TopDict`` structures in the font
    (again, usually only one entry is present). Hence the following calls are
    equivalent:

    .. code:: python

            tt["CFF "].cff[0]
            # <fontTools.cffLib.TopDict object at 0x102ed6e50>
            tt["CFF "].cff.topDictIndex[0]
            # <fontTools.cffLib.TopDict object at 0x102ed6e50>

    Nr   c                    s   |d k|d kkst || _|d k	r|r|| _g | _| jj}ttd||  || _	d}d g| | _d|g| _
| | _|| j|  ttd||  ntt| j||d d S )Nr   r   r   r   rO   )r0   rj   r   r   r   r   r   r   r   rh   r   r   r[   r   r`   r   )r   rh   rj   ZtopSizerP   ru   r   r   r   r   r     s    

zTopDictIndex.__init__c                 C   s*   t | j||| j| j| jd}|| |S r  )r   rc   rg   rj   r   rk   )r   r4   r   rh   r   topr   r   r   r    s    
zTopDictIndex.produceItemc                 C   sL   t t| D ]:}|jd|d |  | | | |d |  qd S Nr   r  r   r5   r   r   r   r   r   r   r  r   r   r   r     s    
zTopDictIndex.toXML)NNr   N)
r   r   r   r   r   r
  r   r  r   r   r   r   r   r   r`     s
   r`   c                   @   s(   e Zd ZeZdd Zdd Zdd ZdS )r   c                 C   sL   t t| D ]:}|jd|d |  | | | |d |  qd S r  r  r  r   r   r   r     s    
zFDArrayIndex.toXMLc                 C   s*   t | j||| j| j| jd}|| |S N)rP   r   )r   rc   rg   r   r   rk   )r   r4   r   rh   r   r   r   r   r   r    s    
zFDArrayIndex.produceItemc                 C   sN   |dkrd S t  }|D ](}t|tr&q|\}}}|||| q| | d S )Nr   )r   rq   rr   r   r6   )r   ru   r   r   r   r   r   r   r   r     s    

zFDArrayIndex.fromXMLN)r   r   r   r   r
  r   r  r   r   r   r   r   r     s   r   c                   @   sF   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )VarStoreDataNc                 C   s   || _ d | _|| _t | _d S r   )rh   r   
otVarStorer   r   )r   rh   r  r   r   r   r     s    zVarStoreData.__init__c                 C   sL   | j rHt| j }| j || _i }t| j|}t | _| j|| j	 | S r   )
rh   r   rV   r   r   otr   r  rk   r   )r   lengthZglobalStatereaderr   r   r   rk     s    

zVarStoreData.decompilec                 C   s$   t  }| j|| j | | _d S r   )r   r  r   r   Z
getAllDatar   )r   r   r   r   r   r     s    zVarStoreData.compilec                 C   s   | j || j d S r   )r  r   r   )r   r   ru   r   r   r   writeXML&  s    zVarStoreData.writeXMLc                 C   sB   t  | _|D ].}t|tr|\}}}| j|||| j qqd S r   )r   r   r  rq   tupler   r   )r   ru   r   r   r   r   r   r   r   xmlRead)  s    


zVarStoreData.xmlReadc                 C   s
   t | jS r   r5   r   rl   r   r   r   rm   3  s    zVarStoreData.__len__c                 C   s"   |d krd}| j j| }|j}|S r   )r  ZVarDataZVarRegionCount)r   ZvsIndexZvarData
numRegionsr   r   r   getNumRegions6  s
    zVarStoreData.getNumRegions)NN)
r   r   r   r   rk   r   r#  r%  rm   r(  r   r   r   r   r    s   

r  c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )FDSelectNc                 C   s  |rt || _| jdkr@ddlm} |d|| | _q| jdkrd g| }t|}d }d }t|D ]8}	t|}
|d k	rt||
D ]}|||< q|
}t |}ql|d k	rt|}
t||
D ]}|||< q|| _n| jdkrxd g| }t|}d }d }t|D ]>}	t|}
|d k	r4t||
D ]}|||< q$|
}t|}q|d k	rpt|}
t||
D ]}|||< q`|| _ndst	d| n|| _g | _d S )Nr   )arrayrI   rE   rx   Fzunsupported FDSelect format: %s)
r   formatr*  rV   tolistgidArrayr   r   r   r0   )r   rh   	numGlyphsr+  r*  r-  nRangesr   prevr  firstglyphIDr   r   r   r   ?  sT    









zFDSelect.__init__c                 C   s
   t | jS r   )r5   r-  rl   r   r   r   rm   q  s    zFDSelect.__len__c                 C   s
   | j | S r   r-  rC   r   r   r   rv   t  s    zFDSelect.__getitem__c                 C   s   || j |< d S r   r3  )r   r4   fdSelectValuer   r   r   r  w  s    zFDSelect.__setitem__c                 C   s   | j | d S r   )r-  r6   )r   r4  r   r   r   r6   z  s    zFDSelect.append)NNN)r   r   r   r   rm   rv   r  r6   r   r   r   r   r)  >  s
   
2r)  c                   @   sf   e Zd ZdZdddZdd Zdd Zd	d
 ZeZdd Z	dd Z
dd Zdd Zdd Zdd ZdS )r   a  The ``CharStrings`` in the font represent the instructions for drawing
    each glyph. This object presents a dictionary interface to the font's
    CharStrings, indexed by glyph name:

    .. code:: python

            tt["CFF "].cff[0].CharStrings["a"]
            # <T2CharString (bytecode) at 103451e90>

    See :class:`fontTools.misc.psCharStrings.T1CharString` and
    :class:`fontTools.misc.psCharStrings.T2CharString` for how to decompile,
    compile and interpret the glyph drawing instructions in the returned objects.

    Nc	                 C   s   || _ || _|d k	rZt||||||d| _i  | _}	tt|D ]}
|
|	||
 < q@d| _n.i | _d| _|| _|d k	rz|| _	|d k	r|| _
d S )NrO   r   r   )r   varStorer  r   r   r   r5   r   r    r  r   )r   rh   ry   r   r    r  r   rP   r5  r   r  r   r   r   r     s,         
zCharStrings.__init__c                 C   s   t | j S r   )r]   r   rn   rl   r   r   r   rn     s    zCharStrings.keysc                 C   s   | j r| jS t| j S d S r   )r   r   r]   r   ro   rl   r   r   r   ro     s    zCharStrings.valuesc                 C   s
   || j kS r   )r   )r   ru   r   r   r   has_key  s    zCharStrings.has_keyc                 C   s
   t | jS r   )r5   r   rl   r   r   r   rm     s    zCharStrings.__len__c                 C   s   | j | }| jr| j| }|S r   )r   r   r   )r   ru   r7   r   r   r   rv     s    

zCharStrings.__getitem__c                 C   s*   | j r| j| }|| j|< n
|| j|< d S r   )r   r   r   )r   ru   r7   r4   r   r   r   r    s    
zCharStrings.__setitem__c                 C   sZ   | j r| j| }| j|S t| drDt| dr>| j| j}qHd}nd }| j| |fS d S )Nr   r  r   )r   r   r   r   r*   fdSelectIndex)r   ru   r4   r  r   r   r   r     s    


zCharStrings.getItemAndSelectorc                 C   s   t |  }|D ]}| |\}}| r2dg}ng }|d krV|dd|fg|  n|dd|fd|fg|  |  || |d |  qd S )N)r  r   r  ru   r7  )sortedrn   r   r  r   r   r   r   )r   r   namesru   ZcharStrr7  r  r   r   r   r     s     

zCharStrings.toXMLc           
   	   C   s   |D ]}t |trq|\}}}|dkr(qd}t| drnzt|d }W n tk
r^   d}Y nX | j| j}n| j}|d }tj	}||| j
d}	|	||| |dkr||	_|	| |< qd S )Nr  r"   r   r7  r   ru   r  )rq   rr   r*   r   rs   r   r   r    r   r   r   r   r7  )
r   ru   r   r   r   ZfdIDr    	glyphNamer  r7   r   r   r   r     s*    



zCharStrings.fromXML)NN)r   r   r   r   r   rn   ro   r6  __contains__rm   rv   r  r   r   r   r   r   r   r   r   ~  s     
!r   c                 C   s   t | dS r  )r   rV   )rh   r   r   r   r   	  s    r   c                 C   s   t d| d\}|S )NrQ   r#   rY   rT   rV   rh   r   r   r   r   r     s    r   c                 C   s   t d| d\}|S )Nr   rx   r<  r=  r   r   r   r     s    r   c                 C   s   |  t| d S r   )r   r   r=  r   r   r   r     s    r   c                 C   s   |  td| d S NrQ   r   rY   r~   r=  r   r   r   r     s    r   c                 C   s   |  td| d S Nr   r?  r=  r   r   r   r     s    r   c                 C   s   t | S r   )r   r   r   r   r   	packCard8#  s    rA  c                 C   s   t d| S r>  rY   r~   r   r   r   r   
packCard16'  s    rC  c                 C   s   t d| S r@  rB  r   r   r   r   
packCard32+  s    rD  c                 C   s(   i }| D ]\}}}}}||f||< q|S r   r   r   dopru   argdefaultconvr   r   r   buildOperatorDict/  s    rK  c                 C   sT   i }| D ]F\}}}}}t |tr:t|d t|d  }nt|}||f||< q|S Nr   r   )rq   r$  r   rE  r   r   r   buildOpcodeDict6  s    
rM  c                 C   s&   g }| D ]\}}}}}| | q|S r   )r6   )r   lrG  ru   rH  rI  rJ  r   r   r   r   A  s    r   c                 C   s,   i }| D ]\}}}}}|d k	r|||< q|S r   r   rE  r   r   r   buildDefaultsH  s
    
rO  c                 C   s$   i }| D ]\}}}}}|||< q|S r   r   rE  r   r   r   buildConvertersP  s    
rP  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )SimpleConverterc              	   C   sF   t |ds| ||S |j}| }z| ||W S || X d S )Nrh   )r*   _readrh   r   r[   )r   r   r   rh   r   r   r   r   rV   X  s    
zSimpleConverter.readc                 C   s   |S r   r   r   r   r   r   r   r   rR  b  s    zSimpleConverter._readc                 C   s   |S r   r   rS  r   r   r   r   e  s    zSimpleConverter.writec                 C   s   |j ||d |  d S )Nr   )r   r   r   r   ru   r   r   r   r   xmlWriteh  s    zSimpleConverter.xmlWritec                 C   s   |d S Nr   r   r   ru   r   r   r   r   r   r   r%  l  s    zSimpleConverter.xmlReadN)r   r   r   rV   rR  r   rU  r%  r   r   r   r   rQ  W  s
   
rQ  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASCIIConverterc                 C   s   t |ddS Nasciir   rJ   rS  r   r   r   rR  q  s    zASCIIConverter._readc                 C   s   t |ddS rY  r	   rS  r   r   r   r   t  s    zASCIIConverter.writec                 C   s"   |j |t|ddd |  d S )NrZ  r   r   r   r
   r   rT  r   r   r   rU  w  s    zASCIIConverter.xmlWritec                 C   s   t |d ddS )Nr   rZ  r   r[  rW  r   r   r   r%  {  s    zASCIIConverter.xmlReadNr   r   r   rR  r   rU  r%  r   r   r   r   rX  p  s   rX  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Latin1Converterc                 C   s   t |ddS Nr   r   rJ   rS  r   r   r   rR    s    zLatin1Converter._readc                 C   s   t |ddS r_  r[  rS  r   r   r   r     s    zLatin1Converter.writec                 C   s<   t |dd}|dkr"tdd|}|j||d |  d S )Nr   r   )Notice	Copyrightz	[\r\n]\s+ r   )r
   resubr   r   rT  r   r   r   rU    s
    zLatin1Converter.xmlWritec                 C   s   t |d ddS )Nr   r   r   r[  rW  r   r   r   r%    s    zLatin1Converter.xmlReadNr]  r   r   r   r   r^    s   r^  c                 C   s&   zt | }W n   t| }Y nX |S r   )r2   float)rM   r   r   r   r   parseNum  s
    rf  c                 C   s`   g }| D ]>}t |trq|\}}}|d  }dd |D }|| qt|dkr\|d }|S )Nr   c                 S   s   g | ]}t |qS r   )evalrL   valr   r   r   
<listcomp>  s     z"parseBlendList.<locals>.<listcomp>r   r   )rq   rr   splitr6   r5   )rM   	valueListr   ru   r   r   	blendListr   r   r   parseBlendList  s    

rn  c                   @   s   e Zd Zdd Zdd ZdS )NumberConverterc                 C   s   t |trj|| |  |  ddd |D }|jt|d |  |  |	| |  n|j||d |  d S )Nrb  c                 S   s   g | ]}t |qS r   rr   rh  r   r   r   rj    s     z,NumberConverter.xmlWrite.<locals>.<listcomp>r   
rq   r]   r   r   indentjoinr   kBlendDictOpNamededentr   )r   r   ru   r   
blendValuer   r   r   rU    s    



zNumberConverter.xmlWritec                 C   s.   | dd }|d krt|}nt|d }|S rV  )getrn  rf  )r   ru   r   r   r   valueStringr   r   r   r   r%    s
    
zNumberConverter.xmlReadNr   r   r   rU  r%  r   r   r   r   ro    s   ro  c                   @   s   e Zd Zdd Zdd ZdS )ArrayConverterc                 C   s   |r|t |d tr||| |  |  |D ].}ddd |D }|jt|d |  q0|  |	| |  n*ddd |D }|j||d |  d S )Nr   rb  c                 S   s   g | ]}t |qS r   rp  rh  r   r   r   rj    s     z+ArrayConverter.xmlWrite.<locals>.<listcomp>r   c                 S   s   g | ]}t |qS r   rp  rh  r   r   r   rj    s     rq  )r   r   ru   r   rl  rv  r   r   r   rU    s    



zArrayConverter.xmlWritec                 C   s8   | dd }|d krt|}n| }dd |D }|S )Nr   c                 S   s   g | ]}t |qS r   )rf  )rL   r   r   r   r   rj    s     z*ArrayConverter.xmlRead.<locals>.<listcomp>)rw  rn  rk  )r   ru   r   r   r   rx  rl  ro   r   r   r   r%    s    
zArrayConverter.xmlReadNry  r   r   r   r   rz    s   rz  c                   @   s   e Zd Zdd Zdd ZdS )TableConverterc                 C   s2   | | |  || || |  d S r   )r   r   r   r   rT  r   r   r   rU    s
    


zTableConverter.xmlWritec                 C   s<   |    }|D ](}t|trq|\}}}|||| q|S r   )getClassrq   rr   r   )r   ru   r   r   r   obr   r   r   r   r%    s    


zTableConverter.xmlReadNry  r   r   r   r   r{    s   r{  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )PrivateDictConverterc                 C   s   t S r   )PrivateDictrl   r   r   r   r|    s    zPrivateDictConverter.getClassc           
      C   s~   |\}}|j }|j}z
|j}W n tk
r6   d }Y nX t|j||||d}|| ||}	t|	|kspt	|
|	 |S r  )rh   r   r   AttributeErrorr  rc   r[   rV   r5   r0   rk   )
r   r   r   r  r   rh   rP   r   Zprivr   r   r   r   rR    s    




zPrivateDictConverter._readc                 C   s   dS )N)r   r   r   rS  r   r   r   r     s    zPrivateDictConverter.writeNr   r   r   r|  rR  r   r   r   r   r   r~    s   r~  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )SubrsConverterc                 C   s   t S r   )r  rl   r   r   r   r|    s    zSubrsConverter.getClassc                 C   s(   |j }|j}||j|  t||dS r  )rh   r   r[   r   r  )r   r   r   rh   rP   r   r   r   rR  	  s    zSubrsConverter._readc                 C   s   dS r   r   rS  r   r   r   r     s    zSubrsConverter.writeNr  r   r   r   r   r    s   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )CharStringsConverterc              
   C   s   |j }|j}|j}t|dd }|j}t|drP|j}t|drF|j}	nd }	d }
nd\}	}|j}
|	| t
||||
|	|||d}|S )Nr   r   r)  )NN)rP   r5  )rh   r   ry   r   rg   r*   r   r)  r   r[   r   )r   r   r   rh   rP   ry   r5  r   r   r  r    r   r   r   r   rR    s2    



zCharStringsConverter._readc                 C   s   dS r   r   rS  r   r   r   r   1  s    zCharStringsConverter.writec           	      C   sp   t |dr,|j}t |dr"|j}nd }d }n|jd d   }}}td d |j|||t|dd d}|||| |S )Nr   r)  r   )r5  )r*   r   r)  r   r   rg   r   r   )	r   ru   r   r   r   r   r  r    r   r   r   r   r%  4  s$    


	zCharStringsConverter.xmlReadNr   r   r   rR  r   r%  r   r   r   r   r    s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
CharsetConverterc                 C   s  t |d}|dkr|j}|j}|| ttd| t|}|dkrZt|||j|}n(|dksj|dkr~t	|||j||}nt
t||kstttd|  i }g }	|D ]`}
|
|kr||
 }|
d t| |kr|d7 }q|d ||
< |
d t| }
d||
< |	|
 q|	}nT|s*d|jkr>|dks8td }n.|dkrNt}n|dkr^t}n|dkrlt}|rt||jkr|d |j }|S )	NROSr#   zloading charset at %sr   r   z    charset end at %s#r   )r*   r.  rh   r[   r   r   r   parseCharset0rc   parseCharsetNotImplementedErrorr5   r0   r   rr   r6   r   cffISOAdobeStringscffIExpertStringscffExpertSubsetStrings)r   r   r   isCIDr.  rh   r+  ry   ZallNamesZ
newCharsetr:  nr   r   r   rR  Q  sL    






zCharsetConverter._readc                 C   s   dS r   r   rS  r   r   r   r     s    zCharsetConverter.writec                 C   s   | d |  d S )Nz8charset is dumped separately as the 'GlyphOrder' element)r  r   rT  r   r   r   rU    s    
zCharsetConverter.xmlWritec                 C   s   d S r   r   rW  r   r   r   r%    s    zCharsetConverter.xmlReadNr]  r   r   r   r   r  P  s   .r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
CharsetCompilerc                 C   s\   |d dkst t|jd}t|||}t|||}t|t|k rL|| _n|| _|| _d S )Nr   .notdefr  )r0   r*   dictObjpackCharset0packCharsetr5   r   r   )r   rc   ry   r   r  data0r   r   r   r   r     s    zCharsetCompiler.__init__c                 C   s   || j jd< d S )Nry   r   r   r   r   r   r     s    zCharsetCompiler.setPosc                 C   s
   t | jS r   r&  rl   r   r   r   r     s    zCharsetCompiler.getDataLengthc                 C   s   | | j d S r   r   r   r   r   r   r   r     s    zCharsetCompiler.toFileNr   r   r   r   r   r   r   r   r   r   r   r    s   r  c                 C   s|   d }t tdfttdfttdfg}t| }|D ]J\}}}|d k	rB qx||krLq,|}t|D ]}| | || krXd } q,qXq,|S )Nr   r   r#   )cffISOAdobeStringCountr  cffExpertStringCountr  cffExpertSubsetStringCountr  r5   r   )ry   ZpredefinedCharSetValZpredefinedCharSetsZlcsZcntZpcscsvr  r   r   r   getStdCharSet  s"    r  c                 C   s   t | dd  S )NrE   )r2   ru   rc   r   r   r   getCIDfromName  s    r  c                 C   s
   | | S r   )getSIDr  r   r   r   getSIDfromName  s    r  c                 C   sJ   d}t |g}|rt}nt}| dd  D ]}|t||| q(t|S rL  )rA  r  r  r6   rC  r   )ry   r  rc   fmtr   	getNameIDru   r   r   r   r    s    
r  c                 C   s   d}g }d }d}|rt }nt}| dd  D ]R}|||}	|d krF|	}n2|d |	krx|| }
|
dkrfd}|||
f |	}|	}q*|r|| }
|
dkrd}|||
f t|g}|dkrt}nt}|D ]\}}
|t|||
  qt|S )Nr   r      r#   )r  r  r6   rA  rC  r   )ry   r  rc   r  rangesr1  endr  ru   SIDnLeftr   	nLeftFuncr   r   r   r    s<    

r  c                 C   sj   dg}|r>t | d D ]$}t|}|dt|d  qn(t | d D ]}t|}|||  qJ|S Nr  r   Zcidrw   )r   r   r6   rr   zfill)r.  rh   rc   r  ry   r  CIDr  r   r   r   r    s    r  c                 C   s   dg}d}|dkrt }nt}|| k rt|}||}	|rjt|||	 d D ]}
|dt|
d  qJn&t|||	 d D ]}|||  q|||	 d }q|S r  )r   r   r   r6   rr   r  )r.  rh   rc   r  r  ry   r   r  r1  r  r  r  r   r   r   r     s    r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
EncodingCompilerc                 C   sZ   t |trtt|jj||j}t|jj||j}t|t|k rJ|| _	n|| _	|| _
d S r   )rq   rr   r0   packEncoding0r  ry   rc   packEncoding1r5   r   r   )r   rc   r   r   r  Zdata1r   r   r   r     s    zEncodingCompiler.__init__c                 C   s   || j jd< d S )NEncodingr   r   r   r   r   r     s    zEncodingCompiler.setPosc                 C   s
   t | jS r   r&  rl   r   r   r   r   "  s    zEncodingCompiler.getDataLengthc                 C   s   | | j d S r   r  r   r   r   r   r   %  s    zEncodingCompiler.toFileNr  r   r   r   r   r    s   
r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
EncodingConverterc                 C   s   |dkrdS |dkrdS |dks$t |j}|| ttd| t|}|d@ }|r^td|d@ }|dkrt|j|||j	}n|dkrt
|j|||j	}|S d S )	Nr   StandardEncodingr   ExpertEncodingzloading Encoding at %s   z*Encoding supplements are not yet supported   )r0   rh   r[   r   r   r   r  parseEncoding0ry   rc   parseEncoding1)r   r   r   rh   r  haveSupplementr   r   r   r   rR  *  s8    
      zEncodingConverter._readc                 C   s   |dkrdS |dkrdS dS )Nr  r   r  r   r   rS  r   r   r   r   C  s
    zEncodingConverter.writec                 C   s   |dkr"|j ||d |  d S || |  tt|D ]0}|| }|dkr@|j dt||d |  q@|| |  d S )N)r  r  r   r  map)coderu   )r   r   r   r   r5   hexr   )r   r   ru   r   r  r:  r   r   r   rU  J  s    


zEncodingConverter.xmlWritec           	      C   sZ   d|kr|d S dgd }|D ]6}t |tr.q|\}}}t|d }|d }|||< q|S )Nru   r  r   r  )rq   rr   r   )	r   ru   r   r   r   r   r   r  r:  r   r   r   r%  Y  s    



zEncodingConverter.xmlReadNr]  r   r   r   r   r  )  s   r  c                 C   sF   t |}dgd }td|d D ] }t |}|dkr | | ||< q |S )Nr  r   r   r   r   r   )ry   rh   r  rc   ZnCodesr   r2  r  r   r   r   r  g  s    
r  c           
      C   sl   t |}dgd }d}t|D ]H}t |}t |}	t|||	 d D ]}| | ||< |d }qD|d }q|S )Nr  r   r   r  )
ry   rh   r  rc   r/  r   r2  r  r  r  r   r   r   r  q  s    


r  c           	      C   s   d}i }t t|D ]}|| }|dkr|||< qg }| dd  D ]}||}|| qB|rv|d d krv|  q\t|tt|g}|D ]}|d krd}|t| qt|S )Nr   r  r   r"   r   r5   rw  r6   poprA  r   )	ry   r   rc   r  mr  ru   codesr   r   r   r   r    s$    


r  c                 C   s  d}i }t t|D ]}|| }|dkr|||< qg }d }d}	| dd  D ]H}||d}|d krh|}n&|	d |kr|	| }
|||
f |}|}	qJ|	| }
|||
f |r|d d dkr|  qt|tt|g}|D ]*\}}
|dkrd}|t|t|
  qt|S )Nr   r  r   r"   r  )ry   r   rc   r  r  r  ru   r  r1  r  r  r   r   r   r   r    s8    

r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )FDArrayConverterc                 C   s`   z
|j }W n tk
r"   d }Y nX |j}|j}|| t||d}||_|j|_|j|_|S r  )	r   r  rh   r   r[   r   r   rc   rg   )r   r   r   r   rh   rP   r   r   r   r   rR    s    


zFDArrayConverter._readc                 C   s   dS r   r   rS  r   r   r   r     s    zFDArrayConverter.writec                 C   s8   t  }|D ](}t|trq
|\}}}|||| q
|S r   )r   rq   rr   r   )r   ru   r   r   r   r   r   r   r   r   r%    s    

zFDArrayConverter.xmlReadNr  r   r   r   r   r    s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
FDSelectConverterc                 C   s    |j }|| t||j}|S r   )rh   r[   r)  r.  )r   r   r   rh   r  r   r   r   rR    s    
zFDSelectConverter._readc                 C   s   dS r   r   rS  r   r   r   r     s    zFDSelectConverter.writec                 C   s    | |d|jfg |  d S Nr+  )r   r+  r   rT  r   r   r   rU    s    zFDSelectConverter.xmlWritec           	      C   s$   t |d }d }d }t|||}|S r  )r   r)  )	r   ru   r   r   r   r  rh   r.  r  r   r   r   r%    s
    zFDSelectConverter.xmlReadNr]  r   r   r   r   r    s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
VarStoreConverterc                 C   s$   |j }|| t|}|  |S r   )rh   r[   r  rk   )r   r   r   rh   r5  r   r   r   rR    s
    
zVarStoreConverter._readc                 C   s   dS r   r   rS  r   r   r   r     s    zVarStoreConverter.writec                 C   s   | || d S r   )r#  rT  r   r   r   rU    s    zVarStoreConverter.xmlWritec                 C   s   t  }||||| |S r   )r  r%  )r   ru   r   r   r   r5  r   r   r   r%    s    zVarStoreConverter.xmlReadNr]  r   r   r   r   r    s   r  c                 C   s.   d}t |g}| D ]}|t | qt|S r   )rA  r6   r   )fdSelectArrayr  r   r4   r   r   r   packFDSelect0   s
    
r  c           
      C   s   d}g }t | }d}t|D ]&}| | }||kr|||g |}q|d }t|g}|tt | |D ](}	|t|	d  |t|	d  ql|t| t|S )NrE   r"   r   r   )r5   r   r6   rA  rC  r   
r  r  ZfdRangesZlenArrayZlastFDIndexr  r  ZsentinelGIDr   ZfdRanger   r   r   packFDSelect3  s"    
r  c           
      C   s   d}g }t | }d}t|D ]&}| | }||kr|||g |}q|d }t|g}|tt | |D ](}	|t|	d  |t|	d  ql|t| t|S )Nrx   r"   r   r   )r5   r   r6   rA  rD  rC  r   r  r   r   r   packFDSelect4  s"    
r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
FDSelectCompilerc                 C   s   |j }|j}|dkr t|| _nb|dkr4t|| _nN|dkrHt|| _n:t|}t|}t|t|k rv|| _d|_ n|| _d|_ || _d S )Nr   rE   rx   )r+  r-  r  r   r  r  r5   r   )r   r  r   r  r  r  Zdata3r   r   r   r   3  s     zFDSelectCompiler.__init__c                 C   s   || j jd< d S )Nr)  r   r   r   r   r   r   I  s    zFDSelectCompiler.setPosc                 C   s
   t | jS r   r&  rl   r   r   r   r   L  s    zFDSelectCompiler.getDataLengthc                 C   s   | | j d S r   r  r   r   r   r   r   O  s    zFDSelectCompiler.toFileNr  r   r   r   r   r  2  s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
VarStoreCompilerc                 C   s6   || _ |js|  tt|j|jg}t|| _d S r   )r   r   r   rC  r5   r   )r   varStoreDatar   r   r   r   r   r   T  s
    zVarStoreCompiler.__init__c                 C   s   || j jd< d S )Nr   r   r   r   r   r   r   [  s    zVarStoreCompiler.setPosc                 C   s
   t | jS r   r&  rl   r   r   r   r   ^  s    zVarStoreCompiler.getDataLengthc                 C   s   | | j d S r   r  r   r   r   r   r   a  s    zVarStoreCompiler.toFileNr  r   r   r   r   r  S  s   r  c                   @   s   e Zd Zdd Zdd ZdS )ROSConverterc                 C   s<   |\}}}| |dt|fdt|fd|fg |  d S NZRegistryZOrderZ
Supplementr\  )r   r   ru   r   registryr   Z
supplementr   r   r   rU  f  s    


zROSConverter.xmlWritec                 C   s   |d |d t |d fS r  )r   rW  r   r   r   r%  r  s    zROSConverter.xmlReadNry  r   r   r   r   r  e  s   r  )   ZmaxstacknumberNN)      r  )r  r  r  ))r     ZSyntheticBaser  NN)r   versionr  NNr`  r  )r  r   ra  r#   ZFullName)r  &   FontNamerE   Z
FamilyName)rx   Weightr  NN))r  r   ZisFixedPitchr  r   N))r  r#   ZItalicAngler  r   N))r  rE   ZUnderlinePositionr  iN))r  rx   ZUnderlineThicknessr  2   N))r  rw   Z	PaintTyper  r   N))r     ZCharstringTyper  r#   N)r     
FontMatrixr*  gMbP?)   ZUniqueIDr  NNrw   FontBBox))r     ZStrokeWidthr  r   N)   ZXUIDr*  NN))r     Z
PostScriptr  NN))r     ZBaseFontNamer  NN))r     ZBaseFontBlenddeltaNN))r     CIDFontVersionr  r   N))r      CIDFontRevisionr  r   N))r  !   CIDFontTyper  r   N))r  "   CIDCountr  i"  N   ry   r  ))r  #   ZUIDBaser  NN   r     r   )r  r  )r  %   )r  $   r         r   Zblendr  )r  vsindexr  NNrm  )r  Z
BlueValuesr  NN)r  Z
OtherBluesr  NN)r  ZFamilyBluesr  NN)	   ZFamilyOtherBluesr  NN))r  r  Z	BlueScaler  g}?5^I?N))r  
   Z	BlueShiftr  r  N))r     ZBlueFuzzr  r   N)r  ZStdHWr  NN)r  ZStdVWr  NN))r  r  Z	StemSnapHr  NN))r  r  Z	StemSnapVr  NN))r  r  Z	ForceBoldr  r   N))r  r  ZForceBoldThresholdr  NN))r  r  ZlenIVr  NN))r  r  ZLanguageGroupr  r   N))r  r  ZExpansionFactorr  gQ?N))r     ZinitialRandomSeedr  r   N)r  defaultWidthXr  r   N)r  nominalWidthXr  r   Nr  r   c                 C   s   t t| D ]x}| | \}}}}}|d k	r,q|dkr<t }n6|dkrLt }n&|dkr\t }n|dkrjd }ndsrt|||||f| |< qd S )N)r  r*  r  r  rm  F)r   r5   rz  ro  rX  r0   )r   r  rG  ru   rH  rI  rJ  r   r   r   addConverters  s    r  c                   @   s   e Zd ZeeZdS )TopDictDecompilerN)r   r   r   rK  r   	operatorsr   r   r   r   r    s   r  c                   @   s   e Zd ZeeZdS )PrivateDictDecompilerN)r   r   r   rK  r   r  r   r   r   r   r  	  s   r  c                   @   sb   e Zd ZdZd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S )DictCompilerr   Nc           	      C   s   |rt |tst|d kr6t|dr6|j}|d k	s6t|| _|| _|| _|| _i }|jD ]J}t	||d }|d krrqX|j
| }|||}||j|krqX|||< qX|| _d S r   )rq   rb   r0   r*   rP   r  rc   r   r   r   
convertersr   defaultsrw  r   )	r   r  rc   r   rP   r   ru   r   rJ  r   r   r   r   
	  s(    


zDictCompiler.__init__c                 C   s   d S r   r   r   r   r   r   r    	  s    zDictCompiler.setPosc                 C   s   t | dS )Nr   )r5   r   rl   r   r   r   r   #	  s    zDictCompiler.getDataLengthc                 C   s   t  td| jj| | j}g }| jjD ]}||}|d kr>q&| j| \}}t	|t
rt|}t||ksrtdt|D ]0}	||	 }
||	 }t| d|
 }||| qznt| d| }||| || q&t|}|S )Nz-- compiling %s for %szvalue doesn't match arg typeZarg_)r   r   r   r   r   r  r   rw  opcodesrq   r$  r5   r0   r   r   r6   r   )r   reasonr   r   ru   r   rG  ZargTyperN  r  rH  vZ
arghandlerr   r   r   r   &	  s*    

zDictCompiler.compilec                 C   s   |  d}|| d S )Nr   )r   r   )r   rh   r   r   r   r   r   >	  s    
zDictCompiler.toFilec                 C   sJ   t |tr>dd |D }|td |tt t|}nt|}|S )Nc                 S   s   g | ]}t |qS r   encodeNumberrh  r   r   r   rj  D	  s     z+DictCompiler.arg_number.<locals>.<listcomp>r   )rq   r]   r6   r  r   blendOpr   )r   numr   Zdatumr   r   r   
arg_numberB	  s    

zDictCompiler.arg_numberc                 C   s   t | j|S r   )r   encodeIntCFFrc   r  )r   rM   r   r   r   arg_SIDL	  s    zDictCompiler.arg_SIDc                 C   s&   g }|D ]}| | | qt|S r   )r6   r	  r   )r   r   r   r  r   r   r   	arg_arrayO	  s    zDictCompiler.arg_arrayc                 C   sn   |sdS |d }t |tr&| |}n@g }d}|D ]}|||  |}q2g }|D ]}|t| qRt|S )N    r   )rq   r]   arg_delta_blendr6   r  r   )r   r   Zval0r   r   lastr  r  r   r   r   	arg_deltaU	  s    
zDictCompiler.arg_deltac                 C   s,  t |d }t |}|| d }|| jkrt| jd | }g }tt ||}|dkrXq|d| }| |}	||	 ||d }q@ndg| }
dg| }d}d}||k r|| d }|| |
|< |}|| dd ||< |d7 }q|
}|D ]}|| qdd |D }|t| |tt	 |S )aM  A delta list with blend lists has to be *all* blend lists.

        The value is a list is arranged as follows::

                [
                        [V0, d0..dn]
                        [V1, d0..dn]
                        ...
                        [Vm, d0..dn]
                ]

        ``V`` is the absolute coordinate value from the default font, and ``d0-dn``
        are the delta values from the *n* regions. Each ``V`` is an absolute
        coordinate from the default font.

        We want to return a list::

                [
                        [v0, v1..vm]
                        [d0..dn]
                        ...
                        [d0..dn]
                        numBlends
                        blendOp
                ]

        where each ``v`` is relative to the previous default font value.
        r   r   Nc                 S   s   g | ]}t |qS r   r  rh  r   r   r   rj  	  s     z0DictCompiler.arg_delta_blend.<locals>.<listcomp>)
r5   maxBlendStackr2   minr  r   r6   r  r   r  )r   r   Z
numMastersZ	numBlendsZnumStackZnumBlendValuesr   ZnumValZvalListZout1Z	firstListZ	deltaListr  ZprevValdefaultValueZrelValueListrm  r   r   r   r  f	  s<    





zDictCompiler.arg_delta_blend)N)r   r   r   r  r   r   r   r   r   r	  r  r  r  r  r   r   r   r   r  	  s   

r  c                 C   s"   t | trt| S t| S d S r   )rq   re  r   ZencodeFloatr
  )r  r   r   r   r  	  s    

r  c                   @   s   e Zd ZeeZdd ZdS )TopDictCompilerc                 C   s  | j }g }| jjd krt| jdrr| jjrrt| jdr<d }nt| jj}|d krh|t|| jj|  n
|| jd< t| jdr| jj	r| jj	}t
|ts|t|||  n(t| jdr| jj}t|| }|| t| jdr4| jj}t|dkr | jj}	| jjD ]}
||	|
 j qt|| }|| t| jdrg }| jj}	| jjD ]}
||	|
  qVt||| |d}|| t| jd	r| jj|| }|| ||| t| jd
r| jj|| }|| ||| |S )Nry   r  r  r   r)  r   r   rO   r   r   )rP   r  rj   r*   ry   r  r6   r  r   r  rq   rr   r  r   r  r)  r5   r   r7  r  r   r   r|   r   r   r   )r   rc   rP   r   ZcharsetCoder   r  ZvarStoreCompr  r   ru   ZfdSelectCompr   ZcharStringsCompZfdArrayIndexCompprivCompr   r   r   r   	  sX    








zTopDictCompiler.getChildrenN)r   r   r   rM  r   r  r   r   r   r   r   r  	  s   r  c                       s.   e Zd ZeeZd fdd	Zdd Z  ZS )FontDictCompilerNc           	         s   t t| j||||d g }| j}tt|jt|j D ]^}||jkrT|	| q:|j
|}|d k	r~|j| }|||}t||d |kr:|	| q:|rtddt|  d S )NrO   z:Some CFF FDArray/FontDict keys were ignored upon compile: rb  )r   r  r   r  r8  setr   r   r   r6   r  rw  rV   r   r   warningrs  )	r   r  rc   r   rP   ignoredNamesru   rI  rJ  r   r   r   r   	  s$    

zFontDictCompiler.__init__c                 C   s>   g }t | jdr:| jj|| }|| ||| |S Nr   )r*   r  r   r|   r6   r   r   )r   rc   r   r  r   r   r   r   
  s    
zFontDictCompiler.getChildren)N)	r   r   r   rM  r   r  r   r   r   r   r   r   r   r  	  s   !r  c                   @   s(   e Zd ZeZeeZdd Zdd Z	dS )PrivateDictCompilerc                 C   s"   || }||f| j jd< || _d S r  )r   r   r   )r   r   r   r  r   r   r   r   "
  s    zPrivateDictCompiler.setPosc                 C   s*   g }t | jdr&|| jj||  |S r   )r*   r  r6   r   r|   )r   rc   r   r   r   r   r   '
  s    zPrivateDictCompiler.getChildrenN)
r   r   r   maxStackLimitr  rM  r   r  r   r   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 )BaseDictNc                 C   sd   |d k|d kkst i | _g | _|| _|d kr2d S || _|| _|d k	r`ttd| jj	| || _
d S )Nr   )r0   r   	skipNamesrc   r   rh   r   r   r   r   r   )r   rc   rh   r   rP   r   r   r   r   /
  s    zBaseDict.__init__c                 C   sF   t  td| jjt| | | j| }|| | | _	| 
  d S )Nz    length %s is %d)r   r   r   r   r5   decompilerClassrc   rk   ZgetDictr   postDecompile)r   r   decr   r   r   rk   <
  s
    

zBaseDict.decompilec                 C   s   d S r   r   rl   r   r   r   r   C
  s    zBaseDict.postDecompilec                 C   s   | j | |||dS r  r	  r  r   r   r   r|   F
  s    zBaseDict.getCompilerc                 C   s   |d d |dd    kr$dkr0n nt || j|d }|d krR| j|}|d krbt || j| }|| |}t| || |S )Nr#   __)r  r   rw  r  r   rV   r(   )r   ru   r   rJ  r   r   r   __getattr__I
  s    (
zBaseDict.__getattr__c                 C   s   | j D ]F}|| jkrqt| |d }|d kr4|dkr4q| j| }|||| qt| jt| j  }|r|ddt	|  |
  d S )Nry   zsome keys were ignored: %srb  )r   r  r   r   rU  r  r   r  rs  r8  r   )r   r   ru   r   rJ  r  r   r   r   r   Z
  s    



zBaseDict.toXMLc                 C   s*   | j | }||||| }t| || d S r   )r   r%  r(   )r   ru   r   r   rJ  r   r   r   r   r   s
  s    
zBaseDict.fromXML)NNNN)N)
r   r   r   r   rk   r   r|   r$  r   r   r   r   r   r   r  .
  s   

r  c                       sj   e Zd ZdZeeZeeZe	Z
eeZeZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z  ZS )r   ad  The ``TopDict`` represents the top-level dictionary holding font
    information. CFF2 tables contain a restricted set of top-level entries
    as described `here <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#7-top-dict-data>`_,
    but CFF tables may contain a wider range of information. This information
    can be accessed through attributes or through the dictionary returned
    through the ``rawDict`` property:

    .. code:: python

            font = tt["CFF "].cff[0]
            font.FamilyName
            # 'Linux Libertine O'
            font.rawDict["FamilyName"]
            # 'Linux Libertine O'

    More information is available in the CFF file's private dictionary, accessed
    via the ``Private`` property:

    .. code:: python

            tt["CFF "].cff[0].Private.BlueValues
            # [-15, 0, 515, 515, 666, 666]

    Nc                    s^   t t| j||||d || _|| _|rFtt| _| | _t	t| _
ntt| _t	t| _
d S r  )r   r   r   rj   rg   rO  r   r  ry   r   r   r   )r   rc   rh   r   rg   rj   rP   r   r   r   r   
  s    	

zTopDict.__init__c                 C   s   | j S )z.Returns a list of glyph names in the CFF font.)ry   rl   r   r   r   re   
  s    zTopDict.getGlyphOrderc                 C   sH   | j d}|d krd S | j| | jr8t| j| _nt| j| _d S r   )r   rw  rh   r[   r   r   r.  r   )r   r   r   r   r   r   
  s    zTopDict.postDecompilec                 C   sV   t | dr|   t | dr$dg| _t | dr8t | dsFddddg| _t| | d S )Nr   r  r  r  r  r  r  )r*   decompileAllCharStringsr  r  r   )r   r   r   r   r   r   
  s    

zTopDict.toXMLc                 C   sD   t | j D ]0\}}z|  W q   td|  Y qX qd S )NzError in charstring %s)	enumerater   ro   rk   r   error)r   r  r7   r   r   r   r%  
  s    zTopDict.decompileAllCharStringsc                 C   sp   d }| j  D ]0}|| j }|d k	r|d k	r:t||}q|}q|d kr^| jd d d  | _ntt|| _d S )Nr  )r   ro   Z
calcBoundsr   r  r  r]   r   )r   ZfontBBoxr7   Zboundsr   r   r   rz   
  s    zTopDict.recalcFontBBox)NNNNNN)r   r   r   r   rO  r   r  rP  r   r  r
  r   r   r  r  r   re   r   r   r%  rz   r   r   r   r   r   r   y
  s$         	r   c                       sL   e Zd Zi ZeeZeZddddgZ	dgZ
eZd
 fdd	Zdd	 Z  ZS )r   r  r  r  r   Nc                    s,   t t| j||||d || _| | d S r  )r   r   r   r   r   )r   rc   rh   r   rg   rP   r   r   r   r   r     s    	zFontDict.__init__c                 C   s&   |r| j | _d| _n| j| _d| _d S )NTF)	orderCFF2r   r   orderCFFr   r   r   r   r     s
    zFontDict.setCFF2)NNNNNN)r   r   r   r  rP  r   r   r  r
  r)  r(  r  r  r   r   r   r   r   r   r   r   
  s         r   c                       sT   e Zd ZeeZeeZeeZ	e
ZeZd fdd	Zedd Zd	ddZ  ZS )
r  Nc                    s\   t t| j||||d || _|rDtt| _tt| _d  | _	| _
ntt| _tt| _d S r  )r   r  r   r   rO  r   r  r   r   r  r  r   )r   rc   rh   r   rP   r   r   r   r   r   &  s    


zPrivateDict.__init__c                 C   s   | j S r   )r   rl   r   r   r   r3   3  s    zPrivateDict.in_cff2c                 C   s.   |d krt | dr| j}nd}| j|}|S )Nr  r   )r*   r  r   r(  )r   vir'  r   r   r   r(  7  s    
zPrivateDict.getNumRegions)NNNNN)N)r   r   r   rO  r   r  rP  r   r   r   r  r  r  r
  r   propertyr3   r(  r   r   r   r   r   r    s   
r  c                   @   sJ   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )rb   zSID -> string mapping.Nc                 C   s.   |d krg }ndd t |ddD }|| _d S )Nc                 S   s   g | ]}t |d dqS )r   r   rJ   rK   r   r   r   rj  I  s     z+IndexedStrings.__init__.<locals>.<listcomp>FrO   )r^   rc   )r   rh   rc   r   r   r   r   E  s    zIndexedStrings.__init__c                 C   s   t | d | ddS )NFrO   )r   rl   r   r   r   r|   L  s    zIndexedStrings.getCompilerc                 C   s
   t | jS r   )r5   rc   rl   r   r   r   rm   O  s    zIndexedStrings.__len__c                 C   s"   |t k rt| S | j|t   S d S r   )cffStandardStringCountcffStandardStringsrc   )r   r  r   r   r   rv   R  s    zIndexedStrings.__getitem__c                 C   sn   t | ds|   t|dd}|tkr0t| }n:|| jkrF| j| }n$t| jt }| j| || j|< |S )NstringMappingr   r   )	r*   buildStringMappingr
   cffStandardStringMappingr.  r5   rc   r,  r6   )r   rM   r  r   r   r   r  X  s    



zIndexedStrings.getSIDc                 C   s   | j S r   r   rl   r   r   r   
getStringsf  s    zIndexedStrings.getStringsc                 C   s2   i | _ tt| jD ]}|t | j | j| < qd S r   )r.  r   r5   rc   r,  rC   r   r   r   r/  i  s    z!IndexedStrings.buildStringMapping)N)r   r   r   r   r   r|   rm   rv   r  r1  r/  r   r   r   r   rb   B  s   
rb   r  spaceZexclamZquotedblZ
numbersigndollarpercentZ	ampersandZ
quoterightZ	parenleftZ
parenrightZasteriskpluscommaZhyphenZperiodZslashZzeroZoneZtwoZthreeZfourZfivesixZsevenZeightZninecolonZ	semicolonZlessequalZgreaterZquestionatArI   CDEFGHIJKLMNOPQRSTUVWXYZZbracketleft	backslashZbracketrightZasciicircumZ
underscoreZ	quoteleftabr   rF  efr   hr  jkrN  r  r  opqrrM   tur  wxyzZ	braceleftbarZ
bracerightZ
asciitildeZ
exclamdowncentZsterlingfractionyenZflorinsectioncurrencyZquotesingleZquotedblleftZguillemotleftZguilsinglleftZguilsinglrightfiflZendashdaggerZ	daggerdblZperiodcenteredZ	paragraphZbulletZquotesinglbaseZquotedblbaseZquotedblrightZguillemotrightZellipsisZperthousandZquestiondownZgraveacuteZ
circumflextildeZmacronZbreveZ	dotaccentZdieresisZringZcedillaZhungarumlautZogonekZcaronZemdashZAEZordfeminineZLslashOslashZOEZordmasculineZaeZdotlessiZlslashoslashZoeZ
germandblsZonesuperiorZ
logicalnotmuZ	trademarkZEthZonehalfZ	plusminusZThornZ
onequarterdivideZ	brokenbarZdegreethornZthreequartersZtwosuperiorZ
registeredminusethmultiplyZthreesuperior	copyrightAacuteZAcircumflexZ	AdieresisAgraveAringAtildeZCcedillaEacuteZEcircumflexZ	EdieresisEgraveIacuteZIcircumflexZ	IdieresisIgraveNtildeOacuteZOcircumflexZ	OdieresisOgraveOtildeScaronUacuteZUcircumflexZ	UdieresisUgraveYacuteZ	YdieresisZZcaronaacuteZacircumflexZ	adieresisagravearingatildeZccedillaeacuteZecircumflexZ	edieresisegraveiacuteZicircumflexZ	idieresisigraventildeoacuteZocircumflexZ	odieresisograveotildescaronuacuteZucircumflexZ	udieresisugraveyacuteZ	ydieresisZzcaronZexclamsmallZHungarumlautsmallZdollaroldstyleZdollarsuperiorZampersandsmallZ
AcutesmallZparenleftsuperiorZparenrightsuperiorZtwodotenleaderZonedotenleaderZzerooldstyleZoneoldstyleZtwooldstyleZthreeoldstyleZfouroldstyleZfiveoldstyleZsixoldstyleZsevenoldstyleZeightoldstyleZnineoldstyleZcommasuperiorZthreequartersemdashZperiodsuperiorZquestionsmallZ	asuperiorZ	bsuperiorZcentsuperiorZ	dsuperiorZ	esuperiorZ	isuperiorZ	lsuperiorZ	msuperiorZ	nsuperiorZ	osuperiorZ	rsuperiorZ	ssuperiorZ	tsuperiorffffifflZparenleftinferiorZparenrightinferiorZCircumflexsmallZhyphensuperiorZ
GravesmallZAsmallZBsmallZCsmallZDsmallZEsmallZFsmallZGsmallZHsmallZIsmallZJsmallZKsmallZLsmallZMsmallZNsmallZOsmallZPsmallZQsmallZRsmallZSsmallZTsmallZUsmallZVsmallZWsmallZXsmallZYsmallZZsmallZcolonmonetaryZ	onefittedZrupiahZ
TildesmallZexclamdownsmallZcentoldstyleZLslashsmallZScaronsmallZZcaronsmallZDieresissmallZ
BrevesmallZ
CaronsmallZDotaccentsmallZMacronsmallZ
figuredashZhypheninferiorZOgoneksmallZ	RingsmallZCedillasmallZquestiondownsmallZ	oneeighthZthreeeighthsZfiveeighthsZseveneighthsZonethirdZ	twothirdsZzerosuperiorZfoursuperiorZfivesuperiorZsixsuperiorZsevensuperiorZeightsuperiorZninesuperiorZzeroinferiorZoneinferiorZtwoinferiorZthreeinferiorZfourinferiorZfiveinferiorZsixinferiorZseveninferiorZeightinferiorZnineinferiorZcentinferiorZdollarinferiorZperiodinferiorZcommainferiorZAgravesmallZAacutesmallZAcircumflexsmallZAtildesmallZAdieresissmallZ
AringsmallZAEsmallZCcedillasmallZEgravesmallZEacutesmallZEcircumflexsmallZEdieresissmallZIgravesmallZIacutesmallZIcircumflexsmallZIdieresissmallZEthsmallZNtildesmallZOgravesmallZOacutesmallZOcircumflexsmallZOtildesmallZOdieresissmallZOEsmallZOslashsmallZUgravesmallZUacutesmallZUcircumflexsmallZUdieresissmallZYacutesmallZ
ThornsmallZYdieresissmallz001.000z001.001z001.002z001.003ZBlackZBoldZBookZLightZMediumZRegularZRomanZSemiboldi        W   )r   ZfontTools.miscr   r   ZfontTools.misc.arrayToolsr   r   ZfontTools.misc.textToolsr   r   r   r	   r
   r   ZfontTools.ttLibr   ZfontTools.ttLib.tables.otBaser   r   ZfontTools.ttLib.tablesr   r   ior   rY   loggingrc  r   	getLoggerr   r   rU   r  	Exceptionr   r   r   objectrD   r{   r   r   r   r   r   r   r   r   r^   rf   r  r`   r   r  r)  r   r   r   r   r   r   r   rA  rC  rD  rK  rM  r   rO  rP  rQ  rX  r^  rf  rn  ro  rz  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  r  r   r   rt  r  r   r   r  ZDictDecompilerr  r  r  r  r  r  r  r  r   r   r  rb   r-  r,  r5   r0   r0  r   Z_ir  r  r  r  r  r  r   r   r   r   <module>   s   

V  o2L$)	Hk8#1@ ==%>
"!*" '=-Kl:#1        i  *Z