diff options
| author | Ac_K <Acoustik666@gmail.com> | 2021-03-26 01:16:08 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-26 01:16:08 +0100 |
| commit | 32be8caa9d37471947e5d75f953f8fda7a3e1943 (patch) | |
| tree | cac2c6ae27e789963d12c168f4368211daf2dcf0 /Ryujinx.HLE/HOS/Services/Caps/IScreenShotApplicationService.cs | |
| parent | 4bd1ad16f93e8decf790191868690c3bd3875ee0 (diff) | |
caps: Implement SaveScreenShot calls and cleanup (#2140)
* caps: Implement SaveScreenShot calls and cleanup
This PR implement:
- caps:u IAlbumApplicationService (32) SetShimLibraryVersion
- caps:c IAlbumControlService (33) SetShimLibraryVersion
- caps:su IScreenShotApplicationService (32) SetShimLibraryVersion
- caps:su IScreenShotApplicationService (203/205/210) SaveScreenShotEx0/SaveScreenShotEx1/SaveScreenShotEx2
ImageSharp is used to save the raw screenshot data as a JPG file following what the service does.
All screenshots are save in: `%AppData%\Ryujinx\sdcard\Nintendo\Album` folder. (as example a screenshot file path will be `%AppData%\Ryujinx\sdcard\Nintendo\Album\2021\03\26\2021032601020300-0123456789ABCDEF0123456789ABCDEF.jpg`
This is needed by Animal Crossing: New Horizon where screenshots looks like this:
And this is needed in Monster Hunter Rise but screenshots are currently empty due to another issue.
* remove useless comment
* Addresses gdkchan feedback
* Addresses gdkchan feedback 2
* remove useless comment 2
* Fix nits
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Caps/IScreenShotApplicationService.cs')
| -rw-r--r-- | Ryujinx.HLE/HOS/Services/Caps/IScreenShotApplicationService.cs | 84 |
1 files changed, 80 insertions, 4 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Caps/IScreenShotApplicationService.cs b/Ryujinx.HLE/HOS/Services/Caps/IScreenShotApplicationService.cs index 36bdb9f5..3824e7a3 100644 --- a/Ryujinx.HLE/HOS/Services/Caps/IScreenShotApplicationService.cs +++ b/Ryujinx.HLE/HOS/Services/Caps/IScreenShotApplicationService.cs @@ -1,4 +1,5 @@ -using Ryujinx.Common.Logging; +using Ryujinx.Common; +using Ryujinx.HLE.HOS.Services.Caps.Types; namespace Ryujinx.HLE.HOS.Services.Caps { @@ -11,12 +12,87 @@ namespace Ryujinx.HLE.HOS.Services.Caps // SetShimLibraryVersion(pid, u64, nn::applet::AppletResourceUserId) public ResultCode SetShimLibraryVersion(ServiceCtx context) { - ulong shimLibraryVersion = context.RequestData.ReadUInt64(); + return context.Device.System.CaptureManager.SetShimLibraryVersion(context); + } + + [Command(203)] + // SaveScreenShotEx0(bytes<0x40> ScreenShotAttribute, u32 unknown, u64 AppletResourceUserId, pid, buffer<bytes, 0x45> ScreenshotData) -> bytes<0x20> ApplicationAlbumEntry + public ResultCode SaveScreenShotEx0(ServiceCtx context) + { + // TODO: Use the ScreenShotAttribute. + ScreenShotAttribute screenShotAttribute = context.RequestData.ReadStruct<ScreenShotAttribute>(); + + uint unknown = context.RequestData.ReadUInt32(); + ulong appletResourceUserId = context.RequestData.ReadUInt64(); + ulong pidPlaceholder = context.RequestData.ReadUInt64(); + + long screenshotDataPosition = context.Request.SendBuff[0].Position; + long screenshotDataSize = context.Request.SendBuff[0].Size; + + byte[] screenshotData = context.Memory.GetSpan((ulong)screenshotDataPosition, (int)screenshotDataSize, true).ToArray(); + + ResultCode resultCode = context.Device.System.CaptureManager.SaveScreenShot(screenshotData, appletResourceUserId, context.Device.Application.TitleId, out ApplicationAlbumEntry applicationAlbumEntry); + + context.ResponseData.WriteStruct(applicationAlbumEntry); + + return resultCode; + } + + [Command(205)] // 8.0.0+ + // SaveScreenShotEx1(bytes<0x40> ScreenShotAttribute, u32 unknown, u64 AppletResourceUserId, pid, buffer<bytes, 0x15> ApplicationData, buffer<bytes, 0x45> ScreenshotData) -> bytes<0x20> ApplicationAlbumEntry + public ResultCode SaveScreenShotEx1(ServiceCtx context) + { + // TODO: Use the ScreenShotAttribute. + ScreenShotAttribute screenShotAttribute = context.RequestData.ReadStruct<ScreenShotAttribute>(); + + uint unknown = context.RequestData.ReadUInt32(); ulong appletResourceUserId = context.RequestData.ReadUInt64(); + ulong pidPlaceholder = context.RequestData.ReadUInt64(); + + long applicationDataPosition = context.Request.SendBuff[0].Position; + long applicationDataSize = context.Request.SendBuff[0].Size; + + long screenshotDataPosition = context.Request.SendBuff[1].Position; + long screenshotDataSize = context.Request.SendBuff[1].Size; + + // TODO: Parse the application data: At 0x00 it's UserData (Size of 0x400), at 0x404 it's a uint UserDataSize (Always empty for now). + byte[] applicationData = context.Memory.GetSpan((ulong)applicationDataPosition, (int)applicationDataSize).ToArray(); + + byte[] screenshotData = context.Memory.GetSpan((ulong)screenshotDataPosition, (int)screenshotDataSize, true).ToArray(); + + ResultCode resultCode = context.Device.System.CaptureManager.SaveScreenShot(screenshotData, appletResourceUserId, context.Device.Application.TitleId, out ApplicationAlbumEntry applicationAlbumEntry); + + context.ResponseData.WriteStruct(applicationAlbumEntry); + + return resultCode; + } + + [Command(210)] + // SaveScreenShotEx2(bytes<0x40> ScreenShotAttribute, u32 unknown, u64 AppletResourceUserId, buffer<bytes, 0x15> UserIdList, buffer<bytes, 0x45> ScreenshotData) -> bytes<0x20> ApplicationAlbumEntry + public ResultCode SaveScreenShotEx2(ServiceCtx context) + { + // TODO: Use the ScreenShotAttribute. + ScreenShotAttribute screenShotAttribute = context.RequestData.ReadStruct<ScreenShotAttribute>(); + + uint unknown = context.RequestData.ReadUInt32(); + ulong appletResourceUserId = context.RequestData.ReadUInt64(); + + long userIdListPosition = context.Request.SendBuff[0].Position; + long userIdListSize = context.Request.SendBuff[0].Size; + + long screenshotDataPosition = context.Request.SendBuff[1].Position; + long screenshotDataSize = context.Request.SendBuff[1].Size; + + // TODO: Parse the UserIdList. + byte[] userIdList = context.Memory.GetSpan((ulong)userIdListPosition, (int)userIdListSize).ToArray(); + + byte[] screenshotData = context.Memory.GetSpan((ulong)screenshotDataPosition, (int)screenshotDataSize, true).ToArray(); + + ResultCode resultCode = context.Device.System.CaptureManager.SaveScreenShot(screenshotData, appletResourceUserId, context.Device.Application.TitleId, out ApplicationAlbumEntry applicationAlbumEntry); - Logger.Stub?.PrintStub(LogClass.ServiceCaps, new { shimLibraryVersion, appletResourceUserId }); + context.ResponseData.WriteStruct(applicationAlbumEntry); - return ResultCode.Success; + return resultCode; } } }
\ No newline at end of file |
