o
    nĎi	                      @   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 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gZedZdd ZddddZdddZedkrqddlZe eej!dd  dS dS )zCFF2 to CFF converter.    )TTFontnewTable)makeOutputFileName)T2StackUseExtractor)TopDictIndex
buildOrderbuildDefaultstopDictOperatorsprivateDictOperatorsFDSelect   )desubroutinizeCharString)specializeProgram)optimizeWidths)defaultdictNconvertCFF2ToCFFmainzfontTools.cffLibc                    sX  d| _ td}| jD ]
}d|_|| q
|| _|d }t|dr%tdtt}||_	|j
 D ]}||vrE|j
|= t||rEt|| q1|j}|j}t|ds`t  }	|_dgt|j |	_tt}
tt}|D ]<}|d |j}||_	|D ]}||j
vr||
v r|
| |j
|< qy|j
 D ]}||vr|j
|= t||rt|| qqj| D ]}|  |jd q| jgd	d
 |D  D ]}|D ]}|jd qqtt}|d j}| D ]}||\}}|dkrd}|| || d  q| D ]\}}t |\}}|| j}||_!||_"q| D ],}||\}}|dkr'd}|| j}|| d }||j!krB|j#d||j"  q| D ]6}||\}}|du rXd}|| j}t$t%|dg | j|d}|&|}|dkr}t'| t(|j|_qH| )  dd t*|j+D  dd
 t,t|j+D |_+ fdd|j D |_d|_-dS )am  Converts this object from CFF2 format to CFF format. This conversion
    is done 'in-place'. The conversion cannot be reversed.

    The CFF2 font cannot be variable. (TODO Accept those and convert to the
    default instance?)

    This assumes a decompiled CFF2 table. (i.e. that the object has been
    filled via :meth:`decompile` and e.g. not loaded from XML.)r   Nr   VarStorez5Variable CFF2 font cannot be converted to CFF format.r   Fendcharc                 S   s   g | ]	}t |jd g qS )Subrs)getattrPrivate).0fd r   V/home/jeff/fluffinator/venv/lib/python3.10/site-packages/fontTools/cffLib/CFF2ToCFF.py
<listcomp>U       z%_convertCFF2ToCFF.<locals>.<listcomp>returnhmtxr   )private0   c                 S   s,   i | ]\}}||rd t |d ndqS cid   z.notdefstrzfill)r   nnamer   r   r   
<dictcomp>   s    z%_convertCFF2ToCFF.<locals>.<dictcomp>c                 S   s&   g | ]}|rd t |d ndqS r"   r%   )r   r(   r   r   r   r      s    c                    s   i | ]	\}} | |qS r   r   )r   r)   vmappingr   r   r*      r   )AdobeIdentityr   ).majorr   topDictIndexcff2GetGlyphOrderappendhasattr
ValueErrorr   r	   orderrawDictkeysdelattrCharStringsFDArrayr   lencharStringsgidArrayr   r
   setCFF2r   values	decompileprogramGlobalSubrsr   listmetricsgetItemAndSelectoritemsr   defaultWidthXnominalWidthXinsertr   r   executer   r   remove_unused_subroutines	enumeratecharsetrangeROS)cffotFonttopDictDataitemtopDictopOrderkeyr=   fdArrayfdSelectdefaultsr6   r   privateDictcssubrSetswidthsrE   	glyphNamefdIndex	widthListbestDefaultbestNominalr    width	extractorstackUser   r,   r   _convertCFF2ToCFF   s   


















rg   T)updatePostTablec                C   st   d| vrt d| d j}t||  | d= td }| d< ||_|r4d| v r6| d }|jdkr8d|_d S d S d S d S )NCFF2z)Input font does not contain a CFF2 table.zCFF postg       @g      @)r5   rQ   rg   r   
formatType)fontrh   rQ   tablerj   r   r   r   r      s   



c                 C   s  | 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dd |jdddd |jdd}|jddddd |jd d!dd"d || }dd#lm} ||j	rnd$n|j
rsd%nd&d' ddl}|j}|j|s|d(| |jst|d)d*d+n|j}	t||jdd,}
t|
 |jrdd-lm} dd.lm} td/ | }|
| |d t|ddd,}
||
|jd0 t d1|	 |
|	 dS )2z%Convert CFF2 OTF font to CFF OTF fontNr   r   zfonttools cffLib.CFF2ToCFFz(Convert a non-variable CFF2 font to CFF.)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   z--remove-overlaps
store_truez@Merge overlapping contours and components. Requires skia-pathops)rv   rq   z--ignore-overlap-errorszCDon't crash if the remove-overlaps operation fails for some glyphs.F)requiredz-vz	--verbosezRun more verbosely.z-qz--quietzTurn verbosity off.)configLoggerDEBUGERRORINFO)levelzNo such file '{}'Tz-CFF)	overWritesuffix)recalcTimestamprecalcBBoxes)removeOverlaps)BytesIOzRemoving overlaps)ignoreErrorsz	Saving %s)!sysargvargparseArgumentParseradd_argumentadd_mutually_exclusive_group
parse_args	fontToolsry   verbosequietosro   pathisfileerrorformatoutputr   r   rs   r   remove_overlapsfontTools.ttLib.removeOverlapsr   ior   logdebugsaveseekignore_overlap_errorsinfo)argsr   r   parserloggingGroupoptionsry   r   infileoutfilerl   r   r   streamr   r   r   r      s   



__main__)N)"__doc__fontTools.ttLibr   r   fontTools.misc.cliToolsr   fontTools.misc.psCharStringsr   fontTools.cffLibr   r   r   r	   r
   r   
transformsr   specializerr   rd   r   collectionsr   logging__all__	getLoggerr   rg   r   r   __name__r   exitr   r   r   r   r   <module>   s&     
x
\