B
    0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 ddl	m
Z
 G dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZdd ZdS )zGlyphSets returned by a TTFont.    )ABCabstractmethod)Mapping)copy)otRound)deprecateFunctionc               @   sD   e Zd ZdZdd Zdd Zdd Zdd	 Zed
e	ddd Z
dS )_TTGlyphSetzlGeneric dict-like GlyphSet class that pulls metrics from hmtx and
    glyph shape from TrueType or CFF.
    c             C   s|   || _ || _|| _|d j| _t|ddd | _|rxddlm	} t|ddd | _
| j
d k	rx|| j
j|d j|| _d S )	NZhmtxZvmtxmetricsr   )VarStoreInstancerZHVARtablefvar)fontlocationglyphsMappingr	   hMetricsgetattrgetvMetricsfontTools.varLib.varStorer
   	hvarTableZVarStoreaxeshvarInstancer)selfr   r   r   r
    r   \/home/ankuromar296_gmail_com/myenv/lib/python3.7/site-packages/fontTools/ttLib/ttGlyphSet.py__init__   s    
z_TTGlyphSet.__init__c             C   s
   || j kS )N)r   )r   	glyphNamer   r   r   __contains__    s    z_TTGlyphSet.__contains__c             C   s   t | j S )N)iterr   keys)r   r   r   r   __iter__#   s    z_TTGlyphSet.__iter__c             C   s
   t | jS )N)lenr   )r   r   r   r   __len__&   s    z_TTGlyphSet.__len__z#use 'glyphName in glyphSet' instead)categoryc             C   s
   || j kS )N)r   )r   r   r   r   r   has_key)   s    z_TTGlyphSet.has_keyN)__name__
__module____qualname____doc__r   r   r    r"   r   DeprecationWarningr$   r   r   r   r   r   
   s   r   c                   s$   e Zd Z fddZdd Z  ZS )_TTGlyphSetGlyfc                s0   |d | _ t ||| j  |r,|d| _d S )NZglyfZgvar)	glyfTablesuperr   r   	gvarTable)r   r   r   )	__class__r   r   r   1   s    
z_TTGlyphSetGlyf.__init__c             C   s
   t | |S )N)_TTGlyphGlyf)r   r   r   r   r   __getitem__7   s    z_TTGlyphSetGlyf.__getitem__)r%   r&   r'   r   r0   __classcell__r   r   )r.   r   r*   0   s   r*   c                   s$   e Zd Z fddZdd Z  ZS )_TTGlyphSetCFFc                s   d|krdnd}t || j d j| _t ||| j d | _|rddlm	} t
| jdd }|d k	r||j|d j|}|j| _d S )NZCFF2zCFF r   )r
   varStorer   )listZcffvaluesZCharStringscharStringsr,   r   blenderr   r
   r   Z
otVarStorer   ZinterpolateFromDeltas)r   r   r   ZtableTagr
   r3   Z	instancer)r.   r   r   r   <   s    z_TTGlyphSetCFF.__init__c             C   s
   t | |S )N)_TTGlyphCFF)r   r   r   r   r   r0   K   s    z_TTGlyphSetCFF.__getitem__)r%   r&   r'   r   r0   r1   r   r   )r.   r   r2   ;   s   r2   c               @   s,   e Zd ZdZdd Zedd Zdd ZdS )	_TTGlyphaS  Glyph object that supports the Pen protocol, meaning that it has
    .draw() and .drawPoints() methods that take a pen object as their only
    argument. Additionally there are 'width' and 'lsb' attributes, read from
    the 'hmtx' table.

    If the font contains a 'vmtx' table, there will also be 'height' and 'tsb'
    attributes.
    c             C   s   || _ || _|j| \| _| _|jd k	r<|j| \| _| _nd\| _| _|jr|j	d k	r|j	j
d krp|j|n|j	j
j| }|  j|j| 7  _d S )N)NN)glyphSetnamer   widthlsbr   heighttsbr   r   ZAdvWidthMapr   Z
getGlyphIDmappingr   )r   r:   r   Zvaridxr   r   r   r   Z   s    
z_TTGlyph.__init__c             C   s   t dS )zdDraw the glyph onto ``pen``. See fontTools.pens.basePen for details
        how that works.
        N)NotImplementedError)r   penr   r   r   drawk   s    z_TTGlyph.drawc             C   s   ddl m} | || dS )zeDraw the glyph onto ``pen``. See fontTools.pens.pointPen for details
        how that works.
        r   )SegmentToPointPenN)ZfontTools.pens.pointPenrD   rC   )r   rB   rD   r   r   r   
