PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ rt_raster_generate_new_band()

int rt_raster_generate_new_band ( rt_raster  raster,
rt_pixtype  pixtype,
double  initialvalue,
uint32_t  hasnodata,
double  nodatavalue,
int  index 
)

Generate a new inline band and add it to a raster.

Memory is allocated in this function for band data.

Parameters
raster: the raster to add a band to
pixtype: the pixel type for the new band
initialvalue: initial value for pixels
hasnodata: indicates if the band has a nodata value
nodatavalue: nodata value for the new band
index: position to add the new band in the raster
Returns
identifier (position) for the just-added raster, or -1 on error

Definition at line 489 of file rt_raster.c.

493  {
494  rt_band band = NULL;
495  int width = 0;
496  int height = 0;
497  int numval = 0;
498  int datasize = 0;
499  int oldnumbands = 0;
500  int numbands = 0;
501  void * mem = NULL;
502  int32_t checkvalint = 0;
503  uint32_t checkvaluint = 0;
504  double checkvaldouble = 0;
505  float checkvalfloat = 0;
506  int i;
507 
508 
509  assert(NULL != raster);
510 
511  /* Make sure index is in a valid range */
512  oldnumbands = rt_raster_get_num_bands(raster);
513  if (index < 0)
514  index = 0;
515  else if (index > oldnumbands + 1)
516  index = oldnumbands + 1;
517 
518  /* Determine size of memory block to allocate and allocate it */
519  width = rt_raster_get_width(raster);
520  height = rt_raster_get_height(raster);
521  numval = width * height;
522  datasize = rt_pixtype_size(pixtype) * numval;
523 
524  mem = (int *)rtalloc(datasize);
525  if (!mem) {
526  rterror("rt_raster_generate_new_band: Could not allocate memory for band");
527  return -1;
528  }
529 
530  if (FLT_EQ(initialvalue, 0.0))
531  memset(mem, 0, datasize);
532  else {
533  switch (pixtype)
534  {
535  case PT_1BB:
536  {
537  uint8_t *ptr = mem;
538  uint8_t clamped_initval = rt_util_clamp_to_1BB(initialvalue);
539  for (i = 0; i < numval; i++)
540  ptr[i] = clamped_initval;
541  checkvalint = ptr[0];
542  break;
543  }
544  case PT_2BUI:
545  {
546  uint8_t *ptr = mem;
547  uint8_t clamped_initval = rt_util_clamp_to_2BUI(initialvalue);
548  for (i = 0; i < numval; i++)
549  ptr[i] = clamped_initval;
550  checkvalint = ptr[0];
551  break;
552  }
553  case PT_4BUI:
554  {
555  uint8_t *ptr = mem;
556  uint8_t clamped_initval = rt_util_clamp_to_4BUI(initialvalue);
557  for (i = 0; i < numval; i++)
558  ptr[i] = clamped_initval;
559  checkvalint = ptr[0];
560  break;
561  }
562  case PT_8BSI:
563  {
564  int8_t *ptr = mem;
565  int8_t clamped_initval = rt_util_clamp_to_8BSI(initialvalue);
566  for (i = 0; i < numval; i++)
567  ptr[i] = clamped_initval;
568  checkvalint = ptr[0];
569  break;
570  }
571  case PT_8BUI:
572  {
573  uint8_t *ptr = mem;
574  uint8_t clamped_initval = rt_util_clamp_to_8BUI(initialvalue);
575  for (i = 0; i < numval; i++)
576  ptr[i] = clamped_initval;
577  checkvalint = ptr[0];
578  break;
579  }
580  case PT_16BSI:
581  {
582  int16_t *ptr = mem;
583  int16_t clamped_initval = rt_util_clamp_to_16BSI(initialvalue);
584  for (i = 0; i < numval; i++)
585  ptr[i] = clamped_initval;
586  checkvalint = ptr[0];
587  break;
588  }
589  case PT_16BUI:
590  {
591  uint16_t *ptr = mem;
592  uint16_t clamped_initval = rt_util_clamp_to_16BUI(initialvalue);
593  for (i = 0; i < numval; i++)
594  ptr[i] = clamped_initval;
595  checkvalint = ptr[0];
596  break;
597  }
598  case PT_32BSI:
599  {
600  int32_t *ptr = mem;
601  int32_t clamped_initval = rt_util_clamp_to_32BSI(initialvalue);
602  for (i = 0; i < numval; i++)
603  ptr[i] = clamped_initval;
604  checkvalint = ptr[0];
605  break;
606  }
607  case PT_32BUI:
608  {
609  uint32_t *ptr = mem;
610  uint32_t clamped_initval = rt_util_clamp_to_32BUI(initialvalue);
611  for (i = 0; i < numval; i++)
612  ptr[i] = clamped_initval;
613  checkvaluint = ptr[0];
614  break;
615  }
616  case PT_32BF:
617  {
618  float *ptr = mem;
619  float clamped_initval = rt_util_clamp_to_32F(initialvalue);
620  for (i = 0; i < numval; i++)
621  ptr[i] = clamped_initval;
622  checkvalfloat = ptr[0];
623  break;
624  }
625  case PT_64BF:
626  {
627  double *ptr = mem;
628  for (i = 0; i < numval; i++)
629  ptr[i] = initialvalue;
630  checkvaldouble = ptr[0];
631  break;
632  }
633  default:
634  {
635  rterror("rt_raster_generate_new_band: Unknown pixeltype %d", pixtype);
636  rtdealloc(mem);
637  return -1;
638  }
639  }
640  }
641 
642  /* Overflow checking */
644  initialvalue,
645  checkvalint, checkvaluint,
646  checkvalfloat, checkvaldouble,
647  pixtype
648  );
649 
650  band = rt_band_new_inline(width, height, pixtype, hasnodata, nodatavalue, mem);
651  if (! band) {
652  rterror("rt_raster_generate_new_band: Could not add band to raster. Aborting");
653  rtdealloc(mem);
654  return -1;
655  }
656  rt_band_set_ownsdata_flag(band, 1); /* we DO own this data!!! */
657  index = rt_raster_add_band(raster, band, index);
658  numbands = rt_raster_get_num_bands(raster);
659  if (numbands == oldnumbands || index == -1) {
660  rterror("rt_raster_generate_new_band: Could not add band to raster. Aborting");
662  }
663 
664  /* set isnodata if hasnodata = TRUE and initial value = nodatavalue */
665  if (hasnodata && FLT_EQ(initialvalue, nodatavalue))
667 
668  return index;
669 }
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.
Definition: rt_band.c:63
void rt_band_set_ownsdata_flag(rt_band band, int flag)
Definition: rt_band.c:667
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
Definition: rt_context.c:219
void * rtalloc(size_t size)
Wrappers used for managing memory.
Definition: rt_context.c:191
rt_errorstate rt_band_set_isnodata_flag(rt_band band, int flag)
Set isnodata flag value.
Definition: rt_band.c:695
int8_t rt_util_clamp_to_8BSI(double value)
Definition: rt_util.c:50
uint8_t rt_util_clamp_to_1BB(double value)
Definition: rt_util.c:35
int32_t rt_util_clamp_to_32BSI(double value)
Definition: rt_util.c:70
@ PT_32BUI
Definition: librtcore.h:196
@ PT_2BUI
Definition: librtcore.h:189
@ PT_32BSI
Definition: librtcore.h:195
@ PT_4BUI
Definition: librtcore.h:190
@ PT_32BF
Definition: librtcore.h:197
@ PT_1BB
Definition: librtcore.h:188
@ PT_16BUI
Definition: librtcore.h:194
@ PT_8BSI
Definition: librtcore.h:191
@ PT_16BSI
Definition: librtcore.h:193
@ PT_64BF
Definition: librtcore.h:198
@ PT_8BUI
Definition: librtcore.h:192
int rt_util_dbl_trunc_warning(double initialvalue, int32_t checkvalint, uint32_t checkvaluint, float checkvalfloat, double checkvaldouble, rt_pixtype pixtype)
Definition: rt_util.c:676
#define FLT_EQ(x, y)
Definition: librtcore.h:2387
uint8_t rt_util_clamp_to_2BUI(double value)
Definition: rt_util.c:40
uint8_t rt_util_clamp_to_8BUI(double value)
Definition: rt_util.c:55
void rt_band_destroy(rt_band band)
Destroy a raster band.
Definition: rt_band.c:340
int16_t rt_util_clamp_to_16BSI(double value)
Definition: rt_util.c:60
uint8_t rt_util_clamp_to_4BUI(double value)
Definition: rt_util.c:45
void rtdealloc(void *mem)
Definition: rt_context.c:206
uint16_t rt_util_clamp_to_16BUI(double value)
Definition: rt_util.c:65
uint32_t rt_util_clamp_to_32BUI(double value)
Definition: rt_util.c:75
float rt_util_clamp_to_32F(double value)
Definition: rt_util.c:80
int rt_pixtype_size(rt_pixtype pixtype)
Return size in bytes of a value in the given pixtype.
Definition: rt_pixel.c:39
band
Definition: ovdump.py:58
raster
Be careful!! Zeros function's input parameter can be a (height x width) array, not (width x height): ...
Definition: rtrowdump.py:121
int rt_raster_add_band(rt_raster raster, rt_band band, int index)
Add band data to a raster.
Definition: rt_raster.c:409
uint16_t rt_raster_get_num_bands(rt_raster raster)
Definition: rt_raster.c:376
uint16_t rt_raster_get_height(rt_raster raster)
Definition: rt_raster.c:133
uint16_t rt_raster_get_width(rt_raster raster)
Definition: rt_raster.c:125

