308 {
309 uint32_t i;
310 uint32_t j;
311 uint32_t dim[2] = {0};
312 double **values = NULL;
313 int **nodatas = NULL;
314 int zero[2] = {0};
315 int _x;
316 int _y;
317
318 assert(npixel != NULL && count > 0);
319 assert(value != NULL);
320 assert(nodata != NULL);
321
322
323 dim[0] = distancex * 2 + 1;
324 dim[1] = distancey * 2 + 1;
326
327
328 if (mask != NULL) {
329 if (dim[0] != mask->
dimx || dim[1] != mask->
dimy) {
330 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]);
332 }
333
335 rterror(
"rt_pixel_set_array: Invalid mask");
337 }
338
339 }
340
341
342 values =
rtalloc(
sizeof(
double *) * dim[1]);
343 nodatas =
rtalloc(
sizeof(
int *) * dim[1]);
344
345 if (values == NULL || nodatas == NULL) {
346 rterror(
"rt_pixel_set_to_array: Could not allocate memory for 2D array");
348 }
349
350
351 for (i = 0; i < dim[1]; i++) {
352 values[i] =
rtalloc(
sizeof(
double) * dim[0]);
353 nodatas[i] =
rtalloc(
sizeof(
int) * dim[0]);
354
355 if (values[i] == NULL || nodatas[i] == NULL) {
356 rterror(
"rt_pixel_set_to_array: Could not allocate memory for dimension of 2D array");
357
358 if (values[i] == NULL) {
359 for (j = 0; j < i; j++) {
362 }
363 }
364 else {
365 for (j = 0; j <= i; j++) {
367 if (j < i)
369 }
370 }
371
374
376 }
377
378
379 memset(values[i], 0, sizeof(double) * dim[0]);
380
381
382 for (j = 0; j < dim[0]; j++)
383 nodatas[i][j] = 1;
384 }
385
386
387 zero[0] =
x - distancex;
388 zero[1] =
y - distancey;
389
390
391 for (i = 0; i <
count; i++) {
392 if (npixel[i].nodata)
393 continue;
394
395 _x = npixel[i].
x - zero[0];
396 _y = npixel[i].
y - zero[1];
397
398 RASTER_DEBUGF(4,
"absolute x,y: %d x %d", npixel[i].x, npixel[i].y);
400
401
402 if (mask == NULL) {
403 values[_y][_x] = npixel[i].
value;
404 nodatas[_y][_x] = 0;
405 }
406
407 else {
408
410
412 {
413 values[_y][_x] = 0;
414 nodatas[_y][_x] = 1;
415 }
416
417 else {
418 values[_y][_x] = npixel[i].
value;
419 nodatas[_y][_x] = 0;
420 }
421 }
422
423 else {
424
425 if(mask->
nodata[_y][_x] == 1) {
426 values[_y][_x] = 0;
427 nodatas[_y][_x] = 1;
428 }
429
430 else {
431 values[_y][_x] = npixel[i].
value * mask->
values[_y][_x];
432 nodatas[_y][_x] = 0;
433 }
434 }
435 }
436
437 RASTER_DEBUGF(4,
"(x, y, nodata, value) = (%d, %d, %d, %f)", _x, _y, nodatas[_y][_x], values[_y][_x]);
438 }
439
441 *nodata = &(*nodatas);
442 if (dimx != NULL)
443 *dimx = dim[0];
444 if (dimy != NULL)
445 *dimy = dim[1];
446
448}
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)