o
    š~ØZvw  ã                   @   sŒ  d Z dZddlZddlZddl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mZmZ ddlmZmZ ddlmZmZ dd	lmZ dd
lmZ dZej ¡  ej Z ej!Z!i Z"i Z#i Z$i Z%G dd„ de&ƒZ'G dd„ de&ƒZ(dd„ Z)G dd„ dƒZ*dQdd„Z+dd„ Z,G dd„ dƒZ-g Z.G dd„ dƒZ/e0dƒZ1e0dƒZ2e0dƒZ3e0dƒZ4er°d d!„ Z5nd"d#„ Z6d$d!„ Z5da7G d%d&„ d&e*ƒZ8d'd(„ Z9d)d*„ Z:dRd+d,„Z;d-d.„ Z<d/d0„ Z=d1d2„ Z>d3d4„ Z?d5d6„ Z@e@d7ƒZAe. Be@d8ƒeAg¡ dQd9d:„ZCdQd;d<„ZDdQd=d>„ZEd?d@„ ZFdSdBdC„ZGdDdE„ ZHdFdG„ ZIdHdI„ ZJdJdK„ ZKeLe" M¡ e# M¡ e$ M¡ e% M¡ dL�fdMdN„ZNddOlmOZO eOeNƒ [OePdPk�rDeKƒ  eJƒ  dS dS )Tz3.3.0aŽ  This provides a database of font metric information and
efines Font, Encoding and TypeFace classes aimed at end users.

There are counterparts to some of these in pdfbase/pdfdoc.py, but
the latter focus on constructing the right PDF objects.  These
classes are declarative and focus on letting the user construct
and query font objects.

The module maintains a registry of font objects at run time.

It is independent of the canvas or any particular context.  It keeps
a registry of Font, TypeFace and Encoding objects.  Ideally these
would be pre-loaded, but due to a nasty circularity problem we
trap attempts to access them and do it on first access.
é    N)Ú	_fontdata)ÚwarnOnce)
Ú	rl_isfileÚrl_globÚrl_isdirÚopen_and_readÚopen_and_readlinesÚfindInPathsÚisSeqÚisStrÚ	isUnicodeÚisPy3)ÚdefaultEncodingÚT1SearchPath)Ú
unicode2T1ÚinstanceStringWidthT1)Ú	rl_codecs)Úasciió   nc                   @   ó   e Zd ZdS )Ú	FontErrorN©Ú__name__Ú
__module__Ú__qualname__© r   r   úN/var/www/html/env/lib/python3.10/site-packages/reportlab/pdfbase/pdfmetrics.pyr   (   ó    r   c                   @   r   )ÚFontNotFoundErrorNr   r   r   r   r   r   *   r   r   c                 C   sî  t | dƒ}t|ƒdkr |r|d  d¡}t|ƒdkr td|  ƒ‚i }g }dd„ |D ƒ}dd„ |D ƒ}d}|D ]q}|dd	… d
krCd}q6|dd… dkrNd}q6|r§| d¡}dd„ |D ƒ}|dd… \}}}	| ¡ \}
}|
dksuJ d| ƒ‚t|ƒ}| ¡ \}
}|
dks‰J d| ƒ‚t|ƒ}|	 ¡ \}
}|
dks�J d| ƒ‚|}| |||f¡ q6d}|D ]F}|dd	… dkr¸d}|dd	… d
krÃd}q¬|rò|dd… dkrÍz
| dd¡\}}W n   td| |f ƒ‚zt|ƒ}W n   Y |||< q¬||fS )a  Quick and dirty - gives back a top-level dictionary
    with top-level items, and a 'widths' key containing
    a dictionary of glyph names and widths.  Just enough
    needed for embedding.  A better parser would accept
    options for what data you wwanted, and preserve the
    order.Úré   r   úzAFM file %s hasn't enough datac                 S   ó   g | ]}|  ¡ ‘qS r   ©Ústrip©Ú.0Úlr   r   r   Ú
