Browse Source

Fixed color converters

pull/2120/head
Dmitry Pentin 4 years ago
parent
commit
23e3bb889d
  1. 17
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromCmykAvx.cs
  2. 16
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromCmykScalar.cs
  3. 17
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromCmykVector.cs
  4. 24
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromGrayScaleAvx.cs
  5. 14
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromGrayScaleScalar.cs
  6. 14
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromGrayScaleVector.cs
  7. 19
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromRgbAvx.cs
  8. 3
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromRgbScalar.cs
  9. 22
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromRgbVector.cs
  10. 1
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYCbCrAvx.cs
  11. 8
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYCbCrScalar.cs
  12. 8
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYCbCrVector.cs
  13. 5
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYccKAvx.cs
  14. 10
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYccKScalar.cs
  15. 6
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYccKVector.cs

17
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromCmykAvx.cs

@ -60,7 +60,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
// Used for the color conversion // Used for the color conversion
var scale = Vector256.Create(this.MaximumValue); var scale = Vector256.Create(this.MaximumValue);
var one = Vector256.Create(1f);
nint n = values.Component0.Length / Vector256<float>.Count; nint n = values.Component0.Length / Vector256<float>.Count;
for (nint i = 0; i < n; i++) for (nint i = 0; i < n; i++)
@ -70,21 +69,21 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
ref Vector256<float> c2 = ref Unsafe.Add(ref c2Base, i); ref Vector256<float> c2 = ref Unsafe.Add(ref c2Base, i);
ref Vector256<float> c3 = ref Unsafe.Add(ref c3Base, i); ref Vector256<float> c3 = ref Unsafe.Add(ref c3Base, i);
Vector256<float> ctmp = Avx.Subtract(one, c0); Vector256<float> ctmp = Avx.Subtract(scale, c0);
Vector256<float> mtmp = Avx.Subtract(one, c1); Vector256<float> mtmp = Avx.Subtract(scale, c1);
Vector256<float> ytmp = Avx.Subtract(one, c2); Vector256<float> ytmp = Avx.Subtract(scale, c2);
Vector256<float> ktmp = Avx.Min(ctmp, Avx.Min(mtmp, ytmp)); Vector256<float> ktmp = Avx.Min(ctmp, Avx.Min(mtmp, ytmp));
Vector256<float> kMask = Avx.CompareNotEqual(ktmp, one); Vector256<float> kMask = Avx.CompareNotEqual(ktmp, scale);
ctmp = Avx.And(Avx.Divide(Avx.Subtract(ctmp, ktmp), Avx.Subtract(one, ktmp)), kMask); ctmp = Avx.And(Avx.Divide(Avx.Subtract(ctmp, ktmp), Avx.Subtract(scale, ktmp)), kMask);
mtmp = Avx.And(Avx.Divide(Avx.Subtract(mtmp, ktmp), Avx.Subtract(one, ktmp)), kMask); mtmp = Avx.And(Avx.Divide(Avx.Subtract(mtmp, ktmp), Avx.Subtract(scale, ktmp)), kMask);
ytmp = Avx.And(Avx.Divide(Avx.Subtract(ytmp, ktmp), Avx.Subtract(one, ktmp)), kMask); ytmp = Avx.And(Avx.Divide(Avx.Subtract(ytmp, ktmp), Avx.Subtract(scale, ktmp)), kMask);
c0 = Avx.Subtract(scale, Avx.Multiply(ctmp, scale)); c0 = Avx.Subtract(scale, Avx.Multiply(ctmp, scale));
c1 = Avx.Subtract(scale, Avx.Multiply(mtmp, scale)); c1 = Avx.Subtract(scale, Avx.Multiply(mtmp, scale));
c2 = Avx.Subtract(scale, Avx.Multiply(ytmp, scale)); c2 = Avx.Subtract(scale, Avx.Multiply(ytmp, scale));
c3 = Avx.Subtract(scale, Avx.Multiply(ktmp, scale)); c3 = Avx.Subtract(scale, ktmp);
} }
} }
} }

16
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromCmykScalar.cs

