
    ^j                    .   d dl mZ d dlZd dl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mZ d dlmZ d dlmZmZmZ d dlZd dlmZ d dlmZ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)m*Z*m+Z+m,Z, d d
l-m.Z.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z} d dl~mZmZmZ d dlmZ d dlmZmZmZmZ d dlmZ d dlmZmZmZmZ d dlmZ erd dlmZ ej        d         Z ed          Z	 d dlmZ n# e$ rZdZ ee          edZ[ww xY wi deCdeKdeKdeOdeGdeQdeIdeNdeKdeLdeJd eDd!eMd"eCd#eFd$ePd%eBeHeEd&Ze>e=e7e5e;e:e9e<e6e8e5d'Ze@eAe?d(Z G d) d*e          ZdEd-Z G d. d/ej                  Z e            ZdFd7Z G d8 d9ej                  ZdGd;ZdHdId@Z G dA dBej                  Z e'            Z e%e"e+d ee                    Z e.dCdCdCdC          Z e.dDdDdDdD          Z e.dDdCdCdD          Z e/d d           ZdS )J    )annotationsN)
POINTERArraybyrefc_void_pcastcreate_unicode_bufferpointer	py_objectsizeof	string_at)BOOLFLOATUINT)Flag)TYPE_CHECKINGBinaryIOSequence)base)GlyphGlyphPosition)(D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONTD2D1_DRAW_TEXT_OPTIONS_NONE!D2D1_FACTORY_TYPE_SINGLE_THREADED D2D1_TEXT_ANTIALIAS_MODE_ALIASED D2D1_TEXT_ANTIALIAS_MODE_DEFAULTD2D1CreateFactoryID2D1DeviceContext4ID2D1FactoryID2D1RenderTargetID2D1SolidColorBrushIID_ID2D1DeviceContext4IID_ID2D1Factorydefault_target_properties)D2D1_COLOR_FD2D_POINT_2F)MDWRITE_CLUSTER_METRICSDWRITE_COLOR_GLYPH_RUN1DWRITE_FACTORY_TYPE_SHAREDDWRITE_FONT_METRICSDWRITE_FONT_STRETCH_CONDENSEDDWRITE_FONT_STRETCH_EXPANDED#DWRITE_FONT_STRETCH_EXTRA_CONDENSED"DWRITE_FONT_STRETCH_EXTRA_EXPANDEDDWRITE_FONT_STRETCH_MEDIUMDWRITE_FONT_STRETCH_NORMAL"DWRITE_FONT_STRETCH_SEMI_CONDENSED!DWRITE_FONT_STRETCH_SEMI_EXPANDED#DWRITE_FONT_STRETCH_ULTRA_CONDENSEDDWRITE_FONT_STRETCH_UNDEFINEDDWRITE_FONT_STYLE_ITALICDWRITE_FONT_STYLE_NORMALDWRITE_FONT_STYLE_OBLIQUEDWRITE_FONT_WEIGHT_BLACKDWRITE_FONT_WEIGHT_BOLDDWRITE_FONT_WEIGHT_DEMI_BOLDDWRITE_FONT_WEIGHT_EXTRA_BLACKDWRITE_FONT_WEIGHT_EXTRA_BOLDDWRITE_FONT_WEIGHT_EXTRA_LIGHTDWRITE_FONT_WEIGHT_HEAVYDWRITE_FONT_WEIGHT_LIGHTDWRITE_FONT_WEIGHT_MEDIUMDWRITE_FONT_WEIGHT_NORMALDWRITE_FONT_WEIGHT_REGULARDWRITE_FONT_WEIGHT_SEMI_BOLDDWRITE_FONT_WEIGHT_SEMI_LIGHTDWRITE_FONT_WEIGHT_THINDWRITE_FONT_WEIGHT_ULTRA_BOLDDWRITE_FONT_WEIGHT_ULTRA_LIGHTDWRITE_GLYPH_IMAGE_FORMATS_ALL!DWRITE_GLYPH_IMAGE_FORMATS_BITMAPDWRITE_GLYPH_IMAGE_FORMATS_SVGDWRITE_GLYPH_METRICSDWRITE_GLYPH_OFFSETDWRITE_GLYPH_RUNDWRITE_GLYPH_RUN_DESCRIPTION.DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMESDWRITE_MATRIXDWRITE_MEASURING_MODE_NATURALDWRITE_NO_PALETTE_INDEXDWRITE_TEXT_METRICSDWriteCreateFactoryIDWriteColorGlyphRunEnumeratorIDWriteColorGlyphRunEnumerator1IDWriteFactoryIDWriteFactory2IDWriteFactory5IDWriteFactory7IDWriteFontIDWriteFontCollectionIDWriteFontCollection1IDWriteFontFaceIDWriteFontFamilyIDWriteFontFamily1IDWriteFontFileIDWriteFontFileLoaderIDWriteFontFileLoader_LIIDWriteFontFileStreamIDWriteFontSetIDWriteFontSetBuilder1IDWriteInMemoryFontFileLoaderIDWriteLocalFontFileLoaderIDWriteLocalizedStringsIDWriteTextFormatIDWriteTextLayoutIDWriteTextRendererIID_IDWriteFactoryIID_IDWriteFactory2IID_IDWriteFactory5IID_IDWriteFactory7IID_IDWriteLocalFontFileLoaderLegacyCollectionLoaderLegacyFontFileLoader)get_harfbuzz_shaped_glyphsget_resource_from_dw_fontharfbuzz_available)GUID_WICPixelFormat32bppPBGRA)UINT16UINT32UINT64com)	_kernel32)LOCALE_NAME_MAX_LENGTHWINDOWS_8_1_OR_GREATERWINDOWS_10_1809_OR_GREATER%WINDOWS_10_CREATORS_UPDATE_OR_GREATER)debug_print)	ImageData
debug_font)wicz6Failed to initialize Windows Imaging Component module.TFthin
extralight
ultralightlight	semilightnormalregularmediumdemiboldsemiboldbold	extrabold	ultraboldblack)heavy
extrablack)	undefinedultracondensedextracondensed	condensedsemicondensedr   r   semiexpandedexpandedextraexpandednarrow)r   obliqueitalicc                  6    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )DWRITE_GLYPH_IMAGE_FORMAT_FLAGr                      @         N)__name__
__module____qualname__NONETRUETYPECFFCOLRSVGPNGJPEGTIFFPREMULTIPLIED_B8G8R8A8COLR_PAINT_TREE     V/home/agentuser/manim-venv/lib/python3.11/site-packages/pyglet/font/dwrite/__init__.pyr   r      sA        DH
CD
C
CDD' OOOr   r   returnstrc                 l    t          t                    } t          j        | t                     | j        S )z3Retrieve the string representing the system locale.)r	   r}   kernel32GetUserDefaultLocaleNamevalue)
local_names    r   get_system_localer      s-    &'=>>J%j2HIIIr   c                  z     e Zd ZdZegZd" fdZed#d            Zd$d
Z	d$dZ
d$dZd%dZd&dZd'dZd(d!Z xZS ))_DWriteTextRendererzThis implements a custom renderer for IDWriteTextLayout.

    This allows the use of DirectWrite shaping to offload manual shaping, fallback detection, glyph combining, and
    other complicated scenarios.
    r   Nonec                    t                                                       d| _        d| _        t	                      | _        d S )NF      ?)super__init__pixel_snappingpixels_per_diprP   dmatrix)self	__class__s    r   r   z_DWriteTextRenderer.__init__   s8    #!$r   	font_facer^   tuple[int, int]c                Z    t          |           }t          |d          \  }}|j        |fS )z%Unique identifier for each font face.Trelease_file)_get_font_file_get_font_refr   )r   	font_fileptrsizes       r   _get_font_referencez'_DWriteTextRenderer._get_font_reference   s3     #9--	!)$???	Ty$r   intc                    t           j        S Nr{   	E_NOTIMPLr   _argss     r   DrawUnderlinez!_DWriteTextRenderer.DrawUnderline   
    }r   c                    t           j        S r   r   r   s     r   DrawStrikethroughz%_DWriteTextRenderer.DrawStrikethrough   r   r   c                    t           j        S r   r   r   s     r   DrawInlineObjectz$_DWriteTextRenderer.DrawInlineObject   r   r   	_draw_ctxr   is_disabledPOINTER(FLOAT)c                    | j         |d<   dS Nr   )r   )r   r   r   s      r   IsPixelSnappingDisabledz+_DWriteTextRenderer.IsPixelSnappingDisabled   s    ,Aqr   r   c                    | j         |d<   dS r   )r   )r   r   r   s      r   GetPixelsPerDipz#_DWriteTextRenderer.GetPixelsPerDip   s     /qqr   	transformPOINTER(DWRITE_MATRIX)c                    | j         |d<   dS r   )r   )r   r   r   s      r   GetCurrentTransformz'_DWriteTextRenderer.GetCurrentTransform   s    |	!qr   drawing_context_baseline_xfloat_baseline_ymodeglyph_run_ptrPOINTER(DWRITE_GLYPH_RUN)_run_des%POINTER(DWRITE_GLYPH_RUN_DESCRIPTION)_effectc           	        t          |j        j                  }|d |j        j                 }	t	          |	          }