<listcomp>>   ó    z parseAFMFile.<locals>.<listcomp>c                 S   s   g | ]}|  ¡  d ¡s|‘qS )Úcomment)ÚlowerÚ
startswithr%   r   r   r   r(   ?   s    é   ÚStartCharMetricsé   ÚEndCharMetricsú;c                 S   r"   r   r#   )r&   Úchunkr   r   r   r(   I   r)   é   ÚCzbad line in font file %sÚWXÚNÚStartFontMetricsé   ÚCommentú z-Header information error in afm %s: line='%s')r   ÚlenÚsplitÚ
ValueErrorÚintÚappend)ÚafmFileNameÚlinesÚtopLevelÚ
glyphLevelÚ	inMetricsÚlineÚchunksÚcidChunkÚ
widthChunkÚ	nameChunkr'   r   ÚcidÚwidthÚnameÚinHeaderÚleftÚrightr   r   r   ÚparseAFMFile-   sb   

€€rP   c                   @   s.   e Zd Zdd„ Zdd„ Zdd„ Zddd	„Zd
S )ÚTypeFacec                 C   s|   || _ g | _i | _d| _d| _d | _d| _d| _|dkr d| _n|dkr(d| _nd | _|t	v r9d| _
|  |¡ d S d| _
d S )Nr   ÚZapfDingbatsÚZapfDingbatsEncodingÚSymbolÚSymbolEncodingr    )rL   Ú
glyphNamesÚglyphWidthsÚascentÚdescentÚ
familyNameÚboldÚitalicÚrequiredEncodingÚstandardFontsÚbuiltInÚ_loadBuiltInData©ÚselfrL   r   r   r   Ú__init__t   s"   
zTypeFace.__init__c                 C   s:   t |ƒ}tj| | _t| j ¡ ƒ| _tj| \| _| _	dS )z�Called for the built in 14 fonts.  Gets their glyph data.
        We presume they never change so this can be a shared reference.N)
Ústrr   ÚwidthsByFontGlyphrW   ÚlistÚkeysrV   Úascent_descentrX   rY   ra   r   r   r   r`   Ž   s   zTypeFace._loadBuiltInDatac                 C   s   g S )z=Info function, return list of the font files this depends on.r   ©rb   r   r   r   ÚgetFontFiles–   s   zTypeFace.getFontFilesú.pfbc                 C   sè   |  ¡ | ¡ f}t| dƒr'tj | j¡d }|D ]}t|| ƒr&||   S qzt 	| j
¡}W n5   t| j
ƒ}|rb|  ¡ dkrY|D ]}tj |¡d | }t|ƒrU|}qBd }qBn|  ¡ dkra|}nd }Y |d u rrtd|| j
f ƒ |S )NÚpfbFileNamer   rk   z.afmzCan't find %s for face '%s')r+   ÚupperÚhasattrÚosÚpathÚsplitextrl   r   r   Ú
findT1FilerL   ÚbruteForceSearchForAFMr   )rb   ÚextÚpossible_extsÚ
r_basenameÚer   ÚafmÚpfbr   r   r   rr   š   s6   
ÿ
û€€zTypeFace.findT1FileN)rk   )r   r   r   rc   r`   rj   rr   r   r   r   r   rQ   s   s
    rQ   c                 C   sb   |d u r
ddl m} t| ƒr| S tj | ¡}|D ]}t|ƒsqtj ||¡}t|ƒr.|  S q| S )Nr   ©r   )Úreportlab.rl_configr   r   ro   rp   Úbasenamer   Újoin)ÚfnÚ
searchPathÚbfnÚdirnameÚtfnr   r   r   ÚbruteForceSearchForFileµ   s   
rƒ   c           
   
   C   sž   ddl m} |D ]D}t|ƒsqt|tj d ƒ}|D ]1}zt|ƒ\}}|d | kr0|W     S W q   t ¡ \}}}	d 	t
t|jƒ¡d|   f|_‚ qdS )zcLooks in all AFM files on path for face with given name.

    Returns AFM file name or None.  Ouch!r   rz   z*.[aA][fF][mM]ÚFontNamer:   z, while looking for faceName=%rN)r{   r   r   r   ro   ÚseprP   ÚsysÚexc_infor}   Úmaprd   Úargs)
