From dcd201b0e0675a2edc8b3544273cedafccc0a9ef Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 11 Jan 2017 11:14:00 +1100 Subject: [PATCH] Add scaled integer benchmarks. --- .../ImageSharp.Benchmarks/Color/RgbToYCbCr.cs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/ImageSharp.Benchmarks/Color/RgbToYCbCr.cs diff --git a/tests/ImageSharp.Benchmarks/Color/RgbToYCbCr.cs b/tests/ImageSharp.Benchmarks/Color/RgbToYCbCr.cs new file mode 100644 index 000000000..2da7d0e44 --- /dev/null +++ b/tests/ImageSharp.Benchmarks/Color/RgbToYCbCr.cs @@ -0,0 +1,48 @@ +namespace ImageSharp.Benchmarks +{ + using System.Numerics; + + using BenchmarkDotNet.Attributes; + + public class RgbToYCbCr + { + [Benchmark(Baseline = true, Description = "Floating Point Conversion")] + public Vector3 RgbaToYcbCr() + { + Vector3 v = new Vector3(255); + + float yy = (0.299F * v.X) + (0.587F * v.Y) + (0.114F * v.Z); + float cb = 128 + ((-0.168736F * v.X) - (0.331264F * v.Y) + (0.5F * v.Z)); + float cr = 128 + ((0.5F * v.X) - (0.418688F * v.Y) - (0.081312F * v.Z)); + + return new Vector3(yy, cb, cr); + } + + [Benchmark(Description = "Scaled Integer Conversion")] + public Vector3 RgbaToYcbCrScaled() + { + int r = 255; + int g = 255; + int b = 255; + + // Scale by 1024 and truncate value + int y0 = 306 * r; // 0.299F + int y1 = 601 * g; // 0.587F + int y2 = 116 * b; // 0.114F + + int cb0 = -172 * r; // -0.168736F + int cb1 = 339 * g; // 0.331264F + int cb2 = 512 * b; // 0.5F + + int cr0 = 512 * r; // 0.5F + int cr1 = 428 * g; // 0.418688F + int cr2 = 83 * b; // 0.081312F + + float yy = ((y0) + (y1) + (y2)) >> 10; + float cb = 128 + ((((cb0) - (cb1) + (cb2))) >> 10); + float cr = 128 + ((((cr0) - (cr1) - (cr2))) >> 10); + + return new Vector3(yy, cb, cr); + } + } +} \ No newline at end of file