t          |t                    j        }|j        }|                     |j	                  }|j
        dk    rR|j        j        }|j                            |           |j                            t!          dddd                     dS g }t#          |j
                  D ]8}|j        |         }||f|j        j        vr||vr|                    |           9|rt)          |j	        t+          t	          |          z  | t	          |                    }t-          |          D ]9\  }}|                    |j	        |||         |          }||j        j        ||f<   :g }t#          |j
                  D ]}|j        |         }|j        j        ||f         }|                    |           |j        rKt3          j        |j        |         |j        z
  d|j        |         j        |j        |         j                  }nt3          j        dddd          }|j                            |           |j                            |           |
|j
        z
  }|dk    rbt#          |          D ]R}|j        j        }|j                            |           |j                            t!          dddd                     SdS r   )r	   contentstext
textLengthlenr   r   r   r   fontFace
glyphCountfont_zero_glyphcurrent_glyphsappendcurrent_offsetsr   rangeglyphIndicesglyphsget_glyph_metricsrx   	enumeraterender_single_glyphglyphOffsetsr   glyphAdvancesadvanceadvanceOffsetascenderOffset)r   r   r   r   r   r   r   r   c_bufc_wchar_txt	pystr_lenglyph_renderer	glyph_runfont_refglyphmissingiglyph_indicemetricsidxcurrentoffsetdiffs                          r   DrawGlyphRunz _DWriteTextRenderer.DrawGlyphRun   s&    &h&7&<==9X.99:$$	373S3S3Y!*	 ++I,>??1$$"'3E)00777*11-1a2K2KLLL1 y+,, 	- 	-A$1!4L,'~/B/IIIlbiNiNi|,,,  	M'	(:Vc'll=RU\<]_bcj_k_kllG%.w%7%7 M M!\&::9;M|]deh]ikoppGL#*Hl+CDD y+,, 	: 	:A$1!4L"'.,/GHENN5!!!% 	8+&4Q7%-G%215C%215D	  +Aq!Q77)00777*11&99999//!884[[ Q Q&+7-44U;;;.55mAq!Q6O6OPPPPqr   )r   r   )r   r^   r   r   )r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   __doc__rl   _interfaces_r   staticmethodr   r   r   r   r   r   r   r#  __classcell__r   s   @r   r   r      s        
 ((L' ' ' ' ' '    \                  B B B B B B B Br   r   r   r^   indicesArray[UINT16]countr   .list[tuple[float, float, float, float, float]]c                T   t          |z              }|                     |||d           g }|D ]y}|j        t          |j                  z   t          |j                  z   }|j        |j        z
  |j        z
  }|j        }|j        }	|j        }
|	                    ||||
|	f           z|S )zObtain metrics for the specific string.

        Returns:
            A list of tuples with the following metrics per indice:
        .       (glyph width, glyph height, left side bearing, advance width, bottom side bearing)
        F)