@ -51,12 +51,12 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
for (int i = 0; i < c0.Length; i++) for (int i = 0; i < c0.Length; i++)
{ {
float ctmp = 1f - c0[i]; float ctmp = 255f - c0[i];
float mtmp = 1f - c1[i]; float mtmp = 255f - c1[i];
float ytmp = 1f - c2[i]; float ytmp = 255f - c2[i];
float ktmp = MathF.Min(MathF.Min(ctmp, mtmp), ytmp); float ktmp = MathF.Min(MathF.Min(ctmp, mtmp), ytmp);
if (1f - ktmp <= float.Epsilon) if (255f - ktmp <= float.Epsilon)
{ {
ctmp = 0f; ctmp = 0f;
mtmp = 0f; mtmp = 0f;
@ -64,15 +64,15 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
} }
else else
{ {
ctmp = (ctmp - ktmp) / (1f - ktmp); ctmp = (ctmp - ktmp) / (255f - ktmp);
mtmp = (mtmp - ktmp) / (1f - ktmp); mtmp = (mtmp - ktmp) / (255f - ktmp);
ytmp = (ytmp - ktmp) / (1f - ktmp); ytmp = (ytmp - ktmp) / (255f - ktmp);
} }
c0[i] = maxValue - (ctmp * maxValue); c0[i] = maxValue - (ctmp * maxValue);
c1[i] = maxValue - (mtmp * maxValue); c1[i] = maxValue - (mtmp * maxValue);
c2[i] = maxValue - (ytmp * maxValue); c2[i] = maxValue - (ytmp * maxValue);
c3[i] = maxValue - (ktmp * maxValue); c3[i] = maxValue - ktmp;
} }
} }
} }

17
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromCmykVector.cs

@ -60,7 +60,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
// Used for the color conversion // Used for the color conversion
var scale = new Vector<float>(this.MaximumValue); var scale = new Vector<float>(this.MaximumValue);
var one = new Vector<float>(1f);
nint n = values.Component0.Length / Vector<float>.Count; nint n = values.Component0.Length / Vector<float>.Count;
for (nint i = 0; i < n; i++) for (nint i = 0; i < n; i++)
@ -70,20 +69,20 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
ref Vector<float> c2 = ref Unsafe.Add(ref c2Base, i); ref Vector<float> c2 = ref Unsafe.Add(ref c2Base, i);
ref Vector<float> c3 = ref Unsafe.Add(ref c3Base, i); ref Vector<float> c3 = ref Unsafe.Add(ref c3Base, i);
Vector<float> ctmp = one - c0; Vector<float> ctmp = scale - c0;
Vector<float> mtmp = one - c1; Vector<float> mtmp = scale - c1;
Vector<float> ytmp = one - c2; Vector<float> ytmp = scale - c2;
Vector<float> ktmp = Vector.Min(ctmp, Vector.Min(mtmp, ytmp)); Vector<float> ktmp = Vector.Min(ctmp, Vector.Min(mtmp, ytmp));
var kMask = Vector.Equals(ktmp, Vector<float>.One); var kMask = Vector.Equals(ktmp, scale);
ctmp = Vector.AndNot((ctmp - ktmp) / (one - ktmp), kMask.As<int, float>()); ctmp = Vector.AndNot((ctmp - ktmp) / (scale - ktmp), kMask.As<int, float>());
mtmp = Vector.AndNot((mtmp - ktmp) / (one - ktmp), kMask.As<int, float>()); mtmp = Vector.AndNot((mtmp - ktmp) / (scale - ktmp), kMask.As<int, float>());
ytmp = Vector.AndNot((ytmp - ktmp) / (one - ktmp), kMask.As<int, float>()); ytmp = Vector.AndNot((ytmp - ktmp) / (scale - ktmp), kMask.As<int, float>());
c0 = scale - (ctmp * scale); c0 = scale - (ctmp * scale);
c1 = scale - (mtmp * scale); c1 = scale - (mtmp * scale);
c2 = scale - (ytmp * scale); c2 = scale - (ytmp * scale);
c3 = scale - (ktmp * scale); c3 = scale - ktmp;
} }
} }

