diff --git a/AssetRipper.TextureDecoder/Rgb/IColor.cs b/AssetRipper.TextureDecoder/Rgb/IColor.cs index e6e8845..b9cc6ba 100644 --- a/AssetRipper.TextureDecoder/Rgb/IColor.cs +++ b/AssetRipper.TextureDecoder/Rgb/IColor.cs @@ -56,5 +56,25 @@ ConversionUtilities.ConvertValue(b), ConversionUtilities.ConvertValue(a)); } + + [MethodImpl(OptimizationConstants.AggressiveInliningAndOptimization)] + internal static TTarget Convert(this TThis color) + where TThisArg : unmanaged + where TTargetArg : unmanaged + where TThis : unmanaged, IColor + where TTarget : unmanaged, IColor + { + if (typeof(TThis) == typeof(TTarget)) + { + return Unsafe.As(ref color); + } + else + { + TTarget destination = default; + color.GetChannels(out TThisArg r, out TThisArg g, out TThisArg b, out TThisArg a); + destination.SetConvertedChannels(r, g, b, a); + return destination; + } + } } } diff --git a/AssetRipper.TextureDecoder/Rgb/RgbConverter.cs b/AssetRipper.TextureDecoder/Rgb/RgbConverter.cs index 4598c02..6adaa63 100644 --- a/AssetRipper.TextureDecoder/Rgb/RgbConverter.cs +++ b/AssetRipper.TextureDecoder/Rgb/RgbConverter.cs @@ -600,11 +600,7 @@ namespace AssetRipper.TextureDecoder.Rgb { for (int i = 0; i < sourceSpan.Length; i++) { - TSource source = sourceSpan[i]; - TDestination destination = default; - source.GetChannels(out TSourceArg r, out TSourceArg g, out TSourceArg b, out TSourceArg a); - destination.SetConvertedChannels(r, g, b, a); - destinationSpan[i] = destination; + destinationSpan[i] = sourceSpan[i].Convert(); } }