References ovdump::band, FLT_EQ, PT_16BSI, PT_16BUI, PT_1BB, PT_2BUI, PT_32BF, PT_32BSI, PT_32BUI, PT_4BUI, PT_64BF, PT_8BSI, PT_8BUI, rtrowdump::raster, rt_band_destroy(), rt_band_new_inline(), rt_band_set_isnodata_flag(), rt_band_set_ownsdata_flag(), rt_pixtype_size(), rt_raster_add_band(), rt_raster_get_height(), rt_raster_get_num_bands(), rt_raster_get_width(), rt_util_clamp_to_16BSI(), rt_util_clamp_to_16BUI(), rt_util_clamp_to_1BB(), rt_util_clamp_to_2BUI(), rt_util_clamp_to_32BSI(), rt_util_clamp_to_32BUI(), rt_util_clamp_to_32F(), rt_util_clamp_to_4BUI(), rt_util_clamp_to_8BSI(), rt_util_clamp_to_8BUI(), rt_util_dbl_trunc_warning(), rtalloc(), rtdealloc(), and rterror().

Referenced by RASTER_addBand(), RASTER_clip(), RASTER_mapAlgebra2(), RASTER_mapAlgebraExpr(), RASTER_mapAlgebraFct(), RASTER_mapAlgebraFctNgb(), RASTER_tile(), RASTER_union_transfn(), rt_raster_from_gdal_dataset(), rt_raster_iterator(), and test_raster_get_pixel_bilinear().

Here is the call graph for this function:
Here is the caller graph for this function: