const FAtlasedTextureSlot* AddSprite(UPaperSprite* Sprite) { const FVector2D SpriteSizeFloat = Sprite->GetSourceSize(); const FIntPoint SpriteSize(FMath::TruncToInt(SpriteSizeFloat.X), FMath::TruncToInt(SpriteSizeFloat.Y)); TArray<uint8> DummyBuffer; DummyBuffer.AddZeroed(SpriteSize.X * SpriteSize.Y * Stride); check(Sprite->GetSourceTexture()); FTextureSource& SourceData = Sprite->GetSourceTexture()->Source; //@TODO: Handle different texture formats! if (SourceData.GetFormat() == TSF_BGRA8) { uint32 BytesPerPixel = SourceData.GetBytesPerPixel(); uint8* OffsetSource = SourceData.LockMip(0) + (FMath::TruncToInt(Sprite->GetSourceUV().X) + FMath::TruncToInt(Sprite->GetSourceUV().Y) * SourceData.GetSizeX()) * BytesPerPixel; uint8* OffsetDest = DummyBuffer.GetData(); CopyTextureData(OffsetSource, OffsetDest, SpriteSize.X, SpriteSize.Y, BytesPerPixel, SourceData.GetSizeX() * BytesPerPixel, SpriteSize.X * BytesPerPixel); SourceData.UnlockMip(0); } else { UE_LOG(LogPaper2DEditor, Error, TEXT("Sprite %s is not BGRA8, which isn't supported in atlases yet"), *(Sprite->GetPathName())); } const FAtlasedTextureSlot* Slot = AddTexture(SpriteSize.X, SpriteSize.Y, DummyBuffer); if (Slot != nullptr) { SpriteToSlotMap.Add(Sprite, Slot); } return Slot; }
bool FPaperAtlasTextureHelpers::ReadSpriteTexture(UTexture* SourceTexture, const FIntPoint& SourceXY, const FIntPoint& SourceSize, TArray<uint8>& TargetBuffer) { { const int32 BytesPerPixel = 4; TargetBuffer.Empty(); TargetBuffer.AddZeroed(SourceSize.X * SourceSize.Y * BytesPerPixel); } check(SourceTexture); FTextureSource& SourceData = SourceTexture->Source; if (SourceData.GetFormat() == TSF_BGRA8) { uint32 BytesPerPixel = SourceData.GetBytesPerPixel(); uint8* OffsetSource = SourceData.LockMip(0) + (SourceXY.X + SourceXY.Y * SourceData.GetSizeX()) * BytesPerPixel; uint8* OffsetDest = TargetBuffer.GetData(); CopyTextureData(OffsetSource, OffsetDest, SourceSize.X, SourceSize.Y, BytesPerPixel, SourceData.GetSizeX() * BytesPerPixel, SourceSize.X * BytesPerPixel); SourceData.UnlockMip(0); } else { UE_LOG(LogPaper2DEditor, Error, TEXT("Sprite texture %s is not BGRA8, which isn't supported in atlases yet"), *SourceTexture->GetName()); } return true; }