@@ -40,10 +40,12 @@ typedef HGDIOBJ WINAPI SelectObject_type(
4040
4141DETOUR_CHAIN_DEF (CreateCompatibleDC);
4242W32U8_DETOUR_CHAIN_DEF (CreateFont);
43+ W32U8_DETOUR_CHAIN_DEF (GetTextExtentPoint32);
4344DETOUR_CHAIN_DEF (DeleteObject);
4445DETOUR_CHAIN_DEF (SelectObject);
4546W32U8_DETOUR_CHAIN_DEF (TextOut);
4647auto chain_TextOutW = TextOutW;
48+ auto chain_GetTextExtentPoint32W = GetTextExtentPoint32W;
4749// / -------------
4850
4951// / TH06-TH09 font cache
@@ -669,7 +671,7 @@ size_t GetTextExtentBase(HDC hdc, const json_t *str_obj)
669671 SIZE size = {0 };
670672 const char *str = json_string_value (str_obj);
671673 const size_t str_len = json_string_length (str_obj);
672- GetTextExtentPoint32 (hdc, str, str_len, &size);
674+ chain_GetTextExtentPoint32U (hdc, str, str_len, &size);
673675 return size.cx ;
674676}
675677
@@ -682,6 +684,40 @@ size_t TH_STDCALL text_extent_full(const char *str)
682684 return lay.cur_x ;
683685}
684686
687+ BOOL layout_GetTextExtentPoint32A (HDC hdc, LPCSTR lpString, int c, LPSIZE psizl) {
688+ layout_state_t lay = { hdc };
689+
690+ BOOL ret1 = chain_GetTextExtentPoint32U (hdc, lpString, c, psizl);
691+ if (!ret1) {
692+ return FALSE ;
693+ }
694+
695+ layout_process (&lay, NULL , lpString, c);
696+ psizl->cx = lay.cur_x ;
697+
698+ return TRUE ;
699+ }
700+
701+ BOOL layout_GetTextExtentPoint32W (HDC hdc, LPCWSTR lpString, int c, LPSIZE psizl) {
702+ BOOL ret1 = chain_GetTextExtentPoint32W (hdc, lpString, c, psizl);
703+ if (!ret1) {
704+ return FALSE ;
705+ }
706+
707+ size_t lpString_len = c * UTF8_MUL + 1 ;
708+ VLA (char , lpString_utf8, lpString_len);
709+ size_t lpString_utf8_c = StringToUTF8 (lpString_utf8, lpString, lpString_len);
710+
711+ layout_state_t lay = { hdc };
712+
713+ layout_process (&lay, NULL , lpString_utf8, lpString_utf8_c);
714+ psizl->cx = lay.cur_x ;
715+
716+ UTF8_FREE (lpString);
717+
718+ return TRUE ;
719+ }
720+
685721size_t TH_STDCALL text_extent_full_for_font (const char *str, HFONT font)
686722{
687723 // TH08 doesn't create the DC prior to the first binhacked call of this.
@@ -798,6 +834,9 @@ void layout_mod_detour(void)
798834 " DeleteObject" , fontcache_DeleteObject, &chain_DeleteObject,
799835 " TextOutA" , layout_TextOutU, &chain_TextOutU,
800836 " TextOutW" , layout_TextOutW, &chain_TextOutW,
837+
838+ " GetTextExtentPoint32W" , layout_GetTextExtentPoint32W, &chain_GetTextExtentPoint32W,
839+ " GetTextExtentPoint32A" , layout_GetTextExtentPoint32A, &chain_GetTextExtentPoint32U,
801840 NULL
802841 );
803842
0 commit comments