using Google.Protobuf; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core.ExtensionMethods; using Tango.PMR.ColorLab; namespace Tango.ColorLib.OutOfGamutTest.CLI { class Program { public static Random _s_random = new Random(); static void Main(string[] args) { ColorFunctionGenerator connector = new ColorFunctionGenerator(); //test color spaces Console.WriteLine("Test GetRecommendedProcessParameters ColorSpace CATALOG." + Environment.NewLine); IsTestPassedGetRecommendedProcessParameters(connector, PMR.ColorLab.ColorSpace.Catalog); Console.WriteLine("Test GetRecommendedProcessParameters ColorSpace RGB." + Environment.NewLine); IsTestPassedGetRecommendedProcessParameters(connector, PMR.ColorLab.ColorSpace.Rgb); Console.WriteLine("Test GetRecommendedProcessParameters ColorSpace LAB." + Environment.NewLine); IsTestPassedGetRecommendedProcessParameters(connector, PMR.ColorLab.ColorSpace.Lab); Console.WriteLine("Test GetRecommendedProcessParameters ColorSpace VOLUME." + Environment.NewLine); IsTestPassedGetRecommendedProcessParameters(connector, PMR.ColorLab.ColorSpace.Volume); // Console.WriteLine("Press any key to start..."); Console.ReadLine(); Stopwatch watch = new Stopwatch(); watch.Start(); Console.WriteLine("Start processing Compare Convert and GetRecommendedProcessParameters for 200 Brush stops..."); for (int i = 0; i < 50; i++) { ConversionOutput convert_result1 = Convert(connector, PMR.ColorLab.ColorSpace.Rgb); ConversionOutput convert_result2 = Convert(connector, PMR.ColorLab.ColorSpace.Lab); ConversionOutput convert_result3 = Convert(connector, PMR.ColorLab.ColorSpace.Catalog); ConversionOutput convert_result4 = Convert(connector, PMR.ColorLab.ColorSpace.Volume); } watch.Stop(); Console.WriteLine($"Processing Convert for 200 brush stops completed after: {watch.ElapsedMilliseconds.ToString()} milliseconds."); Console.WriteLine(); watch.Reset(); watch.Restart(); int result = GetRecommendedProcessParameters(connector); watch.Stop(); Console.WriteLine($"Processing GetRecommendedProcessParameters with 200 brush stops completed after: {watch.ElapsedMilliseconds.ToString()} milliseconds."); Console.WriteLine(); Console.WriteLine("Start processing Compare Convert and OutOfGamut for 200 Brush stops..."); watch.Reset(); watch.Restart(); for (int i = 0; i < 100; i++) { ConversionOutput convert_result1 = Convert(connector, PMR.ColorLab.ColorSpace.Rgb); ConversionOutput convert_result2 = Convert(connector, PMR.ColorLab.ColorSpace.Lab); } watch.Stop(); Console.WriteLine($"Processing Convert for 200 brush stops completed after: {watch.ElapsedMilliseconds.ToString()} milliseconds."); Console.WriteLine(); watch.Reset(); watch.Restart(); for (int i = 0; i < 100; i++) { bool result_o1 = CheckOutOfGamut(connector, PMR.ColorLab.ColorSpace.Rgb); bool result_o2 = CheckOutOfGamut(connector, PMR.ColorLab.ColorSpace.Lab); } Console.WriteLine($"Processing CheckOutOfGamut completed after: {watch.ElapsedMilliseconds.ToString()} milliseconds."); Console.WriteLine(); watch.Stop(); Console.WriteLine("Press return to exit..."); Console.ReadLine(); } public static bool CheckOutOfGamut(ColorFunctionGenerator connector, PMR.ColorLab.ColorSpace colorSpase) { OutOfGamutInput input = new OutOfGamutInput(); input.ThreadL = 92.7867; input.ThreadA = -0.2519; input.ThreadB = 0.6968; input.ColorSpace = colorSpase; input.InputCoordinates = GetRandomInputCoordinates(colorSpase); //Process Ranges input.ProcessRanges.Add(new ProcessRange() { MinInkUptake = 200, MaxInkUptake = 200, }); input.ProcessRanges.Add(new ProcessRange() { MinInkUptake = 200, MaxInkUptake = 400, }); input.ForwardData = ByteString.CopyFrom(File.ReadAllBytes(@"Sylko_IL400_BL95_C200R_1N.cct")); //RML Liquid Factors input.InputCoordinates.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Cyan, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Cyan), MaxNanoliterPerCentimeter = 200, }); input.InputCoordinates.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Magenta, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Magenta), MaxNanoliterPerCentimeter = 200, }); input.InputCoordinates.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Yellow, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Yellow), MaxNanoliterPerCentimeter = 200, }); input.InputCoordinates.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Black, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Black), MaxNanoliterPerCentimeter = 200, }); OutOfGamutOutput outOfGamutOutput = connector.CheckOutOfGamut(input); return outOfGamutOutput.OutOfGamut; } public static int GetRecommendedProcessParameters(ColorFunctionGenerator connector) { RecommendedProcessTableInput input = new RecommendedProcessTableInput(); input.ThreadL = 92.7867; input.ThreadA = -0.2519; input.ThreadB = 0.6968; input.ForwardData = ByteString.CopyFrom(File.ReadAllBytes(@"Sylko_IL400_BL95_C200R_1N.cct")); for (int i = 0; i < 50; i++) { input.Stops.Add(GetRandomGradientInputStop(ColorSpace.Rgb)); input.Stops.Add(GetRandomGradientInputStop(ColorSpace.Lab)); input.Stops.Add(GetRandomGradientInputStop(ColorSpace.Catalog)); input.Stops.Add(GetRandomGradientInputStop(ColorSpace.Volume)); } input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Cyan, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Cyan), MaxNanoliterPerCentimeter = 200, }); input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Magenta, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Magenta), MaxNanoliterPerCentimeter = 200, }); input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Yellow, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Yellow), MaxNanoliterPerCentimeter = 200, }); input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Black, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Black), MaxNanoliterPerCentimeter = 200, }); input.ProcessRanges.Add(new ProcessRange() { MinInkUptake = 200, MaxInkUptake = 200, }); input.ProcessRanges.Add(new ProcessRange() { MinInkUptake = 200, MaxInkUptake = 400, }); input.UseLightInks = false; RecommendedProcessTableOutput output = connector.GetRecommendedProcessParameters(input, 4); return output.ProcessParametersTableIndex; } public static bool IsTestPassedGetRecommendedProcessParameters(ColorFunctionGenerator connector, ColorSpace colorSpace) { RecommendedProcessTableInput input = new RecommendedProcessTableInput(); input.ThreadL = 92.7867; input.ThreadA = -0.2519; input.ThreadB = 0.6968; input.ForwardData = ByteString.CopyFrom(File.ReadAllBytes(@"Sylko_IL400_BL95_C200R_1N.cct")); input.Stops.Add(GetRandomGradientInputStop(colorSpace)); input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Cyan, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Cyan), MaxNanoliterPerCentimeter = 200, }); input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Magenta, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Magenta), MaxNanoliterPerCentimeter = 200, }); input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Yellow, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Yellow), MaxNanoliterPerCentimeter = 200, }); input.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Black, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Black), MaxNanoliterPerCentimeter = 200, }); input.ProcessRanges.Add(new ProcessRange() { MinInkUptake = 200, MaxInkUptake = 200, }); input.ProcessRanges.Add(new ProcessRange() { MinInkUptake = 200, MaxInkUptake = 400, }); input.UseLightInks = false; try { RecommendedProcessTableOutput output = connector.GetRecommendedProcessParameters(input, 4); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"Passed."); Console.ForegroundColor = ConsoleColor.Gray; Console.WriteLine(); } catch(Exception ex) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(ex.Message); } return true; } public static ConversionOutput Convert(ColorFunctionGenerator connector, PMR.ColorLab.ColorSpace colorSpase) { ConversionInput input = new ConversionInput(); input.ThreadL = 92.7867; input.ThreadA = -0.2519; input.ThreadB = 0.6968; input.ColorSpace = colorSpase; input.InputCoordinates = GetRandomInputCoordinates(colorSpase); //Process Ranges input.ProcessRanges.Add(new ProcessRange() { MinInkUptake = 200, MaxInkUptake = 200, }); input.ProcessRanges.Add(new ProcessRange() { MinInkUptake = 200, MaxInkUptake = 400, }); input.ForwardData = ByteString.CopyFrom(File.ReadAllBytes(@"Sylko_IL400_BL95_C200R_1N.cct")); //RML Liquid Factors input.InputCoordinates.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Cyan, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Cyan), MaxNanoliterPerCentimeter = 200, }); input.InputCoordinates.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Magenta, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Magenta), MaxNanoliterPerCentimeter = 200, }); input.InputCoordinates.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Yellow, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Yellow), MaxNanoliterPerCentimeter = 200, }); input.InputCoordinates.InputLiquids.Add(new InputLiquid() { LiquidType = LiquidType.Black, CalibrationData = BL.Entities.Cat.CreateDemoCalibrationData(LiquidType.Black), MaxNanoliterPerCentimeter = 200, }); input.GenerateHive = false; return connector.Convert(input, 4); } public static InputCoordinates GetRandomInputCoordinates(PMR.ColorLab.ColorSpace colorSpase) { InputCoordinates inputCoordinates = new InputCoordinates(); if (colorSpase == PMR.ColorLab.ColorSpace.Rgb) { inputCoordinates.Red = _s_random.Next(0, 255); inputCoordinates.Green = _s_random.Next(0, 255); inputCoordinates.Blue = _s_random.Next(0, 255); } else if (colorSpase == PMR.ColorLab.ColorSpace.Lab) { inputCoordinates.L = _s_random.Next(0, 100); ; inputCoordinates.A = _s_random.Next(-128, 128); inputCoordinates.B = _s_random.Next(-128, 128); } //else if (colorSpase == PMR.ColorLab.ColorSpace.Catalog || colorSpase == ColorSpace.Volume) //{ // inputCoordinates.InputLiquids.Add(new InputLiquid() // { // LiquidType = LiquidType.Cyan, // Volume = _s_random.Next(0, 100) // }); // inputCoordinates.InputLiquids.Add(new InputLiquid() // { // LiquidType = LiquidType.Magenta, // Volume = _s_random.Next(0, 100) // }); // inputCoordinates.InputLiquids.Add(new InputLiquid() // { // LiquidType = LiquidType.Yellow, // Volume = _s_random.Next(0, 100) // }); // inputCoordinates.InputLiquids.Add(new InputLiquid() // { // LiquidType = LiquidType.Black, // Volume = _s_random.Next(0, 100) // }); //} else if (colorSpase == PMR.ColorLab.ColorSpace.Catalog || colorSpase == ColorSpace.Cmyk) { inputCoordinates.Cyan = _s_random.Next(0, 100); inputCoordinates.Magenta = _s_random.Next(0, 100); inputCoordinates.Yellow = _s_random.Next(0, 100); inputCoordinates.Key = _s_random.Next(0, 100); } return inputCoordinates; } public static GradientInputStop GetRandomGradientInputStop(PMR.ColorLab.ColorSpace colorSpase) { GradientInputStop input = new GradientInputStop(); input.ColorSpace = colorSpase; if (colorSpase == PMR.ColorLab.ColorSpace.Rgb) { input.Red = _s_random.Next(0, 255); input.Green = _s_random.Next(0, 255); input.Blue = _s_random.Next(0, 255); } else if (colorSpase == PMR.ColorLab.ColorSpace.Lab) { input.L = _s_random.Next(0, 100); ; input.A = _s_random.Next(-128, 128); input.B = _s_random.Next(-128, 128); } else if(colorSpase == ColorSpace.Volume) { input.LiquidVolumes.Add(new LiquidVolume() { LiquidType = LiquidType.Cyan, Volume = _s_random.Next(0, 100) }); input.LiquidVolumes.Add(new LiquidVolume() { LiquidType = LiquidType.Magenta, Volume = _s_random.Next(0, 100) }); input.LiquidVolumes.Add(new LiquidVolume() { LiquidType = LiquidType.Yellow, Volume = _s_random.Next(0, 100) }); input.LiquidVolumes.Add(new LiquidVolume() { LiquidType = LiquidType.Black, Volume = _s_random.Next(0, 100) }); } else if(colorSpase == PMR.ColorLab.ColorSpace.Catalog || colorSpase == ColorSpace.Cmyk) { input.Cyan = _s_random.Next(0, 100); input.Magenta = _s_random.Next(0, 100); input.Yellow = _s_random.Next(0, 100); input.Key = _s_random.Next(0, 100); } return input; } } }