rK   GetDesignGlyphMetricsadvanceWidthabsleftSideBearingrightSideBearingadvanceHeighttopSideBearingbottomSideBearingr  )r   r)  r+  glyph_metricsmetrics_outmetricglyph_widthglyph_heightlsbbsbadvance_widths              r   r  r  5  s     .588''uMMM# 		U 		UF!.V5K1L1LLsSYSjOkOkkK"063HH6KccL(C*C"/M\3sSTTTTr   c                       e Zd ZU ded<   ded<   ej        j        du reneZ	e
reneZeZd! fdZd"dZd#dZd$dZd%dZd&dZd'd Z xZS )(DirectWriteGlyphRendererzlist[DWRITE_GLYPH_RUN]current_runWin32DirectWriteFontr  Tr   r   c                    d | _         d| _        d | _        d | _        d| _        g | _        g | _        t                                          |           d S )NF)r   r   )	_render_target_ctx_supported_bitmap_brush_bitmap_dimensionsr  r  r   r   )r   r  r   s     r   r   z!DirectWriteGlyphRenderer.__init__U  sW    "#"( !r   r   r   r   c                    d S r   r   )r   r   s     r   renderzDirectWriteGlyphRenderer.render_  s    r   widthr   heightr   c           
     b   t          |          }t                      }| j        j                            |t          |          | j        j        ||t          |                     t                      }|	                    t          |                     t          t          j        |j                            t          t          j        |j                            }}t          }t!          j        |||          }t%                      }	t&                              |t*          t          |	                     |	                    | j                   | j        st3                      | _        |	                    t6          dt          | j                             |	                                 |	                    t<                     |	                    t@          || j        | j!                   |	"                    dd           |	#                                 t!          j$        ||          S )zThis process takes Pyglet out of the equation and uses only DirectWrite to shape and render text.

        This may allows more accurate fonts (bidi, rtl, etc) in very special circumstances.
        N)%r	   rk   r  _write_factoryCreateTextLayoutr  _text_formatr   rS   
GetMetricsr   mathceilrJ  rK  rw   r   
get_bitmapr    d2d_factoryCreateWicBitmapRenderTargetr$   SetTextAntialiasModeantialias_moderF  r!   CreateSolidColorBrushwhite	BeginDrawCleartransparentDrawTextLayout	no_offsetdraw_optionsEndDrawReleaseextract_image_data)
r   r   rJ  rK  text_buffertext_layoutlayout_metricswic_fmtbitmaprts
             r   render_to_imagez(DirectWriteGlyphRenderer.render_to_imageb  s   
 ,D11'))	 11I"+	
 	
 	
 -..u^44555DIn&:;;<<c$)NLaBbBb>c>cv/vw77  //8QSXY[S\S\]]] 	 3444{ 	1.00DK
  eDK.@.@AAA


)%++	- 	- 	-
 	

4


%fg666r   r   r^   indicer  (tuple[float, float, float, float, float]r   
base.Glyphc           
        |\  }}}}}	t          dd          }
t          || j        j        dt	          dz  |          t          dz  d          t          |
          dd          }| j        t          z  r| 	                    |          }nd}|dk    r|dk    rd}d}nmt          t          j        t          ||          | j        j        z                      dz   }t          t          j        | j        j                            dz   }d}|dk     r|| j        j        z  }|                     ||           t#          | | j        j                  }| j                                         | j                            t,                     |rd}	 t/          d          }|                    t3          |                     |j        snv t7          t8                                }|                    t3          |                     |j        j        t@          k    r| j!        }ne|sBtE                      }| j        #                    |j        j$        dt3          |                     n|%                    |j        j$                   |}|j        j&        }|tN          k    r6| j(        r.| j        )                    ||j        j*        | j!        dd|           ng|tV          z  r4| j(        r,| j        ,                    |||j        j*        | j-                   n)|j        j*        }| j        .                    ||||           |/                                 |r|/                                 n"| j        .                    ||| j!        |           | j        0                    dd           tc          j2        | j3                  }| j        4                    |          }|5                    | j        j6         ||| j        j        z             |S )z-Renders a single glyph indice using Direct2D.        r   Fr   )r  
fontEmSizer  r
  r  r  