24
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromGrayScaleAvx.cs

@ -20,34 +20,10 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
public override void ConvertToRgbInplace(in ComponentValues values) public override void ConvertToRgbInplace(in ComponentValues values)
{ {
ref Vector256<float> c0Base =
ref Unsafe.As<float, Vector256<float>>(ref MemoryMarshal.GetReference(values.Component0));
// Used for the color conversion
var scale = Vector256.Create(1 / this.MaximumValue);
nint n = values.Component0.Length / Vector256<float>.Count;
for (nint i = 0; i < n; i++)
{
ref Vector256<float> c0 = ref Unsafe.Add(ref c0Base, i);
c0 = Avx.Multiply(c0, scale);
}
} }
public override void ConvertFromRgbInplace(in ComponentValues values) public override void ConvertFromRgbInplace(in ComponentValues values)
{ {
ref Vector256<float> c0Base =
ref Unsafe.As<float, Vector256<float>>(ref MemoryMarshal.GetReference(values.Component0));
// Used for the color conversion
var scale = Vector256.Create(this.MaximumValue);
nint n = values.Component0.Length / Vector256<float>.Count;
for (nint i = 0; i < n; i++)
{
ref Vector256<float> c0 = ref Unsafe.Add(ref c0Base, i);
c0 = Avx.Multiply(c0, scale);
}
} }
} }
} }

14
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromGrayScaleScalar.cs

@ -24,24 +24,10 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
internal static void ConvertCoreInplaceToRgb(Span<float> values, float maxValue) internal static void ConvertCoreInplaceToRgb(Span<float> values, float maxValue)
{ {
ref float valuesRef = ref MemoryMarshal.GetReference(values);
float scale = 1 / maxValue;
for (nint i = 0; i < values.Length; i++)
{
Unsafe.Add(ref valuesRef, i) *= scale;
}
} }
internal static void ConvertCoreInplaceFromRgb(Span<float> values, float maxValue) internal static void ConvertCoreInplaceFromRgb(Span<float> values, float maxValue)
{ {
ref float valuesRef = ref MemoryMarshal.GetReference(values);
float scale = maxValue;
for (nint i = 0; i < values.Length; i++)
{
Unsafe.Add(ref valuesRef, i) *= scale;
}
} }
} }
} }

14
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromGrayScaleVector.cs

@ -36,21 +36,11 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
protected override void ConvertCoreVectorizedInplaceFromRgb(in ComponentValues values) protected override void ConvertCoreVectorizedInplaceFromRgb(in ComponentValues values)
{ {
ref Vector<float> cBase =
ref Unsafe.As<float, Vector<float>>(ref MemoryMarshal.GetReference(values.Component0));
var scale = new Vector<float>(this.MaximumValue);
nint n = values.Component0.Length / Vector<float>.Count;
for (nint i = 0; i < n; i++)
{
ref Vector<float> c0 = ref Unsafe.Add(ref cBase, i);
c0 *= scale;
}
} }
protected override void ConvertCoreInplaceFromRgb(in ComponentValues values) protected override void ConvertCoreInplaceFromRgb(in ComponentValues values)
=> FromGrayscaleScalar.ConvertCoreInplaceFromRgb(values.Component0, this.MaximumValue); {
}
} }
} }
} }

19
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromRgbAvx.cs

@ -43,25 +43,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
public override void ConvertFromRgbInplace(in ComponentValues values) public override void ConvertFromRgbInplace(in ComponentValues values)
{ {
ref Vector256<float> rBase =
ref Unsafe.As<float, Vector256<float>>(ref MemoryMarshal.GetReference(values.Component0));
ref Vector256<float> gBase =
ref Unsafe.As<float, Vector256<float>>(ref MemoryMarshal.GetReference(values.Component1));
ref Vector256<float> bBase =
ref Unsafe.As<float, Vector256<float>>(ref MemoryMarshal.GetReference(values.Component2));
// Used for the color conversion
var scale = Vector256.Create(this.MaximumValue);
nint n = values.Component0.Length / Vector256<float>.Count;
for (nint i = 0; i < n; i++)
{
ref Vector256<float> r = ref Unsafe.Add(ref rBase, i);
ref Vector256<float> g = ref Unsafe.Add(ref gBase, i);
ref Vector256<float> b = ref Unsafe.Add(ref bBase, i);
r = Avx.Multiply(r, scale);
g = Avx.Multiply(g, scale);
b = Avx.Multiply(b, scale);
}
} }
} }
} }

