summaryrefslogtreecommitdiffstats
path: root/src/core/loader
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/loader/loader.h47
-rw-r--r--src/core/loader/smdh.cpp54
-rw-r--r--src/core/loader/smdh.h82
3 files changed, 136 insertions, 47 deletions
diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h
index 39aedfeeb..77d87afe1 100644
--- a/src/core/loader/loader.h
+++ b/src/core/loader/loader.h
@@ -10,10 +10,8 @@
#include <string>
#include <vector>
-#include "common/common_funcs.h"
#include "common/common_types.h"
#include "common/file_util.h"
-#include "common/swap.h"
namespace Kernel {
struct AddressMapping;
@@ -80,51 +78,6 @@ constexpr u32 MakeMagic(char a, char b, char c, char d) {
return a | b << 8 | c << 16 | d << 24;
}
-/// 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
- };
-};
-static_assert(sizeof(SMDH) == 0x36C0, "SMDH structure size is wrong");
-
/// Interface for loading an application
class AppLoader : NonCopyable {
public:
diff --git a/src/core/loader/smdh.cpp b/src/core/loader/smdh.cpp
new file mode 100644
index 000000000..2d014054a
--- /dev/null
+++ b/src/core/loader/smdh.cpp
@@ -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
diff --git a/src/core/loader/smdh.h b/src/core/loader/smdh.h
new file mode 100644
index 000000000..2011abda2
--- /dev/null
+++ b/src/core/loader/smdh.h
@@ -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