Browse Source

Multiply > divide

pull/2937/head
James Jackson-South 11 months ago
parent
commit
55224ecad8
  1. 7
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.TiffCmykScalar.cs
  2. 8
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.TiffCmykVector128.cs
  3. 8
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.TiffCmykVector256.cs
  4. 8
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.TiffCmykVector512.cs
  5. 18
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.TiffYccKScalar.cs
  6. 16
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.TiffYccKVector128.cs
  7. 8
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.TiffYccKVector256.cs
  8. 8
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.TiffYccKVector512.cs
  9. 2
      src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.YccKVector512.cs

7
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.TiffCmykScalar.cs

@ -76,9 +76,10 @@ internal abstract partial class JpegColorConverterBase
}
else
{
ctmp = (ctmp - ktmp) / (255F - ktmp);
mtmp = (mtmp - ktmp) / (255F - ktmp);
ytmp = (ytmp - ktmp) / (255F - ktmp);
float divisor = 1 / (255F - ktmp);
ctmp = (ctmp - ktmp) * divisor;
mtmp = (mtmp - ktmp) * divisor;
ytmp = (ytmp - ktmp) * divisor;
}
c[i] = ctmp * maxValue;

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

@ -83,11 +83,11 @@ internal abstract partial class JpegColorConverterBase
Vector128<float> ktmp = Vector128.Min(ctmp, Vector128.Min(mtmp, ytmp));
Vector128<float> kMask = ~Vector128.Equals(ktmp, scale);
Vector128<float> divisor = scale - ktmp;
Vector128<float> divisor = Vector128<float>.One / (scale - ktmp);
ctmp = ((ctmp - ktmp) / divisor) & kMask;
mtmp = ((mtmp - ktmp) / divisor) & kMask;
ytmp = ((ytmp - ktmp) / divisor) & kMask;
ctmp = ((ctmp - ktmp) * divisor) & kMask;
mtmp = ((mtmp - ktmp) * divisor) & kMask;
ytmp = ((ytmp - ktmp) * divisor) & kMask;
Unsafe.Add(ref destC, i) = ctmp * scale;
Unsafe.Add(ref destM, i) = mtmp * scale;

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

@ -83,11 +83,11 @@ internal abstract partial class JpegColorConverterBase
Vector256<float> ktmp = Vector256.Min(ctmp, Vector256.Min(mtmp, ytmp));
Vector256<float> kMask = ~Vector256.Equals(ktmp, scale);
Vector256<float> divisor = scale - ktmp;
Vector256<float> divisor = Vector256<float>.One / (scale - ktmp);
ctmp = ((ctmp - ktmp) / divisor) & kMask;
mtmp = ((mtmp - ktmp) / divisor) & kMask;
ytmp = ((ytmp - ktmp) / divisor) & kMask;
ctmp = ((ctmp - ktmp) * divisor) & kMask;
mtmp = ((mtmp - ktmp) * divisor) & kMask;
ytmp = ((ytmp - ktmp) * divisor) & kMask;
Unsafe.Add(ref destC, i) = ctmp * scale;
Unsafe.Add(ref destM, i) = mtmp * scale;

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

@ -92,11 +92,11 @@ internal abstract partial class JpegColorConverterBase
Vector512<float> ktmp = Vector512.Min(ctmp, Vector512.Min(mtmp, ytmp));
Vector512<float> kMask = ~Vector512.Equals(ktmp, scale);
Vector512<float> divisor = scale - ktmp;
Vector512<float> divisor = Vector512<float>.One / (scale - ktmp);
ctmp = ((ctmp - ktmp) / divisor) & kMask;
mtmp = ((mtmp - ktmp) / divisor) & kMask;
ytmp = ((ytmp - ktmp) / divisor) & kMask;
ctmp = ((ctmp - ktmp) * divisor) & kMask;
mtmp = ((mtmp - ktmp) * divisor) & kMask;
ytmp = ((ytmp - ktmp) * divisor) & kMask;
Unsafe.Add(ref destC, i) = ctmp * scale;
Unsafe.Add(ref destM, i) = mtmp * scale;

18
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.TiffYccKScalar.cs