drawPointsr   s    z_TTGlyph.drawPointsN)r%   r&   r'   r(   r   r   rC   rE   r   r   r   r   r9   O   s   	r9   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r/   c             C   s"   |   \}}||| jj| dS )zdDraw the glyph onto ``pen``. See fontTools.pens.basePen for details
        how that works.
        N)_getGlyphAndOffsetrC   r:   r+   )r   rB   glyphoffsetr   r   r   rC   |   s    z_TTGlyphGlyf.drawc             C   s"   |   \}}||| jj| dS )zeDraw the glyph onto ``pen``. See fontTools.pens.pointPen for details
        how that works.
        N)rF   rE   r:   r+   )r   rB   rG   rH   r   r   r   rE      s    z_TTGlyphGlyf.drawPointsc             C   sN   | j jr| j jd k	r|  }n| j j| j }t|drB| j|j nd}||fS )NxMinr   )	r:   r   r-   _getGlyphInstancer+   r;   hasattrr=   rI   )r   rG   rH   r   r   r   rF      s
    
z_TTGlyphGlyf._getGlyphAndOffsetc             C   s@  ddl m} ddlm} ddlm} | j}|j}|jj	| j
 }|j}|j}|| j
||\}	}
d\}}x|D ]}||j|j}|sql|j}d |kr|d kr|| j
||\}}|d dkr|d nttt|d }||||}|	||| 7 }	qlW t|| j
 }t||	|\}}}}|| _|| _|jd kr<|| _|| _|S )Nr   )	iup_delta)GlyphCoordinates)supportScalar)NN   )ZfontTools.varLib.iuprL   ZfontTools.ttLib.tables._g_l_y_frM   ZfontTools.varLib.modelsrN   r:   r+   r-   
variationsr;   r   r   Z_getCoordinatesAndControlsr   r   coordinatesr4   ranger!   r   _setCoordinatesr=   r?   r   r<   r>   )r   rL   rM   rN   r:   r+   rP   r   r   rQ   _Z
origCoordsZendPtsvarZscalardeltacontrolrG   r<   r=   r>   r?   r   r   r   rJ      s>    
(z_TTGlyphGlyf._getGlyphInstanceN)r%   r&   r'   rC   rE   rF   rJ   r   r   r   r   r/   {   s   	r/   c               @   s   e Zd Zdd ZdS )r8   c             C   s   | j j| j || j j dS )zdDraw the glyph onto ``pen``. See fontTools.pens.basePen for details
        how that works.
        N)r:   r6   r;   rC   r7   )r   rB   r   r   r   rC      s    z_TTGlyphCFF.drawN)r%   r&   r'   rC   r   r   r   r   r8      s   r8   c             C   s<  t |dkst|d d }|d d }|d d }|d d }xtdD ]
}|d= qJW |  rt |t | jksvtdd	 | jD | _xht|| jD ]\}}	t|	d
r|\|	_|	_qW n8| j	dkrt |dkstnt |t | j
kst|| _
| | t|| }
t|| }t| j| }t|| j }|
|||fS )N   r   rO   c             S   s   g | ]}t |qS r   )r   ).0compr   r   r   
<listcomp>   s    z#_setCoordinates.<locals>.<listcomp>x)r!   AssertionErrorrR   ZisComposite
componentsziprK   r`   yZnumberOfContoursrQ   ZrecalcBoundsr   rI   ZyMax)rG   Zcoordr+   Z	leftSideXZ
rightSideXZtopSideYZbottomSideYrT   pr^   ZhorizontalAdvanceWidthZverticalAdvanceWidthZleftSideBearingZtopSideBearingr   r   r   rS      s4    



rS   N)r(   abcr   r   collections.abcr   r   ZfontTools.misc.fixedToolsr   ZfontTools.misc.loggingToolsr   r   r*   r2   r9   r/   r8   rS   r   r   r   r   <module>   s   &,A