Ë
    ¡ëiu  ã                   ón  — 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 ddlmZmZ ddlmZmZ dd	lmZ d
Zej4                  j7                  «        ej8                  Zej:                  Zi Zi Zi Z i Z! G d„ de"«      Z# G d„ de"«      Z$d„ Z% G d„ d«      Z&d6d„Z'd„ Z( G d„ d«      Z)g Z* G d„ d«      Z+ e,d«      Z- e,d«      Z. e,d«      Z/ e,d«      Z0d„ Z1da2 G d„ de&«      Z3d„ Z4d „ Z5d7d!„Z6d"„ Z7d#„ Z8d$„ Z9d%„ Z:d&„ Z; e;d'«      Z<e*j{                   e;d(«      e<g«       d6d)„Z>d6d*„Z?d6d+„Z@d,„ ZAd8d-„ZBd.„ ZCd/„ ZDd0„ ZEd1„ ZF eGej‘                  «       ej‘                  «       e j‘                  «       e!j‘                  «       ¬2«      fd3„ZIdd4lmJZJ  eJeI«       [JeKd5k(  r eF«         eE«        yy)9z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)ÚdefaultEncodingÚT1SearchPath)Ú
unicode2T1ÚinstanceStringWidthT1)Ú	rl_codecsó   nc                   ó   — e Zd Zy)Ú	FontErrorN©Ú__name__Ú
__module__Ú__qualname__© ó    ú\/var/www/html/chat/reports/venv/lib/python3.12/site-packages/reportlab/pdfbase/pdfmetrics.pyr   r   '   ó   „ Ør   r   c                   ó   — e Zd Zy)ÚFontNotFoundErrorNr   r   r   r   r   r   )   r   r   r   c           	      óJ  — t        | d«      }t        |«      dk  r2|r|d   j                  d«      }t        |«      dk  rt        d| z  «      ‚i }g }|D �cg c]  }|j	                  «       ‘Œ }}|D �cg c]$  }|j                  «       j                  d«      rŒ#|‘Œ& }}d}|D ]å  }|dd dk(  rd}Œ|dd	 d
k(  rd}Œ|sŒ|j                  d«      }|D �cg c]  }|j	                  «       ‘Œ }}|dd \  }	}
}|	j                  «       \  }}|dk(  s
J d|z  «       ‚t        |«      }|
j                  «       \  }}|dk(  s
J d|z  «       ‚	 t        |«      }|j                  «       \  }}|dk(  s
J d|z  «       ‚|}|j                  |||f«       Œç d}|D ]J  }|dd dk(  rd}|dd dk(  rd}Œ|sŒ|dd dk(  r	 	 |j                  dd«      \  }}	 t        |«      }|||<   ŒL ||fS c c}w c c}w c c}w # t        $ r t        |«      }Y Œ´w xY w#  t        d| ›d|›d�«      ‚xY w#  Y ŒOxY w)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 dataÚcommenté   ÚStartCharMetricsé   ÚEndCharMetricsú;é   ÚCzbad line in font file %sÚWXÚNÚStartFontMetricsé   ÚCommentú z Header information error in afm z: line='ú')
r	   ÚlenÚsplitÚ
ValueErrorÚstripÚlowerÚ
startswithÚintÚfloatÚappend)ÚafmFileNameÚlinesÚtopLevelÚ
glyphLevelÚlÚ	inMetricsÚlineÚchunksÚchunkÚcidChunkÚ
widthChunkÚ	nameChunkr    ÚcidÚwidthÚnameÚinHeaderÚleftÚrights                      r   ÚparseAFMFilerM   ,   s”  € ô ˜{¨CÓ0€EÜ
ˆ5ƒz�1‚}á˜% ™(Ÿ.™.¨Ó.�%Üˆu‹:�qŠ=ÜÐ>ÀÑLÓMÐMØ€HØ€Jà %Ö&˜1ˆQ�W‰W�YÐ&€EÐ&ØÖE�1 Q§W¡W£Y×%9Ñ%9¸)Õ%DŠQÐE€EÐEà€IØò 2ˆØ��"ˆ:Ð+Ò+Ø‰IØ�!�BˆZÐ+Ò+Ø‰IÚØ—Z‘Z “_ˆFØ17Ö8¨�e—k‘k•mÐ8ˆFÐ8Ø.4°Q°q¨kÑ+ˆH�j )ð —>‘>Ó#‰DˆAˆqØ˜’8Ð>Ð7¸$Ñ>Ó>�8Ü�a“&ˆCð ×#Ñ#Ó%‰DˆAˆqØ˜’9Ð?Ð8¸4Ñ?Ó?�9ð!Ü˜A›�ð
 —?‘?Ó$‰DˆAˆqØ˜’8Ð>Ð7¸$Ñ>Ó>�8ØˆDà×Ñ˜s E¨4Ð0Õ1ð92ð> €HØò #ˆØ��"ˆ:Ð+Ò+ØˆHØ��"ˆ:Ð+Ò+Ø‰HÚØ�A�aˆy˜IÒ% tðhØ"Ÿj™j¨¨QÓ/‘��eðÜ˜E›
�ð #ˆH�TŠNð#ð$ �jÐ!Ð!ùòm 'ùÚEùò 9øô ò !Ü˜a›’ð!ûð*hÝ ÒT_ÒaeÐ!fÓgÐgûðÙúsB   ÁGÁ2$G#ÂG#ÃG(ÅG-Æ2HÇHÇ-HÈHÈHÈH"c                   ó&   — e Zd Zd„ Zd„ Zd„ Zdd„Zy)ÚTypeFacec                 ó  — || _         g | _        i | _        d| _        d| _        d | _        d| _        d| _        |dk(  rd| _        n|dk(  rd| _        nd | _        |t        v rd| _
        | j                  |«       y d| _
        y )Nr   ÚZapfDingbatsÚZapfDingbatsEncodingÚSymbolÚSymbolEncodingr!   )rI   Ú
