summaryrefslogblamecommitdiffstats
path: root/src/core/hle/service/caps/caps_a.h
blob: 975c0ebdb6323b3abc35df76105bcee0d41d2b3d (plain) (tree)
1
2
3
4
5
6
7
8

                                                               


            
                         

                                     



                

                            
                                                                                    
       
















































































































                                                                                                 


                               
// 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<IAlbumAccessorService> {
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<u8, 0x400> 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<u8> out_image, const std::filesystem::path& path, int width,
                     int height, ScreenShotDecoderFlag flag);

    bool is_mounted{};
    std::vector<std::filesystem::path> sd_image_paths{};
};

} // namespace Service::Capture