mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-13 20:24:17 +01:00
Textures: Simplify away _targetPixels
This commit is contained in:
parent
848e4ff8a6
commit
38a22c5298
1 changed files with 22 additions and 21 deletions
|
|
@ -53,6 +53,11 @@ public partial class CombinedTexture
|
||||||
public (int Width, int Height) Size
|
public (int Width, int Height) Size
|
||||||
=> (Width, Height);
|
=> (Width, Height);
|
||||||
|
|
||||||
|
public RgbaPixelData((int Width, int Height) size, byte[] pixelData)
|
||||||
|
: this(size.Width, size.Height, pixelData)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public Image<Rgba32> ToImage()
|
public Image<Rgba32> ToImage()
|
||||||
=> Image.LoadPixelData<Rgba32>(PixelData, Width, Height);
|
=> Image.LoadPixelData<Rgba32>(PixelData, Width, Height);
|
||||||
|
|
||||||
|
|
@ -61,7 +66,7 @@ public partial class CombinedTexture
|
||||||
if (Width == size.Width && Height == size.Height)
|
if (Width == size.Width && Height == size.Height)
|
||||||
return this;
|
return this;
|
||||||
|
|
||||||
var result = WithNewPixelData(size);
|
var result = new RgbaPixelData(size, NewPixelData(size));
|
||||||
using (var image = ToImage())
|
using (var image = ToImage())
|
||||||
{
|
{
|
||||||
image.Mutate(ctx => ctx.Resize(size.Width, size.Height, KnownResamplers.Lanczos3));
|
image.Mutate(ctx => ctx.Resize(size.Width, size.Height, KnownResamplers.Lanczos3));
|
||||||
|
|
@ -71,8 +76,8 @@ public partial class CombinedTexture
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RgbaPixelData WithNewPixelData((int Width, int Height) size)
|
public static byte[] NewPixelData((int Width, int Height) size)
|
||||||
=> new(size.Width, size.Height, new byte[size.Width * size.Height * 4]);
|
=> new byte[size.Width * size.Height * 4];
|
||||||
|
|
||||||
public static RgbaPixelData FromTexture(Texture texture)
|
public static RgbaPixelData FromTexture(Texture texture)
|
||||||
=> new(texture.TextureWrap!.Width, texture.TextureWrap!.Height, texture.RgbaPixels);
|
=> new(texture.TextureWrap!.Width, texture.TextureWrap!.Height, texture.RgbaPixels);
|
||||||
|
|
@ -88,7 +93,6 @@ public partial class CombinedTexture
|
||||||
private ResizeOp _resizeOp = ResizeOp.None;
|
private ResizeOp _resizeOp = ResizeOp.None;
|
||||||
private Channels _copyChannels = Channels.Red | Channels.Green | Channels.Blue | Channels.Alpha;
|
private Channels _copyChannels = Channels.Red | Channels.Green | Channels.Blue | Channels.Alpha;
|
||||||
|
|
||||||
private RgbaPixelData _targetPixels = RgbaPixelData.Empty;
|
|
||||||
private RgbaPixelData _leftPixels = RgbaPixelData.Empty;
|
private RgbaPixelData _leftPixels = RgbaPixelData.Empty;
|
||||||
private RgbaPixelData _rightPixels = RgbaPixelData.Empty;
|
private RgbaPixelData _rightPixels = RgbaPixelData.Empty;
|
||||||
|
|
||||||
|
|
@ -195,9 +199,9 @@ public partial class CombinedTexture
|
||||||
|
|
||||||
private void AddPixelsMultiplied(int y, ParallelLoopState _)
|
private void AddPixelsMultiplied(int y, ParallelLoopState _)
|
||||||
{
|
{
|
||||||
for (var x = 0; x < _targetPixels.Width; ++x)
|
for (var x = 0; x < _leftPixels.Width; ++x)
|
||||||
{
|
{
|
||||||
var offset = (_targetPixels.Width * y + x) * 4;
|
var offset = (_leftPixels.Width * y + x) * 4;
|
||||||
var left = DataLeft(offset);
|
var left = DataLeft(offset);
|
||||||
var right = DataRight(x, y);
|
var right = DataRight(x, y);
|
||||||
var alpha = right.W + left.W * (1 - right.W);
|
var alpha = right.W + left.W * (1 - right.W);
|
||||||
|
|
@ -213,9 +217,9 @@ public partial class CombinedTexture
|
||||||
|
|
||||||
private void ReverseAddPixelsMultiplied(int y, ParallelLoopState _)
|
private void ReverseAddPixelsMultiplied(int y, ParallelLoopState _)
|
||||||
{
|
{
|
||||||
for (var x = 0; x < _targetPixels.Width; ++x)
|
for (var x = 0; x < _leftPixels.Width; ++x)
|
||||||
{
|
{
|
||||||
var offset = (_targetPixels.Width * y + x) * 4;
|
var offset = (_leftPixels.Width * y + x) * 4;
|
||||||
var left = DataLeft(offset);
|
var left = DataLeft(offset);
|
||||||
var right = DataRight(x, y);
|
var right = DataRight(x, y);
|
||||||
var alpha = left.W + right.W * (1 - left.W);
|
var alpha = left.W + right.W * (1 - left.W);
|
||||||
|
|
@ -232,9 +236,9 @@ public partial class CombinedTexture
|
||||||
private void ChannelMergePixelsMultiplied(int y, ParallelLoopState _)
|
private void ChannelMergePixelsMultiplied(int y, ParallelLoopState _)
|
||||||
{
|
{
|
||||||
var channels = _copyChannels;
|
var channels = _copyChannels;
|
||||||
for (var x = 0; x < _targetPixels.Width; ++x)
|
for (var x = 0; x < _leftPixels.Width; ++x)
|
||||||
{
|
{
|
||||||
var offset = (_targetPixels.Width * y + x) * 4;
|
var offset = (_leftPixels.Width * y + x) * 4;
|
||||||
var left = DataLeft(offset);
|
var left = DataLeft(offset);
|
||||||
var right = DataRight(x, y);
|
var right = DataRight(x, y);
|
||||||
var rgba = new Rgba32((channels & Channels.Red) != 0 ? right.X : left.X,
|
var rgba = new Rgba32((channels & Channels.Red) != 0 ? right.X : left.X,
|
||||||
|
|
@ -250,9 +254,9 @@ public partial class CombinedTexture
|
||||||
|
|
||||||
private void MultiplyPixelsLeft(int y, ParallelLoopState _)
|
private void MultiplyPixelsLeft(int y, ParallelLoopState _)
|
||||||
{
|
{
|
||||||
for (var x = 0; x < _targetPixels.Width; ++x)
|
for (var x = 0; x < _leftPixels.Width; ++x)
|
||||||
{
|
{
|
||||||
var offset = (_targetPixels.Width * y + x) * 4;
|
var offset = (_leftPixels.Width * y + x) * 4;
|
||||||
var left = DataLeft(offset);
|
var left = DataLeft(offset);
|
||||||
var rgba = new Rgba32(left);
|
var rgba = new Rgba32(left);
|
||||||
_centerStorage.RgbaPixels[offset] = rgba.R;
|
_centerStorage.RgbaPixels[offset] = rgba.R;
|
||||||
|
|
@ -264,9 +268,9 @@ public partial class CombinedTexture
|
||||||
|
|
||||||
private void MultiplyPixelsRight(int y, ParallelLoopState _)
|
private void MultiplyPixelsRight(int y, ParallelLoopState _)
|
||||||
{
|
{
|
||||||
for (var x = 0; x < _targetPixels.Width; ++x)
|
for (var x = 0; x < _rightPixels.Width; ++x)
|
||||||
{
|
{
|
||||||
var offset = (_targetPixels.Width * y + x) * 4;
|
var offset = (_rightPixels.Width * y + x) * 4;
|
||||||
var right = DataRight(offset);
|
var right = DataRight(offset);
|
||||||
var rgba = new Rgba32(right);
|
var rgba = new Rgba32(right);
|
||||||
_centerStorage.RgbaPixels[offset] = rgba.R;
|
_centerStorage.RgbaPixels[offset] = rgba.R;
|
||||||
|
|
@ -294,9 +298,7 @@ public partial class CombinedTexture
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_targetPixels = RgbaPixelData.WithNewPixelData(targetSize);
|
_centerStorage.RgbaPixels = RgbaPixelData.NewPixelData(targetSize);
|
||||||
|
|
||||||
_centerStorage.RgbaPixels = _targetPixels.PixelData;
|
|
||||||
_centerStorage.Type = TextureType.Bitmap;
|
_centerStorage.Type = TextureType.Bitmap;
|
||||||
|
|
||||||
_leftPixels = resizeOp switch
|
_leftPixels = resizeOp switch
|
||||||
|
|
@ -311,7 +313,7 @@ public partial class CombinedTexture
|
||||||
_ => right.Resize(targetSize),
|
_ => right.Resize(targetSize),
|
||||||
};
|
};
|
||||||
|
|
||||||
Parallel.For(0, _targetPixels.Height, combineOp switch
|
Parallel.For(0, targetSize.Height, combineOp switch
|
||||||
{
|
{
|
||||||
CombineOp.Over => AddPixelsMultiplied,
|
CombineOp.Over => AddPixelsMultiplied,
|
||||||
CombineOp.Under => ReverseAddPixelsMultiplied,
|
CombineOp.Under => ReverseAddPixelsMultiplied,
|
||||||
|
|
@ -325,7 +327,6 @@ public partial class CombinedTexture
|
||||||
{
|
{
|
||||||
_leftPixels = RgbaPixelData.Empty;
|
_leftPixels = RgbaPixelData.Empty;
|
||||||
_rightPixels = RgbaPixelData.Empty;
|
_rightPixels = RgbaPixelData.Empty;
|
||||||
_targetPixels = RgbaPixelData.Empty;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return targetSize;
|
return targetSize;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue