295 {
296 uint32_t i;
297 uint32_t j;
298 uint32_t dim[2] = {0};
299 double **values = NULL;
300 int **nodatas = NULL;
301 int zero[2] = {0};
302 int _x;
303 int _y;
304
305 assert(npixel != NULL && count > 0);
306 assert(value != NULL);
307 assert(nodata != NULL);
308
309
310 dim[0] = distancex * 2 + 1;
311 dim[1] = distancey * 2 + 1;
313
314
315 if (mask != NULL) {
316 if (dim[0] != mask->
dimx || dim[1] != mask->
dimy) {
317 rterror(
"rt_pixel_set_array: mask dimensions %d x %d do not match given dims %d x %d", mask->
dimx, mask->
dimy, dim[0], dim[1]);
319 }
320
322 rterror(
"rt_pixel_set_array: Invalid mask");
324 }
325
326 }
327
328
329 values =
rtalloc(
sizeof(
double *) * dim[1]);
330 nodatas =
rtalloc(
sizeof(
int *) * dim[1]);
331
332 if (values == NULL || nodatas == NULL) {
333 rterror(
"rt_pixel_set_to_array: Could not allocate memory for 2D array");
335 }
336
337
338 for (i = 0; i < dim[1]; i++) {
339 values[i] =
rtalloc(
sizeof(
double) * dim[0]);
340 nodatas[i] =
rtalloc(
sizeof(
int) * dim[0]);
341
342 if (values[i] == NULL || nodatas[i] == NULL) {
343 rterror(
"rt_pixel_set_to_array: Could not allocate memory for dimension of 2D array");
344
345 if (values[i] == NULL) {
346 for (j = 0; j < i; j++) {
349 }
350 }
351 else {
352 for (j = 0; j <= i; j++) {
354 if (j < i)
356 }
357 }
358
361
363 }
364
365
366 memset(values[i], 0, sizeof(double) * dim[0]);
367
368
369 for (j = 0; j < dim[0]; j++)
370 nodatas[i][j] = 1;
371 }
372
373
374 zero[0] =
x - distancex;
375 zero[1] =
y - distancey;
376
377
378 for (i = 0; i <
count; i++) {
379 if (npixel[i].nodata)
380 continue;
381
382 _x = npixel[i].
x - zero[0];
383 _y = npixel[i].
y - zero[1];
384
385 RASTER_DEBUGF(4,
"absolute x,y: %d x %d", npixel[i].x, npixel[i].y);
387
388
389 if (mask == NULL) {
390 values[_y][_x] = npixel[i].
value;
391 nodatas[_y][_x] = 0;
392 }
393
394 else {
395
397
399 {
400 values[_y][_x] = 0;
401 nodatas[_y][_x] = 1;
402 }
403
404 else {
405 values[_y][_x] = npixel[i].
value;
406 nodatas[_y][_x] = 0;
407 }
408 }
409
410 else {
411
412 if(mask->
nodata[_y][_x] == 1) {
413 values[_y][_x] = 0;
414 nodatas[_y][_x] = 1;
415 }
416
417 else {
418 values[_y][_x] = npixel[i].
value * mask->
values[_y][_x];
419 nodatas[_y][_x] = 0;
420 }
421 }
422 }
423
424 RASTER_DEBUGF(4,
"(x, y, nodata, value) = (%d, %d, %d, %f)", _x, _y, nodatas[_y][_x], values[_y][_x]);
425 }
426
428 *nodata = &(*nodatas);
429 if (dimx != NULL)
430 *dimx = dim[0];
431 if (dimy != NULL)
432 *dimy = dim[1];
433
435}
void rterror(const char *fmt,...) __attribute__((format(printf
Wrappers used for reporting errors and info.
void * rtalloc(size_t size)
Wrappers used for managing memory.
#define RASTER_DEBUGF(level, msg,...)
void rtdealloc(void *mem)