ÚfaceNamer   r�   Ú	possiblesÚpossibleÚtopDictÚ	glyphDictÚtÚvÚbr   r   r   rs   ¿   s    
ÿøýrs   c                   @   sR   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚEncodingz1Object to help you create and refer to encodings.Nc                 C   sÎ   || _ d| _|tv r|d u sJ dƒ‚|| _tj| | _d S |d kr,t| _tjt | _d S t|ƒrBt	|ƒ}|j | _|jd d … | _d S t
|ƒrRt| _|d d … | _d S t|tƒre|j | _|jd d … | _d S d S )Nr   z2Can't have a base encoding for a standard encoding)rL   ÚfrozenÚstandardEncodingsÚbaseEncodingNamer   Ú	encodingsÚvectorr   r   ÚgetEncodingr
   Ú
isinstancer’   )rb   rL   ÚbaseÚbaseEncr   r   r   rc   Ù   s(   
ýzEncoding.__init__c                 C   s
   | j | S )z.Return glyph name for that code point, or None)r—   )rb   Úindexr   r   r   Ú__getitem__ð   s   
zEncoding.__getitem__c                 C   sD   | j dks	J dƒ‚| j| |kr t| jƒ}|||< t|ƒ| _d S d S )Nr   úCannot modify a frozen encoding)r“   r—   rf   Útuple)rb   rœ   ÚvalueÚLr   r   r   Ú__setitem__õ   s   
ýzEncoding.__setitem__c                 C   s   t | jƒ| _d| _d S ©Nr    )rŸ   r—   r“   ri   r   r   r   Úfreezeý   s   
zEncoding.freezec                 C   s    | j |j kot| jƒt|jƒkS ©N)rL   rŸ   r—   )rb   Úotherr   r   r   ÚisEqual  s    zEncoding.isEqualc                 C   s6   | j dks	J dƒ‚|}|D ]}|| j|< |d }qdS )zASet a group of character names starting at the code point 'base'.r   rž   r    N)r“   r—   )rb   rš   ÚnewNamesÚidxrL   r   r   r   ÚmodifyRange  s   

þzEncoding.modifyRangec                 C   sv   g }d}t t| jƒƒD ]&}| j| }||j| kr#|r"| |¡ g }q|r+| |¡ q|r1||g}q|r9| |¡ |S )aZ  
        Return a compact list of the code points differing between two encodings

        This is in the Adobe format: list of
           [[b1, name1, name2, name3],
           [b2, name4]]
           
        where b1...bn is the starting code point, and the glyph names following
        are assigned consecutive code points.
        
        N)Úranger;   r—   r?   )rb   ÚotherEncÚrangesÚcurRangeÚiÚglyphr   r   r   ÚgetDifferences  s"   

€€
zEncoding.getDifferencesc           
      C   s¾   ddl m} i }| j}t|ƒ}|  |¡}|g kr| |¡S g }|D ]}| |d ¡ |dd… D ]}|dur=| d| ¡ q0q!| |¡|d< |dv rQ| |¡|d< | d	¡|d
< | |¡}	|	S )z&Returns a PDF Object representing selfr   ©Úpdfdocr    Nú/ÚDifferences)ÚMacRomanEncodingÚMacExpertEncodingÚWinAnsiEncodingÚBaseEncodingr’   ÚType)	Úreportlab.pdfbaser³   r•   r˜   r±   ÚPDFNamer?   ÚPDFArrayÚPDFDictionary)
rb   r³   ÚDr•   r›   ÚdifferencesÚ	diffArrayr«   Ú	glyphNameÚPDr   r   r   ÚmakePDFObject*  s*   

€ý
zEncoding.makePDFObjectr¥   )r   r   r   Ú__doc__rc   r�   r¢   r¤   r§   rª   r±   rÄ   r   r   r   r   r’   ×   s    
r’   c                   @   sL   e Zd ZdZdZdZddd„Zddd„Zd	d
„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚFontaD  Represents a font (i.e combination of face and encoding).

    Defines suitable machinery for single byte fonts.  This is
    a concrete class which can handle the basic built-in fonts;
    not clear yet if embedded ones need a new font class or
    just a new typeface class (which would do the job through
    composition)r   Nc                 C   sf   || _ t|ƒ }| _t|ƒ| _|| _|jr|jd u rtn|pg | _	|  
