aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
authorMirta <mirta@twine-s.com>2021-01-07 12:04:51 +0200
committerMirta <mirta@twine-s.com>2021-01-07 12:04:51 +0200
commit51a0010efcd6a039adbc4e0fa5421c928b87ab34 (patch)
treef555c791b394340e7be9d6e8032db55c04e7a269 /Software
parentc50e8793fc48afdb53a44ef670860e18f366a70d (diff)
downloadTango-51a0010efcd6a039adbc4e0fa5421c928b87ab34.tar.gz
Tango-51a0010efcd6a039adbc4e0fa5421c928b87ab34.zip
Modified Light Inks Logic
Diffstat (limited to 'Software')
-rw-r--r--Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.cpp160
-rw-r--r--Software/Visual_Studio/ColorLib/Tango.ColorLib_v4/ColorConverter.h5
2 files changed, 113 insertions, 52 deletions
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<m_nProcessRanges-1; ++iReg)
- {
+//Regions 1 to n-1
+ for (int iReg = 0; iReg < m_nProcessRanges - 1; ++iReg)
+ {
ProcessRangeInd = iReg;
- if ((TotalVolume >= 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_nProcessRanges; ++i)
{
if ((TotalVolume > 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);
};
}
}