Reduce requirements for running homebrew (#1053)
* Reduce requirements for running homebrews This commit change the following behaviours: - TimeZoneBinary system archive isn't required until guest code call LoadTimeZoneRule. - Fonts system archives aren't requred until a "pl:u" IPC call is made. - Custom font support was dropped. - TimeZoneBinary missing message is now an error and not a warning. * Address comments
This commit is contained in:
parent
f9c859c8ba
commit
8f21db810d
3 changed files with 32 additions and 31 deletions
|
@ -23,6 +23,7 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
private Dictionary<StorageId, LinkedList<LocationEntry>> _locationEntries;
|
private Dictionary<StorageId, LinkedList<LocationEntry>> _locationEntries;
|
||||||
|
|
||||||
private Dictionary<string, long> _sharedFontTitleDictionary;
|
private Dictionary<string, long> _sharedFontTitleDictionary;
|
||||||
|
private Dictionary<long, string> _systemTitlesNameDictionary;
|
||||||
private Dictionary<string, string> _sharedFontFilenameDictionary;
|
private Dictionary<string, string> _sharedFontFilenameDictionary;
|
||||||
|
|
||||||
private SortedDictionary<(ulong titleId, NcaContentType type), string> _contentDictionary;
|
private SortedDictionary<(ulong titleId, NcaContentType type), string> _contentDictionary;
|
||||||
|
@ -46,6 +47,16 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
{ "FontNintendoExtended", 0x0100000000000810 }
|
{ "FontNintendoExtended", 0x0100000000000810 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_systemTitlesNameDictionary = new Dictionary<long, string>()
|
||||||
|
{
|
||||||
|
{ 0x010000000000080E, "TimeZoneBinary" },
|
||||||
|
{ 0x0100000000000810, "FontNintendoExtension" },
|
||||||
|
{ 0x0100000000000811, "FontStandard" },
|
||||||
|
{ 0x0100000000000812, "FontKorean" },
|
||||||
|
{ 0x0100000000000813, "FontChineseTraditional" },
|
||||||
|
{ 0x0100000000000814, "FontChineseSimple" },
|
||||||
|
};
|
||||||
|
|
||||||
_sharedFontFilenameDictionary = new Dictionary<string, string>
|
_sharedFontFilenameDictionary = new Dictionary<string, string>
|
||||||
{
|
{
|
||||||
{ "FontStandard", "nintendo_udsg-r_std_003.bfttf" },
|
{ "FontStandard", "nintendo_udsg-r_std_003.bfttf" },
|
||||||
|
@ -344,6 +355,11 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
return _sharedFontFilenameDictionary.TryGetValue(fontName, out filename);
|
return _sharedFontFilenameDictionary.TryGetValue(fontName, out filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool TryGetSystemTitlesName(long titleId, out string name)
|
||||||
|
{
|
||||||
|
return _systemTitlesNameDictionary.TryGetValue(titleId, out name);
|
||||||
|
}
|
||||||
|
|
||||||
private LocationEntry GetLocation(long titleId, NcaContentType contentType, StorageId storageId)
|
private LocationEntry GetLocation(long titleId, NcaContentType contentType, StorageId storageId)
|
||||||
{
|
{
|
||||||
LinkedList<LocationEntry> locationList = _locationEntries[storageId];
|
LinkedList<LocationEntry> locationList = _locationEntries[storageId];
|
||||||
|
|
|
@ -2,9 +2,11 @@ using LibHac.Common;
|
||||||
using LibHac.Fs;
|
using LibHac.Fs;
|
||||||
using LibHac.FsSystem;
|
using LibHac.FsSystem;
|
||||||
using LibHac.FsSystem.NcaUtils;
|
using LibHac.FsSystem.NcaUtils;
|
||||||
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.HLE.Exceptions;
|
using Ryujinx.HLE.Exceptions;
|
||||||
using Ryujinx.HLE.FileSystem;
|
using Ryujinx.HLE.FileSystem;
|
||||||
using Ryujinx.HLE.FileSystem.Content;
|
using Ryujinx.HLE.FileSystem.Content;
|
||||||
|
using System;
|
||||||
using System.Buffers.Binary;
|
using System.Buffers.Binary;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
@ -19,8 +21,6 @@ namespace Ryujinx.HLE.HOS.Font
|
||||||
|
|
||||||
private long _physicalAddress;
|
private long _physicalAddress;
|
||||||
|
|
||||||
private string _fontsPath;
|
|
||||||
|
|
||||||
private struct FontInfo
|
private struct FontInfo
|
||||||
{
|
{
|
||||||
public int Offset;
|
public int Offset;
|
||||||
|
@ -38,10 +38,7 @@ namespace Ryujinx.HLE.HOS.Font
|
||||||
public SharedFontManager(Switch device, long physicalAddress)
|
public SharedFontManager(Switch device, long physicalAddress)
|
||||||
{
|
{
|
||||||
_physicalAddress = physicalAddress;
|
_physicalAddress = physicalAddress;
|
||||||
|
|
||||||
_device = device;
|
_device = device;
|
||||||
|
|
||||||
_fontsPath = Path.Combine(device.FileSystem.GetSystemPath(), "fonts");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialize(ContentManager contentManager)
|
public void Initialize(ContentManager contentManager)
|
||||||
|
@ -49,7 +46,6 @@ namespace Ryujinx.HLE.HOS.Font
|
||||||
_fontData?.Clear();
|
_fontData?.Clear();
|
||||||
_fontData = null;
|
_fontData = null;
|
||||||
|
|
||||||
EnsureInitialized(contentManager);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void EnsureInitialized(ContentManager contentManager)
|
public void EnsureInitialized(ContentManager contentManager)
|
||||||
|
@ -97,32 +93,19 @@ namespace Ryujinx.HLE.HOS.Font
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!contentManager.TryGetSystemTitlesName(fontTitle, out string titleName))
|
||||||
|
{
|
||||||
|
titleName = "Unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
string fontFilePath = Path.Combine(_fontsPath, name + ".ttf");
|
throw new InvalidSystemResourceException($"{titleName} ({fontTitle:x8}) system title not found! This font will not work, provide the system archive to fix this error. (See https://github.com/Ryujinx/Ryujinx#requirements for more information)");
|
||||||
|
|
||||||
if (File.Exists(fontFilePath))
|
|
||||||
{
|
|
||||||
byte[] data = File.ReadAllBytes(fontFilePath);
|
|
||||||
|
|
||||||
FontInfo info = new FontInfo((int)fontOffset, data.Length);
|
|
||||||
|
|
||||||
WriteMagicAndSize(_physicalAddress + fontOffset, data.Length);
|
|
||||||
|
|
||||||
fontOffset += 8;
|
|
||||||
|
|
||||||
uint start = fontOffset;
|
|
||||||
|
|
||||||
for (; fontOffset - start < data.Length; fontOffset++)
|
|
||||||
{
|
|
||||||
_device.Memory.WriteByte(_physicalAddress + fontOffset, data[fontOffset - start]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return info;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new InvalidSystemResourceException($"Font \"{name}.ttf\" not found. Please provide it in \"{_fontsPath}\".");
|
throw new ArgumentException($"Unknown font \"{name}\"!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,8 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
|
||||||
{
|
{
|
||||||
private const long TimeZoneBinaryTitleId = 0x010000000000080E;
|
private const long TimeZoneBinaryTitleId = 0x010000000000080E;
|
||||||
|
|
||||||
|
private readonly string TimeZoneSystemTitleMissingErrorMessage = "TimeZoneBinary system title not found! TimeZone conversions will not work, provide the system archive to fix this error. (See https://github.com/Ryujinx/Ryujinx#requirements for more information)";
|
||||||
|
|
||||||
private VirtualFileSystem _virtualFileSystem;
|
private VirtualFileSystem _virtualFileSystem;
|
||||||
private IntegrityCheckLevel _fsIntegrityCheckLevel;
|
private IntegrityCheckLevel _fsIntegrityCheckLevel;
|
||||||
private ContentManager _contentManager;
|
private ContentManager _contentManager;
|
||||||
|
@ -111,7 +113,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
|
||||||
{
|
{
|
||||||
LocationNameCache = new string[] { "UTC" };
|
LocationNameCache = new string[] { "UTC" };
|
||||||
|
|
||||||
Logger.PrintWarning(LogClass.ServiceTime, "TimeZoneBinary system title not found! TimeZone conversions will not work, provide the system archive to fix this warning. (See https://github.com/Ryujinx/Ryujinx#requirements for more informations)");
|
Logger.PrintError(LogClass.ServiceTime, TimeZoneSystemTitleMissingErrorMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,7 +188,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
|
||||||
timeZoneBinaryStream = null;
|
timeZoneBinaryStream = null;
|
||||||
ncaFile = null;
|
ncaFile = null;
|
||||||
|
|
||||||
if (!IsLocationNameValid(locationName))
|
if (!HasTimeZoneBinaryTitle() || !IsLocationNameValid(locationName))
|
||||||
{
|
{
|
||||||
return ResultCode.TimeZoneNotFound;
|
return ResultCode.TimeZoneNotFound;
|
||||||
}
|
}
|
||||||
|
@ -215,7 +217,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
|
||||||
|
|
||||||
if (!HasTimeZoneBinaryTitle())
|
if (!HasTimeZoneBinaryTitle())
|
||||||
{
|
{
|
||||||
throw new InvalidSystemResourceException($"TimeZoneBinary system title not found! Please provide it. (See https://github.com/Ryujinx/Ryujinx#requirements for more informations)");
|
throw new InvalidSystemResourceException(TimeZoneSystemTitleMissingErrorMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultCode result = GetTimeZoneBinary(locationName, out Stream timeZoneBinaryStream, out LocalStorage ncaFile);
|
ResultCode result = GetTimeZoneBinary(locationName, out Stream timeZoneBinaryStream, out LocalStorage ncaFile);
|
||||||
|
|
Loading…
Reference in a new issue