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
var scale = Vector256.Create(this.MaximumValue);
var one = Vector256.Create(1f);
nint n = values.Component0.Length / Vector256<float>.Count;
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> c3 = ref Unsafe.Add(ref c3Base, i);
Vector256<float> ctmp = Avx.Subtract(one, c0);
Vector256<float> mtmp = Avx.Subtract(one, c1);
Vector256<float> ytmp = Avx.Subtract(one, c2);
Vector256<float> ctmp = Avx.Subtract(scale, c0);
Vector256<float> mtmp = Avx.Subtract(scale, c1);
Vector256<float> ytmp = Avx.Subtract(scale, c2);
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);
mtmp = Avx.And(Avx.Divide(Avx.Subtract(mtmp, ktmp), Avx.Subtract(one, ktmp)), kMask);
ytmp = Avx.And(Avx.Divide(Avx.Subtract(ytmp, 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(scale, ktmp)), kMask);
ytmp = Avx.And(Avx.Divide(Avx.Subtract(ytmp, ktmp), Avx.Subtract(scale, ktmp)), kMask);
c0 = Avx.Subtract(scale, Avx.Multiply(ctmp, scale));
c1 = Avx.Subtract(scale, Avx.Multiply(mtmp, 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++)
{
float ctmp = 1f - c0[i];
float mtmp = 1f - c1[i];
float ytmp = 1f - c2[i];
float ctmp = 255f - c0[i];
float mtmp = 255f - c1[i];
float ytmp = 255f - c2[i];
float ktmp = MathF.Min(MathF.Min(ctmp, mtmp), ytmp);
if (1f - ktmp <= float.Epsilon)
if (255f - ktmp <= float.Epsilon)
{
ctmp = 0f;
mtmp = 0f;
@ -64,15 +64,15 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
}
else
{
ctmp = (ctmp - ktmp) / (1f - ktmp);
mtmp = (mtmp - ktmp) / (1f - ktmp);
ytmp = (ytmp - ktmp) / (1f - ktmp);
ctmp = (ctmp - ktmp) / (255f - ktmp);
mtmp = (mtmp - ktmp) / (255f - ktmp);
ytmp = (ytmp - ktmp) / (255f - ktmp);
}
c0[i] = maxValue - (ctmp * maxValue);
c1[i] = maxValue - (mtmp * 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
var scale = new Vector<float>(this.MaximumValue);
var one = new Vector<float>(1f);
nint n = values.Component0.Length / Vector<float>.Count;
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> c3 = ref Unsafe.Add(ref c3Base, i);
Vector<float> ctmp = one - c0;
Vector<float> mtmp = one - c1;
Vector<float> ytmp = one - c2;
Vector<float> ctmp = scale - c0;
Vector<float> mtmp = scale - c1;
Vector<float> ytmp = scale - c2;
Vector<float> ktmp = Vector.Min(ctmp, Vector.Min(mtmp, ytmp));
var kMask = Vector.Equals(ktmp, Vector<float>.One);
ctmp = Vector.AndNot((ctmp - ktmp) / (one - ktmp), kMask.As<int, float>());
mtmp = Vector.AndNot((mtmp - ktmp) / (one - ktmp), kMask.As<int, float>());
ytmp = Vector.AndNot((ytmp - ktmp) / (one - ktmp), kMask.As<int, float>());
var kMask = Vector.Equals(ktmp, scale);
ctmp = Vector.AndNot((ctmp - ktmp) / (scale - ktmp), kMask.As<int, float>());
mtmp = Vector.AndNot((mtmp - ktmp) / (scale - ktmp), kMask.As<int, float>());
ytmp = Vector.AndNot((ytmp - ktmp) / (scale - ktmp), kMask.As<int, float>());
c0 = scale - (ctmp * scale);
c1 = scale - (mtmp * 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)
{
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)
{
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)
{
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)
{
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)
{
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)
=> 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)
{
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)
{
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)
{
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)
=> 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
var chromaOffset = Vector256.Create(this.HalfValue);
var scale = Vector256.Create(this.MaximumValue);
var f0299 = Vector256.Create(0.299f);
var f0587 = Vector256.Create(0.587f);
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> c2 = values.Component2;
float scale = maxValue;
for (int i = 0; i < c0.Length; i++)
{
float r = c0[i] * scale;
float g = c1[i] * scale;
float b = c2[i] * scale;
float r = c0[i];
float g = c1[i];
float b = c2[i];
// y = 0 + (0.299 * r) + (0.587 * g) + (0.114 * 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 scale = new Vector<float>(this.MaximumValue);
var rYMult = new Vector<float>(0.299f);
var gYMult = new Vector<float>(0.587f);
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> c2 = ref Unsafe.Add(ref c2Base, i);
Vector<float> r = c0 * scale;
Vector<float> g = c1 * scale;
Vector<float> b = c2 * scale;
Vector<float> r = c0;
Vector<float> g = c1;
Vector<float> b = c2;
// y = 0 + (0.299 * r) + (0.587 * g) + (0.114 * 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)
{
ref Vector256<float> c0Base =
@ -78,6 +76,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components
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) =>
ConvertToRgpInplace(values, this.MaximumValue, this.HalfValue);
public override void ConvertFromRgbInplace(in ComponentValues values)
=> throw new NotImplementedException();
public override void ConvertToRgbInplace(in ComponentValues values)
=> ConvertToRgpInplace(values, this.MaximumValue, this.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;
}
}
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) =>
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