summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework/Content/AssetDataForImage.cs
diff options
context:
space:
mode:
authoratravita-mods <94934860+atravita-mods@users.noreply.github.com>2022-08-16 19:30:20 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2022-10-08 13:27:05 -0400
commit0a2a1a08def3d97f21b4138d9e39c563389b492a (patch)
tree3a94f10d6901a742885195eed1a6a4897cf2c7b0 /src/SMAPI/Framework/Content/AssetDataForImage.cs
parent581763c36392e28ed6e05690ff84b66da5882e78 (diff)
downloadSMAPI-0a2a1a08def3d97f21b4138d9e39c563389b492a.tar.gz
SMAPI-0a2a1a08def3d97f21b4138d9e39c563389b492a.tar.bz2
SMAPI-0a2a1a08def3d97f21b4138d9e39c563389b492a.zip
Favor record structs when there are four or fewer elements.
Diffstat (limited to 'src/SMAPI/Framework/Content/AssetDataForImage.cs')
-rw-r--r--src/SMAPI/Framework/Content/AssetDataForImage.cs41
1 files changed, 29 insertions, 12 deletions
diff --git a/src/SMAPI/Framework/Content/AssetDataForImage.cs b/src/SMAPI/Framework/Content/AssetDataForImage.cs
index ea04f57a..5016bcd4 100644
--- a/src/SMAPI/Framework/Content/AssetDataForImage.cs
+++ b/src/SMAPI/Framework/Content/AssetDataForImage.cs
@@ -40,7 +40,7 @@ namespace StardewModdingAPI.Framework.Content
this.GetPatchBounds(ref sourceArea, ref targetArea, source.Width, source.Height);
// get the pixels for the source area
- Color[] sourceData;
+ Color[] trimmedSourceData;
{
int areaX = sourceArea.Value.X;
int areaY = sourceArea.Value.Y;
@@ -49,26 +49,42 @@ namespace StardewModdingAPI.Framework.Content
if (areaX == 0 && areaY == 0 && areaWidth == source.Width && areaHeight == source.Height)
{
- sourceData = source.Data;
- this.PatchImageImpl(sourceData, source.Width, source.Height, sourceArea.Value, targetArea.Value, patchMode);
+ trimmedSourceData = source.Data;
+ this.PatchImageImpl(trimmedSourceData, source.Width, source.Height, sourceArea.Value, targetArea.Value, patchMode);
}
else
{
int pixelCount = areaWidth * areaHeight;
- sourceData = ArrayPool<Color>.Shared.Rent(pixelCount);
+ trimmedSourceData = ArrayPool<Color>.Shared.Rent(pixelCount);
- for (int y = areaY, maxY = areaY + areaHeight; y < maxY; y++)
+ // shortcut! If I want a horizontal slice of the texture
+ // I can copy the whole array in one pass
+ // Likely ~uncommon but Array.Copy significantly benefits
+ // from being able to do this.
+ if (areaWidth == source.Width && areaX == 0)
{
- int sourceIndex = (y * source.Width) + areaX;
- int targetIndex = (y - areaY) * areaWidth;
- Array.Copy(source.Data, sourceIndex, sourceData, targetIndex, areaWidth);
+ int sourceIndex = areaY * source.Width;
+ int targetIndex = 0;
+
+ Array.Copy(source.Data, sourceIndex, trimmedSourceData, targetIndex, pixelCount);
+ }
+ else
+ {
+ // copying line-by-line
+ // Array.Copy isn't great at small scale
+ for (int y = areaY, maxY = areaY + areaHeight; y < maxY; y++)
+ {
+ int sourceIndex = (y * source.Width) + areaX;
+ int targetIndex = (y - areaY) * areaWidth;
+ Array.Copy(source.Data, sourceIndex, trimmedSourceData, targetIndex, areaWidth);
+ }
}
// apply
- this.PatchImageImpl(sourceData, source.Width, source.Height, sourceArea.Value, targetArea.Value, patchMode);
+ this.PatchImageImpl(trimmedSourceData, source.Width, source.Height, sourceArea.Value, targetArea.Value, patchMode);
// return
- ArrayPool<Color>.Shared.Return(sourceData);
+ ArrayPool<Color>.Shared.Return(trimmedSourceData);
}
}
}
@@ -160,8 +176,9 @@ namespace StardewModdingAPI.Framework.Content
// merge pixels
for (int i = 0; i < pixelCount; i++)
{
- Color above = sourceData[i];
- Color below = mergedData[i];
+ // should probably benchmark this...
+ ref Color above = ref sourceData[i];
+ ref Color below = ref mergedData[i];
// shortcut transparency
if (above.A < MinOpacity)