3
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromRgbScalar.cs

@ -27,9 +27,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
internal static void ConvertCoreInplaceFromRgb(ComponentValues values, float maxValue) internal static void ConvertCoreInplaceFromRgb(ComponentValues values, float maxValue)
{ {
FromGrayscaleScalar.ConvertCoreInplaceFromRgb(values.Component0, maxValue);
FromGrayscaleScalar.ConvertCoreInplaceFromRgb(values.Component1, maxValue);
FromGrayscaleScalar.ConvertCoreInplaceFromRgb(values.Component2, maxValue);
} }
} }
} }

22
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromRgbVector.cs

@ -44,29 +44,11 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
protected override void ConvertCoreVectorizedInplaceFromRgb(in ComponentValues values) protected override void ConvertCoreVectorizedInplaceFromRgb(in ComponentValues values)
{ {
ref Vector<float> rBase =
ref Unsafe.As<float, Vector<float>>(ref MemoryMarshal.GetReference(values.Component0));
ref Vector<float> gBase =
ref Unsafe.As<float, Vector<float>>(ref MemoryMarshal.GetReference(values.Component1));
ref Vector<float> bBase =
ref Unsafe.As<float, Vector<float>>(ref MemoryMarshal.GetReference(values.Component2));
var scale = new Vector<float>(this.MaximumValue);
nint n = values.Component0.Length / Vector<float>.Count;
for (nint i = 0; i < n; i++)
{
ref Vector<float> r = ref Unsafe.Add(ref rBase, i);
ref Vector<float> g = ref Unsafe.Add(ref gBase, i);
ref Vector<float> b = ref Unsafe.Add(ref bBase, i);
r *= scale;
g *= scale;
b *= scale;
}
} }
protected override void ConvertCoreInplaceFromRgb(in ComponentValues values) protected override void ConvertCoreInplaceFromRgb(in ComponentValues values)
=> FromRgbScalar.ConvertCoreInplaceFromRgb(values, this.MaximumValue); {
}
} }
} }
} }

1
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYCbCrAvx.cs

@ -81,7 +81,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
// Used for the color conversion // Used for the color conversion
var chromaOffset = Vector256.Create(this.HalfValue); var chromaOffset = Vector256.Create(this.HalfValue);
var scale = Vector256.Create(this.MaximumValue);
var f0299 = Vector256.Create(0.299f); var f0299 = Vector256.Create(0.299f);
var f0587 = Vector256.Create(0.587f); var f0587 = Vector256.Create(0.587f);
var f0114 = Vector256.Create(0.114f); var f0114 = Vector256.Create(0.114f);

8
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYCbCrScalar.cs

