mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Use open source Shared Font if no dumped file is available (#3881)
* Add virtual SharedFont; Load if dumped is missing * Move open_source_archives to externals; add readme and git hash to open_source_archives * Updated shared font to newest version: m fixed, symbols fixed
This commit is contained in:
		
							parent
							
								
									7fa2076918
								
							
						
					
					
						commit
						7f1303a834
					
				
					 8 changed files with 92587 additions and 1 deletions
				
			
		|  | @ -416,7 +416,7 @@ add_library(core STATIC | |||
| create_target_directory_groups(core) | ||||
| 
 | ||||
| target_link_libraries(core PUBLIC common PRIVATE audio_core network video_core) | ||||
| target_link_libraries(core PUBLIC Boost::boost PRIVATE cryptopp fmt) | ||||
| target_link_libraries(core PUBLIC Boost::boost PRIVATE cryptopp fmt open_source_archives) | ||||
| if (ENABLE_WEB_SERVICE) | ||||
|     target_link_libraries(core PUBLIC json-headers web_service) | ||||
| endif() | ||||
|  |  | |||
|  | @ -19,6 +19,7 @@ | |||
| #include "core/hle/service/am/am.h" | ||||
| #include "core/hle/service/fs/archive.h" | ||||
| #include "core/loader/loader.h" | ||||
| #include "shared_font.app.romfs.h" | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
|  | @ -102,6 +103,7 @@ ResultVal<std::unique_ptr<FileBackend>> NCCHArchive::OpenFile(const Path& path, | |||
|         constexpr u32 mii_data = 0x00010202; | ||||
|         constexpr u32 region_manifest = 0x00010402; | ||||
|         constexpr u32 ng_word_list = 0x00010302; | ||||
|         constexpr u32 shared_font = 0x00014002; | ||||
| 
 | ||||
|         u32 high = static_cast<u32>(title_id >> 32); | ||||
|         u32 low = static_cast<u32>(title_id & 0xFFFFFFFF); | ||||
|  | @ -115,6 +117,20 @@ ResultVal<std::unique_ptr<FileBackend>> NCCHArchive::OpenFile(const Path& path, | |||
|                 archive_name = "Mii Data"; | ||||
|             else if (low == region_manifest) | ||||
|                 archive_name = "Region manifest"; | ||||
|             else if (low == shared_font) { | ||||
|                 LOG_WARNING( | ||||
|                     Service_FS, | ||||
|                     "Shared Font file missing. Loading open source replacement from memory"); | ||||
|                 std::vector<u8> shared_font_file; | ||||
|                 shared_font_file.assign(SHARED_FONT_DATA, SHARED_FONT_DATA + SHARED_FONT_DATA_len); | ||||
|                 u64 romfs_offset = 0; | ||||
|                 u64 romfs_size = shared_font_file.size(); | ||||
|                 std::unique_ptr<DelayGenerator> delay_generator = | ||||
|                     std::make_unique<RomFSDelayGenerator>(); | ||||
|                 file = std::make_unique<IVFCFileInMemory>(std::move(shared_font_file), romfs_offset, | ||||
|                                                           romfs_size, std::move(delay_generator)); | ||||
|                 return MakeResult<std::unique_ptr<FileBackend>>(std::move(file)); | ||||
|             } | ||||
|         } else if (high == system_data_archive) { | ||||
|             if (low == ng_word_list) | ||||
|                 archive_name = "NG bad word list"; | ||||
|  |  | |||
|  | @ -115,4 +115,36 @@ bool IVFCFile::SetSize(const u64 size) const { | |||
|     return false; | ||||
| } | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| IVFCFileInMemory::IVFCFileInMemory(std::vector<u8> bytes, u64 offset, u64 size, | ||||
|                                    std::unique_ptr<DelayGenerator> delay_generator_) | ||||
|     : romfs_file(std::move(bytes)), data_offset(offset), data_size(size) { | ||||
|     delay_generator = std::move(delay_generator_); | ||||
| } | ||||
| 
 | ||||
| ResultVal<size_t> IVFCFileInMemory::Read(const u64 offset, const size_t length, u8* buffer) const { | ||||
|     LOG_TRACE(Service_FS, "called offset={}, length={}", offset, length); | ||||
|     size_t read_length = (size_t)std::min((u64)length, data_size - offset); | ||||
| 
 | ||||
|     std::memcpy(buffer, romfs_file.data() + data_offset + offset, read_length); | ||||
|     return MakeResult<size_t>(read_length); | ||||
| } | ||||
| 
 | ||||
| ResultVal<size_t> IVFCFileInMemory::Write(const u64 offset, const size_t length, const bool flush, | ||||
|                                           const u8* buffer) { | ||||
|     LOG_ERROR(Service_FS, "Attempted to write to IVFC file"); | ||||
|     // TODO(Subv): Find error code
 | ||||
|     return MakeResult<size_t>(0); | ||||
| } | ||||
| 
 | ||||
| u64 IVFCFileInMemory::GetSize() const { | ||||
|     return data_size; | ||||
| } | ||||
| 
 | ||||
| bool IVFCFileInMemory::SetSize(const u64 size) const { | ||||
|     LOG_ERROR(Service_FS, "Attempted to set the size of an IVFC file"); | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ | |||
| #include <cstddef> | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include "common/common_types.h" | ||||
| #include "common/file_util.h" | ||||
| #include "core/file_sys/archive_backend.h" | ||||
|  | @ -118,4 +119,24 @@ public: | |||
|     } | ||||
| }; | ||||
| 
 | ||||
| class IVFCFileInMemory : public FileBackend { | ||||
| public: | ||||
|     IVFCFileInMemory(std::vector<u8> bytes, u64 offset, u64 size, | ||||
|                      std::unique_ptr<DelayGenerator> delay_generator_); | ||||
| 
 | ||||
|     ResultVal<size_t> Read(u64 offset, size_t length, u8* buffer) const override; | ||||
|     ResultVal<size_t> Write(u64 offset, size_t length, bool flush, const u8* buffer) override; | ||||
|     u64 GetSize() const override; | ||||
|     bool SetSize(u64 size) const override; | ||||
|     bool Close() const override { | ||||
|         return false; | ||||
|     } | ||||
|     void Flush() const override {} | ||||
| 
 | ||||
| private: | ||||
|     std::vector<u8> romfs_file; | ||||
|     u64 data_offset; | ||||
|     u64 data_size; | ||||
| }; | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue