[Xam/Locale] - Sketchy Implementation of XamGetLanguageTypefacePatch
- Sketchy Implementation of XamGetLanguageTypefacePatch
This commit is contained in:
committed by
Radosław Gliński
parent
d119505289
commit
d804cf828a
@@ -649,9 +649,10 @@ dword_result_t XamGetLanguageTypeface_entry(dword_t language,
|
|||||||
DECLARE_XAM_EXPORT1(XamGetLanguageTypeface, kNone, kImplemented);
|
DECLARE_XAM_EXPORT1(XamGetLanguageTypeface, kNone, kImplemented);
|
||||||
|
|
||||||
pointer_result_t XamGetLanguageTypefacePatch_entry(dword_t language) {
|
pointer_result_t XamGetLanguageTypefacePatch_entry(dword_t language) {
|
||||||
return 0;
|
assert_false(language >= static_cast<uint32_t>(XLanguage::kMaxLanguages));
|
||||||
|
return kernel_state()->xam_state()->GetLanguageTypefacePatch(language);
|
||||||
}
|
}
|
||||||
DECLARE_XAM_EXPORT1(XamGetLanguageTypefacePatch, kNone, kStub);
|
DECLARE_XAM_EXPORT1(XamGetLanguageTypefacePatch, kNone, kSketchy);
|
||||||
|
|
||||||
dword_result_t XamGetCountry_entry() {
|
dword_result_t XamGetCountry_entry() {
|
||||||
return kernel_state()->xconfig()->ReadSetting<uint32_t>(
|
return kernel_state()->xconfig()->ReadSetting<uint32_t>(
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ XamState::XamState(Emulator* emulator, KernelState* kernel_state)
|
|||||||
achievement_manager_ = std::make_unique<AchievementManager>();
|
achievement_manager_ = std::make_unique<AchievementManager>();
|
||||||
|
|
||||||
LoadLanguageLocaleFallback();
|
LoadLanguageLocaleFallback();
|
||||||
|
LoadLanguageTypefacePatch();
|
||||||
LoadIptvServiceName();
|
LoadIptvServiceName();
|
||||||
|
|
||||||
AppManager::RegisterApps(kernel_state, app_manager_.get());
|
AppManager::RegisterApps(kernel_state, app_manager_.get());
|
||||||
@@ -61,8 +62,53 @@ void XamState::LoadLanguageLocaleFallback() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void XamState::LoadLanguageTypefacePatch() {
|
||||||
|
const std::array<std::u16string, 7> patch_data = {
|
||||||
|
u"",
|
||||||
|
u"file://media:/XenonSCLatin.xttp2",
|
||||||
|
u"file://media:/XenonCLatin.xttp2",
|
||||||
|
u"file://media:/XenonJKLatin.xttp2",
|
||||||
|
u"file://media:/XenonSCLatin.xttp1",
|
||||||
|
u"file://media:/XenonCLatin.xttp1",
|
||||||
|
u"file://media:/XenonJKLatin.xttp1"};
|
||||||
|
|
||||||
|
constexpr uint32_t array_start = 0x80D10000;
|
||||||
|
|
||||||
|
if (kernel_state_->memory()
|
||||||
|
->LookupHeap(0x80000000)
|
||||||
|
->AllocFixed(array_start, 0x168, 0x1000, kMemoryAllocationCommit,
|
||||||
|
kMemoryProtectRead | kMemoryProtectWrite)) {
|
||||||
|
char16_t* ptr =
|
||||||
|
kernel_state_->memory()->TranslateVirtual<char16_t*>(array_start);
|
||||||
|
|
||||||
|
for (size_t i = 1; i < patch_data.size(); i++) {
|
||||||
|
language_type_face_patch_[i] =
|
||||||
|
kernel_state_->memory()->HostToGuestVirtual(ptr);
|
||||||
|
ptr += xe::string_util::copy_and_swap_truncating(
|
||||||
|
ptr, patch_data.at(i), patch_data.at(i).size() + 1) +
|
||||||
|
1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t XamState::GetLanguageTypefacePatch(uint32_t language) const {
|
||||||
|
// checks an out of bounds address to see if either a flag of 0x1000 or 0x2000
|
||||||
|
// is set. If first then use xttp1, if other use xttp2, else just return empty
|
||||||
|
// pointer. for now only usng xttp2
|
||||||
|
uint32_t index = 0;
|
||||||
|
if (language == 17) { // kSChinese
|
||||||
|
index = 1;
|
||||||
|
} else if (language == 8) { // kTChinese
|
||||||
|
index = 2;
|
||||||
|
} else {
|
||||||
|
index = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
return language_type_face_patch_[index];
|
||||||
|
}
|
||||||
|
|
||||||
void XamState::LoadIptvServiceName() {
|
void XamState::LoadIptvServiceName() {
|
||||||
constexpr uint32_t address = 0x80D10000;
|
constexpr uint32_t address = 0x80D20000;
|
||||||
|
|
||||||
if (kernel_state_->memory()
|
if (kernel_state_->memory()
|
||||||
->LookupHeap(0x80000000)
|
->LookupHeap(0x80000000)
|
||||||
|
|||||||
@@ -66,6 +66,8 @@ class XamState {
|
|||||||
return language_fallback_address_[index];
|
return language_fallback_address_[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t GetLanguageTypefacePatch(uint32_t language) const;
|
||||||
|
|
||||||
uint32_t GetIptvNameAddress() const { return iptv_name_address_; }
|
uint32_t GetIptvNameAddress() const { return iptv_name_address_; }
|
||||||
|
|
||||||
X_DASH_APP_INFO dash_app_info_ = {};
|
X_DASH_APP_INFO dash_app_info_ = {};
|
||||||
@@ -78,6 +80,7 @@ class XamState {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void LoadLanguageLocaleFallback();
|
void LoadLanguageLocaleFallback();
|
||||||
|
void LoadLanguageTypefacePatch();
|
||||||
void LoadIptvServiceName();
|
void LoadIptvServiceName();
|
||||||
|
|
||||||
KernelState* kernel_state_;
|
KernelState* kernel_state_;
|
||||||
@@ -92,6 +95,7 @@ class XamState {
|
|||||||
|
|
||||||
// Custom XAM stuff
|
// Custom XAM stuff
|
||||||
std::array<uint32_t, 0x12> language_fallback_address_{};
|
std::array<uint32_t, 0x12> language_fallback_address_{};
|
||||||
|
std::array<uint32_t, 0x7> language_type_face_patch_{};
|
||||||
uint32_t iptv_name_address_{};
|
uint32_t iptv_name_address_{};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user