U
    #vh9                     @   s  d Z ddlmZ ddlmZ ddlm  m  mZ ddlm  m  m	Z	 ddl
mZ ddlm  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mZ d
dgZG dd deZeeddfeddfeddfeddfeddfeddfe	jdfe	jdfe	j dfe	j!dfe	j"dfe	j#dffdd Z$e%ed ed!fd"d#d Z$e%ed$d%d&d Z$e%ed'd(d)d Z$e%ed*d+d,d Z$e%ed-d.d/d Z$e%ed0d1d2d Z$d3d4 Z&e%ed5ed6fd7d8d Z$e'e	j(d9d Z$d:d; Z)e'e	j*d<d Z$e'e	j+d=d Z$d>d
 Z,dBd?d@Z-e.dAkrddl/Z/e/0e-  dS )CzsChange the units-per-EM of a font.

AAT and Graphite tables are not supported. CFF/CFF2 fonts
are de-subroutinized.    )	TTVisitorN)VarStoreData)builder)OnlineMultiVarStoreBuilderVector)otRound)batched
scale_upemScalerVisitorc                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s
   || _ d S N)scaleFactor)selfr    r   =/tmp/pip-unpacked-wheel-1ufboor8/fontTools/ttLib/scaleUpem.py__init__   s    zScalerVisitor.__init__c                 C   s   t || j S r   )r   r   )r   vr   r   r   scale   s    zScalerVisitor.scaleN)__name__
__module____qualname__r   r   r   r   r   r   r      s   head)
unitsPerEmxMinyMinxMaxyMaxpost)ZunderlinePositionZunderlineThicknessZVORGZdefaultVertOriginYZhhea)ascentdescentlineGapZadvanceWidthMaxZminLeftSideBearingZminRightSideBearingZ
xMaxExtentcaretOffsetZvhea)r   r   r    ZadvanceHeightMaxZminTopSideBearingZminBottomSideBearingZ
yMaxExtentr!   zOS/2)ZxAvgCharWidthZySubscriptXSizeZySubscriptYSizeZySubscriptXOffsetZySubscriptYOffsetZySuperscriptXSizeZySuperscriptYSizeZySuperscriptXOffsetZySuperscriptYOffsetZyStrikeoutSizeZyStrikeoutPositionZsTypoAscenderZsTypoDescenderZsTypoLineGapZusWinAscentZusWinDescentZsxHeightZ
sCapHeight)ZXAdvanceZYAdvanceZ
XPlacementZ
YPlacement)ZXCoordinateZYCoordinateZ
CoordinateValue)r   r   r   r   c                 C   s   t ||| | d S r   )setattrr   )visitorobjattrvaluer   r   r   visit   s    Br(   ZhmtxZvmtxmetricsc                 C   s2   |D ](}|| \}}|  ||  |f||< qd S r   r   )r$   r%   r&   r)   gZadvanceZlsbr   r   r   r(   c   s    ZVMTXVOriginRecordsc                 C   s    |D ]}|  || ||< qd S r   r*   )r$   r%   r&   r,   r+   r   r   r   r(   l   s    glyfglyphsc                 C   s   |  D ]}dD ]*}t||d }|d k	rt||| | q| rn|jD ] }| |j|_| |j|_qJqt|dr|j	}t
|D ]$\}\}	}
| |	| |
f||< qqd S )N)r   r   r   r   coordinates)valuesgetattrr#   r   ZisComposite
componentsxyhasattrr/   	enumerate)r$   r%   r&   r.   r+   r   	componentr/   ir3   r4   r   r   r   r(   r   s    

Zgvar
variationsc                 C   st   | j d }| D ]\\}}|| }|D ]F}|j}	t|	D ]2\}
}|d krJq8| |d | |d f|	|
< q8q&qd S )Nr-   r      )fontitemsr/   r6   r   )r$   r%   r&   r9   Z	glyfTableZ	glyphNameZvarlistZglyphvarr/   r8   xyr   r   r   r(      s    
ZVARCtablec                 C   s  | j d }dd |jD }|j}t|}|jjD ]}|jD ]}	|	j}
| |
j	|
_	| |
j
|
_
| |
j|
_| |
j|
_|	jtjkr|	j}|tjkr|d? }|d@ }|j| }|j| }||||j |rt||j }tt||}dd |D }|||	_ntj|	_|	jtjkr<|	j}|tjkr<|d? }|d@ }|j|d@  }|d? }|d@ }|j| }|j| }||||j |rt||j }|	j}tt||}g }|D ].}t|}d}|tjj@ r| || ||< |d7 }|tjj@ r"| || ||< |d7 }|tjj@ r8|d7 }|tjj@ rN|d7 }|tjj @ rd|d7 }|tjj!@ rz|d7 }|tjj"@ r|d7 }|tjj#@ r| || ||< |d7 }|tjj$@ r| || ||< |d7 }|%t&| q|}|||	_q<tj|	_q<q0|' |_d S )	Nfvarc                 S   s   g | ]
}|j qS r   )ZaxisTag).0ar   r   r   
<listcomp>   s     zvisit.<locals>.<listcomp>   i  c                 S   s   g | ]}t |qS r   r   )rA   r   r   r   r   rC      s     r   r:   )(r;   ZaxesZMultiVarStorer   ZVarCompositeGlyphsZVarCompositeGlyphr2   	transformr   Z
translateXZ
translateYZtCenterXZtCenterYZaxisValuesVarIndexotTablesZNO_VARIATION_INDEXZMultiVarDataItemZsetSupportsZget_supportslenZVarRegionCountlistr	   ZstoreDeltasZtransformVarIndexflagsZVarComponentFlagsZHAVE_TRANSLATE_XZHAVE_TRANSLATE_YZHAVE_ROTATIONZHAVE_SCALE_XZHAVE_SCALE_YZHAVE_SKEW_XZHAVE_SKEW_YZHAVE_TCENTER_XZHAVE_TCENTER_Yappendr   finish)r$   r%   r&   Zvarcr@   ZfvarAxesstoreZstoreBuilderr+   r7   tZvarIdxmajorminorvarDataZvecmrJ   ZnewVecr   r8   r   r   r   r(      s    






kern
kernTablesc                 C   s4   |D ]*}|j }| D ]}| || ||< qqd S r   )	kernTablekeysr   )r$   r%   r&   rT   r?   rU   kr   r   r   r(      s    c                 C   sT   t |D ]F\}}t|ts4t|tsN| |||< q|d }t| | ||d< qd S )N)r6   
isinstancerI   bytesr   
_cff_scale)r$   argsr8   argZ
num_blendsr   r   r   r[      s    


r[   zCFF ZCFF2cffc              	   C   s  |   |jd }t|dd }|d k	r,|jnd }t }| D ]F}|| }	|	j}
|	jD ]d}|
|\}}|	|j
 tj|j|d}|D ]\}}|dkrqt| | qt||jd d < qXdD ]B}t||d }|d krqt|trt| | qt||| | qtdD ]}|j|  | j  < q|D ]V}dD ]J}t||d }|d krTq6t|trlt| | nt||| | q6q.q>d S )Nr   ZVarStore)getNumRegionsZvsindex)ZUnderlinePositionZUnderlineThicknessZFontBBoxZStrokeWidth   )
