o
    h'                     @   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   n/var/www/html/construction_image-detection-poc/venv/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
}|	dur||	 nt|drt|jdg ng }t|||d}z|| W nk ty'   t|dkr|d dv rd}|d}t|tsJ ||d}|dkr|jn|j}||7 }|dkr|n|}|| j
}||dd< t|dkr|d dv st|dks J ||d Y nw |r6|d d	kr6|  q|r>|   d| _| jj}td|}| j D ]}|| qM|| _ |d }t|drg|j}nd}tt}||_ ||_!t|dst"  }|_d|_#|j|_||j_$|j}|j%r||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|| rt,||  q|j}t*D ]%}|d } | |vr0| t-|j+ v r%|j+| = t|| r0t,||  qqt.D ](}|d } | dkrCq6| |vr]| |j+v rR|j+| = t|| r]t,||  q6t/ }!| j0|!|dd |!1d | 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      )callsubr	callgsubrTr*   charset)isCFF2)2topDictIndexhasattrr   CharStringsGlobalSubrsr"   r    keysgetItemAndSelector	decompileprogramlenindex
ValueErrorminr   r!   r   executepop
isinstanceint	localBias
globalBiasremove_unused_subroutinesmajorotFontgetGlyphOrderr   appendr	   r   ordercff2GetGlyphOrderr   stringsfdArraycharStringsAreIndexedcharStringsIndexr   setCFF2r   r   rawDictdelattrlistr
   r   compileseek)"cffrC   topDictrI   charStringsglobalSubrs
localSubrs	glyphNamecsfdIndexsubrssubrr6   ijremoveUnusedSubrsnominalWidthXErrorthisLocalSubrs	extractor
subrNumberopbiassubrSetsubrProgramrG   topDictDataitemprivateDictopOrderfontDictprivateOpOrderentrykeyfiler   r   r   _convertCFFToCFF2!   s  
	





















rp   c                 C   s4   | d j }| d= t||  td }| d< ||_ d S )NzCFF CFF2)rR   rp   r   )fontrR   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).)rv   defaultrw   z--no-recalc-timestamprecalc_timestampstore_falsez:Don't set the output font's timestamp to the current time.)destactionrw   F)requiredz-vz	--verbose
store_truezRun more verbosely.)r|   rw   z-qz--quietzTurn verbosity off.)configLoggerDEBUGERRORINFO)levelzNo such file '{}'Tz-CFF2)	overWritesuffix)recalcTimestamprecalcBBoxesz	Saving %s)sysargvargparseArgumentParseradd_argumentadd_mutually_exclusive_group
parse_args	fontToolsr   verbosequietosru   pathisfileerrorformatoutputr   r   ry   r   loginfosave)argsr   r   parserloggingGroupoptionsr   r   infileoutfilerr   r   r   r   r      sf   
__main__r)   r   ) __doc__fontTools.ttLibr   r   fontTools.misc.cliToolsr   fontTools.misc.psCharStringsr   fontTools.cffLibr   r   r   r	   r
   r   r   r   ior   logging__all__	getLoggerr   	Exceptionr   rp   r   r   r   r   exitr   r   r   r   r   <module>   s$    (

 C
C