diff options
author | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2022-11-14 17:34:40 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-14 17:34:40 -0500 |
commit | 0f7026c1b1fd4f0031783bc2435b84713c99bcad (patch) | |
tree | 0c459b0e06fbbad1928e703b2dff12af4d4aad34 /src/SMAPI | |
parent | 72f5df2d207481b4d83ea34379ef0dada86ff8fc (diff) | |
parent | ae5829a3ee5ab1bde79735c6f3a0004f6047a922 (diff) | |
download | SMAPI-0f7026c1b1fd4f0031783bc2435b84713c99bcad.tar.gz SMAPI-0f7026c1b1fd4f0031783bc2435b84713c99bcad.tar.bz2 SMAPI-0f7026c1b1fd4f0031783bc2435b84713c99bcad.zip |
Merge pull request #886 from atravita-mods/develop
Fix overlay transparency crop not always starting at end of pixel area
Diffstat (limited to 'src/SMAPI')
-rw-r--r-- | src/SMAPI/Framework/Content/AssetDataForImage.cs | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/src/SMAPI/Framework/Content/AssetDataForImage.cs b/src/SMAPI/Framework/Content/AssetDataForImage.cs index 7c8cc6a8..89ced1ba 100644 --- a/src/SMAPI/Framework/Content/AssetDataForImage.cs +++ b/src/SMAPI/Framework/Content/AssetDataForImage.cs @@ -140,9 +140,11 @@ namespace StardewModdingAPI.Framework.Content /// <exception cref="InvalidOperationException">The content being read isn't an image.</exception> private void PatchImageImpl(Color[] sourceData, int sourceWidth, int sourceHeight, Rectangle sourceArea, Rectangle targetArea, PatchMode patchMode, int startRow = 0) { - // get texture + // get texture info Texture2D target = this.Data; int pixelCount = sourceArea.Width * sourceArea.Height; + int firstPixel = startRow * sourceArea.Width; + int lastPixel = firstPixel + pixelCount - 1; // validate if (sourceArea.X < 0 || sourceArea.Y < 0 || sourceArea.Right > sourceWidth || sourceArea.Bottom > sourceHeight) @@ -155,36 +157,34 @@ namespace StardewModdingAPI.Framework.Content // shortcut: replace the entire area if (patchMode == PatchMode.Replace) { - target.SetData(0, targetArea, sourceData, startRow * sourceArea.Width, pixelCount); + target.SetData(0, targetArea, sourceData, firstPixel, pixelCount); return; } // skip transparent pixels at the start & end (e.g. large spritesheet with a few sprites replaced) int startIndex = -1; int endIndex = -1; + for (int i = firstPixel; i <= lastPixel; i++) { - for (int i = startRow * sourceArea.Width; i < pixelCount; i++) + if (sourceData[i].A >= AssetDataForImage.MinOpacity) { - if (sourceData[i].A >= AssetDataForImage.MinOpacity) - { - startIndex = i; - break; - } + startIndex = i; + break; } - if (startIndex == -1) - return; // blank texture + } + if (startIndex == -1) + return; // blank texture - for (int i = startRow * sourceArea.Width + pixelCount - 1; i >= startIndex; i--) + for (int i = lastPixel; i >= startIndex; i--) + { + if (sourceData[i].A >= AssetDataForImage.MinOpacity) { - if (sourceData[i].A >= AssetDataForImage.MinOpacity) - { - endIndex = i; - break; - } + endIndex = i; + break; } - if (endIndex == -1) - return; // ??? } + if (endIndex == -1) + return; // ??? // update target rectangle int sourceOffset; |