]> granicus.if.org Git - postgis/commitdiff
Refactored return and parameters of rt_raster_iterator()
authorBborie Park <bkpark at ucdavis.edu>
Wed, 28 Nov 2012 20:16:45 +0000 (20:16 +0000)
committerBborie Park <bkpark at ucdavis.edu>
Wed, 28 Nov 2012 20:16:45 +0000 (20:16 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@10746 b70326c6-7e19-0410-871a-916f4a2858ee

raster/rt_core/rt_api.c
raster/rt_core/rt_api.h
raster/rt_pg/rt_pg.c
raster/test/core/testapi.c

index 34c5e091352960b93395630ba6cba06693e9bca5..763089424b99a9c72de90134c32fe6929c0d8e5e 100644 (file)
@@ -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;
 }
index 0d5f3a8bfa0503f891bdf5356e9ae12cbe64691b..71e209e87d6d657faf49efea766816412e43b735 100644 (file)
@@ -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 -------------------------------------------------------*/
index 979c0045eeb25669519ded974d68af3500542a06..0e4463d401fcdc2302333c9585db79098121849c 100644 (file)
@@ -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);
index 48d85e369f729b13c7548e04004df00e550b8787..a8eeb637fd20bdd0a48ee3646d1e4e59a501e435 100644 (file)
@@ -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));