// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include "common/fs/fs.h" #include "core/hle/service/service.h" namespace Core { class System; } namespace Service::Capture { class IAlbumAccessorService final : public ServiceFramework { public: explicit IAlbumAccessorService(Core::System& system_); ~IAlbumAccessorService() override; private: enum class ContentType : u8 { Screenshot, Movie, ExtraMovie, }; enum class AlbumStorage : u8 { Nand, Sd, }; enum class ScreenShotDecoderFlag : u64 { None = 0, EnableFancyUpsampling = 1 << 0, EnableBlockSmoothing = 1 << 1, }; enum class ScreenShotOrientation : u32 { None, Rotate90, Rotate180, Rotate270, }; struct ScreenShotAttribute { u32 unknown_0; ScreenShotOrientation orientation; u32 unknown_1; u32 unknown_2; INSERT_PADDING_BYTES(0x30); }; static_assert(sizeof(ScreenShotAttribute) == 0x40, "ScreenShotAttribute is an invalid size"); struct ScreenShotDecodeOption { ScreenShotDecoderFlag flags; INSERT_PADDING_BYTES(0x18); }; static_assert(sizeof(ScreenShotDecodeOption) == 0x20, "ScreenShotDecodeOption is an invalid size"); struct AlbumFileDateTime { u16 year; u8 month; u8 day; u8 hour; u8 minute; u8 second; u8 unique_id; }; static_assert(sizeof(AlbumFileDateTime) == 0x8, "AlbumFileDateTime is an invalid size"); struct AlbumFileId { u64 application_id; AlbumFileDateTime date; AlbumStorage storage; ContentType type; INSERT_PADDING_BYTES(0x5); u8 unknown; }; static_assert(sizeof(AlbumFileId) == 0x18, "AlbumFileId is an invalid size"); struct AlbumEntry { u64 entry_size; AlbumFileId file_id; }; static_assert(sizeof(AlbumEntry) == 0x20, "AlbumEntry is an invalid size"); struct ApplicationData { std::array data; u32 data_size; }; static_assert(sizeof(ApplicationData) == 0x404, "ApplicationData is an invalid size"); struct LoadAlbumScreenShotImageOutput { s64 width; s64 height; ScreenShotAttribute attribute; INSERT_PADDING_BYTES(0x400); }; static_assert(sizeof(LoadAlbumScreenShotImageOutput) == 0x450, "LoadAlbumScreenShotImageOutput is an invalid size"); struct LoadAlbumScreenShotImageOutputForApplication { s64 width; s64 height; ScreenShotAttribute attribute; ApplicationData data; INSERT_PADDING_BYTES(0xAC); }; static_assert(sizeof(LoadAlbumScreenShotImageOutputForApplication) == 0x500, "LoadAlbumScreenShotImageOutput is an invalid size"); void DeleteAlbumFile(HLERequestContext& ctx); void IsAlbumMounted(HLERequestContext& ctx); void Unknown18(HLERequestContext& ctx); void GetAlbumFileListEx0(HLERequestContext& ctx); void GetAutoSavingStorage(HLERequestContext& ctx); void LoadAlbumScreenShotImageEx1(HLERequestContext& ctx); void LoadAlbumScreenShotThumbnailImageEx1(HLERequestContext& ctx); private: void FindScreenshots(); Result GetAlbumEntry(AlbumEntry& out_entry, const std::filesystem::path& path); Result LoadImage(std::span out_image, const std::filesystem::path& path, int width, int height, ScreenShotDecoderFlag flag); bool is_mounted{}; std::vector sd_image_paths{}; }; } // namespace Service::Capture