U
    Ú²gë  ã                   @  sæ   U d dl mZ d dl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dl	mZ dd	l	mZ dd
l	mZ dZdZdZdZdZdZdZdZdZdZdd„ dd„ dd„ dd„ gZded< ddddœdd„ZG d d!„ d!ejƒZ dS )"é    )ÚannotationsN)ÚBinaryIOÚCallableé   )ÚFontFileÚImage)Úi8)Úi16be)Úi16le)Úi32be)Úi32leifcpé   é   é   é   é    é@   é€   é   c                 C  s   | d d? S )Né   é   © ©Úbitsr   r   ú3/tmp/pip-unpacked-wheel-xela2va7/PIL/PcfFontFile.pyÚ<lambda>.   ó    r   c                 C  s   | d d? d@ S )Né   r   éþÿÿÿr   r   r   r   r   r   /   r   c                 C  s   | d d? d@ S )Né   r   éüÿÿÿr   r   r   r   r   r   0   r   c                 C  s   | d d? d@ S )Né?   r   iøÿÿÿr   r   r   r   r   r   1   r   zlist[Callable[[int], int]]ÚBYTES_PER_ROWÚbytesÚint)ÚsÚoÚreturnc                 C  s   | ||   d|¡… S )Nó    )Úindex)r%   r&   r   r   r   Úsz5   s    r*   c                      sx   e Zd ZdZdZddddœ‡ fdd„Zd	d
dœdd„Zddœdd„Zddœdd„Zdddœdd„Z	ddœdd„Z
‡  ZS )ÚPcfFontFilez(Font file plugin for the X11 PCF format.Únameú	iso8859-1r   Ústr)ÚfpÚcharset_encodingc              	     s"  || _ t| d¡ƒ}|tkr(d}t|ƒ‚tƒ  ¡  t| d¡ƒ}i | _t|ƒD ]@}t| d¡ƒ}t| d¡ƒt| d¡ƒt| d¡ƒf| j|< qN|| _	|  
¡ | _|  ¡ }|  |¡}	|  ¡ }
t|
ƒD ]Z\}}|d k	rÂ|| \}}}}}}}}|df||| || |fdd||f|	| f| j|< qÂd S )Nr   znot a PCF filer   )r0   Úl32ÚreadÚ	PCF_MAGICÚSyntaxErrorÚsuperÚ__init__ÚtocÚranger/   Ú_load_propertiesÚinfoÚ_load_metricsÚ_load_bitmapsÚ_load_encodingÚ	enumerateZglyph)Úselfr/   r0   ÚmagicÚmsgÚcountÚiÚtypeÚmetricsÚbitmapsÚencodingÚchÚixÚxsizeÚysizeÚleftÚrightÚwidthÚascentÚdescentÚ
attributes©Ú	__class__r   r   r6   >   sB    
0


÷
üzPcfFontFile.__init__r$   zDtuple[BinaryIO, int, Callable[[bytes], int], Callable[[bytes], int]])Útagr'   c                 C  sX   | j | \}}}| j}| |¡ t| d¡ƒ}|d@ rBtt }}n
tt }}||||fS )Nr   )r7   r/   Úseekr1   r2   Úb16Úb32Úl16)r?   rT   ÚformatÚsizeÚoffsetr/   Úi16Úi32r   r   r   Ú
_getformatl   s    

zPcfFontFile._getformatzdict[bytes, bytes | int])r'   c                   s¢   i }|   t¡\‰ }}‰ˆˆ  d¡ƒ}‡ ‡fdd„t|ƒD ƒ}|d@ rZˆ  d|d@  tj¡ ˆ  ˆˆ  d¡ƒ¡}|D ]*\}}}	|rŠt||	ƒn|	}
|
|t||ƒ< qr|S )Nr   c                   s4   g | ],}ˆˆ   d ¡ƒtˆ   d¡ƒˆˆ   d ¡ƒf‘qS )r   r   )r2   r   ©Ú.0Ú_©r/   r]   r   r   Ú
<listcomp>ˆ   s     z0PcfFontFile._load_properties.<locals>.<listcomp>r   )r^   ÚPCF_PROPERTIESr2   r8   rU   ÚioÚSEEK_CURr*   )r?   Z
propertiesrY   r\   ZnpropsÚpÚdataÚkr%   ÚvZproperty_valuer   rb   r   r9   }   s    zPcfFontFile._load_propertiesz3list[tuple[int, int, int, int, int, int, int, int]]c              
   C  s\  g }|   t¡\}}}}|j}|d@ dkrÄt|| d¡ƒƒD ]†}t| d¡ƒd }t| d¡ƒd }	t| d¡ƒd }
