Sfoglia il codice sorgente

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
Thog 6 anni fa
parent
commit
8f21db810d

+ 16 - 0
Ryujinx.HLE/FileSystem/Content/ContentManager.cs

@@ -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];

+ 11 - 28
Ryujinx.HLE/HOS/Font/SharedFontManager.cs

@@ -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;
-
-            _fontsPath = Path.Combine(device.FileSystem.GetSystemPath(), "fonts");
+            _device          = device;
         }
         }
 
 
         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;
                         }
                         }
-                    }
-
-                    string fontFilePath = Path.Combine(_fontsPath, name + ".ttf");
-
-                    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++)
+                        else
                         {
                         {
-                            _device.Memory.WriteByte(_physicalAddress + fontOffset, data[fontOffset - start]);
-                        }
+                            if (!contentManager.TryGetSystemTitlesName(fontTitle, out string titleName))
+                            {
+                                titleName = "Unknown";
+                            }
 
 
-                        return info;
+                            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)");
+                        }
                     }
                     }
                     else
                     else
                     {
                     {
-                        throw new InvalidSystemResourceException($"Font \"{name}.ttf\" not found. Please provide it in \"{_fontsPath}\".");
+                        throw new ArgumentException($"Unknown font \"{name}\"!");
                     }
                     }
                 }
                 }
 
 

+ 5 - 3
Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneContentManager.cs

@@ -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);