glyphNamesÚglyphWidthsÚascentÚdescentÚ
familyNameÚboldÚitalicÚrequiredEncodingÚstandardFontsÚbuiltInÚ_loadBuiltInData©ÚselfrI   s     r   Ú__init__zTypeFace.__init__v   s‰   € ØˆŒ	ØˆŒØˆÔØˆŒØˆŒð
 ˆŒØˆŒ	ØˆŒà�>Ò!Ø$:ˆDÕ!Ø�XÒØ$4ˆDÕ!à$(ˆDÔ!Ø”=Ñ ØˆDŒLØ×!Ñ! $Õ'àˆD�Lr   c                 óÚ   — t        |«      }t        j                  |   | _        t	        | j                  j                  «       «      | _        t        j                  |   \  | _        | _	        y)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   ÚwidthsByFontGlyphrV   ÚlistÚkeysrU   Úascent_descentrW   rX   r`   s     r   r_   zTypeFace._loadBuiltInData�   sT   € ô �4‹yˆÜ$×6Ñ6°tÑ<ˆÔÜ˜t×/Ñ/×4Ñ4Ó6Ó7ˆŒÜ#,×#;Ñ#;¸DÑ#AÑ ˆŒ�D•Lr   c                 ó   — g S )z=Info function, return list of the font files this depends on.r   ©ra   s    r   ÚgetFontFileszTypeFace.getFontFiles˜   s   € àˆ	r   c                 óv  — |j                  «       |j                  «       f}t        | d«      rHt        j                  j                  | j                  «      d   }|D ]  }t        ||z   «      sŒ||z   c S  	 t        j                  | j                  «      }€t        d|›d| j                  ›d�«       |S #  t        | j                  «      }|rf|j                  «       dk(  r=|D ]7  }t        j                  j                  |«      d   |z   }t        |«      r|}Œ6d }Œ9 n|j                  «       dk(  r|}nd }Y Œ£xY w)NÚpfbFileNamer   ú.pfbz.afmzCan't find z for face 'r1   )r6   ÚupperÚhasattrÚosÚpathÚsplitextrm   r   r   Ú
findT1FilerI   ÚbruteForceSearchForAFMr   )ra   ÚextÚpossible_extsÚ
r_basenameÚer    ÚafmÚpfbs           r   rt   zTypeFace.findT1Fileœ   s  € ØŸ™› c§i¡i£kÐ2ˆÜ�4˜Ô&ÜŸ™×)Ñ)¨$×*:Ñ*:Ó;¸AÑ>ˆJØ"ò *�Ü˜Z¨!™^Õ,Ø%¨™>Ò)ð*ð	Ü×$Ñ$ T§Y¡YÓ/ˆAð ˆ9Ý²c¸4¿9»9ÐEÔFØˆøð!	Ü(¨¯©Ó3ˆCÙØ—9‘9“; &Ò(Ø*ò %˜Ü Ÿg™g×.Ñ.¨sÓ3°AÑ6¸Ñ:˜Ü$ Sœ>Ø #™Aà $™Añ%ð —Y‘Y“[ FÒ*Ø‘Aà�üs   Á6B5 Â5BD8N)rn   )r   r   r   rb   r_   rk   rt   r   r   r   rO   rO   u   s   „ òò4Bòôr   rO   c                 óò   — |€ddl m} t        | «      r| S t        j                  j                  | «      }|D ]=  }t        |«      sŒt        j                  j                  ||«      }t        |«      sŒ;|c S  | S )Nr   ©r   )Úreportlab.rl_configr   r   rq   rr   Úbasenamer   Újoin)ÚfnÚ
searchPathÚbfnÚdirnameÚtfns        r   ÚbruteForceSearchForFiler†   ·   si   € ØÐÕUÜ�„}˜R�iÜ
�'‰'×
Ñ
˜2Ó
€CØò &ˆÜ˜Ô  (Ü�g‰g�l‰l˜7 3Ó'ˆÜ�S�> #š:ð&ð €Ir   c           	      ób  — ddl m} |D ]Q  }t        |«      sŒt        |t        j
                  z   dz   «      }|D ]  }	 t        |«      \  }}|d   | k(  r|c c S Œ! ŒS y#  t        j                  «       \  }}}	dj                  t        t        |j                  «      «      d| z  z   f|_        ‚ xY w)zcLooks in all AFM files on path for face with given name.

    Returns AFM file name or None.  Ouch!r   r}   z*.[aA][fF][mM]ÚFontNamer0   z, while looking for faceName=%rN)r~   r   r   r   rq   ÚseprM   ÚsysÚexc_infor€   Úmaprd   Úargs)
