Browse Source

inlined YCbCr conversion code

af/merge-core
Anton Firszov 9 years ago
parent
commit
e72250e6ee
  1. 20
      src/ImageSharp/Formats/Jpeg/Common/Decoder/JpegColorConverter.FromYCbCr.cs

20
src/ImageSharp/Formats/Jpeg/Common/Decoder/JpegColorConverter.FromYCbCr.cs

@ -25,21 +25,23 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Common.Decoder
ReadOnlySpan<float> cbVals = values.Component1; ReadOnlySpan<float> cbVals = values.Component1;
ReadOnlySpan<float> crVals = values.Component2; ReadOnlySpan<float> crVals = values.Component2;
Vector4 rgbaVector = new Vector4(0, 0, 0, 1); var v = new Vector4(0, 0, 0, 1);
Vector4 scale = new Vector4(1/255f, 1 / 255f, 1 / 255f, 1f);
for (int i = 0; i < result.Length; i++) for (int i = 0; i < result.Length; i++)
{ {
float colY = yVals[i]; float y = yVals[i];
float colCb = cbVals[i]; float cb = cbVals[i] - 128F;
float colCr = crVals[i]; float cr = crVals[i] - 128F;
YCbCr yCbCr = new YCbCr(colY, colCb, colCr); v.X = MathF.Round(y + (1.402F * cr), MidpointRounding.AwayFromZero);
v.Y = MathF.Round(y - (0.344136F * cb) - (0.714136F * cr), MidpointRounding.AwayFromZero);
v.Z = MathF.Round(y + (1.772F * cb), MidpointRounding.AwayFromZero);
// Slow conversion for now: v *= scale;
Rgb rgb = Converter.Convert(yCbCr);
Unsafe.As<Vector4, Vector3>(ref rgbaVector) = rgb.Vector; result[i] = v;
result[i] = rgbaVector;
} }
} }
} }

Loading…
Cancel
Save