Browse Source
Loader: Split SMDH into its own header and import helpers from QGameList
Loader: Split SMDH into its own header and import helpers from QGameList
Also rewrite Qt wrappers to use those.nce_cpp
5 changed files with 149 additions and 89 deletions
-
53src/citra_qt/game_list_p.h
-
2src/core/CMakeLists.txt
-
47src/core/loader/loader.h
-
54src/core/loader/smdh.cpp
-
82src/core/loader/smdh.h
@ -0,0 +1,54 @@ |
|||||
|
// Copyright 2016 Citra Emulator Project
|
||||
|
// Licensed under GPLv2 or any later version
|
||||
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include <cstring>
|
||||
|
#include <vector>
|
||||
|
|
||||
|
#include "common/common_types.h"
|
||||
|
|
||||
|
#include "core/loader/loader.h"
|
||||
|
#include "core/loader/smdh.h"
|
||||
|
|
||||
|
#include "video_core/utils.h"
|
||||
|
|
||||
|
namespace Loader { |
||||
|
|
||||
|
bool IsValidSMDH(const std::vector<u8>& smdh_data) { |
||||
|
if (smdh_data.size() < sizeof(Loader::SMDH)) |
||||
|
return false; |
||||
|
|
||||
|
u32 magic; |
||||
|
memcpy(&magic, smdh_data.data(), sizeof(u32)); |
||||
|
|
||||
|
return Loader::MakeMagic('S', 'M', 'D', 'H') == magic; |
||||
|
} |
||||
|
|
||||
|
std::vector<u16> SMDH::GetIcon(bool large) const { |
||||
|
u32 size; |
||||
|
const u8* icon_data; |
||||
|
|
||||
|
if (large) { |
||||
|
size = 48; |
||||
|
icon_data = large_icon.data(); |
||||
|
} else { |
||||
|
size = 24; |
||||
|
icon_data = small_icon.data(); |
||||
|
} |
||||
|
|
||||
|
std::vector<u16> icon(size * size); |
||||
|
for (u32 x = 0; x < size; ++x) { |
||||
|
for (u32 y = 0; y < size; ++y) { |
||||
|
u32 coarse_y = y & ~7; |
||||
|
const u8* pixel = icon_data + VideoCore::GetMortonOffset(x, y, 2) + coarse_y * size * 2; |
||||
|
icon[x + size * y] = (pixel[1] << 8) + pixel[0]; |
||||
|
} |
||||
|
} |
||||
|
return icon; |
||||
|
} |
||||
|
|
||||
|
std::array<u16, 0x40> SMDH::GetShortTitle(Loader::SMDH::TitleLanguage language) const { |
||||
|
return titles[static_cast<int>(language)].short_title; |
||||
|
} |
||||
|
|
||||
|
} // namespace
|
||||
@ -0,0 +1,82 @@ |
|||||
|
// Copyright 2016 Citra Emulator Project |
||||
|
// Licensed under GPLv2 or any later version |
||||
|
// Refer to the license.txt file included. |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <array> |
||||
|
#include <vector> |
||||
|
|
||||
|
#include "common/common_funcs.h" |
||||
|
#include "common/common_types.h" |
||||
|
#include "common/swap.h" |
||||
|
|
||||
|
namespace Loader { |
||||
|
|
||||
|
/** |
||||
|
* Tests if data is a valid SMDH by its length and magic number. |
||||
|
* @param smdh_data data buffer to test |
||||
|
* @return bool test result |
||||
|
*/ |
||||
|
bool IsValidSMDH(const std::vector<u8>& smdh_data); |
||||
|
|
||||
|
/// SMDH data structure that contains titles, icons etc. See https://www.3dbrew.org/wiki/SMDH |
||||
|
struct SMDH { |
||||
|
u32_le magic; |
||||
|
u16_le version; |
||||
|
INSERT_PADDING_BYTES(2); |
||||
|
|
||||
|
struct Title { |
||||
|
std::array<u16, 0x40> short_title; |
||||
|
std::array<u16, 0x80> long_title; |
||||
|
std::array<u16, 0x40> publisher; |
||||
|
}; |
||||
|
std::array<Title, 16> titles; |
||||
|
|
||||
|
std::array<u8, 16> ratings; |
||||
|
u32_le region_lockout; |
||||
|
u32_le match_maker_id; |
||||
|
u64_le match_maker_bit_id; |
||||
|
u32_le flags; |
||||
|
u16_le eula_version; |
||||
|
INSERT_PADDING_BYTES(2); |
||||
|
float_le banner_animation_frame; |
||||
|
u32_le cec_id; |
||||
|
INSERT_PADDING_BYTES(8); |
||||
|
|
||||
|
std::array<u8, 0x480> small_icon; |
||||
|
std::array<u8, 0x1200> large_icon; |
||||
|
|
||||
|
/// indicates the language used for each title entry |
||||
|
enum class TitleLanguage { |
||||
|
Japanese = 0, |
||||
|
English = 1, |
||||
|
French = 2, |
||||
|
German = 3, |
||||
|
Italian = 4, |
||||
|
Spanish = 5, |
||||
|
SimplifiedChinese = 6, |
||||
|
Korean= 7, |
||||
|
Dutch = 8, |
||||
|
Portuguese = 9, |
||||
|
Russian = 10, |
||||
|
TraditionalChinese = 11 |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Gets game icon from SMDH |
||||
|
* @param large If true, returns large icon (48x48), otherwise returns small icon (24x24) |
||||
|
* @return vector of RGB565 data |
||||
|
*/ |
||||
|
std::vector<u16> GetIcon(bool large) const; |
||||
|
|
||||
|
/** |
||||
|
* Gets the short game title from SMDH |
||||
|
* @param language title language |
||||
|
* @return UTF-16 array of the short title |
||||
|
*/ |
||||
|
std::array<u16, 0x40> GetShortTitle(Loader::SMDH::TitleLanguage language) const; |
||||
|
}; |
||||
|
static_assert(sizeof(SMDH) == 0x36C0, "SMDH structure size is wrong"); |
||||
|
|
||||
|
} // namespace |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue