U
    Q»{j‡'  ã                   @   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rÌd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   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/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…< q–qŽd
}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ƒ�sÒt|ƒ‚| d¡}|dk�rì|jn|j}||7 }|dk�r|n|}|| j
}||dd…< �q”t|ƒ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ƒ�s¬t#ƒ  }|_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|| ƒ�rÚt-|| ƒ �qÚ|j}t+D ]J}|d } | |k�r| t.|j, ¡ ƒk�rH|j,| = t|| ƒ�rt-|| ƒ �q�q¾t/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   ÚreturnZ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)"Úcffr7   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   	
ÿÿ
ÿú

ÿÿúü














rJ   c                 C   s4   | d j }| d= t|| ƒ tdƒ }| d< ||_ d S )NzCFF ZCFF2)rA   rJ   r   )ÚfontrA   Ú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	r¼d n|j
rÆd!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).)rO   ÚdefaultrP   z--no-recalc-timestampÚrecalc_timestampÚstore_falsez:Don't set the output font's timestamp to the current time.)ÚdestÚactionrP   F)Úrequiredz-vz	--verboseÚ
store_truezRun more verbosely.)rU   rP   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	fontToolsrX   ÚverboseÚquietÚosrN   ÚpathÚisfileÚerrorÚformatÚoutputr   r   rR   r   ÚlogÚinfoÚsave)Úargsr^   r`   ÚparserZloggingGroupÚoptionsrX   rg   ÚinfileÚoutfilerK   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__Ú	getLoggerrm   Ú	Exceptionr   rJ   r   r   r   r^   Úexitr_   r   r   r   r   Ú<module>   s    (

 C
C