* along the Y axis
* @param userarg : pointer to any argument that is passed as-is to callback.
* @param callback : callback function for actual processing of pixel values.
- * @param noerr : if 0, error occurred
+ * @param *rtnraster : return one band raster from iterator process
*
* The callback function _must_ have the following signature.
*
* - double *value: value of pixel to be burned by rt_raster_iterator()
* - int *nodata: flag (0 or 1) indicating that pixel to be burned is NODATA
*
- * @return raster object if success, NULL otherwise
+ * @return ES_NONE on success, ES_ERROR on error
*/
-rt_raster
+rt_errorstate
rt_raster_iterator(
rt_iterator itrset, uint16_t itrcount,
rt_extenttype extenttype, rt_raster customextent,
double *value,
int *nodata
),
- int *noerr
+ rt_raster *rtnraster
) {
/* output raster */
rt_raster rtnrast = NULL;
RASTER_DEBUG(3, "Starting...");
- /* assume error for flag */
- *noerr = 0;
+ assert(rtnraster != NULL);
+
+ /* init rtnraster to NULL */
+ *rtnraster = NULL;
/* check that callback function is not NULL */
if (callback == NULL) {
rterror("rt_raster_iterator: Callback function not provided");
- return NULL;
+ return ES_ERROR;
}
/* check that custom extent is provided if extenttype = ET_CUSTOM */
if (extenttype == ET_CUSTOM && rt_raster_is_empty(customextent)) {
rterror("rt_raster_iterator: Custom extent cannot be empty if extent type is ET_CUSTOM");
- return NULL;
+ return ES_ERROR;
}
/* check that pixtype != PT_END */
if (pixtype == PT_END) {
rterror("rt_raster_iterator: Pixel type cannot be PT_END");
- return NULL;
+ return ES_ERROR;
}
/* itrcount must be greater than 0 */
if (itrcount < 1) {
rterror("rt_raster_iterator: At least one element must be provided for itrset");
- return NULL;
+ return ES_ERROR;
}
/* itrset is not NULL */
if (itrset == NULL) {
rterror("rt_raster_iterator: itrset cannot be NULL");
- return NULL;
+ return ES_ERROR;
}
/* initialize _param */
if ((_param = _rti_iterator_arg_init()) == NULL) {
rterror("rt_raster_iterator: Unable to initialize internal variables");
- return NULL;
+ return ES_ERROR;
}
/* fill _param */
if (!_rti_iterator_arg_populate(_param, itrset, itrcount, distancex, distancey, &allnull, &allempty)) {
rterror("rt_raster_iterator: Unable to populate for internal variables");
_rti_iterator_arg_destroy(_param);
- return NULL;
+ return ES_ERROR;
}
/* shortcut if all null, return NULL */
_rti_iterator_arg_destroy(_param);
- *noerr = 1;
- return NULL;
+ return ES_NONE;
}
/* shortcut if all empty, return empty raster */
else if (allempty == itrcount) {
rtnrast = rt_raster_new(0, 0);
if (rtnrast == NULL) {
rterror("rt_raster_iterator: Unable to create empty raster");
- return NULL;
+ return ES_ERROR;
}
rt_raster_set_scale(rtnrast, 0, 0);
- *noerr = 1;
- return rtnrast;
+ *rtnraster = rtnrast;
+ return ES_NONE;
}
/* check that all rasters are aligned */
_rti_iterator_arg_destroy(_param);
- return NULL;
+ return ES_ERROR;
}
do {
_rti_iterator_arg_destroy(_param);
- return NULL;
+ return ES_ERROR;
}
RASTER_DEBUGF(5, "custom extent alignment: %d", aligned);
_rti_iterator_arg_destroy(_param);
- return NULL;
+ return ES_ERROR;
}
RASTER_DEBUGF(5, "raster at index %d alignment: %d", i, aligned);
_rti_iterator_arg_destroy(_param);
- return NULL;
+ return ES_ERROR;
}
/* use extenttype to build output raster (no bands though) */
_rti_iterator_arg_destroy(_param);
- return NULL;
+ return ES_ERROR;
}
for (i = 0; i < itrcount; i++) {
_rti_iterator_arg_destroy(_param);
- return NULL;
+ return ES_ERROR;
}
else if (rt_raster_is_empty(rast)) {
rtinfo("rt_raster_iterator: Computed raster for %s extent is empty",
_rti_iterator_arg_destroy(_param);
- *noerr = 1;
- return rast;
+ *rtnraster = rast;
+ return ES_NONE;
}
rtnrast = rast;
_rti_iterator_arg_destroy(_param);
- *noerr = 1;
- return NULL;
+ return ES_NONE;
}
/* input raster is empty, return empty raster */
else if (_param->isempty[i]) {
rtnrast = rt_raster_new(0, 0);
if (rtnrast == NULL) {
rterror("rt_raster_iterator: Unable to create empty raster");
- return NULL;
+ return ES_ERROR;
}
rt_raster_set_scale(rtnrast, 0, 0);
- *noerr = 1;
- return rtnrast;
+ *rtnraster = rtnrast;
+ return ES_NONE;
}
/* copy the custom extent raster */
case ET_CUSTOM:
_rti_iterator_arg_destroy(_param);
- return NULL;
+ return ES_ERROR;
}
switch (extenttype) {
_rti_iterator_arg_destroy(_param);
rt_raster_destroy(rtnrast);
- return NULL;
+ return ES_ERROR;
}
/* create output band */
_rti_iterator_arg_destroy(_param);
rt_raster_destroy(rtnrast);
- return NULL;
+ return ES_ERROR;
}
/* get output band */
_rti_iterator_arg_destroy(_param);
rt_raster_destroy(rtnrast);
- return NULL;
+ return ES_ERROR;
}
/* output band's minimum value */
rt_band_destroy(rtnband);
rt_raster_destroy(rtnrast);
- return NULL;
+ return ES_ERROR;
}
/* fill _param->offset */
rt_band_destroy(rtnband);
rt_raster_destroy(rtnrast);
- return NULL;
+ return ES_ERROR;
}
_param->offset[i][0] = offset[2];
rt_band_destroy(rtnband);
rt_raster_destroy(rtnrast);
- return NULL;
+ return ES_ERROR;
}
}
rt_band_destroy(rtnband);
rt_raster_destroy(rtnrast);
- return NULL;
+ return ES_ERROR;
}
inextent = 1;
}
rt_band_destroy(rtnband);
rt_raster_destroy(rtnrast);
- return NULL;
+ return ES_ERROR;
}
npixels[status - 1].x = x;
rt_band_destroy(rtnband);
rt_raster_destroy(rtnrast);
- return NULL;
+ return ES_ERROR;
}
}
rt_band_destroy(rtnband);
rt_raster_destroy(rtnrast);
- return NULL;
+ return ES_ERROR;
}
/* burn value to pixel */
rt_band_destroy(rtnband);
rt_raster_destroy(rtnrast);
- return NULL;
+ return ES_ERROR;
}
}
}
/* lots of cleanup */
_rti_iterator_arg_destroy(_param);
- *noerr = 1;
- return rtnrast;
+ *rtnraster = rtnrast;
+ return ES_NONE;
}
* along the X axis
* @param distancey : the number of pixels around the specified pixel
* along the Y axis
- * @param userarg : pointer to any argument that is passed as-is to callback.
- * @param callback : callback function for actual processing of pixel values.
- * @param noerr : if 0, error occurred
+ * @param *userarg : pointer to any argument that is passed as-is to callback.
+ * @param *callback : callback function for actual processing of pixel values.
+ * @param *rtnraster : return one band raster from iterator process
*
* The callback function _must_ have the following signature.
*
* - double *value : value of pixel to be burned by rt_raster_iterator()
* - int *nodata : flag (0 or 1) indicating that pixel to be burned is NODATA
*
- * @return raster object if success, NULL otherwise
+ * @return ES_NONE on success, ES_ERROR on error
*/
-rt_raster
+rt_errorstate
rt_raster_iterator(
rt_iterator itrset, uint16_t itrcount,
rt_extenttype extenttype, rt_raster customextent,
double *value,
int *nodata
),
- int *noerr
+ rt_raster *rtnraster
);
/*- utilities -------------------------------------------------------*/
}
/* pass to iterator */
- _raster = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, arg->ngv + 1,
ET_FIRST, NULL,
pixtype,
0, 0,
arg,
rtpg_setvalues_geomval_callback,
- &noerr
+ &_raster
);
pfree(itrset);
- if (!noerr) {
+ if (noerr != ES_NONE) {
elog(ERROR, "RASTER_setPixelValuesGeomval: Unable to run raster iterator function");
rtpg_setvaluesgv_arg_destroy(arg);
rt_raster_destroy(raster);
}
/* pass everything to iterator */
- raster = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, arg->numraster,
arg->extenttype, arg->cextent,
arg->pixtype,
arg->distance[0], arg->distance[1],
&(arg->callback),
rtpg_nmapalgebra_callback,
- &noerr
+ &raster
);
/* cleanup */
pfree(itrset);
rtpg_nmapalgebra_arg_destroy(arg);
- if (!noerr) {
+ if (noerr != ES_NONE) {
elog(ERROR, "RASTER_nMapAlgebra: Unable to run raster iterator function");
PG_RETURN_NULL();
}
}
/* pass everything to iterator */
- _raster = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 2,
ET_UNION, NULL,
pixtype,
0, 0,
&utype,
rtpg_union_callback,
- &noerr
+ &_raster
);
- if (!noerr) {
+ if (noerr != ES_NONE) {
elog(ERROR, "RASTER_union_transfn: Unable to run raster iterator function");
pfree(itrset);
/* pass everything to iterator */
if (iwr->bandarg[i].uniontype == UT_MEAN) {
- _raster = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 2,
ET_UNION, NULL,
pixtype,
0, 0,
NULL,
rtpg_union_mean_callback,
- &noerr
+ &_raster
);
}
else if (iwr->bandarg[i].uniontype == UT_RANGE) {
- _raster = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 2,
ET_UNION, NULL,
pixtype,
0, 0,
NULL,
rtpg_union_range_callback,
- &noerr
+ &_raster
);
}
- if (!noerr) {
+ if (noerr != ES_NONE) {
elog(ERROR, "RASTER_union_finalfn: Unable to run raster iterator function");
pfree(itrset);
rtpg_union_arg_destroy(iwr);
itrset[1].nbnodata = 1;
/* pass to iterator */
- _raster = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 2,
arg->extenttype, NULL,
pixtype,
0, 0,
NULL,
rtpg_clip_callback,
- &noerr
+ &_raster
);
- if (!noerr) {
+ if (noerr != ES_NONE) {
elog(ERROR, "RASTER_clip: Unable to run raster iterator function");
pfree(itrset);
rtpg_clip_arg_destroy(arg);
userargs->rows = 1;
userargs->columns = 1;
- rtn = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 1,
ET_INTERSECTION, NULL,
PT_32BUI,
0, 0,
userargs,
testRasterIterator1_callback,
- &noerr
+ &rtn
);
- CHECK(noerr);
+ CHECK(noerr == ES_NONE);
CHECK((rt_raster_get_width(rtn) == 5));
CHECK((rt_raster_get_height(rtn) == 5));
CHECK((rt_raster_get_x_offset(rtn) == 0));
userargs->rows = 1;
userargs->columns = 1;
- rtn = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 1,
ET_UNION, NULL,
PT_32BUI,
0, 0,
userargs,
testRasterIterator1_callback,
- &noerr
+ &rtn
);
- CHECK(noerr);
+ CHECK(noerr == ES_NONE);
CHECK((rt_raster_get_width(rtn) == 5));
CHECK((rt_raster_get_height(rtn) == 5));
CHECK((rt_raster_get_x_offset(rtn) == 0));
userargs->rows = 1;
userargs->columns = 1;
- rtn = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 2,
ET_UNION, NULL,
PT_32BUI,
0, 0,
userargs,
testRasterIterator2_callback,
- &noerr
+ &rtn
);
- CHECK(noerr);
+ CHECK(noerr == ES_NONE);
CHECK((rt_raster_get_width(rtn) == 6));
CHECK((rt_raster_get_height(rtn) == 6));
CHECK((rt_raster_get_x_offset(rtn) == 0));
rtn = NULL;
/* 2 raster, 0 distance, INTERSECTION */
- rtn = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 2,
ET_INTERSECTION, NULL,
PT_32BUI,
0, 0,
userargs,
testRasterIterator3_callback,
- &noerr
+ &rtn
);
- CHECK(noerr);
+ CHECK(noerr == ES_NONE);
CHECK((rt_raster_get_width(rtn) == 4));
CHECK((rt_raster_get_height(rtn) == 4));
CHECK((rt_raster_get_x_offset(rtn) == 1));
rtn = NULL;
/* 2 raster, 0 distance, FIRST */
- rtn = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 2,
ET_FIRST, NULL,
PT_32BUI,
0, 0,
userargs,
testRasterIterator4_callback,
- &noerr
+ &rtn
);
- CHECK(noerr);
+ CHECK(noerr == ES_NONE);
CHECK((rt_raster_get_width(rtn) == 5));
CHECK((rt_raster_get_height(rtn) == 5));
CHECK((rt_raster_get_x_offset(rtn) == 0));
rtn = NULL;
/* 2 raster, 0 distance, LAST or SECOND */
- rtn = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 2,
ET_LAST, NULL,
PT_32BUI,
0, 0,
userargs,
testRasterIterator5_callback,
- &noerr
+ &rtn
);
- CHECK(noerr);
+ CHECK(noerr == ES_NONE);
CHECK((rt_raster_get_width(rtn) == 5));
CHECK((rt_raster_get_height(rtn) == 5));
CHECK((rt_raster_get_x_offset(rtn) == 1));
rtn = NULL;
/* 2 raster, 0 distance, CUSTOM */
- rtn = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 2,
ET_CUSTOM, rast3,
PT_32BUI,
0, 0,
userargs,
testRasterIterator6_callback,
- &noerr
+ &rtn
);
- CHECK(noerr);
+ CHECK(noerr == ES_NONE);
CHECK((rt_raster_get_width(rtn) == 2));
CHECK((rt_raster_get_height(rtn) == 2));
CHECK((rt_raster_get_x_offset(rtn) == 1));
userargs->rows = 3;
userargs->columns = 3;
- rtn = rt_raster_iterator(
+ noerr = rt_raster_iterator(
itrset, 2,
ET_CUSTOM, rast3,
PT_32BUI,
1, 1,
userargs,
testRasterIterator7_callback,
- &noerr
+ &rtn
);
- CHECK(noerr);
+ CHECK(noerr == ES_NONE);
CHECK((rt_raster_get_width(rtn) == 2));
CHECK((rt_raster_get_height(rtn) == 2));
CHECK((rt_raster_get_x_offset(rtn) == 1));