Z
BlueValuesZ
OtherBluesZFamilyBluesZFamilyOtherBluesZStdHWZStdVWZ	StemSnapHZ	StemSnapVZdefaultWidthXZnominalWidthX)ZdesubroutinizeZtopDictIndexr1   r_   setrV   ZCharStringscharsetZgetItemAndSelectoraddprivatecffSpecializerZprogramToCommandsprogramr[   ZcommandsToProgramrY   rI   r#   r   rangeZ
FontMatrixr   )r$   r%   r&   r^   ZtopDictZvarStorer_   ZprivatesZfontnamer;   csr+   c_commandsopr\   r'   r8   rd   r   r   r   r(      sJ    

 

c                 C   s8   |j D ]$}t|D ]\}}| |||< qq|  d S r   )rG   r6   r   ZcalculateNumShorts)r$   rQ   itemr8   r   r   r   r   r(   H  s    
c                 C   st   d|  krdkr,n nt jj| _|| _d S t  }|  d |_ |_ |_	|_
| |_|_t jj| _|| _d S )N   r   )rF   PaintFormatZPaintScaleUniformFormatr   Z	Affine2x3ZpopulateDefaultsr>   ZyxZdxZdyZxxyyZPaintTransformZ	Transform)paintr   rE   r   r   r   _setup_scale_paintS  s    

rt   c                 C   s*   |j }t  }t|| j ||_ ||_ dS )NT)PaintrF   rt   r   )r$   recordZoldPaintr   r   r   r   r(   b  s    c                 C   s`   |j tjjkrdS t }|j |_ |j|_|j|_|`|`t|d| j  ||_| |j dS )NTr:   F)	rq   rF   rp   Z
PaintGlyphru   ZGlyphrt   r   r(   )r$   rs   ZnewPaintr   r   r   r(   o  s    c                 C   s$   | d j }t|| }||  dS )z1Change the units-per-EM of font to the new value.r   N)r   r   r(   )r;   new_upemZupemr$   r   r   r   r
     s    
c           
      C   s   | dkrddl }|jdd } ddlm} ddlm} ddl}|jdd d}|jddd	d
 |jdddd
 |jddddd |	| }||j
}t|j}|jdk	r|jn||j
ddd}	t|| td|	  ||	 dS )z Change the units-per-EM of fontsNr   r:   )TTFont)makeOutputFileNamezfonttools ttLib.scaleUpem)descriptionr;   z
Font file.)metavarhelprw   znew-upemzNew units-per-EM integer value.z--output-filepathzOutput file.)r{   defaultr|   Tz-scaled)Z	overWritesuffixz
Writing %s)sysargvfontTools.ttLibrx   ZfontTools.misc.cliToolsry   argparseArgumentParseradd_argument
parse_argsr;   intrw   output_filer
   printsave)
r\   r   rx   ry   r   parseroptionsr;   rw   r   r   r   r   main  s@          



r   __main__)N)1__doc__ZfontTools.ttLib.ttVisitorr   r   ZttLibZfontTools.ttLib.tables.otBaseZtablesZotBaseZfontTools.ttLib.tables.otTablesrF   ZfontTools.cffLibr   ZfontTools.cffLib.specializerZcffLibZspecializerre   ZfontTools.varLibr   ZfontTools.varLib.multiVarStorer   ZfontTools.misc.vectorr   ZfontTools.misc.fixedToolsr   ZfontTools.misc.iterToolsr	   __all__r   Zregister_attrsZgetTableClassZValueRecordZAnchorZ
CaretValueZ	BaseCoordZMathValueRecordZClipBoxr(   Zregister_attrr[   registerZVarDatart   ZBaseGlyphPaintRecordru   r
   r   r   r   exitr   r   r   r   <module>   s   A
 




X
 
E







'
