
    ^j&                    n   U d dl m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Zd dlmZ erd dlmZ d dlmZ d d	lmZ d d
lmZmZ ddlmZ dZerdZddlmZmZ d-dZi Z de!d<   d.dZ"d.dZ#ej$        dk    re#Z%nej$        dk    re"Z%d/d Z&d0d#Z'd1d%Z(d2d'Z)d3d*Z*d3d+Z+ G d, d"          Z,dS )4    )annotations)defaultdict)TYPE_CHECKING)c_void_pc_uint16c_uint32	string_atcreate_string_buffer	py_objectcastPOINTERN)GlyphPosition)FreeTypeFont)Win32DirectWriteFont)
QuartzFont)FontGlyph   )hb_libFT)HB_MEMORY_MODE_READONLYHB_DIRECTION_LTRreturnboolc                     t           S )z3Return if the Harfbuzz library is available to use.)
_available     X/home/agentuser/manim-venv/lib/python3.11/site-packages/pyglet/font/harfbuzz/__init__.pyharfbuzz_availabler      s    r   z;dict[tuple[str, str, bool, str | bool], _HarfbuzzResources]	_hb_cachetextstrbufferr   Nonec                    |                      d          }t          |          dz  }t          |z                      |          }t	          j        |||d|           d S )Nz	utf-16-le   r   )encodelenr   from_buffer_copyr   hb_buffer_add_utf16)r!   r#   	txt_utf16length	txt_arrays        r   _add_utf16_bufferr.   !   sZ    K((I^^q FF"44Y??I
vy&!VDDDDDr   c                    |                      d          }t          |          dz  }t          |z                      |          }t	          j        |||d|           d S )Nz	utf-32-le   r   )r'   r(   r   r)   r   hb_buffer_add_utf32)r!   r#   	txt_utf32char_ctr-   s        r   _add_utf32_bufferr4   '   sZ    K((I9~~"GG#55i@@I
vy!WEEEEEr   i i  fontr   c                    | j         | j        | j        | j        f}|t          v rt          |         S t                      }|                                 }|                    |           |t          |<   |S )z:Get a harfbuzz resource object from a CoreText (Mac) font.)nameweightitalicstretchr    _HarfbuzzResources_get_hb_faceload_from_tabled_face)r5   keyresourcehb_faces       r   get_resource_from_ct_fontrA   4   sk    9dk4;
=C
i~!##H!!G""7+++IcNOr   r   r;   c                
   | j         | j        | j        | j        f}|t          v rt          |         S |                                 }|r/t                      }|                    |           |t          |<   |S t          d          )zAGet a harfbuzz resource object from a DirectWrite (Windows) font.zFont data could not be read.)	r7   r8   r9   r:   r    get_font_datar;   load_from_memory	Exception)r5   r>   datar?   s       r   get_resource_from_dw_fontrG   A   s    9dk4;