ÚfaceNamer   r„   Ú	possiblesÚpossibleÚtopDictÚ	glyphDictÚtÚvÚbs
             r   ru   ru   Á   s·   € õ 1àò ˆÜ˜Ô  (Ü˜G¤b§f¡fÑ,Ð/?Ñ?Ó@ˆ	Ø!ò 	ˆHðÜ%1°(Ó%;Ñ"�˜Ø˜:Ñ&¨(Ò2Ø#”Oð 3ñ	ñøðÜ—l‘l“n‘��!�AØŸ(™(¤3¤s¨1¯6©6£?Ó3Ð4UÐX`Ñ4`Ñ`Ðb�”Øús   ½AÁAB.c                   óB   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zy)ÚEncodingz1Object to help you create and refer to encodings.Nc                 ó  — || _         d| _        |t        v r)|�J d«       ‚|| _        t        j
                  |   | _        y |d k(  r(t        | _        t        j
                  t           | _        y t        |«      r1t        |«      }|j                   | _        |j                  d d  | _        y t        |«      rt        | _        |d d  | _        y t        |t        «      r&|j                   | _        |j                  d d  | _        y y )Nr   z2Can't have a base encoding for a standard encoding)rI   ÚfrozenÚstandardEncodingsÚbaseEncodingNamer   Ú	encodingsÚvectorr   r   ÚgetEncodingr   Ú
isinstancer—   )ra   rI   ÚbaseÚbaseEncs       r   rb   zEncoding.__init__Û   sÕ   € ØˆŒ	ØˆŒØÔ$Ñ$Ø�<ÐUÐ!UÓU�<Ø$(ˆDÔ!Ü#×-Ñ-¨dÑ3ˆD�KØ�TŠ\ä$3ˆDÔ!Ü#×-Ñ-¬oÑ>ˆD�KÜ�4Œ[Ü! $Ó'ˆGØ$+§L¡LˆDÔ!Ø!Ÿ.™.©Ð+ˆD�KÜ�4Œ[Ü$3ˆDÔ!Ø™q˜'ˆD�KÜ˜œhÔ'à$(§I¡IˆDÔ!ØŸ+™+¡a˜.ˆD�Kð (r   c                 ó    — | j                   |   S )z.Return glyph name for that code point, or None)r�   )ra   Úindexs     r   Ú__getitem__zEncoding.__getitem__ò   s   € ð �{‰{˜5Ñ!Ð!r   c                 óª   — | j                   dk(  sJ d«       ‚| j                  |   |k7  r+t        | j                  «      }|||<   t        |«      | _        y y )Nr   úCannot modify a frozen encoding)r™   r�   rf   Útuple)ra   r£   ÚvalueÚLs       r   Ú__setitem__zEncoding.__setitem__÷   sR   € à�{‰{˜aÒÐBÐ!BÓBÐØ�;‰;�uÑ˜uÒ$Ü�T—[‘[Ó!ˆAØˆAˆe‰HÜ ›(ˆD�Kð %r   c                 óF   — t        | j                  «      | _        d| _        y ©Nr!   )r§   r�   r™   rj   s    r   ÚfreezezEncoding.freezeÿ   s   € Ü˜DŸK™KÓ(ˆŒØˆ�r   c                 óŽ   — | j                   |j                   k(  xr+ t        | j                  «      t        |j                  «      k(  S ©N)rI   r§   r�   )ra   Úothers     r   ÚisEqualzEncoding.isEqual  s1   € Ø�y‰y˜%Ÿ*™*Ñ$ÒP¬¨t¯{©{Ó);¼UÀ5Ç<Á<Ó=PÑ)PÐPr   c                 ój   — | j                   dk(  sJ d«       ‚|}|D ]  }|| j                  |<   |dz   }Œ y)zASet a group of character names starting at the code point 'base'.r   r¦   r!   N)r™   r�   )ra   r    ÚnewNamesÚidxrI   s        r   ÚmodifyRangezEncoding.modifyRange  sE   € à�{‰{˜aÒÐBÐ!BÓBÐØˆØò 	ˆDØ#ˆD�K‰K˜ÑØ˜‘'‰Cñ	r   c                 ó   — g }d}t        t        | j                  «      «      D ]U  }| j                  |   }||j                  |   k(  r|sŒ'|j                  |«       g }Œ;|r|j                  |«       ŒO|sŒR||g}ŒW |r|j                  |«       |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)Úranger2   r�   r:   )ra   ÚotherEncÚrangesÚcurRangeÚiÚglyphs         r   ÚgetDifferenceszEncoding.getDifferences  sŽ   € ð ˆØˆÜ”s˜4Ÿ;™;Ó'Ó(ò 
	*ˆAØ—K‘K ‘NˆEØ�h—o‘o aÑ(Ò(ÚØ—M‘M (Ô+Ø!‘HáØ—O‘O EÕ*ÚØ ! 5˜z‘Hð
	*ñ Ø�M‰M˜(Ô#Øˆr   c                 ó°  — ddl m} i }| j                  }t        |«      }| j	                  |«      }|g k(  r|j                  |«      S g }|D ]7  }|j                  |d   «       |dd D ]  }|€Œ|j                  d|z   «       Œ Œ9 |j                  |«      |d<   |dv r|j                  |«      |d<   |j                  d	«      |d
<   |j                  |«      }	|	S )z&Returns a PDF Object representing selfr   ©Úpdfdocr!   Nú/ÚDifferences)ÚMacRomanEncodingÚMacExpertEncodingÚWinAnsiEncodingÚBaseEncodingr—   ÚType)	Úreportlab.pdfbaserÀ   r›   rž   r½   ÚPDFNamer:   ÚPDFArrayÚPDFDictionary)
ra   rÀ   ÚDr›   r¡   ÚdifferencesÚ	diffArrayr·   Ú	glyphNameÚPDs
             r   ÚmakePDFObjectzEncoding.makePDFObject,  sû   € õ 	-àˆØ×0Ñ0ÐÜÐ.Ó/ˆØ×)Ñ)¨'Ó2ˆð ˜"ÒØ—>‘>Ð"2Ó3Ð3ð ˆIØ$ò :�Ø× Ñ   q¡Ô*Ø!& q r ò :�IØ Ñ,à!×(Ñ(¨¨y©Õ9ñ:ð:ð  &Ÿ™¨yÓ9ˆAˆmÑØÐ#]Ñ]à$*§N¡NÐ3CÓ$D��.Ñ!ØŸ™ zÓ2ˆAˆf‰IØ×%Ñ% aÓ(ˆBØˆIr   r¯   )r   r   r   Ú__doc__rb   r¤   rª   r­   r±   rµ   r½   rÑ   r   r   r   r—   r—   Ù   s.   „ Ù;ó)ò."ò