isSideways	bidiLevelNT)7rL   rM   r  
pixel_sizerx   r   r
   r_  r   _get_color_enumeratorr   rQ  rR  maxfont_scale_ratiomax_glyph_height_create_bitmapr&   ascentrC  rZ  r[  r\  r   MoveNextr   r   r   r(   GetCurrentRun1r   paletteIndexrR   rF  r!   rX  runColorSetColorglyphImageFormatrJ   rD  DrawSvgGlyphRunglyphRunrI   DrawColorBitmapGlyphRunmeasuring_moder#  ra  r`  r   rb  rE  create_glyphset_bearingsdescent)r   r   rj  r  r   r9  r:  	glyph_lsbglyph_advance	glyph_bsbr!  run
enumeratorrender_widthrender_heightrender_offset_xbaseline_offset
temp_brushhas_run	color_runbrushglyph_image_fmtr  imager  s                            r   r  z,DirectWriteGlyphRenderer.render_single_glyph  sB   
 JQF\9mY$S#..y+ 1*f-- 19c** 	
 	
 	
 GG 	33C88JJJ ! 1 1LMM
 ty[-)H)H49Ke)effggjkkL	$)*D E EFFJMq=='$)*DDO
 	L-888 ''7'+y'79 9 	%%'''!!+... 7	36:J-;t**##E'NN333} <G$;<<>>	))%	*:*:;;; %26MMM KEE & I%9%;%;
+AA)BTB]_cejkuevevwwww"++I,>,GHHH&E"+"4"E"&DDD* +;;+%.7 K     %'HH ;* +CC++%.7 /	   !* 2 ;I'44_5>5:59; ; ;U-;\     %""$$$,,_-0-1[-13 3 3
 	##D$///&t|44	&&u--DI--(49+EE	G 	G 	G r   
dwrite_runrM   GIDWriteColorGlyphRunEnumerator | IDWriteColorGlyphRunEnumerator1 | Nonec                   	 t           rQt                      }| j        j                            t
          |dt          | j        ddt          |                     nPt          rGt                      }| j        j                            dd|d| j        ddt          |                     ndS |S # t          $ r}|j        dk    r|Y d}~nd}~ww xY wdS )z&Obtain a color enumerator if possible.Nr   rn  iP)r   rV   r  rM  TranslateColorGlyphRun4r^  rH   r  r   r~   rU   TranslateColorGlyphRunOSErrorwinerror)r   r  r  dw_errs       r   rs  z.DirectWriteGlyphRenderer._get_color_enumerator  s    	4 <>>
	(@@2'*%%	 	 	 	 ( ;==
	(??'*%%    t 	 	 	+-- .----	
 ts   B&B, *B, ,
C6CCGlyph | Nonec           	        | j                             |          }t                      }|                    t	          |                     t          t          j        |j                            }t          t          j        |j	                            }|dk    s|dk    rdS | 
                    ||           t          dd          }| j                                         | j                            t                     | j                            ||| j        | j                   | j                            dd           t)          j        | j                  }| j                             |          }|                    | j         j         dt          t          j        |j                                       |S )a'  This will render text given the built-in DirectWrite layout.

        This process allows us to take advantage of color glyphs and fallback handling that is built into DirectWrite.
        This can also handle shaping and many other features if you want to render directly to a texture.
        r   N)r  create_text_layoutrS   rP  r   r   rQ  rR  rJ  rK  rw  r&   rC  rZ  r[  r\  r]  rF  r_  r`  r   rb  rE  r  r  r  )	r   r   rd  re  rJ  rK  pointr  r  s	            r   render_using_layoutz,DirectWriteGlyphRenderer.render_using_layout7  s    i22488,..u^44555DIn23344TY~45566A::14E6*** Q""%%'''!!+...**5+6+/;+/+<	> 	> 	>
 	##D$///&t|44	&&u--DI--q#di@T6U6U2V2VWWWr   c                   | j         d         |k    s| j         d         |k    rB| j        r| j                                         t          j        ||t
                    | _        t                      }t          	                    | j        t          t          |                     t                      }t          j        |t          |          r#|                                 || _        d| _        n|| _        | j                            | j                   | j        sJt)                      | _        | j                            t,          dt          | j                             dS dS dS )z(Creates a bitmap using Direct2D and WIC.r   r   TN)rG  rC  ra  r   rS  rw   rE  r    rT  rU  r$   r   r   r{   is_availabler"   rD  rV  rW  rF  r!   rX  rY  )r   rJ  rK  rC  dev_ctxs        r   rw  z'DirectWriteGlyphRenderer._create_bitmap^  sV    "1%..$2I!2LPV2V2V" .#++--->%9VWWDL.00N33DLB[]bcq]r]rsss *++G0GQQ 5&&(((&-#&*##&4# 44T5HIII; [244#99%uT[GYGYZZZZZ1 3W2V,[ [r   )r  rA  r   r   )r   r   r   r   r   r   rJ  r   rK  r   r   r   )
