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;
 | 
						|
}
 |