#òòQòòó<r   r—   c                   óD   — e Zd ZdZdZdZdZdd„Zdd„Zd„ Z	d„ Z
d	„ Zd
„ Zy)Ú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   FNc                 ó  — || _         t        |«      x}| _        t        |«      | _        || _        |j                  r|j                  €t        n|xs g | _	        | j                  «        t        | _        |dk(  xr | xs t        | _        y )NrQ   )ÚfontNameÚgetTypeFaceÚfacerž   ÚencodingÚencNamer^   r\   ÚstandardT1SubstitutionFontsÚsubstitutionFontsÚ_calcWidthsÚ_notdefCharÚ_notdefFont)ra   rI   rŽ   rÚ   rÜ   rØ   s         r   rb   zFont.__init__^  s�   € ØˆŒÜ& xÓ0Ð0ˆˆtŒyÜ" 7Ó+ˆŒØˆŒà'+§|¢|¸×8MÑ8MÐ8Uõ #>à):Ò)@¸bð 	Ôð 	×ÑÔÜ&ˆÔØ Ñ/Ò8°DÒG¼KˆÕr   c                 ó    — t        | |||¬«      S )N©rÙ   )r   )ra   ÚtextÚsizerÙ   s       r   ÚstringWidthzFont.stringWidthj  s   € Ü$ T¨4°ÀÔIÐIr   c                 ód   — d| j                   j                  ›d| j                  j                  ›d�S )Nú<r0   ú>)Ú	__class__r   rØ   rI   rj   s    r   Ú__repr__zFont.__repr__m  s   � Ø ŸN™N×3Ó3°T·Y±Y·^³^ÐDÐDr   c           	      ó^  — dgdz  }| j                   j                  }| j                  j                  }t	        d«      D ]  }||   }|€Œ	 ||   }|||<   Œ || _        y# t
        $ rE ddl}|j                  j                  r't        d| j                   j                  ›d|›d�«       n	 Y Œmw xY w)z)Vector of widths for stringWidth functionr   é   Nz
typeface "z" does not have a glyph "z", bad font!)rØ   rV   rÙ   r�   r·   ÚKeyErrorr~   Ú	rl_configÚwarnOnMissingFontGlyphsÚprintrI   Úwidths)ra   ÚwÚgwÚvecr»   rÏ   rH   Ú	reportlabs           r   rÝ   zFont._calcWidthsp  s±   € ð ˆC�#‰IˆØ�Y‰Y×"Ñ"ˆØ�m‰m×"Ñ"ˆÜ�s“ò 	ˆAØ˜A™ˆIØÑ$ðØ˜y™M�EØ �A�a’Dð	ð ˆ�øô  ò Û.Ø ×*Ñ*×BÒBÝÐW[×W`ÑW`×WeÓWeÒgpÐqÕràùðús   Á

AÁAB,Â+B,c                 óª   — d}t        d«      D ]B  }|dz   t        t        | j                  |   «      d«      z   }|dk(  r|dz   }|dz  dk(  sŒ>|d	z   }ŒD |S )
z<returns a pretty block in PDF Array format to aid inspectionó   [rë   ó    Úutf8éÿ   s    ]r$   é   ó   
)r·   Úbytesrd   rð   )ra   râ   r»   s      r   Ú_formatWidthszFont._formatWidths„  sg   € àˆÜ�s“ò 	$ˆAØ˜$‘;¤¤s¨4¯;©;°q©>Ó':¸6Ó!BÑBˆDØ�CŠxØ˜e‘|�Ø�2‰v˜‹|Ø˜e‘|‘ð	$ð ˆr   c                 ó°  — ddl m} dt        t        |j                  «      dz   «      z   }|j                  «       }||_        | j                  j                  |_	        d| j                  z  |_        | j                  j                  «       }t        |«      r|dv r||_        | j                  j                  t         vrNd|_        d|_        |j'                  | j(                  «      |_        | j                  j-                  |«      |_        |j1                  ||«      }|j2                  d   j4                  }|||<   d	|z   |j                  | j                  <   y
)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À   Úreprr2   ÚfontMappingÚPDFType1FontÚNamerØ   rI   ÚBaseFontrÖ   Ú__Comment__rÙ   rÑ   r   r—   r]   Ú	FirstCharÚLastCharrÊ   rð   ÚWidthsÚ
addObjectsÚFontDescriptorÚ	ReferenceÚ
idToObjectÚdict)ra   ÚdocrÀ   ÚinternalNameÚpdfFontry   ÚrefÚfontDicts           r   r
  zFont.addObjects�  s  € õ
 	-ð œT¤# c§o¡oÓ"6°qÑ"8Ó9Ñ9ˆØ×%Ñ%Ó'ˆØ#ˆŒØŸ9™9Ÿ>™>ˆÔØ'¨$¯-©-Ñ7ˆÔØ�M‰M×'Ñ'Ó)ˆÜ�QŒx˜1Ð ]Ñ]à ˆGÔð �y‰y�~‰~¤Ñ.Ø !ˆGÔØ"ˆGÔØ#Ÿ_™_¨T¯[©[Ó9ˆGŒNØ%)§Y¡Y×%9Ñ%9¸#Ó%>ˆGÔ"à�m‰m˜G \Ó2ˆð —>‘> ,Ñ/×4Ñ4ˆØ!(ˆ�Ñð *-¨|Ñ);ˆ�‰˜Ÿ™Ò&r   r¯   ©rø   )r   r   r   rÒ   Ú
_multiByteÚ_dynamicFontÚshapablerb   rä   ré   rÝ   rý   r
  r   r   r   rÔ   rÔ   Q  s9   „ ñð €JØ€LØ€Hó