@ -55,13 +55,11 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
Span<float> c1 = values.Component1; Span<float> c1 = values.Component1;
Span<float> c2 = values.Component2; Span<float> c2 = values.Component2;
float scale = maxValue;
for (int i = 0; i < c0.Length; i++) for (int i = 0; i < c0.Length; i++)
{ {
float r = c0[i] * scale; float r = c0[i];
float g = c1[i] * scale; float g = c1[i];
float b = c2[i] * scale; float b = c2[i];
// y = 0 + (0.299 * r) + (0.587 * g) + (0.114 * b) // y = 0 + (0.299 * r) + (0.587 * g) + (0.114 * b)
// cb = 128 - (0.168736 * r) - (0.331264 * g) + (0.5 * b) // cb = 128 - (0.168736 * r) - (0.331264 * g) + (0.5 * b)

8
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYCbCrVector.cs

@ -81,8 +81,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
var chromaOffset = new Vector<float>(this.HalfValue); var chromaOffset = new Vector<float>(this.HalfValue);
var scale = new Vector<float>(this.MaximumValue);
var rYMult = new Vector<float>(0.299f); var rYMult = new Vector<float>(0.299f);
var gYMult = new Vector<float>(0.587f); var gYMult = new Vector<float>(0.587f);
var bYMult = new Vector<float>(0.114f); var bYMult = new Vector<float>(0.114f);
@ -102,9 +100,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
ref Vector<float> c1 = ref Unsafe.Add(ref c1Base, i); ref Vector<float> c1 = ref Unsafe.Add(ref c1Base, i);
ref Vector<float> c2 = ref Unsafe.Add(ref c2Base, i); ref Vector<float> c2 = ref Unsafe.Add(ref c2Base, i);
Vector<float> r = c0 * scale; Vector<float> r = c0;
Vector<float> g = c1 * scale; Vector<float> g = c1;
Vector<float> b = c2 * scale; Vector<float> b = c2;
// y = 0 + (0.299 * r) + (0.587 * g) + (0.114 * b) // y = 0 + (0.299 * r) + (0.587 * g) + (0.114 * b)
// cb = 128 - (0.168736 * r) - (0.331264 * g) + (0.5 * b) // cb = 128 - (0.168736 * r) - (0.331264 * g) + (0.5 * b)

5
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYccKAvx.cs

@ -19,8 +19,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
{ {
} }
public override void ConvertFromRgbInplace(in ComponentValues values) => throw new System.NotImplementedException();
public override void ConvertToRgbInplace(in ComponentValues values) public override void ConvertToRgbInplace(in ComponentValues values)
{ {
ref Vector256<float> c0Base = ref Vector256<float> c0Base =
@ -78,6 +76,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
c2 = b; c2 = b;
} }
} }
public override void ConvertFromRgbInplace(in ComponentValues values)
=> throw new System.NotImplementedException();
} }
} }
} }

10
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYccKScalar.cs

@ -14,11 +14,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
{ {
} }
public override void ConvertToRgbInplace(in ComponentValues values) => public override void ConvertToRgbInplace(in ComponentValues values)
ConvertToRgpInplace(values, this.MaximumValue, this.HalfValue); => ConvertToRgpInplace(values, this.MaximumValue, this.HalfValue);
public override void ConvertFromRgbInplace(in ComponentValues values)
=> throw new NotImplementedException();
public static void ConvertToRgpInplace(in ComponentValues values, float maxValue, float halfValue) public static void ConvertToRgpInplace(in ComponentValues values, float maxValue, float halfValue)
{ {
@ -41,6 +38,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
c2[i] = (maxValue - MathF.Round(y + (1.772F * cb), MidpointRounding.AwayFromZero)) * scaledK; c2[i] = (maxValue - MathF.Round(y + (1.772F * cb), MidpointRounding.AwayFromZero)) * scaledK;
} }
} }
public override void ConvertFromRgbInplace(in ComponentValues values)
=> throw new NotImplementedException();
} }
} }
} }

6
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.FromYccKVector.cs

@ -71,9 +71,11 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
protected override void ConvertCoreInplaceToRgb(in ComponentValues values) => protected override void ConvertCoreInplaceToRgb(in ComponentValues values) =>
FromYccKScalar.ConvertToRgpInplace(values, this.MaximumValue, this.HalfValue); FromYccKScalar.ConvertToRgpInplace(values, this.MaximumValue, this.HalfValue);
protected override void ConvertCoreVectorizedInplaceFromRgb(in ComponentValues values) => throw new System.NotImplementedException(); protected override void ConvertCoreVectorizedInplaceFromRgb(in ComponentValues values)
=> throw new System.NotImplementedException();
protected override void ConvertCoreInplaceFromRgb(in ComponentValues values) => throw new System.NotImplementedException(); protected override void ConvertCoreInplaceFromRgb(in ComponentValues values)
=> throw new System.NotImplementedException();
} }
} }
} }

Loading…
Cancel
Save