summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/caps/caps_a.h
blob: 975c0ebdb6323b3abc35df76105bcee0d41d2b3d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// 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