r   r^   rj  r   r  rk  r   r   r   rl  )r  rM   r   r  )r   r   r   r  )rJ  r   rK  r   r   r   )r   r   r   __annotations__pygletoptionstext_antialiasingr   r   rW  r~   r   r   r_  rQ   r  r   rI  ri  r  rs  r  rw  r'  r(  s   @r   r?  r?  N  s        ''''9?9Y]a9a9a55  hHN?Uv;;[vL2N        17 17 17 17fz z z zx$ $ $ $L% % % %N[ [ [ [ [ [ [ [r   r?  ra   c                    t                      }|                     t          |          d           t          |j        z              }|                     t          |          |           |d         S )zGet the font file associated with this face.

    Seems to give something, even for memory loaded fonts.

    .. note:: Caller is responsible for freeing the returned object.
    Nr   )ry   GetFilesr   ra   r   )r   file_ct
font_filess      r   r   r   |  sa     hhGuW~~t,,,!GM144JuW~~z222a=r   r   r   booltuple[c_void_p, int]c                    t                      }t                      }|                     t          |          t          |                     |r|                                  ||j        fS )al  Get a unique font reference for the font face.

    Callbacks will generate new addresses for the same IDWriteFontFace, so a unique value
    needs to be established to cache glyphs.

    Args:
        font_file:
            The target font file object to pull the unique key from.
        release_file:
            If ``True`` the font file will be released.
    )r   ry   GetReferenceKeyr   ra  r   )r   r   key_dataff_key_sizes       r   r   r     sb     zzH((KeHoou[/A/ABBB [&&&r   c                      e Zd ZdZdZdZdZdZdZdZ	g Z
dZdZdZdZdZeZej        j        Z	 	 dMdN fdZdOdZedPd            ZedPd            ZdQdRd ZdSd"ZdTd%ZdUd'ZdVd)ZdWd+Z e!dXd.            Z"e!dXd/            Z#e!dYd2            Z$e!dZd5            Z%e!d[d7            Z&d\d9Z'e!d]d;            Z(e)d^d>            Z*e)d_d`dC            Z+e)dadF            Z,e)dbdJ            Z-e)dcdL            Z. xZ/S )drA  z'DirectWrite Font object for Windows 7+.NzSegoe UIr   Fnamer   r   r   weightr   
bool | strstretchdpi
int | Nonelocale
str | Noner   r   c                |   d | _         t                                                       |s| j        }g | _        || _        || _        || _        || _        || _	        || _
        || _        | j        d| _        d| _        | j
        d| _
        | j        | j
        z  dz  | _        t          | j                 | _        | j        r?t!          | j        t"                    rt$          | j                 | _        nt(          | _        nt*          | _        | j	        r?t!          | j	        t"                    rt,          | j	                 | _        nt0          | _        nt2          | _        |                     |          \  | _        | _        d }t:          j        d         r=| j        6| j        /|                     || j        | j        | j                  \  }| _        | j        J d| d            | j        }tA                      }	| j        !                    | j        tE          |	                     tG                      }|	$                    | j        | j        | j        tE          |                     tK                      | _&        | j'        (                    | j        | j        | j        | j        | j        | j        tS          | j                  tE          | j&                             tU                      }
|+                    tE          |
                     |
| _,        t[                      | _.        | j,        /                    tE          | j.                             | j        | j.        j0        z  | _1        te          j3        | j.        j4        | j1        z            | _4        tk          | j.        j6        | j1        z             | _6        | j.        j4        | j.        j6        z   | j1        z  | _7        | j.        j8        | j1        z  | _9        t:          j        j:        dk    r$tw                      rty          |           | _=        d S d S d S )	N F`   H   dw_legacy_namingzFont: 'z0' not found in loaded or system font collection.harfbuzz)>	_filenamer   r   _default_namebuffers_namer  r   r   r  r  r  rtlrr  name_to_weight_weight
isinstancer   name_to_style_styler5   r6   name_to_stretch_stretchr,   r0   get_collection_font_index_collectionr  r  find_font_facer`   GetFontFamilyr   r[   GetFirstMatchingFontrj   rO  rM  CreateTextFormatr	   r^   CreateFontFacer   r*   _font_metricsrP  designUnitsPerEmru  rQ  rR  rx  roundr  rv  lineGapline_gaptext_shapingrv   ru   hb_resource)r   r  r   r  r   r  r  r  
write_fontfont_familyr   r   s              r   r   zWin32DirectWriteFont.__init__  s   %) 	&%D
	;DKDH 8DH  9tx/B6%dk2; 	3$+s++ 7+DK862DK< 	7$,,, = / = <6DM-1-@-@-F-F*$*
>,- 	o43C3KPTP`Ph+/+>+>tT\SWS^`d`m+n+n(J(++-mt-m-m-m+++',..K**4+;U;=O=OPPP$J,,j!!	   .//,,JLKMO!$+..$#$$		
 		
 		
 $%%	!!%	"2"2333 #022!!%(:";";<<<!%43E3V!Vi 2 9D<Q QRRd084;PPQQQ!%!3!:T=O=W!W[_[p p*2T5JJ>&*449K9M9M48>>D 5444r   bytes | Nonec                   t          | j                  }t                      }|                    t	          |                     t          |d          \  }} t          t                                }|                    ||t	          |                     |rt                      }|
                    t	          |                     t                      }t                      }|                    t	          |          d|j        t	          |                     t          ||j                  }|r|                    |           |S d S )NFr   )r   r   rb   	GetLoaderr   r   r   rd   CreateStreamFromKeyrz   GetFileSizer   ReadFileFragmentr   r   ReleaseFileFragment)	r   ffloaderkeyr   font_filestream	void_datacontext	font_datas	            r   get_font_dataz"Win32DirectWriteFont.get_font_data'  s   DN++&((
U6]]###!"e,,	T8'"788::""3eO.D.DEEE 	88D''d444 

IjjG,,U9-=-=q$*eT[nn]]]!)TZ88I =33G<<<tr   c                   | j         | j         S d| _         t          | j                  }t          |d          \  }}t	                      }|                    t          |                     	 t                      }|                    t          t          |                     ns# t          $ rf}|j        dz  }|t          j        k    s|t          j        k    r)|                                 |                                 n|| j         cY d}~S d}~ww xY wt!                      }|                    ||t          |                     t%          |j        dz             }	|                    |||	t+          |	                     |                                 |                                 |                                 t-          j        |	j                                                  | _         | j         S )zReturns a filename associated with the font face.

        Note: Capable of returning more than 1 file in the future, but will do just one for now.
        NzNot AvailableFr   l    r   )r  r   r   r   rb   r  r   rh   QueryInterfacerq   r  r  r{   r   E_NOINTERFACEra  ry   GetFilePathLengthFromKeyr	   r   GetFilePathFromKeyr  pathlibPureWindowsPathas_posix)
r   r   r  key_sizer  local_loadere	int_errorpath_lenbuffers
             r   filenamezWin32DirectWriteFont.filenameA  s    >%>!("4>22	*95III(&((E&MM***
	"577L!!"@%BUBUVVVV 	" 	" 	"
Z/ICM))Y#:K-K-K   !!####>!!!!!!	" 88--h%//RRR&x~'9::''(FCKKPPP 0>>GGII~s   /6B& &
D0ADDDc                    | j         S r   )r  )r   s    r   r  zWin32DirectWriteFont.namek  s
    zr   '  P   r   rJ  r   rK  r   c                b    |                                   | j                            |||          S )zThis process uses only DirectWrite to shape and render text for layout and graphics.

        This may allow more accurate fonts (bidi, rtl, etc) in very special circumstances at the cost of
        additional texture space.
        )_initialize_renderer_glyph_rendererri  )r   r   rJ  rK  s       r   ri  z$Win32DirectWriteFont.render_to_imageo  s1     	!!####33D%HHHr   $tuple[Sequence[int], dict[int, int]]c                   g }t          j        |          }t          |          }|D ]2}|dk    rd}|                    t	          |d                              3t          |z              }||d d <   t          |z              }| j                            |||           i }t          |          D ]\  }	}
|
dk    r||	         ||	<   ||fS )N	 r   )
r   get_grapheme_clustersr  r  ordry   rx   r   GetGlyphIndicesr  )r   r   
codepointsclusterstext_lengthc
text_arrayglyph_indicesr  r  r  s              r   get_glyph_indicesz&Win32DirectWriteFont.get_glyph_indicesy  s    
-d33(mm 	) 	)ADyyc!A$ii(((({*--
"
111+-00&&z;NNN(77 	) 	)OA|q  %a[
g%%r   r)  	list[int]c                   |                                   t                      }t          t          |                    D ](}||         }|| j        vr|                    |           )|rt          | j        t          t          |          z  | t          |                    }t          |          D ]C\  }}| j
                            | j        |||         | j
        j                  }|| j        |<   BdS dS )z7Given the indice list, ensure all glyphs are available.N)r  setr	  r  r  addr  r   rx   r  r  r  r  )r   r)  r  r  r  r  r  r  s           r   render_glyph_indicesz)Win32DirectWriteFont.render_glyph_indices  s    	!!###%%s7||$$ 	* 	*A"1:L4;..L)))  	2'#g,,9NQX8Y[^_f[g[ghhG%.w%7%7 2 2!\,@@Q]_fgj_kAEAUAdf f,1L))	2 	22 2r   rl  c                   | j         D ]l}|                    |          \  }}t          |          t          |          k    r;|                    |           |D ]}|dk    r|j        |         c c S m| j        d         S r   )	fallbacksr  r  r  r  )r   r   fallbackr)  r  rj  s         r   _get_fallback_glyphz(Win32DirectWriteFont._get_fallback_glyph  s     		3 		3H'99$??GW7||s7||++))'222! 3 3Q;;#?6222222 3 {1~r   ,tuple[list[Glyph], list[base.GlyphPosition]]c           	        |                                   t          j        j        dk    rt	                      rt          | |          S t          j        j        dk    r| j        j                                         | j        j	                                         | 
                    |          }t          t          | j                  t                    }|                    |t                              t"                    dd           |                                 | j        j        | j        j	        fS g }g }|                     |          \  }}|                     |           t+          |          D ]\  }}	|	dk    r1|                     ||                   }
|                    |
           n |                    | j        |	                    |                    t3          dddd                     ||fS )Nr  platformr   )r  r  r  r  rv   rt   r  r  clearr  r  r   idr   Draw	_rendereras_interfacerl   ra  r  r  r  r  r  r  r   )r   r   rd  r   r  offsetsr)  r  r  rj  r  s              r   
get_glyphszWin32DirectWriteFont.get_glyphs  s   !!###>&*449K9M9M4-dD999>&*44 /55777 06688811$77Kr$.//::CS)"8"89L"M"MqRSTTT!!!'68L8\\\11$77!!'***"7++ 	6 	6IAv{{00<<e$$$$dk&1222NN=Aq!445555wr   rk   c           
         t          |          }t                      }| j                            |t	          |          dz
  | j        ddt          |                     |S )zCreate a text layout that holds the specified text.

        .. note:: Caller is responsible for calling ``Release`` when finished.
        r   r  )r	   rk   rM  rN  r  rO  r   )r   r   rc  rd  s       r   r  z'Win32DirectWriteFont.create_text_layout  sf    
 ,D11')),,[))!+T->5+	
 	
 	
 r   clstype[Win32DirectWriteFont]c                V   t           rt                      | _        t          }n^t          rt                      | _        t          }n<t          rt                      | _        t          }nt                      | _        t          }t          t          |t          | j                             dS )zBAll DirectWrite fonts needs factory access as well as the loaders.N)r   rZ   rM  rp   r   rY   ro   r~   rX   rn   rW   rm   rT   r)   r   )r&  guids     r   _initialize_direct_writez-Win32DirectWriteFont._initialize_direct_write  s     & 	&!0!2!2C&DD2 	&!0!2!2C&DD# 	&!0!2!2C&DD!/!1!1C%D6eCDV>W>WXXXXXr   c                   t           rt                      | _        | j                            t          | j                             | j                            | j                   t                      | _        | j        	                    t          | j                             dS t                      | _        | j                            | j                            t                               t          | j        | j                  | _        | j                            | j                   t!          t#          d          t$                    | _        dS )z3Initialize the loaders needed to load custom fonts.legacy_font_loaderN)r   rg   _font_loaderrM  CreateInMemoryFontFileLoaderr   RegisterFontFileLoaderrf   _font_builderCreateFontSetBuilder5rs   r"  rc   rr   _font_collection_loaderRegisterFontCollectionLoaderr   r	   r   _font_loader_key)r&  s    r   _initialize_custom_loadersz/Win32DirectWriteFont._initialize_custom_loaders  s    1 	_<>>C;;E#BR<S<STTT55c6FGGG !7 8 8C44U3;L5M5MNNNNN355C 55c6F6S6STl6m6mnnn*@ASUXUe*f*fC';;C<WXXX#'(=>R(S(SU]#^#^C   r   datar   c           	        | j         s|                                  | j        s|                                  t          r9t                      }| j                            | j         |t          |          d t          |                     | j	        
                    |          }|dk    rt          d          | j        r2| j                                         | j                                         t                      | _        | j	                            t          | j                             t#                      | _        | j                             | j        t          | j                             d S | j                            |           | j        rd | _        | j                             | j                   | j                             | j                   t1                      | _        t3          | j         | j                  | _        | j                             | j                   | j                             | j                            t:                               | j                            | j                   t?                      | _        | j                              | j        | j!        tE          | j!                  t          | j                             d S )Nr   z5This font file data is not not a font or unsupported.)#rM  r*  r-  r5  r   ra   CreateInMemoryFontFileReferencer  r   r0  AddFontFile	Exception_custom_collection	_font_setra  re   CreateFontSetr]   CreateFontCollectionFromFontSet_font_cacher  UnregisterFontCollectionLoaderr2  UnregisterFontFileLoaderrs   rr   r3  r/  r"  rc   AddFontDatar\   CreateCustomFontCollectionr4  r   )r&  r6  r   hrs       r   add_font_dataz"Win32DirectWriteFont.add_font_data  s   ! 	+((*** 	-**,,,0 0	Y'))I<<S=OBFBEd))BFBG	BRBR	T T T "..y99BQww WXXX
 % 1%%'''&..000*,,CM++E#-,@,@AAA%;%=%=C">>s}eTWTjNkNklllll O""4((( % 
