// Copyright Epic Games, Inc. All Rights Reserved. #include "ImageWriteStream.h" #include "Misc/ScopeLock.h" void FImageStreamEndpoint::PipeImage(TUniquePtr&& InOwnedImage) { OnImageReceived(MoveTemp(InOwnedImage)); } void FImagePixelPipe::Push(TUniquePtr&& InImagePixelData) { if (!InImagePixelData.IsValid()) { return; } FScopeLock Lock(&EndPointLock); // Pass onto end points that need a copy of the image, making as few copies as possible for (int32 Index = 0; Index < EndPoints.Num(); ++Index) { if (Index == EndPoints.Num() - 1) { // Pass ownership of the the input parameter to the last pipe EndPoints[Index]->PipeImage(MoveTemp(InImagePixelData)); // InImagePixelData is now dead } else { EndPoints[Index]->PipeImage(InImagePixelData->CopyImageData()); } } } void FImagePixelPipe::AddEndpoint(const TFunction&& )>& InHandler) { typedef TFunction&&)> FLocalHandler; struct FFunctorEndpoint : FImageStreamEndpoint { FLocalHandler Handler; FFunctorEndpoint(const FLocalHandler& InLocalHandler) : Handler(InLocalHandler) {} virtual void OnImageReceived(TUniquePtr&& InImageData) override { Handler(MoveTemp(InImageData)); } }; AddEndpoint(MakeUnique(InHandler)); } void FImagePixelPipe::AddEndpoint(TUniquePtr&& InEndpoint) { FScopeLock Lock(&EndPointLock); check(InEndpoint); EndPoints.Add(MoveTemp(InEndpoint)); }