67 lines
2.1 KiB
C++
67 lines
2.1 KiB
C++
|
|
// Copyright (c) 2024 Sentry. All Rights Reserved.
|
|||
|
|
|
|||
|
|
#include "SentryScreenshotUtils.h"
|
|||
|
|
|
|||
|
|
#include "HighResScreenshot.h"
|
|||
|
|
#include "SentryDefines.h"
|
|||
|
|
|
|||
|
|
#include "Engine/Engine.h"
|
|||
|
|
#include "ImageUtils.h"
|
|||
|
|
#include "UnrealClient.h"
|
|||
|
|
#include "Misc/FileHelper.h"
|
|||
|
|
#include "Engine/GameViewportClient.h"
|
|||
|
|
#include "Framework/Application/SlateApplication.h"
|
|||
|
|
#include "Misc/EngineVersionComparison.h"
|
|||
|
|
|
|||
|
|
bool SentryScreenshotUtils::CaptureScreenshot(const FString& ScreenshotSavePath)
|
|||
|
|
{
|
|||
|
|
if (!GEngine || !GEngine->GameViewport)
|
|||
|
|
{
|
|||
|
|
UE_LOG(LogSentrySdk, Error, TEXT("GameViewport required for screenshot capturing is not valid"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UGameViewportClient* GameViewportClient = GEngine->GameViewport;
|
|||
|
|
if (!GameViewportClient)
|
|||
|
|
{
|
|||
|
|
UE_LOG(LogSentrySdk, Error, TEXT("Game Viewport Client required for screenshot capturing is not valid"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
FIntVector ViewportSize(GameViewportClient->Viewport->GetSizeXY().X, GameViewportClient->Viewport->GetSizeXY().Y, 0);
|
|||
|
|
|
|||
|
|
TArray<FColor> Bitmap;
|
|||
|
|
|
|||
|
|
if (!FSlateApplication::IsInitialized())
|
|||
|
|
{
|
|||
|
|
UE_LOG(LogSentrySdk, Error, TEXT("Slate application required for screenshot capturing is not initialized"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
TSharedPtr<SWindow> WindowPtr = GameViewportClient->GetWindow();
|
|||
|
|
TSharedRef<SWidget> WindowRef = WindowPtr.ToSharedRef();
|
|||
|
|
|
|||
|
|
bool bScreenshotSuccessful = FSlateApplication::Get().TakeScreenshot(WindowRef, Bitmap, ViewportSize);
|
|||
|
|
if (!bScreenshotSuccessful)
|
|||
|
|
{
|
|||
|
|
UE_LOG(LogSentrySdk, Error, TEXT("Failed to capture screenshot"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if UE_VERSION_OLDER_THAN(5, 0, 0)
|
|||
|
|
GetHighResScreenshotConfig().MergeMaskIntoAlpha(Bitmap);
|
|||
|
|
TArray<uint8> CompressedBitmap;
|
|||
|
|
FImageUtils::CompressImageArray(ViewportSize.X, ViewportSize.Y, Bitmap, CompressedBitmap);
|
|||
|
|
#else
|
|||
|
|
GetHighResScreenshotConfig().MergeMaskIntoAlpha(Bitmap, FIntRect());
|
|||
|
|
TArray64<uint8> CompressedBitmap;
|
|||
|
|
FImageUtils::PNGCompressImageArray(ViewportSize.X, ViewportSize.Y, Bitmap, CompressedBitmap);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
FFileHelper::SaveArrayToFile(CompressedBitmap, *ScreenshotSavePath);
|
|||
|
|
|
|||
|
|
UE_LOG(LogSentrySdk, Log, TEXT("Screenshot saved to: %s"), *ScreenshotSavePath);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|