Changeset 30912


Ignore:
Timestamp:
Apr 9, 2008, 3:11:36 AM (16 years ago)
Author:
1gray
Message:

raster/r.univar2/r.univar_main.c (process_raster): Simplified handling
of different map types.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • grass/trunk/raster/r.univar2/r.univar_main.c

    r30384 r30912  
    184184    int first = (stats->n < 1);
    185185
    186     RASTER_MAP_TYPE map_type;
     186    const RASTER_MAP_TYPE map_type = G_get_raster_map_type (fd);
     187    void *nextp
     188        = ((! param.extended->answer) ? 0
     189           : (map_type == DCELL_TYPE) ? stats->dcell_array
     190           : (map_type == FCELL_TYPE) ? stats->fcell_array
     191           : stats->cell_array);
     192    const size_t value_sz = G_raster_size (map_type);
    187193    unsigned int row;
    188194    void *raster_row;
    189195
    190     map_type = G_get_raster_map_type (fd);
    191     raster_row = G_calloc(cols, G_raster_size(map_type));
     196    raster_row = G_calloc (cols, value_sz);
    192197
    193198    for (row = 0; row < rows; row++) {
     
    203208
    204209            if (G_is_null_value(ptr, map_type)) {
    205                 ptr = G_incr_void_ptr(ptr, G_raster_size(map_type));
     210                ptr = G_incr_void_ptr (ptr, value_sz);
    206211                continue;
    207212            }
    208213
    209 
    210             if (map_type == CELL_TYPE) {
    211                 const int val_i = *((CELL *) ptr);
    212 
    213                 stats->sum += val_i;
    214                 stats->sumsq += (double) val_i * val_i;
    215                 stats->sum_abs += abs(val_i);
    216 
    217                 if (param.extended->answer)
    218                     stats->cell_array[stats->n] = val_i;
     214            if (nextp) {
     215                /* put the value into stats->XXXcell_array */
     216                memcpy (nextp, ptr, value_sz);
     217                nextp = G_incr_void_ptr (nextp, value_sz);
     218            }
     219
     220            {
     221                double val
     222                    = ((map_type   == DCELL_TYPE) ? *((DCELL *) ptr)
     223                       : (map_type == FCELL_TYPE) ? *((FCELL *) ptr)
     224                       : *((CELL *) ptr));
     225
     226                stats->sum += val;
     227                stats->sumsq += val * val;
     228                stats->sum_abs += fabs (val);
    219229
    220230                if (first) {
    221                     stats->max = val_i;
    222                     stats->min = val_i;
     231                    stats->max = val;
     232                    stats->min = val;
    223233                    first = FALSE;
     234                } else {
     235                    if (val > stats->max) stats->max = val;
     236                    if (val < stats->min) stats->min = val;
    224237                }
    225                 else {
    226                     if (val_i > stats->max)
    227                         stats->max = val_i;
    228                     if (val_i < stats->min)
    229                         stats->min = val_i;
    230                 }
    231             }
    232             else if (map_type == FCELL_TYPE) {
    233                 const float val_f = *((FCELL *) ptr);
    234 
    235                 stats->sum += val_f;
    236                 stats->sumsq += (double) val_f * val_f;
    237                 stats->sum_abs += fabs(val_f);
    238 
    239                 if (param.extended->answer)
    240                     stats->fcell_array[stats->n] = val_f;
    241 
    242                 if (first) {
    243                     stats->max = val_f;
    244                     stats->min = val_f;
    245                     first = FALSE;
    246                 }
    247                 else {
    248                     if (val_f > stats->max)
    249                         stats->max = val_f;
    250                     if (val_f < stats->min)
    251                         stats->min = val_f;
    252                 }
    253             }
    254             else if (map_type == DCELL_TYPE) {
    255                 const double val_d = *((DCELL *) ptr);
    256 
    257                 stats->sum += val_d;
    258                 stats->sumsq += val_d * val_d;
    259                 stats->sum_abs += fabs(val_d);
    260 
    261                 if (param.extended->answer)
    262                     stats->dcell_array[stats->n] = val_d;
    263 
    264                 if (first) {
    265                     stats->max = val_d;
    266                     stats->min = val_d;
    267                     first = FALSE;
    268                 }
    269                 else {
    270                     if (val_d > stats->max)
    271                         stats->max = val_d;
    272                     if (val_d < stats->min)
    273                         stats->min = val_d;
    274                 }
    275             }
    276             ptr = G_incr_void_ptr(ptr, G_raster_size(map_type));
     238            }
     239
     240            ptr = G_incr_void_ptr (ptr, value_sz);
    277241            stats->n++;
    278242        }
Note: See TracChangeset for help on using the changeset viewer.