From 51a0010efcd6a039adbc4e0fa5421c928b87ab34 Mon Sep 17 00:00:00 2001 From: Mirta Date: Thu, 7 Jan 2021 12:04:51 +0200 Subject: Modified Light Inks Logic --- .../ColorLib/Tango.ColorLib_v4/ColorConverter.cpp | 160 ++++++++++++++------- .../ColorLib/Tango.ColorLib_v4/ColorConverter.h | 5 +- 2 files changed, 113 insertions(+), 52 deletions(-) (limited to 'Software') diff --git a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.cpp b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.cpp index c0b6029aa..912b8b7aa 100644 --- a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.cpp +++ b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.cpp @@ -128,6 +128,7 @@ Tango::ColorLib::ColorConverter::~ColorConverter() delete[] m_InkNames; m_InkNames = NULL; } + /* if (m_ProcessRangesMinP != NULL) { delete[] m_ProcessRangesMinP; @@ -1086,7 +1087,7 @@ void Tango::ColorLib::ColorConverter::ConvertToNLInks(VectorXd InkIn, VectorXd { for (int i = 0; i < m_nInks; ++i) { - if (InkIn(i) <= m_NormGamutRegionMaxLim[0]) + if (InkIn(i) <= m_NormGamutRegionMaxLim[0]) m_CalibCurves[i].m_InvLinearInterp->Eval(InkIn(i), InkOut(i)); else InkOut(i) = InkIn(i); @@ -1597,6 +1598,7 @@ size_t Tango::ColorLib::ColorConverter::Convert(uint8_t * input_buffer, size_t i } SetLowVolThr_nlcm(); + VectorXd InkOut(m_nInks); VectorXd RGBOut(3); VectorXd LabOut(3); @@ -3919,16 +3921,15 @@ void Tango::ColorLib::ColorConverter::SplitVolume(VectorXd Volume, VectorXd &Vol { //mark split candidates int ind = 0; - int *LISplitInd = new int[m_nInks - 1]; VectorXd Vol_nlcm(m_nInks); - double TotalVolume = 0; + double InitTotalVolume = 0; double low = 0; double high = 0; for (int i = 0; i < m_nInks ; ++i) { Vol_nlcm(i) = Volume(i)*m_maxNlPerCM(i)/100; VolumeLI(i) = Vol_nlcm(i); - TotalVolume += Vol_nlcm(i); + InitTotalVolume += Vol_nlcm(i); } int indGR = 0; //Find Gamut Region @@ -3937,82 +3938,139 @@ void Tango::ColorLib::ColorConverter::SplitVolume(VectorXd Volume, VectorXd &Vol if (GamutRegion == i) indGR = i; } + //Set Limits + DefineSplitLimits(low, high, InitTotalVolume); + + //Apply 1st Split + for (int i = 0; i < m_nInks - 1; ++i) + { + if ((Vol_nlcm(i) >= low) & (Vol_nlcm(i) <= high)) + { + VolumeLI(i + m_nInks) = DilutionFactor * Vol_nlcm(i); + VolumeLI(i) = 0.0; + } + else + { + VolumeLI(i) = Vol_nlcm(i); + VolumeLI(i + m_nInks) = 0; + } + } + double UpperLimit = m_ProcessRangesMaxP[m_nProcessRanges - 1]; + double TotalVolume = 0.0; + + bool resplit = true; + VectorXd PrevVolume(m_TotalNumberofInks); + for (int i = 0; i < m_nInks; ++i) + PrevVolume(i) = Vol_nlcm(i); + for (int i = m_nInks; i < m_TotalNumberofInks; ++i) + PrevVolume(i) = 0.0; + int PrevGamutRegion = GamutRegion; + double PrevHigh = high; + double PrevLow = low; + while (resplit == true) + { + for (int i = 0; i < m_TotalNumberofInks; ++i) + TotalVolume += VolumeLI(i); + if (TotalVolume > UpperLimit) + { + VolumeLI = PrevVolume; + GamutRegion = PrevGamutRegion; + resplit = false; + } + else if (TotalVolume > InitTotalVolume) + { + DefineSplitLimits(low, high, TotalVolume); + //recalculate Gamut Region + indGR = 0; + findGamutRegion(GamutRegion, TotalVolume); + if (((low - PrevLow) > 0) & ((high - PrevHigh) > 0)) + { + //set Previous Volume + for (int i = 0; i < m_TotalNumberofInks; ++i) + PrevVolume(i) = VolumeLI(i); + PrevGamutRegion = GamutRegion; + PrevLow = low; + PrevHigh = high; + InitTotalVolume = TotalVolume; + for (int i = 0; i < m_nInks - 1; ++i) + { + if ((VolumeLI(i) >= low) & (VolumeLI(i) <= high)) + { + VolumeLI(i + m_nInks) = DilutionFactor * VolumeLI(i); + VolumeLI(i) = 0.0; + } + else + { + VolumeLI(i + m_nInks) = 0; + } + } + //recalculate Gamut Region + for (int i = 0; i < m_TotalNumberofInks; ++i) + TotalVolume += VolumeLI(i); + resplit = true; + } + else + resplit = false; + } + else + resplit = false; + } + NLcmtoPercentage(VolumeLI, VolumeLI); +} + +void Tango::ColorLib::ColorConverter::DefineSplitLimits(double &low, double &high, double InitTotalVolume ) +{ +//Set Limits + //1st Region double lim1 = 0; double lim2 = m_ProcessRangesMinP[0]; double lim3 = m_ProcessRangesMaxP[0]; int ProcessRangeInd = 0; - for (int iReg = 1; iReg= lim1) & (TotalVolume <= lim2)) + if ((InitTotalVolume >= lim1) & (InitTotalVolume <= lim2)) { //Calculate Ink Split Based on m_ProcessRangesMinP[iReg] low = LowVolumeThreshold * m_ProcessRangesMinP[iReg] / 100.0; high = LightInksThr * m_ProcessRangesMinP[iReg] / 100.0; } - else if ((TotalVolume <= lim3) & (TotalVolume > lim2)) + else if ((InitTotalVolume <= lim3) & (InitTotalVolume > lim2)) { //Calculate Ink Split Based on Total Volume - low = LowVolumeThreshold * TotalVolume / 100.0; - high = LightInksThr * TotalVolume / 100.0; + low = LowVolumeThreshold * InitTotalVolume / 100.0; + high = LightInksThr * InitTotalVolume / 100.0; } - lim1 = m_ProcessRangesMaxP[iReg]; - lim2 = m_ProcessRangesMinP[iReg+1]; - lim3 = m_ProcessRangesMaxP[iReg+1]; + lim1 = m_ProcessRangesMaxP[iReg]; + lim2 = m_ProcessRangesMinP[iReg + 1]; + lim3 = m_ProcessRangesMaxP[iReg + 1]; } - if ((TotalVolume >= lim1) & (TotalVolume <= lim2)) + //Last Region + if ((InitTotalVolume >= lim1) & (InitTotalVolume <= lim2)) { //Calculate Ink Split Based on m_ProcessRangesMinP[iReg] low = LowVolumeThreshold * m_ProcessRangesMinP[ProcessRangeInd] / 100.0; high = LightInksThr * m_ProcessRangesMinP[ProcessRangeInd] / 100.0; } - else if ((TotalVolume <= lim3) & (TotalVolume > lim2)) + else if ((InitTotalVolume <= lim3) & (InitTotalVolume > lim2)) { //Calculate Ink Split Based on Total Volume - low = LowVolumeThreshold * TotalVolume / 100.0; - high = LightInksThr * TotalVolume / 100.0; + low = LowVolumeThreshold * InitTotalVolume / 100.0; + high = LightInksThr * InitTotalVolume / 100.0; } +} - for (int i = 0; i < m_nInks - 1; ++i) - { - if ((Vol_nlcm(i) >= low) & (Vol_nlcm(i) <= high)) - { - VolumeLI(i + m_nInks) = DilutionFactor * Vol_nlcm(i); - VolumeLI(i) = 0.0; - } - else - { - VolumeLI(i) = Vol_nlcm(i); - VolumeLI(i + m_nInks) = 0; - } - } - //Check if Split Volume exceeds MaxInkUptake[1] - double UpperLimit = m_ProcessRangesMaxP[m_nProcessRanges - 1]; - TotalVolume = 0.0; - for (int i = 0; i < m_TotalNumberofInks; ++i) - TotalVolume += VolumeLI(i); - if (TotalVolume > UpperLimit) - { - //go back to CMYK inks - for (int iBack = 0; iBack < m_nInks - 1; ++iBack) - { - if ((VolumeLI(iBack) == 0) & (VolumeLI(iBack + m_nInks) > 0)) - { - VolumeLI(iBack) = VolumeLI(iBack + m_nInks)/DilutionFactor; - TotalVolume += (VolumeLI(iBack) - VolumeLI(iBack + m_nInks)); - VolumeLI(iBack + m_nInks) = 0.0; - } - } - } - NLcmtoPercentage(VolumeLI, VolumeLI); +void Tango::ColorLib::ColorConverter::findGamutRegion(int &GamutRegion, double TotalVolume) +{ if (TotalVolume <= m_ProcessRangesMaxP[0]) GamutRegion = 0; else { - for (int i = 1; i < indGR + 1; ++i) + for (int i = 1; i m_ProcessRangesMaxP[i - 1]) & (TotalVolume <= m_ProcessRangesMaxP[i])) GamutRegion = i; } } -} \ No newline at end of file +} diff --git a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.h b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.h index 3f84b9304..2ea0c34dd 100644 --- a/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.h +++ b/Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.h @@ -79,7 +79,7 @@ namespace Tango VectorXd &InkOut, VectorXd &RGBOut, VectorXd &LabOut, int &GamutRegion); void ConvertVolumeToLabRel(VectorXd &Volume, VectorXd &LabOut, int GamutRegion); - void SplitVolume(VectorXd Volume, VectorXd &VolumeLI, int &GamutRegion); + size_t Tango::ColorLib::ColorConverter::Convert(uint8_t * input_buffer, size_t input_buffer_size, uint8_t *& output_buffer); size_t Tango::ColorLib::ColorConverter::GenerateGradient(uint8_t * input_buffer, size_t input_buffer_size, uint8_t *& output_buffer); void ConvertToNLInks(VectorXd InkIn, VectorXd &InkOut); @@ -173,6 +173,9 @@ namespace Tango void GetClosestInk(VectorXd Volume, int &GamutRegion, VectorXd &BestVolume); bool CheckMonotonicity(CalibrationData *calibdata); void ConfineVolumes(VectorXd &Volume); + void SplitVolume(VectorXd Volume, VectorXd &VolumeLI, int &GamutRegion); + void DefineSplitLimits(double &low, double &high, double InitTotalVolume); + void findGamutRegion(int &GamutRegion, double TotalVolume); }; } } -- cgit v1.3.1