@ -75,9 +75,10 @@ internal abstract partial class JpegColorConverterBase
for (int i = 0; i < cr.Length; i++)
{
// Scale down to [0-1]
float r = rLane[i] / 255F;
float g = gLane[i] / 255F;
float b = bLane[i] / 255F;
const float divisor = 1F / 255F;
float r = rLane[i] * divisor;
float g = gLane[i] * divisor;
float b = bLane[i] * divisor;
float ytmp;
float cbtmp;
@ -87,15 +88,16 @@ internal abstract partial class JpegColorConverterBase
if (ktmp >= 1F)
{
ytmp = 0F;
cbtmp = 0F;
crtmp = 0F;
cbtmp = 0.5F;
crtmp = 0.5F;
ktmp = maxValue;
}
else
{
r /= 1F - ktmp;
g /= 1F - ktmp;
b /= 1F - ktmp;
float kmask = 1F / (1F - ktmp);
r *= kmask;
g *= kmask;
b *= kmask;
// Scale to [0-maxValue]
ytmp = ((0.299f * r) + (0.587f * g) + (0.114f * b)) * maxValue;

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

@ -86,7 +86,7 @@ internal abstract partial class JpegColorConverterBase
ref Vector128<float> destK =
ref Unsafe.As<float, Vector128<float>>(ref MemoryMarshal.GetReference(values.Component3));
Vector128<float> maxSourceValue = Vector128.Create(255F);
Vector128<float> maxSourceValue = Vector128.Create(1 / 255F);
Vector128<float> maxSampleValue = Vector128.Create(this.MaximumValue);
Vector128<float> chromaOffset = Vector128.Create(this.HalfValue);
@ -102,17 +102,17 @@ internal abstract partial class JpegColorConverterBase
nuint n = values.Component0.Vector128Count<float>();
for (nuint i = 0; i < n; i++)
{
Vector128<float> r = Unsafe.Add(ref srcR, i) / maxSourceValue;
Vector128<float> g = Unsafe.Add(ref srcG, i) / maxSourceValue;
Vector128<float> b = Unsafe.Add(ref srcB, i) / maxSourceValue;
Vector128<float> r = Unsafe.Add(ref srcR, i) * maxSourceValue;
Vector128<float> g = Unsafe.Add(ref srcG, i) * maxSourceValue;
Vector128<float> b = Unsafe.Add(ref srcB, i) * maxSourceValue;
Vector128<float> ktmp = Vector128<float>.One - Vector128.Max(r, Vector128.Min(g, b));
Vector128<float> kMask = ~Vector128.Equals(ktmp, Vector128<float>.One);
Vector128<float> divisor = Vector128<float>.One - ktmp;
Vector128<float> divisor = Vector128<float>.One / (Vector128<float>.One - ktmp);
r /= divisor;
g /= divisor;
b /= divisor;
r = (r * divisor) & kMask;
g = (g * divisor) & kMask;
b = (b * divisor) & kMask;
// 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.TiffYccKVector256.cs

@ -108,11 +108,11 @@ internal abstract partial class JpegColorConverterBase
Vector256<float> ktmp = Vector256<float>.One - Vector256.Max(r, Vector256.Min(g, b));
Vector256<float> kMask = ~Vector256.Equals(ktmp, Vector256<float>.One);
Vector256<float> divisor = Vector256<float>.One - ktmp;
Vector256<float> divisor = Vector256<float>.One / (Vector256<float>.One - ktmp);
r /= divisor;
g /= divisor;
b /= divisor;
r = (r * divisor) & kMask;
g = (g * divisor) & kMask;
b = (b * divisor) & kMask;
// 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.TiffYccKVector512.cs

@ -119,11 +119,11 @@ internal abstract partial class JpegColorConverterBase
Vector512<float> ktmp = Vector512<float>.One - Vector512.Max(r, Vector512.Min(g, b));
Vector512<float> kMask = ~Vector512.Equals(ktmp, Vector512<float>.One);
Vector512<float> divisor = Vector512<float>.One - ktmp;
Vector512<float> divisor = Vector512<float>.One / (Vector512<float>.One - ktmp);
r /= divisor;
g /= divisor;
b /= divisor;
r = (r * divisor) & kMask;
g = (g * divisor) & kMask;
b = (b * divisor) & kMask;
// y = 0 + (0.299 * r) + (0.587 * g) + (0.114 * b)
// cb = 128 - (0.168736 * r) - (0.331264 * g) + (0.5 * b)

2
src/ImageSharp/Formats/Jpeg/Components/ColorConverters/JpegColorConverter.YccKVector512.cs

@ -138,6 +138,6 @@ internal abstract partial class JpegColorConverterBase
/// <inheritdoc/>
protected override void ConvertFromRgbScalarRemainder(in ComponentValues values, Span<float> rLane, Span<float> gLane, Span<float> bLane)
=> TiffYccKScalar.ConvertFromRgb(in values, this.HalfValue, this.MaximumValue, rLane, gLane, bLane);
=> YccKScalar.ConvertFromRgb(in values, this.HalfValue, this.MaximumValue, rLane, gLane, bLane);
}
}

Loading…
Cancel
Save