¡  t| _|dkr.| p/t| _d S )NrR   )ÚfontNameÚgetTypeFaceÚfacer˜   ÚencodingÚencNamer_   r]   ÚstandardT1SubstitutionFontsÚsubstitutionFontsÚ_calcWidthsÚ_notdefCharÚ_notdefFont)rb   rL   rŠ   rË   rÍ   rÉ   r   r   r   rc   [  s   
ÿ
ÿþzFont.__init__Úutf8c                 C   s   t | |||d�S )N©rÊ   )r   )rb   ÚtextÚsizerÊ   r   r   r   ÚstringWidthg  s   zFont.stringWidthc                 C   s   d| j j| jjf S )Nz<%s %s>)Ú	__class__r   rÉ   rL   ri   r   r   r   Ú__repr__j  s   zFont.__repr__c              	   C   s’   dgd }| j j}| jj}tdƒD ]2}|| }|durCz
|| }|||< W q tyB   ddl}|jjr?t	d| j j
|f ƒ n	 Y qw q|| _dS )z)Vector of widths for stringWidth functionr   é   Nz3typeface "%s" does not have a glyph "%s", bad font!)rÉ   rW   rÊ   r—   r«   ÚKeyErrorr{   Ú	rl_configÚwarnOnMissingFontGlyphsÚprintrL   Úwidths)rb   ÚwÚgwÚvecr¯   rÂ   rK   Ú	reportlabr   r   r   rÎ   m  s$   
€ûü

zFont._calcWidthsc                 C   sV   d}t dƒD ]"}|d tt| j| ƒdƒ }|dkr|d }|d dkr(|d	 }q|S )
z<returns a pretty block in PDF Array format to aid inspectionó   [rØ   ó    rÑ   éÿ   s    ]r-   é   ó   
)r«   Úbytesrd   rÝ   )rb   rÓ   r¯   r   r   r   Ú_formatWidths�  s   €zFont._formatWidthsc                 C   sÎ   ddl m} dtt|jƒd ƒ }| ¡ }||_| jj|_	d| j
 |_| j ¡ }t|ƒr0|dv r3||_| jjtvrMd|_d|_| | j¡|_| j |¡|_| ||¡}|jd j}|||< d	| |j| j
< d
S )z«Makes and returns one or more PDF objects to be added
        to the document.  The caller supplies the internal name
        to be used (typically F1, F2... in sequence) r   r²   ÚFr    zFont %s)z/MacRomanEncodingz/MacExpertEncodingz/WinAnsiEncodingrä   Ú
BasicFontsr´   N)r»   r³   Úreprr;   ÚfontMappingÚPDFType1FontÚNamerÉ   rL   ÚBaseFontrÇ   Ú__Comment__rÊ   rÄ   r   r’   r^   Ú	FirstCharÚLastCharr½   rÝ   ÚWidthsÚ
addObjectsÚFontDescriptorÚ	ReferenceÚ
idToObjectÚdict)rb   Údocr³   ÚinternalNameÚpdfFontrw   ÚrefÚfontDictr   r   r   rô   Œ  s$   

zFont.addObjectsr¥   ©rÑ   )r   r   r   rÅ   Ú
_multiByteÚ_dynamicFontrc   rÕ   r×   rÎ   rè   rô   r   r   r   r   rÆ   O  s    

rÆ   é€   r    é   r3   c              
   C   sØ   t ||  ƒtkst || d  ƒ|kr(td|ttƒt|ƒ| ||  || d  f ƒ‚|tkr.d S | d } || d  d> || d  d> B || d  B d> ||  B }| d } | | t|ƒkrftd|| |t|ƒf ƒ‚| | | fS )Nr    úGBad pfb file'%s' expected chr(%d)chr(%d) at char %d, got chr(%d)chr(%d)r  r3   é   é   ú1Bad pfb file'%s' needed %d+%d bytes have only %d!)ÚchrÚ
PFB_MARKERr=   ÚordÚPFB_EOFr;   ©ÚpÚdÚmr~   r'   r   r   r   Ú	_pfbCheck´  s   $,8r  c                 C   sH   t || d  ƒd> t || d  ƒd> B t || d  ƒB d> t ||  ƒB S )z=compute a pfb style length from the first 4 bytes of string dr3   r  r  r    )r	  )r  r  r   r   r   Ú
_pfbSegLen¿  s   Hr  c                 C   sª   ||  t ks|| d  |kr(td|tt ƒt|ƒ| t||  ƒt|| d  ƒf ƒ‚|tkr.d S | d } t| |ƒ}| d } | | t|ƒkrOtd|| |t|ƒf ƒ‚| | | fS )Nr    r  r  r  r  )r  r=   r	  r
  r  r;   r  r   r   r   r  Ã  s   4
