From: Bborie Park Date: Wed, 28 Nov 2012 20:16:45 +0000 (+0000) Subject: Refactored return and parameters of rt_raster_iterator() X-Git-Tag: 2.1.0beta2~354 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=180685822512dded698fb9e1cf38553a77b446b0;p=postgis Refactored return and parameters of rt_raster_iterator() git-svn-id: http://svn.osgeo.org/postgis/trunk@10746 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/raster/rt_core/rt_api.c b/raster/rt_core/rt_api.c index 34c5e0913..763089424 100644 --- a/raster/rt_core/rt_api.c +++ b/raster/rt_core/rt_api.c @@ -13487,7 +13487,7 @@ _rti_iterator_arg_callback_clean(_rti_iterator_arg _param) { * 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. * @@ -13502,9 +13502,9 @@ _rti_iterator_arg_callback_clean(_rti_iterator_arg _param) { * - 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, @@ -13518,7 +13518,7 @@ rt_raster_iterator( double *value, int *nodata ), - int *noerr + rt_raster *rtnraster ) { /* output raster */ rt_raster rtnrast = NULL; @@ -13553,50 +13553,52 @@ rt_raster_iterator( 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 */ @@ -13605,8 +13607,7 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); - *noerr = 1; - return NULL; + return ES_NONE; } /* shortcut if all empty, return empty raster */ else if (allempty == itrcount) { @@ -13617,12 +13618,12 @@ rt_raster_iterator( 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 */ @@ -13652,7 +13653,7 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); - return NULL; + return ES_ERROR; } do { @@ -13665,7 +13666,7 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); - return NULL; + return ES_ERROR; } RASTER_DEBUGF(5, "custom extent alignment: %d", aligned); @@ -13683,7 +13684,7 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); - return NULL; + return ES_ERROR; } RASTER_DEBUGF(5, "raster at index %d alignment: %d", i, aligned); @@ -13700,7 +13701,7 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); - return NULL; + return ES_ERROR; } /* use extenttype to build output raster (no bands though) */ @@ -13715,7 +13716,7 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); - return NULL; + return ES_ERROR; } for (i = 0; i < itrcount; i++) { @@ -13743,7 +13744,7 @@ rt_raster_iterator( _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", @@ -13752,8 +13753,8 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); - *noerr = 1; - return rast; + *rtnraster = rast; + return ES_NONE; } rtnrast = rast; @@ -13786,8 +13787,7 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); - *noerr = 1; - return NULL; + return ES_NONE; } /* input raster is empty, return empty raster */ else if (_param->isempty[i]) { @@ -13801,12 +13801,12 @@ rt_raster_iterator( 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: @@ -13816,7 +13816,7 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); - return NULL; + return ES_ERROR; } switch (extenttype) { @@ -13855,7 +13855,7 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); rt_raster_destroy(rtnrast); - return NULL; + return ES_ERROR; } /* create output band */ @@ -13871,7 +13871,7 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); rt_raster_destroy(rtnrast); - return NULL; + return ES_ERROR; } /* get output band */ @@ -13882,7 +13882,7 @@ rt_raster_iterator( _rti_iterator_arg_destroy(_param); rt_raster_destroy(rtnrast); - return NULL; + return ES_ERROR; } /* output band's minimum value */ @@ -13896,7 +13896,7 @@ rt_raster_iterator( rt_band_destroy(rtnband); rt_raster_destroy(rtnrast); - return NULL; + return ES_ERROR; } /* fill _param->offset */ @@ -13913,7 +13913,7 @@ rt_raster_iterator( rt_band_destroy(rtnband); rt_raster_destroy(rtnrast); - return NULL; + return ES_ERROR; } _param->offset[i][0] = offset[2]; @@ -13983,7 +13983,7 @@ rt_raster_iterator( rt_band_destroy(rtnband); rt_raster_destroy(rtnrast); - return NULL; + return ES_ERROR; } } @@ -14006,7 +14006,7 @@ rt_raster_iterator( rt_band_destroy(rtnband); rt_raster_destroy(rtnrast); - return NULL; + return ES_ERROR; } inextent = 1; } @@ -14038,7 +14038,7 @@ rt_raster_iterator( rt_band_destroy(rtnband); rt_raster_destroy(rtnrast); - return NULL; + return ES_ERROR; } npixels[status - 1].x = x; @@ -14069,7 +14069,7 @@ rt_raster_iterator( rt_band_destroy(rtnband); rt_raster_destroy(rtnrast); - return NULL; + return ES_ERROR; } } @@ -14090,7 +14090,7 @@ rt_raster_iterator( rt_band_destroy(rtnband); rt_raster_destroy(rtnrast); - return NULL; + return ES_ERROR; } /* burn value to pixel */ @@ -14113,7 +14113,7 @@ rt_raster_iterator( rt_band_destroy(rtnband); rt_raster_destroy(rtnrast); - return NULL; + return ES_ERROR; } } } @@ -14121,6 +14121,6 @@ rt_raster_iterator( /* lots of cleanup */ _rti_iterator_arg_destroy(_param); - *noerr = 1; - return rtnrast; + *rtnraster = rtnrast; + return ES_NONE; } diff --git a/raster/rt_core/rt_api.h b/raster/rt_core/rt_api.h index 0d5f3a8bf..71e209e87 100644 --- a/raster/rt_core/rt_api.h +++ b/raster/rt_core/rt_api.h @@ -1901,9 +1901,9 @@ rt_raster_from_two_rasters( * 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. * @@ -1918,9 +1918,9 @@ rt_raster_from_two_rasters( * - 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, @@ -1934,7 +1934,7 @@ rt_raster_iterator( double *value, int *nodata ), - int *noerr + rt_raster *rtnraster ); /*- utilities -------------------------------------------------------*/ diff --git a/raster/rt_pg/rt_pg.c b/raster/rt_pg/rt_pg.c index 979c0045e..0e4463d40 100644 --- a/raster/rt_pg/rt_pg.c +++ b/raster/rt_pg/rt_pg.c @@ -3817,7 +3817,7 @@ Datum RASTER_setPixelValuesGeomval(PG_FUNCTION_ARGS) } /* pass to iterator */ - _raster = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, arg->ngv + 1, ET_FIRST, NULL, pixtype, @@ -3825,11 +3825,11 @@ Datum RASTER_setPixelValuesGeomval(PG_FUNCTION_ARGS) 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); @@ -15619,7 +15619,7 @@ Datum RASTER_nMapAlgebra(PG_FUNCTION_ARGS) } /* pass everything to iterator */ - raster = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, arg->numraster, arg->extenttype, arg->cextent, arg->pixtype, @@ -15627,14 +15627,14 @@ Datum RASTER_nMapAlgebra(PG_FUNCTION_ARGS) 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(); } @@ -16384,7 +16384,7 @@ Datum RASTER_union_transfn(PG_FUNCTION_ARGS) } /* pass everything to iterator */ - _raster = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, 2, ET_UNION, NULL, pixtype, @@ -16392,10 +16392,10 @@ Datum RASTER_union_transfn(PG_FUNCTION_ARGS) 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); @@ -16492,7 +16492,7 @@ Datum RASTER_union_finalfn(PG_FUNCTION_ARGS) /* 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, @@ -16500,11 +16500,11 @@ Datum RASTER_union_finalfn(PG_FUNCTION_ARGS) 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, @@ -16512,11 +16512,11 @@ Datum RASTER_union_finalfn(PG_FUNCTION_ARGS) 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); @@ -17053,7 +17053,7 @@ Datum RASTER_clip(PG_FUNCTION_ARGS) itrset[1].nbnodata = 1; /* pass to iterator */ - _raster = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, 2, arg->extenttype, NULL, pixtype, @@ -17061,10 +17061,10 @@ Datum RASTER_clip(PG_FUNCTION_ARGS) 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); diff --git a/raster/test/core/testapi.c b/raster/test/core/testapi.c index 48d85e369..a8eeb637f 100644 --- a/raster/test/core/testapi.c +++ b/raster/test/core/testapi.c @@ -7990,7 +7990,7 @@ static void testRasterIterator() { userargs->rows = 1; userargs->columns = 1; - rtn = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, 1, ET_INTERSECTION, NULL, PT_32BUI, @@ -7998,9 +7998,9 @@ static void testRasterIterator() { 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)); @@ -8019,7 +8019,7 @@ static void testRasterIterator() { userargs->rows = 1; userargs->columns = 1; - rtn = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, 1, ET_UNION, NULL, PT_32BUI, @@ -8027,9 +8027,9 @@ static void testRasterIterator() { 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)); @@ -8048,7 +8048,7 @@ static void testRasterIterator() { userargs->rows = 1; userargs->columns = 1; - rtn = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, 2, ET_UNION, NULL, PT_32BUI, @@ -8056,9 +8056,9 @@ static void testRasterIterator() { 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)); @@ -8073,7 +8073,7 @@ static void testRasterIterator() { rtn = NULL; /* 2 raster, 0 distance, INTERSECTION */ - rtn = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, 2, ET_INTERSECTION, NULL, PT_32BUI, @@ -8081,9 +8081,9 @@ static void testRasterIterator() { 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)); @@ -8098,7 +8098,7 @@ static void testRasterIterator() { rtn = NULL; /* 2 raster, 0 distance, FIRST */ - rtn = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, 2, ET_FIRST, NULL, PT_32BUI, @@ -8106,9 +8106,9 @@ static void testRasterIterator() { 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)); @@ -8123,7 +8123,7 @@ static void testRasterIterator() { rtn = NULL; /* 2 raster, 0 distance, LAST or SECOND */ - rtn = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, 2, ET_LAST, NULL, PT_32BUI, @@ -8131,9 +8131,9 @@ static void testRasterIterator() { 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)); @@ -8148,7 +8148,7 @@ static void testRasterIterator() { rtn = NULL; /* 2 raster, 0 distance, CUSTOM */ - rtn = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, 2, ET_CUSTOM, rast3, PT_32BUI, @@ -8156,9 +8156,9 @@ static void testRasterIterator() { 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)); @@ -8177,7 +8177,7 @@ static void testRasterIterator() { userargs->rows = 3; userargs->columns = 3; - rtn = rt_raster_iterator( + noerr = rt_raster_iterator( itrset, 2, ET_CUSTOM, rast3, PT_32BUI, @@ -8185,9 +8185,9 @@ static void testRasterIterator() { 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));