@@ -54,11 +54,7 @@ void calculate_daylight_SPD( const int &cct_input, Spectrum &spectrum )
5454 else if ( cct_input >= 4000 && cct_input <= 25000 )
5555 cct = cct_input * 1.0 ;
5656 else
57- {
58- std::cerr << " The range of Correlated Color Temperature for "
59- << " Day Light should be from 4000 to 25000." << std::endl;
60- exit ( 1 );
61- }
57+ assert ( false );
6258
6359 spectrum.values .clear ();
6460
@@ -100,12 +96,7 @@ void calculate_daylight_SPD( const int &cct_input, Spectrum &spectrum )
10096
10197void calculate_blackbody_SPD ( const int &cct, Spectrum &spectrum )
10298{
103- if ( cct < 1500 || cct >= 4000 )
104- {
105- std::cerr << " The range of Color Temperature for BlackBody "
106- << " should be from 1500 to 3999." << std::endl;
107- exit ( 1 );
108- }
99+ assert ( cct >= 1500 && cct < 4000 );
109100
110101 spectrum.values .clear ();
111102
@@ -129,12 +120,15 @@ void calculate_blackbody_SPD( const int &cct, Spectrum &spectrum )
129120// / @param type Type of light source (e.g. "d50", "d65", "d75", "A", "B", "C", "D50", "D65", "D75")
130121// / @param is_daylight True if the light source is a daylight source, false if it is a blackbody source
131122// / @param illuminant Reference to SpectralData object to fill with generated illuminant data
123+ // / @param error_message a destination for any potential error message.
124+ // / @result `true` if generated successfully.
132125// / @pre cct is in valid range for the specified illuminant type
133- void generate_illuminant (
126+ bool generate_illuminant (
134127 int cct,
135128 const std::string &type,
136129 bool is_daylight,
137- SpectralData &illuminant )
130+ SpectralData &illuminant,
131+ std::string &error_message )
138132{
139133 illuminant.data .clear ();
140134
@@ -150,12 +144,30 @@ void generate_illuminant(
150144 illuminant.type = type;
151145 if ( is_daylight )
152146 {
147+ if ( cct < 40 || ( cct > 250 && cct < 4000 ) || cct > 25000 )
148+ {
149+ error_message =
150+ " The range of Correlated Color Temperature for "
151+ " Day Light should be from 4000 to 25000.\n " ;
152+ return false ;
153+ }
154+
153155 calculate_daylight_SPD ( cct, power_spectrum );
154156 }
155157 else
156158 {
159+ if ( cct < 1500 || cct >= 4000 )
160+ {
161+ error_message =
162+ " The range of Color Temperature for BlackBody "
163+ " should be from 1500 to 3999.\n " ;
164+ return false ;
165+ }
166+
157167 calculate_blackbody_SPD ( cct, power_spectrum );
158168 }
169+
170+ return true ;
159171}
160172
161173SpectralSolver::SpectralSolver (
@@ -328,15 +340,15 @@ bool SpectralSolver::find_illuminant( const std::string &type )
328340 {
329341 int cct = atoi ( type.substr ( 1 ).c_str () );
330342 const std::string illuminant_type = " d" + std::to_string ( cct );
331- generate_illuminant ( cct, illuminant_type, true , illuminant );
332- return true ;
343+ return generate_illuminant (
344+ cct, illuminant_type, true , illuminant, last_error_message ) ;
333345 }
334346 else if ( is_blackbody )
335347 {
336348 int cct = atoi ( type.substr ( 0 , type.length () - 1 ).c_str () );
337349 const std::string illuminant_type = std::to_string ( cct ) + " k" ;
338- generate_illuminant ( cct, illuminant_type, false , illuminant );
339- return true ;
350+ return generate_illuminant (
351+ cct, illuminant_type, false , illuminant, last_error_message ) ;
340352 }
341353 else
342354 {
@@ -360,8 +372,9 @@ bool SpectralSolver::find_illuminant( const vector<double> &wb )
360372 if ( camera.data .count ( " main" ) == 0 ||
361373 camera.data .at ( " main" ).size () != 3 )
362374 {
363- std::cerr << " ERROR: camera needs to be initialised prior to calling "
364- << " SpectralSolver::find_illuminant()" << std::endl;
375+ last_error_message =
376+ " Camera needs to be initialised prior to calling "
377+ " SpectralSolver::find_illuminant()." ;
365378 return false ;
366379 }
367380
@@ -372,15 +385,21 @@ bool SpectralSolver::find_illuminant( const vector<double> &wb )
372385 {
373386 SpectralData &illuminant_data = _all_illuminants.emplace_back ();
374387 const std::string type = " d" + std::to_string ( cct / 100 );
375- generate_illuminant ( cct, type, true , illuminant_data );
388+
389+ [[maybe_unused]] bool success = generate_illuminant (
390+ cct, type, true , illuminant_data, last_error_message );
391+ assert ( success );
376392 }
377393
378394 // Blackbody - pre-calculate
379395 for ( int cct = 1500 ; cct < 4000 ; cct += 500 )
380396 {
381397 SpectralData &illuminant_data = _all_illuminants.emplace_back ();
382398 const std::string type = std::to_string ( cct ) + " k" ;
383- generate_illuminant ( cct, type, false , illuminant_data );
399+
400+ [[maybe_unused]] bool success = generate_illuminant (
401+ cct, type, false , illuminant_data, last_error_message );
402+ assert ( success );
384403 }
385404
386405 auto illuminant_files = collect_data_files ( " illuminant" );
@@ -425,16 +444,18 @@ bool SpectralSolver::calculate_WB()
425444 if ( camera.data .count ( " main" ) == 0 ||
426445 camera.data .at ( " main" ).size () != 3 )
427446 {
428- std::cerr << " ERROR: camera needs to be initialised prior to calling "
429- << " SpectralSolver::calculate_WB()" << std::endl;
447+ last_error_message =
448+ " Camera needs to be initialised prior to calling "
449+ " SpectralSolver::calculate_WB()." ;
430450 return false ;
431451 }
432452
433453 if ( illuminant.data .count ( " main" ) == 0 ||
434454 illuminant.data .at ( " main" ).size () != 1 )
435455 {
436- std::cerr << " ERROR: illuminant needs to be initialised prior to "
437- << " calling SpectralSolver::calculate_WB()" << std::endl;
456+ last_error_message =
457+ " Illuminant needs to be initialised prior to "
458+ " calling SpectralSolver::calculate_WB()." ;
438459 return false ;
439460 }
440461
@@ -717,34 +738,36 @@ bool SpectralSolver::calculate_IDT_matrix()
717738 if ( camera.data .count ( " main" ) == 0 ||
718739 camera.data .at ( " main" ).size () != 3 )
719740 {
720- std::cerr << " ERROR: camera needs to be initialised prior to calling "
721- << " SpectralSolver::calculate_IDT_matrix()" << std::endl;
741+ last_error_message =
742+ " Camera needs to be initialised prior to calling "
743+ " SpectralSolver::calculate_IDT_matrix()." ;
722744 return false ;
723745 }
724746
725747 if ( illuminant.data .count ( " main" ) == 0 ||
726748 illuminant.data .at ( " main" ).size () != 1 )
727749 {
728- std::cerr << " ERROR: illuminant needs to be initialised prior to "
729- << " calling SpectralSolver::calculate_IDT_matrix() "
730- << std::endl ;
750+ last_error_message =
751+ " Illuminant needs to be initialised prior to "
752+ " calling SpectralSolver::calculate_IDT_matrix(). " ;
731753 return false ;
732754 }
733755
734756 if ( observer.data .count ( " main" ) == 0 ||
735757 observer.data .at ( " main" ).size () != 3 )
736758 {
737- std::cerr << " ERROR: observer needs to be initialised prior to calling "
738- << " SpectralSolver::calculate_IDT_matrix()" << std::endl;
759+ last_error_message =
760+ " Observer needs to be initialised prior to "
761+ " calling SpectralSolver::calculate_IDT_matrix()." ;
739762 return false ;
740763 }
741764
742765 if ( training_data.data .count ( " main" ) == 0 ||
743766 training_data.data .at ( " main" ).empty () )
744767 {
745- std::cerr << " ERROR: training data needs to be initialised prior to "
746- << " calling SpectralSolver::calculate_IDT_matrix() "
747- << std::endl ;
768+ last_error_message =
769+ " Training data needs to be initialised prior to "
770+ " calling SpectralSolver::calculate_IDT_matrix(). " ;
748771 return false ;
749772 }
750773
0 commit comments