c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚEmbeddedType1FacezcA Type 1 font other than one of the basic 14.

    Its glyph data will be embedded in the PDF file.c                 C   sZ   t  | d ¡ t|tƒ}t|tƒ}tj |¡| _tj |¡| _d | _	|  
|¡ |  |¡ d S r¥   )rQ   rc   r	   r   ro   rp   Úabspathr@   rl   r]   Ú_loadGlyphsÚ_loadMetrics)rb   r@   rl   r   r   r   rc   Ó  s   


zEmbeddedType1Face.__init__c                 C   s   | j | jgS r¥   )r@   rl   ri   r   r   r   rj   à  s   zEmbeddedType1Face.getFontFilesc           	      C   s¾   t |ƒ}t|ƒsJ d| ƒ‚t|dƒ}td|t|ƒ\}}t||t|ƒ\}}t||t|ƒ\}}t||t|ƒ |||… |||…  |||…  | _t| jƒ| _	|| | _
|| | _|| | _dS )ziLoads in binary glyph data, and finds the four length
        measurements needed for the font descriptorzfile %s not foundr‘   r   N)rƒ   r   r   r  Ú	PFB_ASCIIÚ
PFB_BINARYr
  Ú_binaryDatar;   Ú_lengthÚ_length1Ú_length2Ú_length3)	rb   rl   r  Ús1Úl1Ús2Úl2Ús3Úl3r   r   r   r  ã  s   
&

zEmbeddedType1Face._loadGlyphsc                 C   sÔ  t |ƒ}t|ƒ\}}|d | _|d | _| dd¡| _| dd¡| _| dd¡| _| dd¡| _| d	d¡| _	| d
d¡| _
| dg d¢¡}| ¡ }g | _|D ]
}| j t|ƒ¡ qOi }|D ]	\}}	}
|	||
< q^|| _t| ¡ ƒ| _| j ¡  | dd¡dkrètdu r˜zddlm} |a~W n	   i atdƒ‚dgd }i }i }|D ]'\}}	}
d|  kr²dkrÊn q£|
||< t |
d¡}|durÊ|||< |||< q£d| j ¡  }tj |||¡ || _t||ƒ}t|ƒ dS dS )z Loads in and parses font metricsr„   Ú
FamilyNameÚAscenderéè  Ú	Descenderr   Ú	CapHeightÚItalicAngleÚstemVÚXHeightÚFontBBox)r   r   r$  r$  ÚEncodingSchemeNÚFontSpecific)Ú_glyphname2unicodezˆcannot import module reportlab.pdfbase._glyphlist module
you can obtain a version from here
https://www.reportlab.com/ftp/_glyphlist.py
rØ   rä   zrl-dynamic-%s-encoding)rƒ   rP   rL   rZ   ÚgetrX   rY   Ú	capHeightÚitalicAngler(  ÚxHeightr<   Úbboxr?   r>   rW   rf   rg   rV   ÚsortÚ_postScriptNames2UnicodeÚreportlab.pdfbase._glyphlistr-  r=   r+   r   Ú	RL_CodecsÚadd_dynamic_codecr]   r’   ÚregisterEncoding)rb   r@   rB   Ú	glyphDataÚstrBboxÚtokensÚtokrW   rJ   rK   rL   r-  ÚnamesÚexÚrexÚcodeÚurË   Úencr   r   r   r  õ  sb   



ÿ
€
ãzEmbeddedType1Face._loadMetricsc                 C   s¦   ddl m} | ¡ }| j|_| j|jd< | j|jd< | j|jd< | 	|d| j
 ¡}| d| j| j| jd| | j¡| | j¡| j| j| j|d	œ¡}| 	|d