HóJòEòò(	ó <r   rÔ   é€   r!   é   r)   c                 óš  — t        ||    «      t        k7  st        || dz      «      |k7  r3t        d|t        t        «      t        |«      | ||    || dz      fz  «      ‚|t        k(  ry | dz   } || dz      dz  || dz      dz  z  || dz      z  dz  ||    z  }| dz   } | |z   t        |«      kD  rt        d|| |t        |«      fz  «      ‚| | |z   fS )Nr!   zGBad pfb file'%s' expected chr(%d)chr(%d) at char %d, got chr(%d)chr(%d)r  r)   é   é   z1Bad pfb file'%s' needed %d+%d bytes have only %d!)ÚchrÚ
PFB_MARKERr4   ÚordÚPFB_EOFr2   )ÚpÚdÚmr�   r?   s        r   Ú	_pfbCheckr$  ¶  s7  € Ü
ˆ1ˆQ‰4ƒy”*Ò¤ A a¨¡c¡F£¨Q¢ÜÐdÐhjÔknÔoyÓkzÔ{~ð  @Aó  |Bð  CDð  EFð  GHñ  EIð  JKð  LMð  NOñ  LOñ  JPð  hQñ  Qó  Rð  	RØŒ'‚z�6Ø	ˆA‰€AØˆq�‰s‰V�a‰K˜!˜A˜a™C™& 1™Ñ$ q¨¨1©¡vÑ
.°Ñ	2°Q°q±TÑ:€AØ	ˆA‰€AØˆ�sŒ3ˆq‹6‚zÜÐNÐRTÐUVÐWXÔY\Ð]^ÓY_ÐQ`Ñ`ÓaÐaØˆa�‰cˆ6€Mr   c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚEmbeddedType1FacezcA Type 1 font other than one of the basic 14.

    Its glyph data will be embedded in the PDF file.c                 óR  — t         j                  | d «       t        |t        «      }t        |t        «      }t        j
                  j                  |«      | _        t        j
                  j                  |«      | _        d | _	        | j                  |«       | j                  |«       y r¯   )rO   rb   r
   r   rq   rr   Úabspathr;   rm   r\   Ú_loadGlyphsÚ_loadMetrics)ra   r;   rm   s      r   rb   zEmbeddedType1Face.__init__Æ  sz   € ä×Ñ˜$ Ô%ô " +¬lÓ;ˆÜ! +¬lÓ;ˆÜŸ7™7Ÿ?™?¨;Ó7ˆÔÜŸ7™7Ÿ?™?¨;Ó7ˆÔØ $ˆÔØ×Ñ˜Ô%Ø×Ñ˜+Õ&r   c                 ó2   — | j                   | j                  gS r¯   )r;   rm   rj   s    r   rk   zEmbeddedType1Face.getFontFilesÓ  s   € Ø× Ñ  $×"2Ñ"2Ð3Ð3r   c                 óš  — t        |«      }t        |«      s
J d|z  «       ‚t        |d«      }t        d|t        |«      \  }}t        ||t
        |«      \  }}t        ||t        |«      \  }}t        ||t        |«       ||| ||| z   ||| z   | _        t        | j                  «      | _	        ||z
  | _
        ||z
  | _        ||z
  | _        y)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   Ú_binaryDatar2   Ú_lengthÚ_length1Ú_length2Ú_length3)	ra   rm   r"  Ús1Úl1Ús2Úl2Ús3Úl3s	            r   r)  zEmbeddedType1Face._loadGlyphsÖ  sÔ   € ô .¨kÓ:ˆÜ˜Ô%ÐHÐ':¸[Ñ'HÓHÐ%Ü˜+ sÓ+ˆÜ˜1˜Qœy¨Ó5‰ˆˆBÜ˜2˜a¤
¨;Ó7‰ˆˆBÜ˜2˜a¤	¨+Ó6‰ˆˆBÜ�"�Q”w˜{Ô+Ø˜R ˜8 A b¨ HÑ,¨Q¨r°"¨XÑ5ˆÔä˜4×+Ñ+Ó,ˆŒØ˜2™ˆŒØ˜2™ˆŒØ˜2™ˆ�r   c                 óŠ  — t        |«      }t        |«      \  }}|d   | _        |d   | _        |j	                  dd«      | _        |j	                  dd«      | _        |j	                  dd«      | _        |j	                  dd«      | _        |j	                  d	d«      | _	        |j	                  d
d«      | _
        |j	                  dg d¢«      }|j                  «       }g | _        |D ]&  }| j                  j                  t        |«      «       Œ( i }|D ]  \  }}	}
|	||
<   Œ || _        t!        |j#                  «       «      | _        | j$                  j'                  «        |j	                  dd«      dk(  r¾t(        €
	 ddlm} |a~dgdz  }i }i }|D ]=  \  }}	}
