U
    #vh'                     @   s   d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZ ddlmZ ddlZdd	gZed
ZG dd deZdd Zdd Zddd	ZedkrddlZeeejdd  dS )zCFF to CFF2 converter.    )TTFontnewTable)makeOutputFileName)T2WidthExtractor)TopDictIndexFDArrayIndexFontDict
buildOrdertopDictOperatorsprivateDictOperatorstopDictOperators2privateDictOperators2)BytesIONconvertCFFToCFF2mainzfontTools.cffLibc                   @   s   e Zd Zdd Zdd ZdS )_NominalWidthUsedErrorc                 C   s   | d S N selfotherr   r   >/tmp/pip-unpacked-wheel-1ufboor8/fontTools/cffLib/CFFToCFF2.py__add__   s    z_NominalWidthUsedError.__add__c                 C   s   | d S r   r   r   r   r   r   __radd__   s    z_NominalWidthUsedError.__radd__N)__name__
__module____qualname__r   r   r   r   r   r   r      s   r   c           "   
   C   s  | j d }t|dr|jnd}|j}| j}|r<dd |D n"t|dr\t|jdr\|jjgng }| D ]}||\}}	|	  qh|g| D ]z}
|
D ]p}|j
}t| }}z|d}W n tk
r   Y nX z|d	}W n tk
r   Y nX g |t||d< qqd
}t }| D ]L}||\}}	|j
}|	dk	rH||	 nt|drbt|jdg ng }t|||d}z|| W n tk
rJ   t|dkr&|d dkr&d}|d}t|tst||d}|dkr|jn|j}||7 }|dkr|n|}|| j
}||dd< qt|dks<t||d Y nX |r|d d	kr|  q|rz|   d| _| jj}td|}| j D ]}|| q|| _ |d }t|dr|j}nd}tt }||_!||_"t|dst#  }|_d|_$|j|_||j_%|j}|j&r*||j'_%n||_%t( }|)d || ||_tt*}|dk	rft+D ]B}|d } | |krf| |j,kr|j,| = t|| rft-||  qfn|j}tt*}|D ]}|)d t.|j, D ]0} | |j!kr|j,| = t|| rt-||  q|j}t+D ]J}|d } | |kr| t.|j, krH|j,| = t|| rt-||  qqt/D ]P}|d } | dkrqj| |krj| |j,kr|j,| = t|| rjt-||  qjt0 }!| j1|!|dd |!2d | j	|!|dd dS )a  Converts 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` and e.g. not loaded from XML.)r   FDArrayNc                 S   s   g | ]}t |jd g qS )Subrs)getattrPrivate).0fdr   r   r   
<listcomp>/   s     z%_convertCFFToCFF2.<locals>.<listcomp>r    r   returnendcharF      )callsubrZ	callgsubrTr(   charset)ZisCFF2)3ZtopDictIndexhasattrr   ZCharStringsZGlobalSubrsr    r   keysZgetItemAndSelectorZ	decompileprogramlenindex
ValueErrorminr   r   r   executepop
isinstanceintAssertionErrorZ	localBiasZ
globalBiasZremove_unused_subroutinesmajorotFontZgetGlyphOrderr   appendr	   r   ordercff2GetGlyphOrderr   stringsfdArrayZcharStringsAreIndexedZcharStringsIndexr   ZsetCFF2r   r   ZrawDictdelattrlistr
   r   compileseek)"cffr8   ZtopDictr=   ZcharStringsZglobalSubrsZ
localSubrsZ	glyphNamecsZfdIndexZsubrsZsubrr-   ijZremoveUnusedSubrsZnominalWidthXErrorZthisLocalSubrsZ	extractorZ
subrNumberopZbiasZsubrSetZsubrProgramr;   ZtopDictDataitemZprivateDictZopOrderZfontDictZprivateOpOrderentrykeyfiler   r   r   _convertCFFToCFF2!   s   	


















rK   c                 C   s4   | d j }| d= t||  td }| d< ||_ d S )NzCFF ZCFF2)rB   rK   r   )fontrB   tabler   r   r   r      s
    

c                 C   sF  | dkrddl }|jdd } ddl}|jddd}|jddd	d
 |jdddddd |jddddd |jdd}|jddddd |jddddd || }ddlm} ||j	rd n|j
rd!nd"d# ddl}|j}|j|s|d$| |jst|d%d&d'n|j}	t||jdd(}
t|
 td)|	 |
|	 dS )*z%Convert CFF OTF font to CFF2 OTF fontNr   r'   zfonttools cffLib.CFFToCFF2zUpgrade a CFF font to CFF2.)descriptioninputz	INPUT.ttfzInput OTF file with CFF table.)metavarhelpz-oz--outputz
OUTPUT.ttfz3Output instance OTF file (default: INPUT-CFF2.ttf).)rP   defaultrQ   z--no-recalc-timestamprecalc_timestampstore_falsez:Don't set the output font's timestamp to the current time.)destactionrQ   F)requiredz-vz	--verbose
store_truezRun more verbosely.)rV   rQ   z-qz--quietzTurn verbosity off.)configLoggerDEBUGERRORINFO)levelzNo such file '{}'Tz-CFF2)Z	overWritesuffix)ZrecalcTimestampZrecalcBBoxesz	Saving %s)sysargvargparseArgumentParseradd_argumentadd_mutually_exclusive_group
parse_argsZ	fontToolsrY   verbosequietosrO   pathisfileerrorformatoutputr   r   rS   r   loginfosave)argsr_   ra   parserZloggingGroupoptionsrY   rh   infileoutfilerL   r   r   r   r      sv            
__main__r'   )N) __doc__ZfontTools.ttLibr   r   ZfontTools.misc.cliToolsr   ZfontTools.misc.psCharStringsr   ZfontTools.cffLibr   r   r   r	   r
   r   r   r   ior   logging__all__	getLoggerrn   	Exceptionr   rK   r   r   r   r_   exitr`   r   r   r   r   <module>   s    (

 C
C