Generate a new inline band and add it to a raster.
Memory is allocated in this function for band data.
489 {
491 int width = 0;
492 int height = 0;
493 int numval = 0;
494 int datasize = 0;
495 int oldnumbands = 0;
496 int numbands = 0;
497 void * mem = NULL;
498 int32_t checkvalint = 0;
499 uint32_t checkvaluint = 0;
500 double checkvaldouble = 0;
501 float checkvalfloat = 0;
502 int i;
503
504
505 assert(NULL != raster);
506
507
509 if (index < 0)
510 index = 0;
511 else if (index > oldnumbands + 1)
512 index = oldnumbands + 1;
513
514
517 numval = width * height;
519
520 mem = (
int *)
rtalloc(datasize);
521 if (!mem) {
522 rterror(
"rt_raster_generate_new_band: Could not allocate memory for band");
523 return -1;
524 }
525
526 if (
FLT_EQ(initialvalue, 0.0))
527 memset(mem, 0, datasize);
528 else {
529 switch (pixtype)
530 {
532 {
533 uint8_t *ptr = mem;
535 for (i = 0; i < numval; i++)
536 ptr[i] = clamped_initval;
537 checkvalint = ptr[0];
538 break;
539 }
541 {
542 uint8_t *ptr = mem;
544 for (i = 0; i < numval; i++)
545 ptr[i] = clamped_initval;
546 checkvalint = ptr[0];
547 break;
548 }
550 {
551 uint8_t *ptr = mem;
553 for (i = 0; i < numval; i++)
554 ptr[i] = clamped_initval;
555 checkvalint = ptr[0];
556 break;
557 }
559 {
560 int8_t *ptr = mem;
562 for (i = 0; i < numval; i++)
563 ptr[i] = clamped_initval;
564 checkvalint = ptr[0];
565 break;
566 }
568 {
569 uint8_t *ptr = mem;
571 for (i = 0; i < numval; i++)
572 ptr[i] = clamped_initval;
573 checkvalint = ptr[0];
574 break;
575 }
577 {
578 int16_t *ptr = mem;
580 for (i = 0; i < numval; i++)
581 ptr[i] = clamped_initval;
582 checkvalint = ptr[0];
583 break;
584 }
586 {
587 uint16_t *ptr = mem;
589 for (i = 0; i < numval; i++)
590 ptr[i] = clamped_initval;
591 checkvalint = ptr[0];
592 break;
593 }
595 {
596 int32_t *ptr = mem;
598 for (i = 0; i < numval; i++)
599 ptr[i] = clamped_initval;
600 checkvalint = ptr[0];
601 break;
602 }
604 {
605 uint32_t *ptr = mem;
607 for (i = 0; i < numval; i++)
608 ptr[i] = clamped_initval;
609 checkvaluint = ptr[0];
610 break;
611 }
613 {
614 float *ptr = mem;
616 for (i = 0; i < numval; i++)
617 ptr[i] = clamped_initval;
618 checkvalfloat = ptr[0];
619 break;
620 }
622 {
623 double *ptr = mem;
624 for (i = 0; i < numval; i++)
625 ptr[i] = initialvalue;
626 checkvaldouble = ptr[0];
627 break;
628 }
629 default:
630 {
631 rterror(
"rt_raster_generate_new_band: Unknown pixeltype %d", pixtype);
633 return -1;
634 }
635 }
636 }
637
638
640 initialvalue,
641 checkvalint, checkvaluint,
642 checkvalfloat, checkvaldouble,
643 pixtype
644 );
645
647 if (! band) {
648 rterror(
"rt_raster_generate_new_band: Could not add band to raster. Aborting");
650 return -1;
651 }
655 if (numbands == oldnumbands || index == -1) {
656 rterror(
"rt_raster_generate_new_band: Could not add band to raster. Aborting");
658 }
659
660
661 if (hasnodata &&
FLT_EQ(initialvalue, nodatavalue))
663
664 return index;
665}
rt_band rt_band_new_inline(uint16_t width, uint16_t height, rt_pixtype pixtype, uint32_t hasnodata, double nodataval, uint8_t *data)
Create an in-db rt_band with no data.
void rt_band_set_ownsdata_flag(rt_band band, int flag)
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
void * rtalloc(size_t size)
Wrappers used for managing memory.
rt_errorstate rt_band_set_isnodata_flag(rt_band band, int flag)
Set isnodata flag value.
int8_t rt_util_clamp_to_8BSI(double value)
uint8_t rt_util_clamp_to_1BB(double value)
int32_t rt_util_clamp_to_32BSI(double value)
int rt_util_dbl_trunc_warning(double initialvalue, int32_t checkvalint, uint32_t checkvaluint, float checkvalfloat, double checkvaldouble, rt_pixtype pixtype)
uint8_t rt_util_clamp_to_2BUI(double value)
uint8_t rt_util_clamp_to_8BUI(double value)
void rt_band_destroy(rt_band band)
Destroy a raster band.
int16_t rt_util_clamp_to_16BSI(double value)
uint8_t rt_util_clamp_to_4BUI(double value)
void rtdealloc(void *mem)
uint16_t rt_util_clamp_to_16BUI(double value)
uint32_t rt_util_clamp_to_32BUI(double value)
float rt_util_clamp_to_32F(double value)
int rt_pixtype_size(rt_pixtype pixtype)
Return size in bytes of a value in the given pixtype.
int rt_raster_add_band(rt_raster raster, rt_band band, int index)
Add band data to a raster.
uint16_t rt_raster_get_num_bands(rt_raster raster)
uint16_t rt_raster_get_height(rt_raster raster)
uint16_t rt_raster_get_width(rt_raster raster)