o
    l^Uf&                     @   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rhddlZeeejdd  dS 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      | N selfotherr   r   :lib/python3.10/site-packages/fontTools/cffLib/CFFToCFF2.py__add__      z_NominalWidthUsedError.__add__c                 C   r   r   r   r   r   r   r   __radd__   r   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 ]}||\}}	|	  q4|g| D ];}
|
D ]6}|j
}t| }}z|d}W n	 tyf   Y nw z|d	}W n	 tyw   Y nw g |t||d< qKqGd
}t }| D ]}||\}}	|j
}|	r||	 nt|drt|jdg ng }t|||d}z|| W nH ty   |d dv rd}|d}|d}|dkr|jn|j}||7 }|dkr|n|}|| j
}||dd< |d dv s|d Y nw |r|d d	kr|  q|r|   d| _| jj}td|}| j D ]}|| q(|| _ |d }t|drB|j}nd}tt}||_||_t|dst   }|_d|_!|j|_||j_"|j}|j#rq||j$_"n||_"t% }|&d || ||_tt'}|durt(D ]!}|d } | |vr| |j)v r|j)| = t|| rt*||  qn]|j}tt'}|D ]S}|&d t+|j) D ]} | |jvr|j)| = t|| rt*||  q|j}t(D ]%}|d } | |vr| t+|j) v r |j)| = t|| rt*||  qqt,D ](}|d } | dkrq| |vr8| |j)v r-|j)| = t|| r8t*||  qt- }!| j.|!|dd |!/d | 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    returnZendcharF   )callsubrZ	callgsubrTr(      charset)ZisCFF2)0ZtopDictIndexhasattrr   ZCharStringsZGlobalSubrsr"   r    keysZgetItemAndSelectorZ	decompileprogramlenindex
ValueErrorminr   r!   r   ZexecutepopZ	localBiasZ
globalBiasZremove_unused_subroutinesmajorotFontZgetGlyphOrderr   appendr	   r   Zordercff2GetGlyphOrderr   stringsfdArrayZcharStringsAreIndexedZcharStringsIndexr   ZsetCFF2r   r   ZrawDictdelattrlistr
   r   compileseek)"cffr5   ZtopDictr9   ZcharStringsZglobalSubrsZ
localSubrsZ	glyphNamecsZfdIndexZsubrsZsubrr.   ijZremoveUnusedSubrsZnominalWidthXErrorZthisLocalSubrsZ	extractorZ
subrNumberopZbiasZsubrSetZsubrProgramr7   ZtopDictDataitemZprivateDictZopOrderZfontDictZprivateOpOrderentrykeyfiler   r   r   _convertCFFToCFF2!   s  
	























rG   c                 C   s4   | d j }| d= t||  td }| d< ||_ d S )NzCFF ZCFF2)r>   rG   r   )fontr>   tabler   r   r   r      s
   


c                 C   sD  | du 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	r^d n|j
rcd!nd"d# ddl}|j}|j|s||d$| |jst|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).)rL   defaultrM   z--no-recalc-timestamprecalc_timestampstore_falsez:Don't set the output font's timestamp to the current time.)destactionrM   F)requiredz-vz	--verbose
store_truezRun more verbosely.)rR   rM   z-qz--quietzTurn verbosity off.)configLoggerDEBUGZ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	fontToolsrU   verbosequietosrK   pathisfileerrorformatoutputr   r   rO   r   loginfoZsave)argsrZ   r\   parserZloggingGroupoptionsrU   rc   ZinfileZoutfilerH   r   r   r   r      sf   
__main__r'   r   ) __doc__ZfontTools.ttLibr   r   ZfontTools.misc.cliToolsr   ZfontTools.misc.psCharStringsr   ZfontTools.cffLibr   r   r   r	   r
   r   r   r   ior   Zlogging__all__Z	getLoggerri   	Exceptionr   rG   r   r   r   rZ   exitr[   r   r   r   r   <module>   s$    (

 A
C