d|cxk  rdk  sŒn Œ|
||<   t(        j	                  |
d«      }|€Œ4|||<   |||<   Œ? t1        j2                  d| j                  z  «      }t4        j6                  j9                  |||«       || _        t=        ||«      }t?        |«       yy#  i at/        d«      ‚xY w)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†   rM   rI   rY   ÚgetrW   rX   Ú	capHeightÚitalicAnglerA  ÚxHeightr3   Úbboxr:   r8   rV   rf   rg   rU   ÚsortÚ_postScriptNames2UnicodeÚreportlab.pdfbase._glyphlistrF  r4   rœ   Únormalize_encodingr   Ú	RL_CodecsÚadd_dynamic_codecr\   r—   ÚregisterEncoding)ra   r;   r=   Ú	glyphDataÚstrBboxÚtokensÚtokrV   rG   rH   rI   rF  ÚnamesÚexÚrexÚcodeÚurÚ   Úencs                      r   r*  zEmbeddedType1Face._loadMetricsè  sJ  € ô .¨kÓ:ˆÜ ,¨[Ó 9Ñˆ�9à˜ZÑ(ˆŒ	Ø" <Ñ0ˆŒØ—l‘l :¨tÓ4ˆŒØ—|‘| K°Ó3ˆŒØ!Ÿ™ k°4Ó8ˆŒØ#Ÿ<™<¨°qÓ9ˆÔØ—\‘\ '¨1Ó-ˆŒ
Ø—|‘| I¨tÓ4ˆŒà—,‘,˜zª?Ó;ˆØ—‘“ˆØˆŒ	Øò 	'ˆCØ�I‰I×ÑœS ›XÕ&ð	'ð ˆØ"+ò 	&ÑˆS�%˜Ø %ˆK˜Òð	&à&ˆÔÜ˜{×/Ñ/Ó1Ó2ˆŒØ�‰×ÑÔð �<‰<Ð(¨$Ó/°>ÒAä'Ð/ð
ÝOØ/AÐ,Ø*ð �F˜S‘LˆEØˆBØˆCØ'0ò %Ñ#��u˜dØ�d”<˜C–<Ø"&�E˜$‘KÜ0×4Ñ4°T¸$Ó?�AØ‘}Ø$%˜˜D™	Ø $˜˜1šð%ô  ×2Ñ2Ð3KÈdÏiÉiÑ3WÓXˆGÜ×Ñ×1Ñ1°'¸"¸SÔAØ$+ˆDÔ!Ü˜7 EÓ*ˆCÜ˜SÕ!ð; BøðØ/1Ð,Ü$ðLóð ús   Å;	H3 È3Ic                 ó|  — ddl m} |j                  «       }| j                  |_        | j
                  |j                  d<   | j                  |j                  d<   | j                  |j                  d<   |j                  |d| j                  z   «      }|j                  d| j                  | j                  | j                  d|j                  | j                   «      |j#                  | j$                  «      | j&                  | j(                  | j*                  |d	œ«      }|j                  |d
| j$                  z   «      }|S )zFAdd whatever needed to PDF file, and return a FontDescriptor referencer   r¿   ÚLength1ÚLength2ÚLength3z	fontFile:z/FontDescriptoré"   )rÇ   ÚAscentr?  ÚDescentÚFlagsrC  rˆ   r@  ÚStemVrB  ÚFontFilezfontDescriptor:)rÈ   rÀ   Ú	PDFStreamr/  Úcontentr1  Ú
dictionaryr2  r3  r  rm   rË   rW   rH  rX   rÊ   rK  rÉ   rI   rI  rA  rJ  )ra   r  rÀ   ÚfontFileÚfontFileRefÚfontDescriptorÚfontDescriptorRefs          r   r
  zEmbeddedType1Face.addObjects%  s  € å,à×#Ñ#Ó%ˆØ×+Ñ+ˆÔà)-¯©ˆ×Ñ˜IÑ&Ø)-¯©ˆ×Ñ˜IÑ&Ø)-¯©ˆ×Ñ˜IÑ&ð —m‘m H¨k¸D×<LÑ<LÑ.LÓMˆà×-Ñ-Ø%Ø—[‘[ØŸ™Ø—l‘lØØ—‘ t§y¡yÓ1Ø—~‘~ d§i¡iÓ0Ø×*Ñ*Ø—J‘JØ—l‘lØ#ñ/ó ˆð  ŸM™M¨.Ð:KÈdÏiÉiÑ:WÓXÐØ Ð r   N)	r   r   r   rÒ   rb   rk   r)  r*  r
  r   r   r   r&  r&  Â  s!   „ ñ8ò'ò4òò$;"óz!r   r&  c                 ó®   — t        | t        «      s
J d| z  «       ‚| t        | j                  <   | j                  t        vrt        | j                  «       y y )NzNot a TypeFace: %s)rŸ   rO   Ú
_typefacesrI   r]   ÚregisterFontFamily)rØ   s    r   ÚregisterTypeFacerq  C  sJ   € Ü�dœHÔ%ÐBÐ';¸dÑ'BÓBÐ%Ø „Jˆt�y‰yÑØ�9‰9œÑ%ô 	˜4Ÿ9™9Õ%ð &r   c                 ó8  — t        | t        «      s
J d| z  «       ‚| j                  t        v rK| j	                  t        | j                     «      r| j                  «        y t        d| j                  z  «      ‚| t        | j                  <   | j                  «        y )NzNot an Encoding: %sz>Encoding "%s" already registered with a different name vector!)rŸ   r—   rI   Ú
_encodingsr±   r­   r   )r\  s    r   rR  rR  K  sv   € Ü�cœ8Ô$ÐAÐ&;¸cÑ&AÓAÐ$Ø
‡x�x”:Ñà�;‰;”z #§(¡(Ñ+Ô,Ø�J‰J�LäÐ\Ð_b×_gÑ_gÑgÓhÐhà"Œ
�3—8‘8ÑØ�
‰
�r   c                 ó   — ddl m} |s| }| j                  «       } |s
|xs |xs |}|s|}|s|}|j                  | dd|«       |j                  | dd|«       |j                  | dd|«       |j                  | dd|«       y )Nr   )Úfontsr!   )Úreportlab.libru  r6   Ú
addMapping)ÚfamilyÚnormalrZ   r[   Ú
boldItalicru  s         r   rp  rp  X  s†   € Ý#Ù˜F�6Ø�\‰\‹^€FÙ FÒ$<¨dÒ$<°f�zÙ˜�Ù˜F�6Ø	×Ñ�V˜Q  6Ô*Ø	×Ñ�V˜Q  4Ô(Ø	×Ñ�V˜Q  6Ô*Ø	×Ñ�V˜Q  :Õ.r   c                 ób  — | j                   }| j                  rl| j                  j                  }|t        vrW|t
        v r3t
        |   }|j                  st        d|›d| ›d|›�«      ‚|t        |<   n| xt
        |<   t        |<   n	| t        |<   | j                  rt        | j                   «       yy)zGRegisters a font, including setting up info for accelerated stringWidthzAttempt to register fonts r0   z
 for face N)	rÖ   r  rØ   rI   Ú_fontsÚ_dynFaceNamesr4   r  rp  )ÚfontrÖ   rŽ   Úofonts       r   ÚregisterFontr€  d  s�   € ð �}‰}€HØ×ÒØ—9‘9—>‘>ˆØœ6Ñ!Øœ=Ñ(Ü% hÑ/�Ø×)Ò)Ý$ÒV[Ò]aÑckÐ%lÓmÐmà',”F˜8Ò$à=AÐA”˜hÑ'¬&°Ò*:àŒˆxÑà‡‚ô 	˜4Ÿ=™=Õ)ð	 r   c                 ó®  — 	 t         |    S # t        $ rÀ | t        v r@t        | «      }t        j
                  |    \  |_        |_        |_        t        |«       |cY S t        | «      }|ridD ]4  }t        j                  j                  |«      d   |z   }t        |«      sŒ4 n t        «      s