s)-&"AA#B]^^^";;C<LMMM#7#9#9 .DSEWY\Yi.j.j+"??@[\\\"99#:J:W:WXp:q:qrrr'33CODDD%:%<%<C"99#:U:=:N:@AU:V:V:?@V:W:WY Y Y Y Yr   	font_name0tuple[int | None, IDWriteFontCollection1 | None]c                H   | j         s|                                  t                      }t                      }| j        rX| j                            t          |          t          |          t          |                     |j        r|j        | j        fS t                      }|j        sv| j         
                    t          |          d           |                    t          |          t          |          t          |                     |j        r	|j        |fS dS )zObtain a collection of fonts based on the font name.

        Returns:
            Warnings collection this font belongs to (system or custom collection), as well as the index
            in the collection.
        r   NN)rM  r*  r   r   r;  FindFamilyNamer	   r   r   r\   GetSystemFontCollection)r&  rF  
font_indexfont_existssys_collections        r   r  z#Win32DirectWriteFont.get_collectionF  s1    ! 	+((***VV
ff ! 	@"112G	2R2R27
2C2C272D2DF F F   @!')??? /00  	866u^7L7LaPPP))*?	*J*J*/
*;*;*/*<*<> > >   8!'77zr   7tuple[IDWriteFont | None, IDWriteFontCollection | None]c                n   |                      ||||          \  }}}t          d| d           | j        r)|                     | j        ||||          }|	|| j        fS t	                      }	| j                            t          |	          d           |                     |	||||          }|||	fS dS )a  Search font collections for legacy RBIZ names.

        Matching to weight, italic, stretch is problematic in that there are many values. Attempt to parse the font
        name looking for matches to the name database, and pick the closest match.

        This will search all font faces in the system and custom collections.

        Returns:
            Returns a collection and IDWriteFont if successful.
        zdirectwrite: 'z>' not found. Attempting legacy name lookup in all collections.Nr   rI  )
parse_name_debug_printr;  find_legacy_fontr\   rM  rK  r   )
r&  rF  r  r   r  p_weightp_italic	p_stretchcollection_idxrN  s
             r   r  z#Win32DirectWriteFont.find_font_facek  s     ),y&&RY(Z(Z%(Ioioooppp! 	> 11#2H)U]_girssN)%s'===.002253H3H!LLL--niS[]fgg%!>11zr   r   c                   |                      |          }t                      }|                    t          |                     |                                 t          |j                  t          |j                  fS r   )r  rS   rP  r   ra  r   widthIncludingTrailingWhitespacerK  )r   r   layoutr  s       r   get_text_sizez"Win32DirectWriteFont.get_text_size  sj    ((..%''%..)))W=>>gn@U@UUUr   r  c                <    |                      |          d         d uS r   )r  )r&  r  s     r   	have_fontzWin32DirectWriteFont.have_font  s     !!$''*$66r   styletuple[str, int, int]c                z   |                                  } |                     d          }|}|}|}t          |          dk    rut                                          D ]\  }}	||v r|	} nt
                                          D ]\  }}	||v r|	} nt                                          D ]\  }}	||v r|	} n|||fS )zXAttempt at parsing any special names in a font for legacy checks. Takes the first found.r  r   )lowersplitr  r  itemsr  r  )
rF  r  r^  r  
split_namefound_weightfound_stylefound_stretchr  r   s
             r   rQ  zWin32DirectWriteFont.parse_name  s    OO%%	__S))
 z??Q-3355  e:%%#(LE &  -2244  e:%%"'KE &  /4466  e:%%$)ME & [-77r   
collectionr\   
full_debugIDWriteFont | Nonec                   |                                  }t          d| d          sJ t                      }t          |          D ]}t	                      }	|                     |t          |	                     t                      }
|	                    t          |
                     t          
                    |
|          }|d         }|d         |d         k    r|	                                 t          d|           sJ |	                                }g }g }t          |          D ]}t                      }|	                    |t          |                     t          rv|rtt                      }|                    t          |                     t          
                    ||          }|                    |           t          d|           sJ t                      }t%                      }|                    t(          t          |          t          |                     d}|j        dk    rt          
                    ||          D ]y}||k    rqt          d| d| d	| d
| d	          sJ d}|                    |                                |                                |                                |f            nz|s|                                 |	                                 |rLt                              ||||          }|D ](}|d         |k    r|d                                          )|c S 
d S )Nzdirectwrite: Found z fonts in collection.r   z%directwrite: Inspecting family name: zdirectwrite: Face names found: FzFound legacy name 'z' as 'z' in font face 'z' (collection id #z).T   )GetFontFamilyCountrR  r   r	  r_   r  r   ri   GetFamilyNamesrA  unpack_localized_stringra  GetFontCountr[   GetFont_debug_fontGetFaceNamesextendr   GetInformationalStringsrO   r   r  	GetWeightGetStyle
GetStretchmatch_closest_font)rh  rF  r  r   r  ri  
coll_countr  r  familyfamily_name_strfamily_namesfamily_nameft_ct
face_namesmatchesjtemp_ftfc_strstringscompat_namesexistsmatch_foundcompat_namer  matchs                             r   rS  z%Win32DirectWriteFont.find_legacy_font  s   2244
S*SSSTTTTT"$$z"" F	" F	"A&((F$$Qf666 677O!!%"8"8999/GGY_``L&q/K1~1--    U U UVVVVV ''))EJG5\\ #& #&%--q%..111 U: U466F((v7772JJ6SYZZG%%g...'(S'(S(STTTTT  788//0^05l0C0C05f? ? ?
 $<1$$';'S'ST`bh'i'i " "&)33#/!-i !- !-{ !- !-de !- !-'(!- !- !-$. $. . . $. +/K#NNG,=,=,?,?AQAQASASU\UgUgUiUikr+sttt!E 4 # &OO%%%NN  "1DDWfV\^eff
 % + +EQx:--a((***!!!!" tr   	font_list'list[tuple[int, int, int, IDWriteFont]]c           
     P   g }| D ]}|\  }}}}	||k    r)||k    r#||k    rt          d| d| d| d           |	c S d}
d}||k    r|
dz  }
n|t          k    r|t          k    r|dz  }||k    r|
dz  }
n|t          k    r|t          k    r|dz  }||k    r|
dz  }
n|t          k    r|t          k    r|dz  }|                    |
|g|R            |                    d d	           |r;|d         }t          d
|d          d|d          d|d          d           |d         S dS )a  Match the closest font to the parameters specified.

        If a full match is not found, a secondary match will be found based on similar features. This can probably
        be improved, but it is possible you could get a different font style than expected.
        z(directwrite: full match found. (weight: z
, italic: z, stretch: )r   r   c                "    | d         | d         fS )Nr   r   r   )ftss    r   <lambda>z9Win32DirectWriteFont.match_closest_font.<locals>.<lambda>*  s    c!fc!f%5 r   T)r  reversez5directwrite: falling back to partial match. (weight: r   rl  r      N)rR  rA   r6   r0   r  sort)r  r  r   r  closestr  f_weightf_style	f_stretch	writefont
prop_matchsimilar_matchclosest_matchs                r   ry  z'Win32DirectWriteFont.match_closest_font  s     	@ 	@E8=5Xw	9 6!!g&7&7I<P<PsxssSZssgpsssu u u    JM 6!!a

444E^9^9^"&  a

333C[8[8[")##a

6669Hb;b;b"NNJ>>>???? 	55tDDD 	$#AJM r%21%5r rANqAQr r^klm^nr r r s s s ##tr   local_stringri   	list[str]c                   |                                  }g }t          |          D ]}t                      }t                              | |          }|                     |t          |                     |j        }t          |dz             }| 	                    ||t          |                     |                    |j                   |                                  |S )zOTakes IDWriteLocalizedStrings and unpacks the strings inside of it into a list.r   )GetCountr	  ry   rA  get_localized_indexGetStringLengthr   r   r	   	GetStringr  r  ra  )	r  r  str_array_lenr  _string_sizer  buffer_sizer  s	            r   ro  z,Win32DirectWriteFont.unpack_localized_string5  s     %--//}%% 	) 	)A ((K&::<PPC((eK.@.@AAA%+K*;?;;F""3F<<<NN6<((((r   r  c                *   t                      }t                      }|rt|                     |t          |          t          |                     |j        s5|                     dt          |          t          |                     |sdS |j        S dS )Nzen-usr   )ry   r   FindLocaleNamer   r   )r  r  r  r  s       r   r  z(Win32DirectWriteFont.get_localized_indexN  s    hh 
	""65::uV}}EEE< &&wc

E&MMJJJ 19qr   )r   FFNN)r  r   r   r   r  r   r   r  r  r  r  r  r  r  r   r   )r   r  r   r   )r  r   r  )r   r   r   r  )r)  r  r   r   )r   r   r   rl  )r   r   r   r  )r   r   r   rk   )r&  r'  r   r   )r&  r'  r6  r   r   r   )r&  r'  rF  r   r   rG  )
rF  r   r  r   r   r  r  r  r   rO  )r   r   r   r   )r&  r'  r  r   r   r  )
rF  r   r  r   r^  r   r  r   r   r_  )F)rh  r\   rF  r   r  r   r   r  r  r  ri  r  r   rj  )
r  r  r  r   r   r   r  r   r   rj  )r  ri   r  r   r   r  )r  ri   r  r   r   r   )0r   r   r   r$  r;  rM  r-  r0  r<  r2  r?  r4  r  r  _empty_glyphr  r?  glyph_renderer_classr  glGL_RGBAtexture_internalformatr   r  propertyr  r  ri  r  r  r  r$  r  classmethodr*  r5  rE  r  r  r[  r]  r&  rQ  rS  ry  ro  r  r'  r(  s   @r   rA  rA    s       11 NL MI #KMOLK3#Y.\a[_i? i? i? i? i? i? i?V   4 ' ' ' X'R    XI I I I I& & & &02 2 2 2(      >     Y Y Y [Y" _ _ _ [_. 7Y 7Y 7Y [7Yr " " " ["H    [:V V V V 7 7 7 [7 8 8 8 \88 O O O O \Ob / / / \/b    \0    \    r   rA  rn  r   r  )r   r^   r)  r*  r+  r   r   r,  )r   r^   r   ra   )T)r   ra   r   r  r   r  )
__future__r   rQ  r  ctypesr   r   r   r   r   r	   r
   r   r   r   ctypes.wintypesr   r   r   enumr   typingr   r   r   r  pyglet.fontr   pyglet.font.baser   r   pyglet.font.dwrite.d2d1_libr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   !pyglet.font.dwrite.d2d1_types_libr%   r&   pyglet.font.dwrite.dwrite_libr'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   pyglet.font.harfbuzzrt   ru   rv    pyglet.image.codecs.wincodec_librw   pyglet.libs.win32rx   ry   rz   r{   r|   r   pyglet.libs.win32.constantsr}   r~   r   r   pyglet.utilr   pyglet.imager   r  rr  rR  pyglet.image.codecsr   ImportErrorerrmsgr  r  r  r   r   	COMObjectr   r!  r  GlyphRendererr?  r   r   FontrA  rT  rD  r\  rY  redr^  r   r   r   <module>r     s	   " " " " " "   v v v v v v v v v v v v v v v v v v v v v v v v - - - - - - - - - -       4 4 4 4 4 4 4 4 4 4        1 1 1 1 1 1 1 1                              I H H H H H H HN N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N^ k j j j j j j j j j J J J J J J 9 9 9 9 9 9 9 9 9 9 9 9 3 3 3 3 3 3            $ # # # # # '&&&&&&n\*{<(($''''''' $ $ $
BC
+c

#$

!	$ 	
# #	
 0 0 % . ' ) ' , , # .  .!" %#$ &0'  , /99.7((5,7+  '(& 
! 
! 
! 
! 
!T 
! 
! 
!   l l l l l#- l l l^  !!	   2k[ k[ k[ k[ k[t1 k[ k[ k[\	   ' ' ' ' ',~
 ~
 ~
 ~
 ~
49 ~
 ~
 ~
B lnn8:JDRWRWXcRdRdeel3S#..S#sC((l3S#&&LA			s   ,E3 3F8FF