Merge branch 'miirefactor' into online

This commit is contained in:
PabloMK7 2023-07-31 11:03:07 +02:00
commit 6cc63061b1
2 changed files with 32 additions and 20 deletions

View File

@ -1,8 +1,12 @@
// Copyright 2023 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#include <boost/crc.hpp> #include <boost/crc.hpp>
#include "core/hle/mii.h" #include "core/hle/mii.h"
namespace Mii { namespace Mii {
u16 ChecksummedMiiData::CalcChecksum() { u16 ChecksummedMiiData::CalculateChecksum() {
// Calculate the checksum of the selected Mii, see https://www.3dbrew.org/wiki/Mii#Checksum // Calculate the checksum of the selected Mii, see https://www.3dbrew.org/wiki/Mii#Checksum
return boost::crc<16, 0x1021, 0, 0, false, false>(this, offsetof(ChecksummedMiiData, crc16)); return boost::crc<16, 0x1021, 0, 0, false, false>(this, offsetof(ChecksummedMiiData, crc16));
} }

View File

@ -1,3 +1,7 @@
// Copyright 2023 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#pragma once #pragma once
#include <boost/serialization/base_object.hpp> #include <boost/serialization/base_object.hpp>
@ -93,10 +97,10 @@ struct MiiData {
BitField<0, 6, u32> style; BitField<0, 6, u32> style;
BitField<6, 3, u32> color; BitField<6, 3, u32> color;
BitField<9, 4, u32> scale; BitField<9, 4, u32> scale;
BitField<13, 3, u32> yscale; BitField<13, 3, u32> y_scale;
BitField<16, 5, u32> rotation; BitField<16, 5, u32> rotation;
BitField<21, 4, u32> xspacing; BitField<21, 4, u32> x_spacing;
BitField<25, 5, u32> yposition; BitField<25, 5, u32> y_position;
} eye_details; } eye_details;
/// Eyebrow details /// Eyebrow details
@ -106,11 +110,11 @@ struct MiiData {
BitField<0, 5, u32> style; BitField<0, 5, u32> style;
BitField<5, 3, u32> color; BitField<5, 3, u32> color;
BitField<8, 4, u32> scale; BitField<8, 4, u32> scale;
BitField<12, 3, u32> yscale; BitField<12, 3, u32> y_scale;
BitField<15, 1, u32> pad; BitField<15, 1, u32> pad;
BitField<16, 5, u32> rotation; BitField<16, 5, u32> rotation;
BitField<21, 4, u32> xspacing; BitField<21, 4, u32> x_spacing;
BitField<25, 5, u32> yposition; BitField<25, 5, u32> y_position;
} eyebrow_details; } eyebrow_details;
/// Nose details /// Nose details
@ -119,7 +123,7 @@ struct MiiData {
BitField<0, 5, u16> style; BitField<0, 5, u16> style;
BitField<5, 4, u16> scale; BitField<5, 4, u16> scale;
BitField<9, 5, u16> yposition; BitField<9, 5, u16> y_position;
} nose_details; } nose_details;
/// Mouth details /// Mouth details
@ -129,7 +133,7 @@ struct MiiData {
BitField<0, 6, u16> style; BitField<0, 6, u16> style;
BitField<6, 3, u16> color; BitField<6, 3, u16> color;
BitField<9, 4, u16> scale; BitField<9, 4, u16> scale;
BitField<13, 3, u16> yscale; BitField<13, 3, u16> y_scale;
} mouth_details; } mouth_details;
/// Mustache details /// Mustache details
@ -148,7 +152,7 @@ struct MiiData {
BitField<0, 3, u16> style; BitField<0, 3, u16> style;
BitField<3, 3, u16> color; BitField<3, 3, u16> color;
BitField<6, 4, u16> scale; BitField<6, 4, u16> scale;
BitField<10, 5, u16> ypos; BitField<10, 5, u16> y_pos;
} beard_details; } beard_details;
/// Glasses details /// Glasses details
@ -158,7 +162,7 @@ struct MiiData {
BitField<0, 4, u16> style; BitField<0, 4, u16> style;
BitField<4, 3, u16> color; BitField<4, 3, u16> color;
BitField<7, 4, u16> scale; BitField<7, 4, u16> scale;
BitField<11, 5, u16> ypos; BitField<11, 5, u16> y_pos;
} glasses_details; } glasses_details;
/// Mole details /// Mole details
@ -167,8 +171,8 @@ struct MiiData {
BitField<0, 1, u16> enable; BitField<0, 1, u16> enable;
BitField<1, 5, u16> scale; BitField<1, 5, u16> scale;
BitField<6, 5, u16> xpos; BitField<6, 5, u16> x_pos;
BitField<11, 5, u16> ypos; BitField<11, 5, u16> y_pos;
} mole_details; } mole_details;
std::array<u16_le, 10> author_name; ///< Name of Mii's author (Encoded using UTF16) std::array<u16_le, 10> author_name; ///< Name of Mii's author (Encoded using UTF16)
@ -184,16 +188,23 @@ static_assert(sizeof(MiiData) == 0x5C, "MiiData structure has incorrect size");
static_assert(std::is_trivial_v<MiiData>, "MiiData must be trivial."); static_assert(std::is_trivial_v<MiiData>, "MiiData must be trivial.");
static_assert(std::is_trivially_copyable_v<MiiData>, "MiiData must be trivially copyable."); static_assert(std::is_trivially_copyable_v<MiiData>, "MiiData must be trivially copyable.");
class ChecksummedMiiData { struct ChecksummedMiiData {
private:
MiiData mii_data;
u16 padding;
u16_be crc16;
public: public:
ChecksummedMiiData& operator=(const MiiData& data) { ChecksummedMiiData& operator=(const MiiData& data) {
mii_data = data; mii_data = data;
padding = 0;
FixChecksum(); FixChecksum();
return *this; return *this;
} }
ChecksummedMiiData& operator=(MiiData&& data) { ChecksummedMiiData& operator=(MiiData&& data) {
mii_data = std::move(data); mii_data = std::move(data);
padding = 0;
FixChecksum(); FixChecksum();
return *this; return *this;
} }
@ -203,19 +214,16 @@ public:
} }
bool IsChecksumValid() { bool IsChecksumValid() {
return crc16 == CalcChecksum(); return crc16 == CalculateChecksum();
} }
u16 CalcChecksum(); u16 CalculateChecksum();
void FixChecksum() { void FixChecksum() {
crc16 = CalcChecksum(); crc16 = CalculateChecksum();
} }
private: private:
MiiData mii_data;
u32_be crc16;
template <class Archive> template <class Archive>
void serialize(Archive& ar, const unsigned int) { void serialize(Archive& ar, const unsigned int) {
ar& boost::serialization::make_binary_object(this, sizeof(ChecksummedMiiData)); ar& boost::serialization::make_binary_object(this, sizeof(ChecksummedMiiData));