J d|z  «       ‚t        ||«      }t        |«       |cY S ‚ w xY w)z-Lazily construct known typefaces if not found)rn   z.PFBr   zfile %s not found!)ro  rì   r]   rO   r   ÚstandardFontAttributesrY   rZ   r[   rq  ru   rq   rr   rs   r   r&  )rŽ   rØ   rz   ry   r{   s        r   r×   r×   |  sÚ   € ðÜ˜(Ñ#Ð#øÜò à”}Ñ$Ü˜HÓ%ˆDÜ8A×8XÑ8XÐYaÑ8bÑ5ˆTŒ_˜dœi¨¬Ü˜TÔ"ð ŠKô )¨Ó2ˆCÙØ)ò -�AÜŸ'™'×*Ñ*¨3Ó/°Ñ2°QÑ6�CÜ  •~¡uð-ô ! ”~ÐAÐ';¸cÑ'AÓA�~Ü(¨¨cÓ2�Ü  Ô&Ø’àð+ús   ‚ ‹ACÁACÂ1CÃCc                 óv   — 	 t         |    S # t        $ r$ | t        v rt        | «      }t	        |«       |cY S ‚ w xY w)z-Lazily construct known encodings if not found)rs  rì   rš   r—   rR  )rÚ   r\  s     r   rž   rž   —  sD   € ð	Ü˜'Ñ"Ð"øÜò ØÔ'Ñ'Ü˜7Ó#ˆCÜ˜SÔ!àŠJàðús   ‚ ‹)8¶8c                 óú   — t        | «      } t        | «      t         u sJ dt        | «      z  «       ‚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   ÚtypeÚasciir×   r\   rÔ   r   r€  )rÖ   rØ   r~  s      r   ÚfindFontAndRegisterr‡  ¤  sq   € ä�8‹}€HÜ�‹>œSÑ ÐZÐ"HÌ5ÐQYË?Ñ"ZÓZÐ ô �xÓ €DØ×ÒÜ�H˜h¨×(=Ñ(=Ó>‰ä�H˜h¬Ó8ˆÜ�ÔØ€Kr   c                 óJ   — 	 t         |    S # t        $ r t        | «      cY S w xY 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ì   r‡  )rÖ   s    r   ÚgetFontr‰  ²  s,   € ð-Ü�hÑÐøÜò -Ü" 8Ó,Ò,ð-ús   ‚ ‹"¡"rQ   rS   c                 óÚ   — t        | «      }	 |j                  }|j                  }|r|dz  }||z  ||z  fS ||fS #  |j                  j                  }|j                  j                  }Y ŒExY w)Ng     @�@)r‰  rW   rX   rØ   )rÖ   ÚfontSizer~  rW   rX   Únorms         r   ÚgetAscentDescentr�  Á  ss   € Ü�8Ó€Dð$Ø—‘ˆØ—,‘,ˆñ Ø˜‰~ˆØ�d‰{˜G D™LÐ(Ð(à�wˆÐøð$Ø—‘×!Ñ!ˆØ—)‘)×#Ñ#Šús	   �: º.A*c                 ó    — t        | |«      d   S )Nr   ©r�  ©rÖ   r‹  s     r   Ú	getAscentr‘  Ï  ó   € Ü˜H XÓ.¨qÑ1Ð1r   c                 ó    — t        | |«      d   S r¬   r�  r�  s     r   Ú
getDescentr”  Ò  r’  r   c                  ó`   — t        t        j                  «       «      } | j                  «        | S )zReturns what's in there)rf   r|  rg   rL  )Úregs    r   ÚgetRegisteredFontNamesr—  Õ  s    € ä
Œv�{‰{‹}Ó
€CØ‡H�H„JØ€Jr   c                 ó<   — t        |«      j                  | ||¬«      S )zjCompute width of string in points;
    not accelerated as fast enough because of instanceStringWidthT1/TTFrá   )r‰  rä   )râ   rÖ   r‹  rÙ   s       r   rä   rä   Û  s!   € ô �8Ó×(Ñ(¨¨xÀ(Ð(ÓKÐKr   c            
      óv  — t        d«       t        t        j                  «       «      } | j	                  «        | D ]  }t        d|«       Œ t        «        t        d«       t        t
        j                  «       «      }|j	                  «        |D ]  }t        d|«       Œ t        «        t        d«       t        t        j                  «       «      }|j	                  «        |D ]R  }t        |   }t        d|j                  ›d|j                  j                  ›d|j                  j                  ›d�«       ŒT y )	NzRegistered Encodings:z   zRegistered Typefaces:zRegistered Fonts:z    z (rÁ   ú))rï   rf   rs  rg   rL  ro  r|  rÖ   rØ   rI   rÙ   )rg   rÚ   ÚfacesrŽ   ÚkÚkeyr~  s          r   ÚdumpFontDatarž  à  sé   € Ü	Ð
!Ô"Ü”
—‘Ó!Ó"€DØ‡I�I„KØò ˆÜˆe�GÕðô 
„GÜ	Ð
!Ô"Ü”—‘Ó"Ó#€EØ	‡J�J„LØò ˆÜˆe�HÕðô 
„GÜ	Ð
ÔÜŒV�[‰[‹]Ó€AØ‡F�F„HØò VˆÜ�c‰{ˆÝ $§-£-°·±·³ÀÇÁ×ASÓASÐTÕUñVr   c                 ó°  — dd l }t        dd D ]Æ  }|j                  «       }t        |«      j                  }| D ]  }d}|D ]  }||t	        |«         z   }Œ Œ |j                  «       }t        d||z
  z  «       |j                  «       }| D ]  }t        |«      j                  |d«      }	Œ |j                  «       }t        d||z
  z  «       t        «        ŒÈ y )Nr   r!   zslow stringWidth took %0.4fé
   z'class lookup and stringWidth took %0.4f)Útimer]   r‰  rð   r  rï   rä   )
Útextsr¡  rÖ   Út0rñ   râ   r7  ÚchÚt1r9  s
             r   Útest3widthsr¦  ÷  sÞ   € ãÜ! ! AÐ&ò ˆð �Y‰Y‹[ˆÜ�HÓ×$Ñ$ˆØò 	%ˆDØˆBØò %�Ø˜!œC ›G™*‘_‘ñ%ð	%ð �Y‰Y‹[ˆÜÐ+¨r°B©wÑ7Ô8à�Y‰Y‹[ˆØò 	9ˆDÜ˜Ó"×.Ñ.¨t°RÓ8‰Bð	9à�Y‰Y‹[ˆÜÐ7¸2À¹7ÑCÔDÜ�ñ+r   c                  ó>  — t        d«      j                  «       } t        dt        | «      z  «       t        d«       t	        | g«       t        «        | j                  «       }t        dt        |«      dt        | «      z  t        |«      z  fz  «       t	        |«       y )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ï   r2   r¦  r3   )ÚrawdataÚwordss     r   ÚtestStringWidthAlgorithmsr¬    sƒ   € ÜÐBÓC×HÑHÓJ€GÜ	Ð
¤ G£Ñ
,Ô-Ü	Ð
#Ô$Ü��	ÔÜ	„GØ�M‰M‹O€EÜ	Ð
CÄsÈ5ÃzÐSVÔWZÐ[bÓWcÑScÔdgÐhmÓdnÑSnÐFoÑ
oÔpÜ�Õr   c                  óÊ   — t        d«      } t        | «       t        | j                  dd «       t        d«      }t        |j                  «       t        |«       t	        «        y )NÚ	Helveticar   é   ÚWombat)rO   rq  rï   rU   rž  )ÚhelvÚwombats     r   Útestr³    sL   € Ü�KÓ €DÜ�TÔÜ	ˆ$�/‰/˜!˜BÐ
Ô ä�hÓ€FÜ	ˆ&×
Ñ
ÔÜ�VÔä…Nr   )ro  rs  r|  r}  c                 óÌ   — | j                  «       D ]3  \  }}t        «       |   }|j                  «        |j                  |«       Œ5 t        j
                  j                  «        y r¯   )ÚitemsÚglobalsÚclearÚupdater   rP  Úreset_dynamic_codecs)Úinitial_dictsrœ  r”   r"  s       r   Ú_resetr»  (  sS   € ð ×"Ñ"Ó$ò ‰ˆˆ!Ü
‹)�A‰,ˆØ	�‰Œ	Ø	�‰��ðô ×Ñ×,Ñ,Õ.r   )Úregister_resetÚ__main__r¯   )NNNNr  )LÚ__version__rÒ   rq   rŠ   rœ   rÈ   r   Úreportlab.lib.loggerr   Úreportlab.lib.utilsr   r   r   r   r	   r
   r   r   r~   r   r   Úreportlab.lib.rl_accelr   r   r   rÞ   rP  Úregisterr]   rš   ro  rs  r|  r}  Ú	Exceptionr   r   rM   rO   r†   ru   r—   rÛ   rÔ   r  r  r-  r.  r   r$  rM  r&  rq  rR  rp  r€  r×   rž   r‡  r‰  rß   Úextendr�  r‘  r”  r—  rä   rž  r¦  r¬  r³  r  Úcopyr»  r¼  r   r   r   r   ú<module>rÆ     sê  ðð
 €ð	€÷ Ó Ý 'Ý )ß z× zÓ zß =ß DÝ 'Ø€à 	× Ñ × Ñ Ô Ø×'Ñ'€Ø×/Ñ/Ð à€
Ø€
Ø	€Ø€ô	�	ô 	ô	˜	ô 	òG"÷R@ñ @óDò÷0qñ qðn !Ð ÷^<ñ ^<ñ@ ˆt‹9€
Ù
ˆa‹&€	Ùˆq‹6€
ÙˆA‹€ò	ð  Ð ô!˜ô !òB&ò
ó
/ò*ò0ò6òò
-ñ �nÓ%€Ø × "Ñ "¡G¨HÓ$5°kÐ#BÔ Cóó2ó2òóLò
Vò.ò4ò	ñ Ø#Ÿ™Ó*Ø#Ÿ™Ó*Ø—[‘[“]Ø)×.Ñ.Ó0ô	ó/õ /Ù ˆvÔ ØàˆZÒÙ„FÙÕð r   