commit e001c31f7742f770086fb018210cddaaabec4cdd
parent 34b22b666290127b9dc6745360c822678a97f2a2
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Fri, 9 Dec 2022 14:19:07 +0100
planeto: check the source wavelength radiance
Check the layout of the data and that the radiances are sorted in
ascending order of wavelengths.
Diffstat:
1 file changed, 40 insertions(+), 0 deletions(-)
diff --git a/src/planeto/htrdr_planeto_source.c b/src/planeto/htrdr_planeto_source.c
@@ -45,12 +45,48 @@ struct htrdr_planeto_source {
/*******************************************************************************
* Helper functions
******************************************************************************/
+static INLINE res_T
+check_per_wlen_radiance_sbuf_desc
+ (const struct htrdr_planeto_source* src,
+ const struct sbuf_desc* desc)
+{
+ const source_radiance_T* spectrum = NULL;
+ size_t i;
+ ASSERT(src && desc);
+
+ /* Invalid size */
+ if(desc->size == 0) {
+ htrdr_log_err(src->htrdr, "invalid empty source spectrum\n");
+ return RES_BAD_ARG;
+ }
+
+ /* Invalid memory layout */
+ if(desc->szitem != 16 || desc->alitem != 16 || desc->pitch != 16) {
+ htrdr_log_err(src->htrdr, "unexpected layout of source spectrum\n");
+ return RES_BAD_ARG;
+ }
+
+ /* Data must be sorted */
+ spectrum = desc->buffer;
+ FOR_EACH(i, 1, desc->size) {
+ if(spectrum[i-1].wavelength >= spectrum[i].wavelength) {
+ htrdr_log_err(src->htrdr,
+ "the source spectrum is not sorted in ascending order "
+ "with respect to wavelengths\n");
+ return RES_BAD_ARG;
+ }
+ }
+
+ return RES_OK;
+}
+
static res_T
setup_per_wavelength_radiances
(struct htrdr_planeto_source* src,
const struct htrdr_planeto_source_args* args)
{
struct sbuf_create_args sbuf_args;
+ struct sbuf_desc desc;
res_T res = RES_OK;
ASSERT(src && args && args->rnrl_filename && args->temperature < 0);
@@ -62,6 +98,10 @@ setup_per_wavelength_radiances
res = sbuf_load(src->per_wlen_radiances, args->rnrl_filename);
if(res != RES_OK) goto error;
+ res = sbuf_get_desc(src->per_wlen_radiances, &desc);
+ if(res != RES_OK) goto error;
+ res = check_per_wlen_radiance_sbuf_desc(src, &desc);
+ if(res != RES_OK) goto error;
exit:
return res;