mii_selector.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright 2016 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include "common/common_funcs.h"
  6. #include "common/common_types.h"
  7. #include "core/hle/applets/applet.h"
  8. #include "core/hle/kernel/kernel.h"
  9. #include "core/hle/kernel/shared_memory.h"
  10. #include "core/hle/result.h"
  11. #include "core/hle/service/apt/apt.h"
  12. namespace HLE {
  13. namespace Applets {
  14. struct MiiConfig {
  15. u8 cancel_button_flag;
  16. u8 enable_guest_mii_flag;
  17. u8 show_on_top_screen_flag;
  18. INSERT_PADDING_BYTES(5);
  19. u16 title[0x40];
  20. INSERT_PADDING_BYTES(4);
  21. u8 show_guest_miis_flag;
  22. INSERT_PADDING_BYTES(3);
  23. u32 initially_selected_mii_index;
  24. u8 guest_mii_whitelist[6];
  25. u8 user_mii_whitelist[0x64];
  26. INSERT_PADDING_BYTES(2);
  27. u32 magic_value;
  28. };
  29. static_assert(sizeof(MiiConfig) == 0x104, "MiiConfig structure has incorrect size");
  30. #define ASSERT_REG_POSITION(field_name, position) \
  31. static_assert(offsetof(MiiConfig, field_name) == position, \
  32. "Field " #field_name " has invalid position")
  33. ASSERT_REG_POSITION(title, 0x08);
  34. ASSERT_REG_POSITION(show_guest_miis_flag, 0x8C);
  35. ASSERT_REG_POSITION(initially_selected_mii_index, 0x90);
  36. ASSERT_REG_POSITION(guest_mii_whitelist, 0x94);
  37. #undef ASSERT_REG_POSITION
  38. struct MiiResult {
  39. u32 return_code;
  40. u32 guest_mii_selected_flag;
  41. u32 selected_guest_mii_index;
  42. // TODO(mailwl): expand to Mii Format structure: https://www.3dbrew.org/wiki/Mii
  43. u8 selected_mii_data[0x5C];
  44. INSERT_PADDING_BYTES(2);
  45. u16 mii_data_checksum;
  46. u16 guest_mii_name[0xC];
  47. };
  48. static_assert(sizeof(MiiResult) == 0x84, "MiiResult structure has incorrect size");
  49. #define ASSERT_REG_POSITION(field_name, position) \
  50. static_assert(offsetof(MiiResult, field_name) == position, \
  51. "Field " #field_name " has invalid position")
  52. ASSERT_REG_POSITION(selected_mii_data, 0x0C);
  53. ASSERT_REG_POSITION(guest_mii_name, 0x6C);
  54. #undef ASSERT_REG_POSITION
  55. class MiiSelector final : public Applet {
  56. public:
  57. MiiSelector(Service::APT::AppletId id) : Applet(id) {}
  58. ResultCode ReceiveParameter(const Service::APT::MessageParameter& parameter) override;
  59. ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) override;
  60. void Update() override;
  61. private:
  62. /// This SharedMemory will be created when we receive the LibAppJustStarted message.
  63. /// It holds the framebuffer info retrieved by the application with
  64. /// GSPGPU::ImportDisplayCaptureInfo
  65. Kernel::SharedPtr<Kernel::SharedMemory> framebuffer_memory;
  66. MiiConfig config;
  67. };
  68. } // namespace Applets
  69. } // namespace HLE