[XAM] Implemented XamGetLanguageLocaleFallbackString and XamGetLanguageTypeface
- Added stub XamGetLanguageTypefacePatch - Moved locale related calls to xam_locale from xam_info
This commit is contained in:
committed by
Radosław Gliński
parent
dc4db67f9c
commit
4c396fe611
@@ -17,8 +17,11 @@
|
||||
#include "xenia/kernel/xthread.h"
|
||||
#include "xenia/xbox.h"
|
||||
|
||||
DECLARE_int32(user_country);
|
||||
#include "third_party/fmt/include/fmt/format.h"
|
||||
#include "third_party/fmt/include/fmt/xchar.h"
|
||||
|
||||
DECLARE_int32(user_country);
|
||||
DECLARE_int32(user_language);
|
||||
// TODO(gibbed): put these forward decls in a header somewhere.
|
||||
|
||||
namespace xe {
|
||||
@@ -453,6 +456,126 @@ dword_result_t XamGetLocaleDateFormat_entry(dword_t locale) {
|
||||
|
||||
DECLARE_XAM_EXPORT1(XamGetLocaleDateFormat, kLocale, kImplemented);
|
||||
|
||||
void XamFormatDateString_entry(dword_t locale_format, qword_t filetime,
|
||||
lpvoid_t output_buffer, dword_t output_count) {
|
||||
output_buffer.Zero(output_count * sizeof(char16_t));
|
||||
|
||||
auto tp = xe::chrono::WinSystemClock::to_sys(
|
||||
xe::chrono::WinSystemClock::from_file_time(filetime));
|
||||
auto dp = date::floor<date::days>(tp);
|
||||
auto year_month_day = date::year_month_day{dp};
|
||||
|
||||
auto str = fmt::format(u"{:02d}/{:02d}/{}",
|
||||
static_cast<unsigned>(year_month_day.month()),
|
||||
static_cast<unsigned>(year_month_day.day()),
|
||||
static_cast<int>(year_month_day.year()));
|
||||
xe::string_util::copy_and_swap_truncating(output_buffer.as<char16_t*>(), str,
|
||||
output_count);
|
||||
}
|
||||
DECLARE_XAM_EXPORT1(XamFormatDateString, kNone, kImplemented);
|
||||
|
||||
void XamFormatTimeString_entry(dword_t user_index, qword_t filetime,
|
||||
lpvoid_t output_buffer, dword_t output_count) {
|
||||
output_buffer.Zero(output_count * sizeof(char16_t));
|
||||
|
||||
auto tp = xe::chrono::WinSystemClock::to_sys(
|
||||
xe::chrono::WinSystemClock::from_file_time(filetime));
|
||||
auto dp = date::floor<date::days>(tp);
|
||||
auto time = date::hh_mm_ss{date::floor<std::chrono::milliseconds>(tp - dp)};
|
||||
|
||||
auto str = fmt::format(u"{:02d}:{:02d}", time.hours().count(),
|
||||
time.minutes().count());
|
||||
xe::string_util::copy_and_swap_truncating(output_buffer.as<char16_t*>(), str,
|
||||
output_count);
|
||||
}
|
||||
DECLARE_XAM_EXPORT1(XamFormatTimeString, kNone, kImplemented);
|
||||
|
||||
uint32_t xeXGetGameRegion() {
|
||||
static uint32_t constexpr table[] = {
|
||||
0xFFFFu, 0x03FFu, 0x02FEu, 0x02FEu, 0x03FFu, 0x02FEu, 0x0201u, 0x03FFu,
|
||||
0x02FEu, 0x02FEu, 0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu, 0x02FEu, 0x03FFu,
|
||||
0x00FFu, 0xFFFFu, 0x02FEu, 0x03FFu, 0x0102u, 0x03FFu, 0x03FFu, 0x02FEu,
|
||||
0x02FEu, 0x02FEu, 0x03FFu, 0x03FFu, 0x03FFu, 0x02FEu, 0x03FFu, 0x02FEu,
|
||||
0x02FEu, 0x02FEu, 0x02FEu, 0x02FEu, 0x02FEu, 0x02FEu, 0x03FFu, 0x03FFu,
|
||||
0x03FFu, 0x02FEu, 0x02FEu, 0x03FFu, 0x02FEu, 0x02FEu, 0x03FFu, 0x03FFu,
|
||||
0x03FFu, 0x02FEu, 0x02FEu, 0x03FFu, 0x03FFu, 0x0101u, 0x03FFu, 0x03FFu,
|
||||
0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu, 0x02FEu, 0x02FEu, 0x02FEu, 0x02FEu,
|
||||
0x03FFu, 0x03FFu, 0x02FEu, 0x02FEu, 0x03FFu, 0x0102u, 0x03FFu, 0x00FFu,
|
||||
0x03FFu, 0x03FFu, 0x02FEu, 0x02FEu, 0x0201u, 0x03FFu, 0x03FFu, 0x03FFu,
|
||||
0x03FFu, 0x03FFu, 0x02FEu, 0x03FFu, 0x02FEu, 0x03FFu, 0x03FFu, 0x02FEu,
|
||||
0x02FEu, 0x03FFu, 0x02FEu, 0x03FFu, 0x02FEu, 0x02FEu, 0xFFFFu, 0x03FFu,
|
||||
0x03FFu, 0x03FFu, 0x03FFu, 0x02FEu, 0x03FFu, 0x03FFu, 0x02FEu, 0x00FFu,
|
||||
0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu};
|
||||
auto country = static_cast<uint8_t>(cvars::user_country);
|
||||
return country < xe::countof(table) ? table[country] : 0xFFFFu;
|
||||
}
|
||||
|
||||
dword_result_t XGetGameRegion_entry() { return xeXGetGameRegion(); }
|
||||
DECLARE_XAM_EXPORT1(XGetGameRegion, kNone, kStub);
|
||||
|
||||
XLanguage xeGetLanguage(bool extended_languages_support) {
|
||||
auto desired_language = static_cast<XLanguage>(cvars::user_language);
|
||||
uint32_t region = xeXGetGameRegion();
|
||||
auto max_languages = extended_languages_support ? XLanguage::kMaxLanguages
|
||||
: XLanguage::kSChinese;
|
||||
if (desired_language < max_languages) {
|
||||
return desired_language;
|
||||
}
|
||||
if ((region & 0xff00) != 0x100) {
|
||||
return XLanguage::kEnglish;
|
||||
}
|
||||
switch (region) {
|
||||
case 0x101: // NTSC-J (Japan)
|
||||
return XLanguage::kJapanese;
|
||||
case 0x102: // NTSC-J (China)
|
||||
return extended_languages_support ? XLanguage::kSChinese
|
||||
: XLanguage::kEnglish;
|
||||
default:
|
||||
return XLanguage::kKorean;
|
||||
}
|
||||
}
|
||||
|
||||
dword_result_t XGetLanguage_entry() {
|
||||
return static_cast<uint32_t>(xeGetLanguage(false));
|
||||
}
|
||||
DECLARE_XAM_EXPORT1(XGetLanguage, kNone, kImplemented);
|
||||
|
||||
dword_result_t XamGetLanguage_entry() {
|
||||
return static_cast<uint32_t>(xeGetLanguage(true));
|
||||
}
|
||||
DECLARE_XAM_EXPORT1(XamGetLanguage, kNone, kImplemented);
|
||||
|
||||
pointer_result_t XamGetLanguageLocaleFallbackString_entry(dword_t language) {
|
||||
assert_false(language > 17);
|
||||
return kernel_state()->xam_state()->GetLanguageFallbackAddress(language);
|
||||
}
|
||||
DECLARE_XAM_EXPORT1(XamGetLanguageLocaleFallbackString, kNone, kImplemented);
|
||||
|
||||
dword_result_t XamGetLanguageTypeface_entry(dword_t language,
|
||||
dword_t buffer_size,
|
||||
dword_t buffer) {
|
||||
std::u16string path{};
|
||||
|
||||
if (language == 0x11) {
|
||||
path = u"file://media:/XenonSCLatin.xtt";
|
||||
} else if (language == 8) {
|
||||
path = u"file://media:/XenonCLatin.xtt";
|
||||
} else {
|
||||
path = u"file://media:/XenonJKLatin.xtt";
|
||||
}
|
||||
xe::string_util::copy_and_swap_truncating(
|
||||
kernel_state()->memory()->TranslateVirtual<char16_t*>(buffer), path,
|
||||
path.size() + 1);
|
||||
|
||||
return X_STATUS_SUCCESS;
|
||||
}
|
||||
DECLARE_XAM_EXPORT1(XamGetLanguageTypeface, kNone, kImplemented);
|
||||
|
||||
pointer_result_t XamGetLanguageTypefacePatch_entry(dword_t language) {
|
||||
return 0;
|
||||
}
|
||||
DECLARE_XAM_EXPORT1(XamGetLanguageTypefacePatch, kNone, kStub);
|
||||
|
||||
} // namespace xam
|
||||
} // namespace kernel
|
||||
} // namespace xe
|
||||
|
||||
Reference in New Issue
Block a user