| j ¡}|S )zFAdd whatever needed to PDF file, and return a FontDescriptor referencer   r²   ÚLength1ÚLength2ÚLength3z	fontFile:z/FontDescriptoré"   )rº   ÚAscentr&  ÚDescentÚFlagsr*  r„   r'  ÚStemVr)  ÚFontFilezfontDescriptor:)r»   r³   Ú	PDFStreamr  Úcontentr  Ú
dictionaryr  r  rö   rl   r¾   rX   r/  rY   r½   r2  r¼   rL   r0  r(  r1  )rb   rù   r³   ÚfontFileÚfontFileRefÚfontDescriptorÚfontDescriptorRefr   r   r   rô   2  s,   

õzEmbeddedType1Face.addObjectsN)	r   r   r   rÅ   rc   rj   r  r  rô   r   r   r   r   r  Ï  s    =r  c                 C   s<   t | tƒsJ d|  ƒ‚| t| j< | jtvrt| jƒ d S d S )NzNot a TypeFace: %s)r™   rQ   Ú
_typefacesrL   r^   ÚregisterFontFamily)rÉ   r   r   r   ÚregisterTypeFaceP  s
   

ýrU  c                 C   s`   t | tƒsJ d|  ƒ‚| jtv r%|  t| j ¡r|  ¡  d S td| j ƒ‚| t| j< |  ¡  d S )NzNot an Encoding: %sz>Encoding "%s" already registered with a different name vector!)r™   r’   rL   Ú
_encodingsr§   r¤   r   )rB  r   r   r   r8  X  s   

r8  c                 C   s€   ddl m} |s
| }|  ¡ } |s|p|p|}|s|}|s|}| | dd|¡ | | dd|¡ | | dd|¡ | | dd|¡ d S )Nr   )Úfontsr    )Úreportlab.librW  r+   Ú
addMapping)ÚfamilyÚnormalr[   r\   Ú
boldItalicrW  r   r   r   rT  e  s   rT  c                 C   s€   | j }| jr0| jj}|tvr/|tv r't| }|js"td|| |f ƒ‚|t|< n|  t|< t|< n| t|< | jr>t| j ƒ dS dS )zGRegisters a font, including setting up info for accelerated stringWidthz+Attempt to register fonts %r %r for face %rN)	rÇ   r   rÉ   rL   Ú_fontsÚ_dynFaceNamesr=   rÿ   rT  )ÚfontrÇ   rŠ   Úofontr   r   r   ÚregisterFontq  s   
€üra  c                 C   s¶   zt |  W S  tyZ   | tv r't| ƒ}tj|  \|_|_|_t	|ƒ | Y S t
| ƒ}|rYdD ]}tj |¡d | }t|ƒrA nq/t|ƒsLJ d| ƒ‚t||ƒ}t	|ƒ | Y S ‚ w )z-Lazily construct known typefaces if not found)rk   z.PFBr   zfile %s not found!)rS  rÙ   r^   rQ   r   ÚstandardFontAttributesrZ   r[   r\   rU  rs   ro   rp   rq   r   r  )rŠ   rÉ   rx   rw   ry   r   r   r   rÈ   ‰  s&   

ërÈ   c                 C   s<   zt |  W S  ty   | tv rt| ƒ}t|ƒ | Y S ‚ w )z-Lazily construct known encodings if not found)rV  rÙ   r”   r’   r8  )rË   rB  r   r   r   r˜   ¤  s   
ùr˜   c                 C   sZ   t | ƒ} t| ƒt u sJ dt| ƒ ƒ‚t| ƒ}|jr!t| | |jƒ}nt| | tƒ}t|ƒ |S )z-search for and register a font given its namez$fontName=%s is not required type str)rd   Útyper   rÈ   r]   rÆ   r   ra  )rÇ   rÉ   r_  r   r   r   ÚfindFontAndRegister±  s   rd  c                 C   s&   zt |  W S  ty   t| ƒ Y S w )zêLazily constructs known fonts if not found.

    Names of form 'face-encoding' will be built if
    face and encoding are known.  Also if the name is
    just one of the standard 14, it will make up a font
    in the default encoding.)r]  rÙ   rd  )rÇ   r   r   r   ÚgetFont¿  s
   
ÿre  rR   rT   c                 C   sV   t | ƒ}z|j}|j}W n   |jj}|jj}Y |r'|d }|| || fS ||fS )Ng     @�@)re  rX   rY   rÉ   )rÇ   ÚfontSizer_  rX   rY   Únormr   r   r   ÚgetAscentDescentÎ  s   

rh  c                 C   ó   t | |ƒd S )Nr   ©rh  ©rÇ   rf  r   r   r   Ú	getAscentÜ  ó   rl  c                 C   ri  r£   rj  rk  r   r   r   Ú
getDescentß  rm  rn  c                  C   s   t t ¡ ƒ} |  ¡  | S )zReturns what's in there)rf   r]  rg   r3  )Úregr   r   r   ÚgetRegisteredFontNamesâ  s   rp  rÑ   c                 C   s   t |ƒj| ||d�S )zjCompute width of string in points;
    not accelerated as fast enough because of instanceStringWidthT1/TTFrÒ   )re  rÕ   )rÓ   rÇ   rf  rÊ   r   r   r   rÕ   è  s   rÕ   c                  C   sº   t dƒ tt ¡ ƒ} |  ¡  | D ]}t d|ƒ qt ƒ  t dƒ tt ¡ ƒ}| ¡  |D ]}t d|ƒ q+t ƒ  t dƒ tt ¡ ƒ}| ¡  |D ]}t| }t d|j|jj	|j
j	f ƒ qFd S )NzRegistered Encodings:z   zRegistered Typefaces:zRegistered Fonts:z    %s (%s/%s))rÜ   rf   rV  rg   r3  rS  r]  rÇ   rÉ   rL   rÊ   )rg   rË   ÚfacesrŠ   ÚkÚkeyr_  r   r   r   ÚdumpFontDataí  s&   þrt  c           
      C   s°   dd l }tdd… D ]K}|  ¡ }t|ƒj}| D ]}d}|D ]
}||t|ƒ  }qq|  ¡ }td||  ƒ |  ¡ }| D ]
}t|ƒ |d¡}	q;|  ¡ }td||  ƒ tƒ  q
d S )Nr   r    zslow stringWidth took %0.4fé
   z'class lookup and stringWidth took %0.4f)Útimer^   re  rÝ   r	  rÜ   rÕ   )
Útextsrv  rÇ   Út0rÞ   rÓ   r  ÚchÚt1r!  r   r   r   Útest3widths  s$   
ÿër{  c                  C   sl   t dƒ ¡ } tdt| ƒ ƒ tdƒ t| gƒ tƒ  |  ¡ }tdt|ƒdt| ƒ t|ƒ f ƒ t|ƒ d S )Nz-../../rlextra/rml2pdf/doc/rml_user_guide.prepzrawdata length %dztest one huge string...z7test %d shorter strings (average length %0.2f chars)...g      ð?)ÚopenÚreadrÜ   r;   r{  r<   )ÚrawdataÚwordsr   r   r   ÚtestStringWidthAlgorithms  s   
$r€  c                  C   sF   t dƒ} t| ƒ t| jdd… ƒ t dƒ}t|jƒ t|ƒ tƒ  d S )NÚ	Helveticar   é   ÚWombat)rQ   rU  rÜ   rV   rt  )ÚhelvÚwombatr   r   r   Útest)  s   

r†  )rS  rV  r]  r^  c                 C   s<   |   ¡ D ]\}}tƒ | }| ¡  | |¡ qtj ¡  d S r¥   )ÚitemsÚglobalsÚclearÚupdater   r6  Úreset_dynamic_codecs)Úinitial_dictsrr  r�   r  r   r   r   Ú_reset5  s
   
r�  )Úregister_resetÚ__main__r¥   )NNNNrþ   )QÚ__version__rÅ   Ústringro   r†   r»   r   Úreportlab.lib.loggerr   Úreportlab.lib.utilsr   r   r   r   r   r	   r
   r   r   r   r{   r   r   Úreportlab.lib.rl_accelr   r   r   rá   r   rÏ   r6  Úregisterr^   r”   rS  rV  r]  r^  Ú	Exceptionr   r   rP   rQ   rƒ   rs   r’   rÌ   rÆ   r  r  r  r  r
  r  r  r4  r  rU  r8  rT  ra  rÈ   r˜   rd  re  rÐ   Úextendrh  rl  rn  rp  rÕ   rt  r{  r€  r†  rø   Úcopyr�  rŽ  r   r   r   r   r   Ú<module>   sŽ   0
F
B
w_
 




ü
ÿ

þ