Skip transparent rows at the start and end when doing a patch overlay.
This commit is contained in:
parent
ce63efa2f4
commit
c1d5d19e43
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Linq;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
using StardewValley;
|
using StardewValley;
|
||||||
|
@ -166,9 +167,51 @@ namespace StardewModdingAPI.Framework.Content
|
||||||
if (sourceArea.Size != targetArea.Size)
|
if (sourceArea.Size != targetArea.Size)
|
||||||
throw new InvalidOperationException("The source and target areas must be the same size.");
|
throw new InvalidOperationException("The source and target areas must be the same size.");
|
||||||
|
|
||||||
// merge data
|
if (patchMode == PatchMode.Replace)
|
||||||
if (patchMode == PatchMode.Overlay)
|
target.SetData(0, targetArea, sourceData, 0, pixelCount);
|
||||||
|
else
|
||||||
{
|
{
|
||||||
|
// merge data
|
||||||
|
|
||||||
|
// Content packs have a habit of using large amounts of blank space.
|
||||||
|
// Adjusting bounds to ignore transparent pixels at the start and end.
|
||||||
|
|
||||||
|
int startIndex = -1;
|
||||||
|
for (int i = 0; i < pixelCount; i++)
|
||||||
|
{
|
||||||
|
if (sourceData[i].A >= MinOpacity)
|
||||||
|
{
|
||||||
|
startIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startIndex == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int endIndex = -1;
|
||||||
|
for (int i = pixelCount - 1; i >= startIndex; i--)
|
||||||
|
{
|
||||||
|
if (sourceData[i].A >= MinOpacity)
|
||||||
|
{
|
||||||
|
endIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endIndex == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int topoffset = startIndex / sourceArea.Width;
|
||||||
|
int bottomoffset = endIndex / sourceArea.Width;
|
||||||
|
|
||||||
|
// Update target rectangle
|
||||||
|
targetArea = new(targetArea.X, targetArea.Y + topoffset, targetArea.Width, bottomoffset - topoffset + 1);
|
||||||
|
|
||||||
|
pixelCount = targetArea.Width * targetArea.Height;
|
||||||
|
|
||||||
|
int sourceoffset = topoffset * sourceArea.Width;
|
||||||
|
|
||||||
// get target data
|
// get target data
|
||||||
Color[] mergedData = ArrayPool<Color>.Shared.Rent(pixelCount);
|
Color[] mergedData = ArrayPool<Color>.Shared.Rent(pixelCount);
|
||||||
target.GetData(0, targetArea, mergedData, 0, pixelCount);
|
target.GetData(0, targetArea, mergedData, 0, pixelCount);
|
||||||
|
@ -177,7 +220,7 @@ namespace StardewModdingAPI.Framework.Content
|
||||||
for (int i = 0; i < pixelCount; i++)
|
for (int i = 0; i < pixelCount; i++)
|
||||||
{
|
{
|
||||||
// ref locals here? Not sure.
|
// ref locals here? Not sure.
|
||||||
Color above = sourceData[i];
|
Color above = sourceData[sourceoffset + i];
|
||||||
Color below = mergedData[i];
|
Color below = mergedData[i];
|
||||||
|
|
||||||
// shortcut transparency
|
// shortcut transparency
|
||||||
|
@ -205,8 +248,6 @@ namespace StardewModdingAPI.Framework.Content
|
||||||
target.SetData(0, targetArea, mergedData, 0, pixelCount);
|
target.SetData(0, targetArea, mergedData, 0, pixelCount);
|
||||||
ArrayPool<Color>.Shared.Return(mergedData);
|
ArrayPool<Color>.Shared.Return(mergedData);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
target.SetData(0, targetArea, sourceData, 0, pixelCount);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue