PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ rt_band_set_pixel_line()

rt_errorstate rt_band_set_pixel_line ( rt_band  band,
int  x,
int  y,
void *  vals,
uint32_t  len 
)

Set values of multiple pixels.

Unlike rt_band_set_pixel, values in vals are expected to be of the band's pixel type as this function uses memcpy.

It is important to be careful when using this function as the number of values being set may exceed a pixel "row". Remember that the band values are stored in a stream (1-D array) regardless of what the raster's width and height might be. So, setting a number of values may cross multiple pixel "rows".

Parameters
band: the band to set value to
x: pixel column (0-based)
y: pixel row (0-based)
vals: the pixel values to apply
len: # of elements in vals
Returns
ES_NONE on success, ES_ERROR on error

Unlike rt_band_set_pixel, values in vals are expected to be of the band's pixel type as this function uses memcpy.

It is important to be careful when using this function as the number of values being set may exceed a pixel "row". Remember that the band values are stored in a stream (1-D array) regardless of what the raster's width and height might be. So, setting a number of values may cross multiple pixel "rows".

Parameters
band: the band to set value to
x: X coordinate (0-based)
y: Y coordinate (0-based)
vals: the pixel values to apply
len: # of elements in vals
Returns
ES_NONE on success, ES_ERROR on error

Definition at line 1004 of file rt_band.c.

1008  {
1009  rt_pixtype pixtype = PT_END;
1010  int size = 0;
1011  uint8_t *data = NULL;
1012  uint32_t offset = 0;
1013 
1014  assert(NULL != band);
1015  assert(vals != NULL && len > 0);
1016 
1017  RASTER_DEBUGF(3, "length of values = %d", len);
1018 
1019  if (band->offline) {
1020  rterror("rt_band_set_pixel_line not implemented yet for OFFDB bands");
1021  return ES_ERROR;
1022  }
1023 
1024  pixtype = band->pixtype;
1025  size = rt_pixtype_size(pixtype);
1026 
1027  if (
1028  x < 0 || x >= band->width ||
1029  y < 0 || y >= band->height
1030  ) {
1031  rterror("rt_band_set_pixel_line: Coordinates out of range (%d, %d) vs (%d, %d)", x, y, band->width, band->height);
1032  return ES_ERROR;
1033  }
1034 
1036  offset = x + (y * band->width);
1037  RASTER_DEBUGF(4, "offset = %d", offset);
1038 
1039  /* make sure len of values to copy don't exceed end of data */
1040  if (len > (band->width * band->height) - offset) {
1041  rterror("rt_band_set_pixel_line: Could not apply pixels as values length exceeds end of data");
1042  return ES_ERROR;
1043  }
1044 
1045  switch (pixtype) {
1046  case PT_1BB:
1047  case PT_2BUI:
1048  case PT_4BUI:
1049  case PT_8BUI:
1050  case PT_8BSI: {
1051  uint8_t *ptr = data;
1052  ptr += offset;
1053  memcpy(ptr, vals, (size_t)size * len);
1054  break;
1055  }
1056  case PT_16BUI: {
1057  uint16_t *ptr = (uint16_t *) data;
1058  ptr += offset;
1059  memcpy(ptr, vals, (size_t)size * len);
1060  break;
1061  }
1062  case PT_16BSI: {
1063  int16_t *ptr = (int16_t *) data;
1064  ptr += offset;
1065  memcpy(ptr, vals, (size_t)size * len);
1066  break;
1067  }
1068  case PT_32BUI: {
1069  uint32_t *ptr = (uint32_t *) data;
1070  ptr += offset;
1071  memcpy(ptr, vals, (size_t)size * len);
1072  break;
1073  }
1074  case PT_32BSI: {
1075  int32_t *ptr = (int32_t *) data;
1076  ptr += offset;
1077  memcpy(ptr, vals, (size_t)size * len);
1078  break;
1079  }
1080  case PT_32BF: {
1081  float *ptr = (float *) data;
1082  ptr += offset;
1083  memcpy(ptr, vals, (size_t)size * len);
1084  break;
1085  }
1086  case PT_64BF: {
1087  double *ptr = (double *) data;
1088  ptr += offset;
1089  memcpy(ptr, vals, (size_t)size * len);
1090  break;
1091  }
1092  default: {
1093  rterror("rt_band_set_pixel_line: Unknown pixeltype %d", pixtype);
1094  return ES_ERROR;
1095  }
1096  }
1097 
1098 #if POSTGIS_DEBUG_LEVEL > 0
1099  {
1100  double value;
1101  rt_band_get_pixel(band, x, y, &value, NULL);
1102  RASTER_DEBUGF(4, "pixel at (%d, %d) = %f", x, y, value);
1103  }
1104 #endif
1105 
1106  /* set band's isnodata flag to FALSE */
1109 
1110  return ES_NONE;
1111 }
void rterror(const char *fmt,...) __attribute__((format(printf
Wrappers used for reporting errors and info.
#define RASTER_DEBUGF(level, msg,...)
Definition: librtcore.h:306
rt_pixtype
Definition: librtcore.h:187
@ PT_32BUI
Definition: librtcore.h:196
@ PT_2BUI
Definition: librtcore.h:189
@ PT_32BSI
Definition: librtcore.h:195
@ PT_END
Definition: librtcore.h:199
@ 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
@ ES_NONE
Definition: librtcore.h:182
@ ES_ERROR
Definition: librtcore.h:183
int rt_pixtype_size(rt_pixtype pixtype)
Return size in bytes of a value in the given pixtype.
Definition: rt_pixel.c:39
int value
Definition: genraster.py:62
band
Definition: ovdump.py:58
data
Definition: ovdump.py:104
rt_errorstate rt_band_set_isnodata_flag(rt_band band, int flag)
Set isnodata flag value.
Definition: rt_band.c:846
int rt_band_get_hasnodata_flag(rt_band band)
Get hasnodata flag value.
Definition: rt_band.c:825
rt_errorstate rt_band_get_pixel(rt_band band, int x, int y, double *value, int *nodata)
Get pixel value.
Definition: rt_band.c:1527
void * rt_band_get_data(rt_band band)
Get pointer to raster band data.
Definition: rt_band.c:551

References ovdump::band, ovdump::data, ES_ERROR, ES_NONE, PT_16BSI, PT_16BUI, PT_1BB, PT_2BUI, PT_32BF, PT_32BSI, PT_32BUI, PT_4BUI, PT_64BF, PT_8BSI, PT_8BUI, PT_END, RASTER_DEBUGF, rt_band_get_data(), rt_band_get_hasnodata_flag(), rt_band_get_pixel(), rt_band_set_isnodata_flag(), rt_pixtype_size(), rterror(), genraster::value, pixval::x, and pixval::y.

Referenced by RASTER_InterpolateRaster(), RASTER_tile(), RASTER_union_transfn(), and rt_raster_from_gdal_dataset().

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