=C
i~D %''!!$'''!	#
2
3
33r   r   c                *   | j         | j        | j        | j        f}|t          v rt          |         S | j        j        j        j        j        }t          |j
        |j                  }t                      }|                    |           |t          |<   |S )z<Get a harfbuzz resource object from a FreeType (Linux) font.)r7   r8   r9   r:   r    faceft_facecontentsstreamr	   basesizer;   rD   )r5   r>   rL   rF   r?   s        r   get_resource_from_ft_fontrO   P   s    9dk4;
=C
i~Y'.7FV[&+..D!##Hd###IcNOr   	font_pathc                    t          | d          5 }|                                }d d d            n# 1 swxY w Y   t                      }|                    |           |S )Nrb)openreadr;   rD   )rP   frF   r?   s       r   get_resource_from_pathrV   ^   s    	i		 !vvxx               "##Hd###Os   266r   'tuple[list[Glyph], list[GlyphPosition]]c           	        g }g }t          |          }| j        D ]}|j                            ||j                  }d |D             }|                    |           |D ]q}|j        |d                  }	|                    |	           t          |d         |	j	        z
  |d         |d         |d                   }
|                    |
           r|t          |          z
  }|dk    rQt          |          D ]A}|                    | j                   |                    t          dddd                     B||fS )Nc                    g | ]
}|d          S )	codepointr   .0
glyph_datas     r   
<listcomp>z-_get_fallback_glyph_shape.<locals>.<listcomp>m   s    HHHz:k*HHHr   rZ   	x_advance	y_advancex_offsety_offsetr   )r(   	fallbackshb_resource
shape_text
pixel_sizerender_glyph_indicesglyphsappendr   advancerange_zero_glyph)r5   r!   rh   offsets	pystr_lenfallback
glyph_infoindicesr]   glyphoffsetdiffis                r   _get_fallback_glyph_shaperv   f   s^   FGD		IN # #)44T8;NOO
HHZHHH%%g...$ 	# 	#JOJ{$;<EMM%   #J{$;EM$I:VaKb)3J)?JAWY YFNN6""""	# s6{{"Daxxt 	6 	6AMM$*+++NN=Aq!4455557?r   c                H   | j                             || j                  }d |D             }t          t                    }i }g }|D ]m}|d         }|d         }	|	dk    r||vr|                    |          ||<   ||vrg ||<   ||                             |           |                    |	           n|                     |           i }
|                                D ]g\  }}||||z            }|| j	        vr<|dk    r| j
        gt          dddd          gf}nt          | |          }|| j	        |<   | j	        |         |
|<   hg }g }t          t          |                    D ]6}||         }||
v r6|
|         \  }}|                    |           |                    |           Et          |          dk    rlt          |          dz
  |k     rU|                    | j
                   |                    t          dddd                     t          |          dz
  |k     U|D ]o}| j	        |d                  }|                    |           |                    t          |d         |j        z
  |d         |d	         |d
                              p8||fS )Nc                    g | ]
}|d          S )clusterr   r[   s     r   r^   z.get_harfbuzz_shaped_glyphs.<locals>.<listcomp>   s    CCC*
9%CCCr   ry   rZ   r   
r   r_   r`   ra   rb   )rd   re   rf   r   listcountri   rg   itemsrh   rl   r   rv   rk   r(   extendrj   )r5   r!   rp   clusterscluster_mapempty_clustersrq   r]   cluster_numglyph_indexmissing_glyphs
cluster_id
cluster_ctmissing_textfb_glyph_inforh   rm   ru   cluster_glyph_info_glyphs_offsetsrr   s                         r   get_harfbuzz_shaped_glyphsr      s   !,,T4?CCJCC
CCCHd##K NG  $ $
 + -!> A A*2..*E*EN;'k))')K$K ''
333{####g&&& N"0"6"6"8"8 	? 	?
JJzJ'>>?t{**t##"&"2!3mAq!Q6O6O5P Q !:$ M M(5DK%%)[%>z""FG3t99  (^  .q 1GXMM'"""NN8$$$$ #$$))f++/A%%d.///}Q1a88999 f++/A%% 1  
J{$;<e$$$!*["9EM"I:VaKb",Z"8*Z:PR R   	 7?r   c                  >    e Zd ZddZddZdd	ZefddZd Zd Z	dS )r;   r   r$   c                0    d | _         d | _        d | _        d S N)blobrI   r5   selfs    r   __init__z_HarfbuzzResources.__init__   s    					r   r@   r   c                ^    d | _         || _        t          j        | j                  | _        d S r   )r   rI   r   hb_font_creater5   )r   r@   s     r   r=   z(_HarfbuzzResources.load_from_tabled_face   s(    		)$)44			r   rF   bytesc                   t          |          }t          ||          }t          j        ||t          d d           | _        t          j        | j        d          | _        t          j        | j                  | _	        d S )Nr   )
r(   r
   r   hb_blob_creater   r   hb_face_createrI   r   r5   )r   rF   data_lendata_bufs       r   rD   z#_HarfbuzzResources.load_from_memory   sg    t99'h77)(H>UW[]abb	)$)Q77	)$)44			r   r!   r"   rf   int	directionc           
        t          j                    }t          ||           t          |dz            }t          j        | j        ||           t          j        |           t          j        ||           t          j        | j        |dd           t          j	        |          }t          j
        |d          }t          j        |d          }g }	t          |          D ]X}
||
         }||
         }|	                    |j        |j        |j        dz  |j        dz  |j        dz  |j        dz  d           Yt          j        |           |	S )am  Shapes the given string using the provided hb_font.
        Returns a list of dictionaries for each glyph containing:
          - codepoint: the glyph index
          - cluster: the index into the original string
          - x_advance, y_advance: the advances (including kerning adjustments)
          - x_offset, y_offset: the offsets (shaped adjustments)
        @   Nr   g      P@)rZ   ry   r_   r`   ra   rb   )r   hb_buffer_createset_buffer_stringr   hb_font_set_scaler5   "hb_buffer_guess_segment_propertieshb_buffer_set_directionhb_shapehb_buffer_get_lengthhb_buffer_get_glyph_infoshb_buffer_get_glyph_positionsrk   ri   rZ   ry   r_   r`   ra   rb   hb_buffer_destroy)r   r!   rf   r   bufscaler,   infos	positionsrh   ru   infoposs                r   re   z_HarfbuzzResources.shape_text   sa    %'' 	$$$$JO$$ E59991#666 	&sI666 		3a000 ,S11 0d;;8dCC	 v 
	 
	A8DA,CMM!^< ]T1 ]T1L4/L4/      	 %%%r   c                .    |                                   d S r   )destroyr   s    r   __del__z_HarfbuzzResources.__del__  s    r   c                    | j         r t          j        | j                    d | _         | j        r t          j        | j                   d | _        | j        r"t          j        | j                   d | _        d S d S r   )r5   r   hb_font_destroyrI   hb_face_destroyr   hb_blob_destroyr   s    r   r   z_HarfbuzzResources.destroy  s|    9 	"49---DI9 	"49---DI9 	"49---DIII	 	r   N)r   r$   )r@   r   r   r$   )rF   r   r   r$   )r!   r"   rf   r   r   r   )
__name__
__module____qualname__r   r=   rD   r   re   r   r   r   r   r   r;   r;      s           
5 5 5 5
5 5 5 5 EU 1 1 1 1 1f      r   )r   r   )r!   r"   r#   r   r   r$   )r5   r   )r5   r   r   r;   )r5   r   r   r;   )rP   r"   )r5   r   r!   r"   r   rW   )-
__future__r   collectionsr   typingr   ctypesr   r   r   r	   r
   r   r   r   syspyglet.font.baser   pyglet.font.freetyper   pyglet.font.dwriter   pyglet.font.quartzr   r   r   harfbuzz_libr   r   r   r   r   r    __annotations__r.   r4   
maxunicoder   rA   rG   rO   rV   rv   r   r;   r   r   r   <module>r      s`   " " " " " " " # # # # # #             j j j j j j j j j j j j j j j j j j j j 



 * * * * * * -111111777777------,,,,,,,,            
	 J C C C C C C C C   
 JL	 K K K KE E E EF F F F >X)^v)
 
 
 
4 4 4 4         2> > > >BS S S S S S S S S Sr   