t| d¡ƒd }t| d¡ƒd }|	| }|| }|||||	|
||dfƒ q:n”t|| d¡ƒƒD ]€}|| d¡ƒ}|| d¡ƒ}	|| d¡ƒ}
|| d¡ƒ}|| d¡ƒ}|| d¡ƒ}|	| }|| }|||||	|
|||fƒ qÖ|S )Ni ÿ  r   r   r   r   r   r   )r^   ÚPCF_METRICSÚappendr8   r2   r   )r?   rE   r/   rY   r\   r]   rl   rC   rL   rM   rN   rO   rP   rJ   rK   rQ   r   r   r   r;   •   s0    zPcfFontFile._load_metricszlist[Image.Image])rE   r'   c                   s  |   t¡\‰ }}‰ˆˆ  d¡ƒ}|t|ƒkr8d}t|ƒ‚‡ ‡fdd„t|ƒD ƒ}‡ ‡fdd„tdƒD ƒ}|d@ }|d@ }	||	 }
| |
¡ ˆ  |
¡}t|	 }d}|r¨d	}g }t|ƒD ]V}|| d d
… \}}|||d
 … \}}| t 	d	||f|||… d|||ƒ¡¡ q´|S )Nr   zWrong number of bitmapsc                   s   g | ]}ˆˆ   d ¡ƒ‘qS ©r   ©r2   r_   rb   r   r   rc   È   s     z-PcfFontFile._load_bitmaps.<locals>.<listcomp>c                   s   g | ]}ˆˆ   d ¡ƒ‘qS rm   rn   r_   rb   r   r   rc   Ê   s     r   r   z1;RÚ1r   Úraw)
r^   ÚPCF_BITMAPSr2   ÚlenÚOSErrorr8   rl   r"   r   Z	frombytes)r?   rE   rY   r\   ZnbitmapsrA   ÚoffsetsZbitmap_sizesZbitorderZpadindexZ
bitmapsizerh   ÚpadÚmoderF   rC   rJ   rK   ÚbÚer   rb   r   r<   º   s0    

"ÿzPcfFontFile._load_bitmapszlist[int | None]c              	     sø   |   t¡\‰ }‰}ˆˆ  d¡ƒˆˆ  d¡ƒ }}ˆˆ  d¡ƒˆˆ  d¡ƒ }}ˆˆ  d¡ƒ || d || d  }d gtd|ƒ }‡ ‡fdd„t|ƒD ƒ}	t|t|ƒƒD ]H}
z.|	tt|
gƒ | j	¡ƒ }|dkrÚ|||
< W qª t
k
rð   Y qªX qª|S )Nr   r   r   c                   s   g | ]}ˆˆ   d ¡ƒ‘qS )r   rn   r_   ©r/   r\   r   r   rc   ñ   s     z.PcfFontFile._load_encoding.<locals>.<listcomp>iÿÿ  )r^   ÚPCF_BDF_ENCODINGSr2   Úminr8   rr   ÚordÚ	bytearrayÚdecoder0   ÚUnicodeDecodeError)r?   rY   r]   Z	first_colZlast_colZ	first_rowZlast_rowZ	nencodingrG   Zencoding_offsetsrC   Zencoding_offsetr   ry   r   r=   ä   s"    ÿzPcfFontFile._load_encoding)r-   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r6   r^   r9   r;   r<   r=   Ú__classcell__r   r   rR   r   r+   9   s   .%*r+   )!Ú
__future__r   re   Útypingr   r   Ú r   r   Ú_binaryr   r	   rV   r
   rX   r   rW   r   r1   r3   rd   ZPCF_ACCELERATORSrk   rq   ZPCF_INK_METRICSrz   ZPCF_SWIDTHSZPCF_GLYPH_NAMESZPCF_BDF_ACCELERATORSr"   Ú__annotations__r*   r+   r   r   r   r   Ú<module>   s4    ü