1 /*
2 * PostGIS Raster - Raster Types for PostGIS
3 * http://trac.osgeo.org/postgis/wiki/WKTRaster
4 *
5 * Copyright (C) 2012 Regents of the University of California
6 * <bkpark@ucdavis.edu>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 *
22 */
23
24 #include "CUnit/Basic.h"
25 #include "cu_tester.h"
26
27 typedef struct _callback_userargs_t* _callback_userargs;
28 struct _callback_userargs_t {
29 uint16_t rasters;
30 uint32_t rows;
31 uint32_t columns;
32 };
33
34 /* callback for 1 raster, 0 distance, FIRST or SECOND or LAST or UNION or INTERSECTION */
testRasterIterator1_callback(rt_iterator_arg arg,void * userarg,double * value,int * nodata)35 static int testRasterIterator1_callback(rt_iterator_arg arg, void *userarg, double *value, int *nodata) {
36 _callback_userargs _userarg = (_callback_userargs) userarg;
37
38 /* check that we're getting what we expect from userarg */
39 CU_ASSERT_EQUAL(arg->rasters, _userarg->rasters);
40 CU_ASSERT_EQUAL(arg->rows, _userarg->rows);
41 CU_ASSERT_EQUAL(arg->columns, _userarg->columns);
42
43 /* 0,0 */
44 if (
45 arg->dst_pixel[0] == 0 &&
46 arg->dst_pixel[1] == 0
47 ) {
48 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 0, DBL_EPSILON);
49 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
50 }
51 /* 4,4 */
52 else if (
53 arg->dst_pixel[0] == 4 &&
54 arg->dst_pixel[1] == 4
55 ) {
56 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 24, DBL_EPSILON);
57 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
58 }
59 /* 1,1 */
60 else if (
61 arg->dst_pixel[0] == 1 &&
62 arg->dst_pixel[1] == 1
63 ) {
64 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 1);
65 }
66 /* 2,2 */
67 else if (
68 arg->dst_pixel[0] == 2 &&
69 arg->dst_pixel[1] == 2
70 ) {
71 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 12, DBL_EPSILON);
72 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
73 }
74 /* 3,1 */
75 else if (
76 arg->dst_pixel[0] == 3 &&
77 arg->dst_pixel[1] == 1
78 ) {
79 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 8, DBL_EPSILON);
80 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
81 }
82 /* 1,0 */
83 else if (
84 arg->dst_pixel[0] == 1 &&
85 arg->dst_pixel[1] == 0
86 ) {
87 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 1, DBL_EPSILON);
88 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
89 }
90
91 return 1;
92 }
93
94 /* callback for 2 raster, 0 distance, UNION */
testRasterIterator2_callback(rt_iterator_arg arg,void * userarg,double * value,int * nodata)95 static int testRasterIterator2_callback(rt_iterator_arg arg, void *userarg, double *value, int *nodata) {
96 _callback_userargs _userarg = (_callback_userargs) userarg;
97
98 /* check that we're getting what we expect from userarg */
99 CU_ASSERT_EQUAL(arg->rasters, _userarg->rasters);
100 CU_ASSERT_EQUAL(arg->rows, _userarg->rows);
101 CU_ASSERT_EQUAL(arg->columns, _userarg->columns);
102
103 /* 0,0 */
104 if (
105 arg->dst_pixel[0] == 0 &&
106 arg->dst_pixel[1] == 0
107 ) {
108 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 0, DBL_EPSILON);
109 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
110
111 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 1);
112 }
113 /* 4,4 */
114 else if (
115 arg->dst_pixel[0] == 4 &&
116 arg->dst_pixel[1] == 4
117 ) {
118 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 24, DBL_EPSILON);
119 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
120
121 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 118, DBL_EPSILON);
122 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
123 }
124 /* 1,1 */
125 else if (
126 arg->dst_pixel[0] == 1 &&
127 arg->dst_pixel[1] == 1
128 ) {
129 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 1);
130
131 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 100, DBL_EPSILON);
132 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
133 }
134 /* 2,2 */
135 else if (
136 arg->dst_pixel[0] == 2 &&
137 arg->dst_pixel[1] == 2
138 ) {
139 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 12, DBL_EPSILON);
140 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
141
142 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 106, DBL_EPSILON);
143 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
144 }
145 /* 3,1 */
146 else if (
147 arg->dst_pixel[0] == 3 &&
148 arg->dst_pixel[1] == 1
149 ) {
150 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 8, DBL_EPSILON);
151 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
152
153 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 102, DBL_EPSILON);
154 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
155 }
156 /* 1,0 */
157 else if (
158 arg->dst_pixel[0] == 1 &&
159 arg->dst_pixel[1] == 0
160 ) {
161 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 1, DBL_EPSILON);
162 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
163
164 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 1);
165 }
166 /* 1,3 */
167 else if (
168 arg->dst_pixel[0] == 1 &&
169 arg->dst_pixel[1] == 3
170 ) {
171 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 16, DBL_EPSILON);
172 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
173
174 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 1);
175 }
176 /* 5,0 */
177 else if (
178 arg->dst_pixel[0] == 5 &&
179 arg->dst_pixel[1] == 0
180 ) {
181 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 1);
182
183 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 1);
184 }
185
186 return 1;
187 }
188
189 /* callback for 2 raster, 0 distance, INTERSECTION */
testRasterIterator3_callback(rt_iterator_arg arg,void * userarg,double * value,int * nodata)190 static int testRasterIterator3_callback(rt_iterator_arg arg, void *userarg, double *value, int *nodata) {
191 _callback_userargs _userarg = (_callback_userargs) userarg;
192
193 /* check that we're getting what we expect from userarg */
194 CU_ASSERT_EQUAL(arg->rasters, _userarg->rasters);
195 CU_ASSERT_EQUAL(arg->rows, _userarg->rows);
196 CU_ASSERT_EQUAL(arg->columns, _userarg->columns);
197
198 /* 0,0 */
199 if (
200 arg->dst_pixel[0] == 0 &&
201 arg->dst_pixel[1] == 0
202 ) {
203 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 1);
204
205 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 100, DBL_EPSILON);
206 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
207 }
208 /* 0,3 */
209 else if (
210 arg->dst_pixel[0] == 0 &&
211 arg->dst_pixel[1] == 3
212 ) {
213 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 21, DBL_EPSILON);
214 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
215
216 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 115, DBL_EPSILON);
217 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
218 }
219 /* 3,0 */
220 else if (
221 arg->dst_pixel[0] == 3 &&
222 arg->dst_pixel[1] == 0
223 ) {
224 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 9, DBL_EPSILON);
225 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
226
227 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 103, DBL_EPSILON);
228 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
229 }
230 /* 3,3 */
231 else if (
232 arg->dst_pixel[0] == 3 &&
233 arg->dst_pixel[1] == 3
234 ) {
235 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 24, DBL_EPSILON);
236 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
237
238 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 118, DBL_EPSILON);
239 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
240 }
241 /* 0,2 */
242 else if (
243 arg->dst_pixel[0] == 0 &&
244 arg->dst_pixel[1] == 2
245 ) {
246 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 16, DBL_EPSILON);
247 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
248
249 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 1);
250 }
251
252 return 1;
253 }
254
255 /* callback for 2 raster, 0 distance, FIRST */
testRasterIterator4_callback(rt_iterator_arg arg,void * userarg,double * value,int * nodata)256 static int testRasterIterator4_callback(rt_iterator_arg arg, void *userarg, double *value, int *nodata) {
257 _callback_userargs _userarg = (_callback_userargs) userarg;
258
259 /* check that we're getting what we expect from userarg */
260 CU_ASSERT_EQUAL(arg->rasters, _userarg->rasters);
261 CU_ASSERT_EQUAL(arg->rows, _userarg->rows);
262 CU_ASSERT_EQUAL(arg->columns, _userarg->columns);
263
264 /* 0,0 */
265 if (
266 arg->dst_pixel[0] == 0 &&
267 arg->dst_pixel[1] == 0
268 ) {
269 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 0, DBL_EPSILON);
270 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
271
272 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 1);
273 }
274 /* 4,4 */
275 else if (
276 arg->dst_pixel[0] == 4 &&
277 arg->dst_pixel[1] == 4
278 ) {
279 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 24, DBL_EPSILON);
280 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
281
282 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 118, DBL_EPSILON);
283 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
284 }
285 /* 4,1 */
286 else if (
287 arg->dst_pixel[0] == 4 &&
288 arg->dst_pixel[1] == 1
289 ) {
290 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 9, DBL_EPSILON);
291 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
292
293 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 103, DBL_EPSILON);
294 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
295 }
296 /* 4,0 */
297 else if (
298 arg->dst_pixel[0] == 4 &&
299 arg->dst_pixel[1] == 0
300 ) {
301 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 4, DBL_EPSILON);
302 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
303
304 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 1);
305 }
306
307 return 1;
308 }
309
310 /* callback for 2 raster, 0 distance, SECOND or LAST */
testRasterIterator5_callback(rt_iterator_arg arg,void * userarg,double * value,int * nodata)311 static int testRasterIterator5_callback(rt_iterator_arg arg, void *userarg, double *value, int *nodata) {
312 _callback_userargs _userarg = (_callback_userargs) userarg;
313
314 /* check that we're getting what we expect from userarg */
315 CU_ASSERT_EQUAL(arg->rasters, _userarg->rasters);
316 CU_ASSERT_EQUAL(arg->rows, _userarg->rows);
317 CU_ASSERT_EQUAL(arg->columns, _userarg->columns);
318
319 /* 0,0 */
320 if (
321 arg->dst_pixel[0] == 0 &&
322 arg->dst_pixel[1] == 0
323 ) {
324 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 1);
325
326 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 100, DBL_EPSILON);
327 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
328 }
329 /* 4,4 */
330 else if (
331 arg->dst_pixel[0] == 4 &&
332 arg->dst_pixel[1] == 4
333 ) {
334 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 1);
335
336 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 124, DBL_EPSILON);
337 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
338 }
339 /* 4,1 */
340 else if (
341 arg->dst_pixel[0] == 4 &&
342 arg->dst_pixel[1] == 1
343 ) {
344 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 1);
345
346 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 109, DBL_EPSILON);
347 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
348 }
349 /* 0,2 */
350 else if (
351 arg->dst_pixel[0] == 0 &&
352 arg->dst_pixel[1] == 2
353 ) {
354 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 16, DBL_EPSILON);
355 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
356
357 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 1);
358 }
359
360 return 1;
361 }
362
363 /* callback for 2 raster, 0 distance, CUSTOM */
testRasterIterator6_callback(rt_iterator_arg arg,void * userarg,double * value,int * nodata)364 static int testRasterIterator6_callback(rt_iterator_arg arg, void *userarg, double *value, int *nodata) {
365 _callback_userargs _userarg = (_callback_userargs) userarg;
366
367 /* check that we're getting what we expect from userarg */
368 CU_ASSERT_EQUAL(arg->rasters, _userarg->rasters);
369 CU_ASSERT_EQUAL(arg->rows, _userarg->rows);
370 CU_ASSERT_EQUAL(arg->columns, _userarg->columns);
371
372 /* 0,0 */
373 if (
374 arg->dst_pixel[0] == 0 &&
375 arg->dst_pixel[1] == 0
376 ) {
377 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 16, DBL_EPSILON);
378 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
379
380 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 1);
381 }
382 /* 1,0 */
383 else if (
384 arg->dst_pixel[0] == 1 &&
385 arg->dst_pixel[1] == 0
386 ) {
387 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 17, DBL_EPSILON);
388 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
389
390 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 111, DBL_EPSILON);
391 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
392 }
393 /* 0,1 */
394 else if (
395 arg->dst_pixel[0] == 0 &&
396 arg->dst_pixel[1] == 1
397 ) {
398 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 21, DBL_EPSILON);
399 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
400
401 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 115, DBL_EPSILON);
402 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
403 }
404 /* 1,1 */
405 else if (
406 arg->dst_pixel[0] == 1 &&
407 arg->dst_pixel[1] == 1
408 ) {
409 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 22, DBL_EPSILON);
410 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
411
412 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][0][0], 116, DBL_EPSILON);
413 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 0);
414 }
415
416 return 1;
417 }
418
419 /* callback for 2 raster, 1 distance, CUSTOM */
testRasterIterator7_callback(rt_iterator_arg arg,void * userarg,double * value,int * nodata)420 static int testRasterIterator7_callback(rt_iterator_arg arg, void *userarg, double *value, int *nodata) {
421 _callback_userargs _userarg = (_callback_userargs) userarg;
422
423 /* check that we're getting what we expect from userarg */
424 CU_ASSERT_EQUAL(arg->rasters, _userarg->rasters);
425 CU_ASSERT_EQUAL(arg->rows, _userarg->rows);
426 CU_ASSERT_EQUAL(arg->columns, _userarg->columns);
427
428 /* 0,0 */
429 if (
430 arg->dst_pixel[0] == 0 &&
431 arg->dst_pixel[1] == 0
432 ) {
433 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][1][1], 16, DBL_EPSILON);
434 CU_ASSERT_EQUAL(arg->nodata[0][1][1], 0);
435
436 CU_ASSERT_EQUAL(arg->nodata[1][1][1], 1);
437
438 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 10, DBL_EPSILON);
439 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
440
441 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 1);
442 }
443 /* 1,0 */
444 else if (
445 arg->dst_pixel[0] == 1 &&
446 arg->dst_pixel[1] == 0
447 ) {
448 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][1][1], 17, DBL_EPSILON);
449 CU_ASSERT_EQUAL(arg->nodata[0][1][1], 0);
450
451 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][1][1], 111, DBL_EPSILON);
452 CU_ASSERT_EQUAL(arg->nodata[1][1][1], 0);
453
454 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][2][2], 23, DBL_EPSILON);
455 CU_ASSERT_EQUAL(arg->nodata[0][2][2], 0);
456
457 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][2][2], 117, DBL_EPSILON);
458 CU_ASSERT_EQUAL(arg->nodata[1][2][2], 0);
459 }
460 /* 0,1 */
461 else if (
462 arg->dst_pixel[0] == 0 &&
463 arg->dst_pixel[1] == 1
464 ) {
465 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][1][1], 21, DBL_EPSILON);
466 CU_ASSERT_EQUAL(arg->nodata[0][1][1], 0);
467
468 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][1][1], 115, DBL_EPSILON);
469 CU_ASSERT_EQUAL(arg->nodata[1][1][1], 0);
470
471 CU_ASSERT_EQUAL(arg->nodata[0][2][0], 1);
472
473 CU_ASSERT_EQUAL(arg->nodata[1][2][0], 1);
474 }
475 /* 1,1 */
476 else if (
477 arg->dst_pixel[0] == 1 &&
478 arg->dst_pixel[1] == 1
479 ) {
480 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][1][1], 22, DBL_EPSILON);
481 CU_ASSERT_EQUAL(arg->nodata[0][1][1], 0);
482
483 CU_ASSERT_DOUBLE_EQUAL(arg->values[1][1][1], 116, DBL_EPSILON);
484 CU_ASSERT_EQUAL(arg->nodata[1][1][1], 0);
485
486 CU_ASSERT_DOUBLE_EQUAL(arg->values[0][0][0], 16, DBL_EPSILON);
487 CU_ASSERT_EQUAL(arg->nodata[0][0][0], 0);
488
489 CU_ASSERT_EQUAL(arg->nodata[1][0][0], 1);
490 }
491
492 return 1;
493 }
494
test_raster_iterator()495 static void test_raster_iterator() {
496 rt_raster rast1;
497 rt_raster rast2;
498 rt_raster rast3;
499
500 int num = 2;
501
502 rt_raster rtn = NULL;
503 rt_band band;
504 int maxX = 5;
505 int maxY = 5;
506 rt_iterator itrset;
507 _callback_userargs userargs;
508 int noerr = 0;
509 int x = 0;
510 int y = 0;
511
512 rast1 = rt_raster_new(maxX, maxY);
513 CU_ASSERT(rast1 != NULL);
514
515 rt_raster_set_offsets(rast1, 0, 0);
516 rt_raster_set_scale(rast1, 1, -1);
517
518 band = cu_add_band(rast1, PT_32BUI, 1, 6);
519 CU_ASSERT(band != NULL);
520
521 for (y = 0; y < maxY; y++) {
522 for (x = 0; x < maxX; x++) {
523 rt_band_set_pixel(band, x, y, x + (y * maxX), NULL);
524 }
525 }
526
527 rast2 = rt_raster_new(maxX, maxY);
528 CU_ASSERT(rast2 != NULL);
529
530 rt_raster_set_offsets(rast2, 1, -1);
531 rt_raster_set_scale(rast2, 1, -1);
532
533 band = cu_add_band(rast2, PT_32BUI, 1, 110);
534 CU_ASSERT(band != NULL);
535
536 for (y = 0; y < maxY; y++) {
537 for (x = 0; x < maxX; x++) {
538 rt_band_set_pixel(band, x, y, (x + (y * maxX)) + 100, NULL);
539 }
540 }
541
542 rast3 = rt_raster_new(2, 2);
543 CU_ASSERT(rast3 != NULL);
544
545 rt_raster_set_offsets(rast3, 1, -3);
546 rt_raster_set_scale(rast3, 1, -1);
547
548 /* allocate user args */
549 userargs = rtalloc(sizeof(struct _callback_userargs_t));
550 CU_ASSERT(userargs != NULL);
551
552 /* allocate itrset */
553 itrset = rtalloc(sizeof(struct rt_iterator_t) * num);
554 CU_ASSERT(itrset != NULL);
555 itrset[0].raster = rast1;
556 itrset[0].nband = 0;
557 itrset[0].nbnodata = 1;
558 itrset[1].raster = rast2;
559 itrset[1].nband = 0;
560 itrset[1].nbnodata = 1;
561
562 /* 1 raster, 0 distance, FIRST or SECOND or LAST or UNION or INTERSECTION */
563 userargs->rasters = 1;
564 userargs->rows = 1;
565 userargs->columns = 1;
566
567 noerr = rt_raster_iterator(
568 itrset, 1,
569 ET_INTERSECTION, NULL,
570 PT_32BUI,
571 1, 0,
572 0, 0,
573 NULL,
574 userargs,
575 testRasterIterator1_callback,
576 &rtn
577 );
578 CU_ASSERT_EQUAL(noerr, ES_NONE);
579 CU_ASSERT_EQUAL(rt_raster_get_width(rtn), 5);
580 CU_ASSERT_EQUAL(rt_raster_get_height(rtn), 5);
581 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_offset(rtn), 0, DBL_EPSILON);
582 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_offset(rtn), 0, DBL_EPSILON);
583 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_scale(rtn), 1, DBL_EPSILON);
584 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_scale(rtn), -1, DBL_EPSILON);
585 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_skew(rtn), 0, DBL_EPSILON);
586 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_skew(rtn), 0, DBL_EPSILON);
587 CU_ASSERT_EQUAL(rt_raster_get_srid(rtn), 0);
588
589 if (rtn != NULL) cu_free_raster(rtn);
590 rtn = NULL;
591
592 /* 1 raster, 0 distance, FIRST or SECOND or LAST or UNION or INTERSECTION */
593 userargs->rasters = 1;
594 userargs->rows = 1;
595 userargs->columns = 1;
596
597 noerr = rt_raster_iterator(
598 itrset, 1,
599 ET_UNION, NULL,
600 PT_32BUI,
601 1, 0,
602 0, 0,
603 NULL,
604 userargs,
605 testRasterIterator1_callback,
606 &rtn
607 );
608 CU_ASSERT_EQUAL(noerr, ES_NONE);
609 CU_ASSERT_EQUAL(rt_raster_get_width(rtn), 5);
610 CU_ASSERT_EQUAL(rt_raster_get_height(rtn), 5);
611 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_offset(rtn), 0, DBL_EPSILON);
612 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_offset(rtn), 0, DBL_EPSILON);
613 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_scale(rtn), 1, DBL_EPSILON);
614 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_scale(rtn), -1, DBL_EPSILON);
615 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_skew(rtn), 0, DBL_EPSILON);
616 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_skew(rtn), 0, DBL_EPSILON);
617 CU_ASSERT_EQUAL(rt_raster_get_srid(rtn), 0);
618
619 if (rtn != NULL) cu_free_raster(rtn);
620 rtn = NULL;
621
622 /* 2 raster, 0 distance, UNION */
623 userargs->rasters = 2;
624 userargs->rows = 1;
625 userargs->columns = 1;
626
627 noerr = rt_raster_iterator(
628 itrset, 2,
629 ET_UNION, NULL,
630 PT_32BUI,
631 1, 0,
632 0, 0,
633 NULL,
634 userargs,
635 testRasterIterator2_callback,
636 &rtn
637 );
638 CU_ASSERT_EQUAL(noerr, ES_NONE);
639 CU_ASSERT_EQUAL(rt_raster_get_width(rtn), 6);
640 CU_ASSERT_EQUAL(rt_raster_get_height(rtn), 6);
641 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_offset(rtn), 0, DBL_EPSILON);
642 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_offset(rtn), 0, DBL_EPSILON);
643 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_scale(rtn), 1, DBL_EPSILON);
644 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_scale(rtn), -1, DBL_EPSILON);
645 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_skew(rtn), 0, DBL_EPSILON);
646 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_skew(rtn), 0, DBL_EPSILON);
647 CU_ASSERT_EQUAL(rt_raster_get_srid(rtn), 0);
648
649 if (rtn != NULL) cu_free_raster(rtn);
650 rtn = NULL;
651
652 /* 2 raster, 0 distance, INTERSECTION */
653 noerr = rt_raster_iterator(
654 itrset, 2,
655 ET_INTERSECTION, NULL,
656 PT_32BUI,
657 1, 0,
658 0, 0,
659 NULL,
660 userargs,
661 testRasterIterator3_callback,
662 &rtn
663 );
664 CU_ASSERT_EQUAL(noerr, ES_NONE);
665 CU_ASSERT_EQUAL(rt_raster_get_width(rtn), 4);
666 CU_ASSERT_EQUAL(rt_raster_get_height(rtn), 4);
667 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_offset(rtn), 1, DBL_EPSILON);
668 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_offset(rtn), -1, DBL_EPSILON);
669 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_scale(rtn), 1, DBL_EPSILON);
670 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_scale(rtn), -1, DBL_EPSILON);
671 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_skew(rtn), 0, DBL_EPSILON);
672 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_skew(rtn), 0, DBL_EPSILON);
673 CU_ASSERT_EQUAL(rt_raster_get_srid(rtn), 0);
674
675 if (rtn != NULL) cu_free_raster(rtn);
676 rtn = NULL;
677
678 /* 2 raster, 0 distance, FIRST */
679 noerr = rt_raster_iterator(
680 itrset, 2,
681 ET_FIRST, NULL,
682 PT_32BUI,
683 1, 0,
684 0, 0,
685 NULL,
686 userargs,
687 testRasterIterator4_callback,
688 &rtn
689 );
690 CU_ASSERT_EQUAL(noerr, ES_NONE);
691 CU_ASSERT_EQUAL(rt_raster_get_width(rtn), 5);
692 CU_ASSERT_EQUAL(rt_raster_get_height(rtn), 5);
693 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_offset(rtn), 0, DBL_EPSILON);
694 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_offset(rtn), 0, DBL_EPSILON);
695 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_scale(rtn), 1, DBL_EPSILON);
696 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_scale(rtn), -1, DBL_EPSILON);
697 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_skew(rtn), 0, DBL_EPSILON);
698 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_skew(rtn), 0, DBL_EPSILON);
699 CU_ASSERT_EQUAL(rt_raster_get_srid(rtn), 0);
700
701 if (rtn != NULL) cu_free_raster(rtn);
702 rtn = NULL;
703
704 /* 2 raster, 0 distance, LAST or SECOND */
705 noerr = rt_raster_iterator(
706 itrset, 2,
707 ET_LAST, NULL,
708 PT_32BUI,
709 1, 0,
710 0, 0,
711 NULL,
712 userargs,
713 testRasterIterator5_callback,
714 &rtn
715 );
716 CU_ASSERT_EQUAL(noerr, ES_NONE);
717 CU_ASSERT_EQUAL(rt_raster_get_width(rtn), 5);
718 CU_ASSERT_EQUAL(rt_raster_get_height(rtn), 5);
719 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_offset(rtn), 1, DBL_EPSILON);
720 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_offset(rtn), -1, DBL_EPSILON);
721 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_scale(rtn), 1, DBL_EPSILON);
722 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_scale(rtn), -1, DBL_EPSILON);
723 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_skew(rtn), 0, DBL_EPSILON);
724 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_skew(rtn), 0, DBL_EPSILON);
725 CU_ASSERT_EQUAL(rt_raster_get_srid(rtn), 0);
726
727 if (rtn != NULL) cu_free_raster(rtn);
728 rtn = NULL;
729
730 /* 2 raster, 0 distance, CUSTOM */
731 noerr = rt_raster_iterator(
732 itrset, 2,
733 ET_CUSTOM, rast3,
734 PT_32BUI,
735 1, 0,
736 0, 0,
737 NULL,
738 userargs,
739 testRasterIterator6_callback,
740 &rtn
741 );
742 CU_ASSERT_EQUAL(noerr, ES_NONE);
743 CU_ASSERT_EQUAL(rt_raster_get_width(rtn), 2);
744 CU_ASSERT_EQUAL(rt_raster_get_height(rtn), 2);
745 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_offset(rtn), 1, DBL_EPSILON);
746 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_offset(rtn), -3, DBL_EPSILON);
747 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_scale(rtn), 1, DBL_EPSILON);
748 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_scale(rtn), -1, DBL_EPSILON);
749 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_skew(rtn), 0, DBL_EPSILON);
750 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_skew(rtn), 0, DBL_EPSILON);
751 CU_ASSERT_EQUAL(rt_raster_get_srid(rtn), 0);
752
753 if (rtn != NULL) cu_free_raster(rtn);
754 rtn = NULL;
755
756 /* 2 raster, 1 distance, CUSTOM */
757 userargs->rasters = 2;
758 userargs->rows = 3;
759 userargs->columns = 3;
760
761 noerr = rt_raster_iterator(
762 itrset, 2,
763 ET_CUSTOM, rast3,
764 PT_32BUI,
765 1, 0,
766 1, 1,
767 NULL,
768 userargs,
769 testRasterIterator7_callback,
770 &rtn
771 );
772 CU_ASSERT_EQUAL(noerr, ES_NONE);
773 CU_ASSERT_EQUAL(rt_raster_get_width(rtn), 2);
774 CU_ASSERT_EQUAL(rt_raster_get_height(rtn), 2);
775 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_offset(rtn), 1, DBL_EPSILON);
776 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_offset(rtn), -3, DBL_EPSILON);
777 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_scale(rtn), 1, DBL_EPSILON);
778 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_scale(rtn), -1, DBL_EPSILON);
779 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_x_skew(rtn), 0, DBL_EPSILON);
780 CU_ASSERT_DOUBLE_EQUAL(rt_raster_get_y_skew(rtn), 0, DBL_EPSILON);
781 CU_ASSERT_EQUAL(rt_raster_get_srid(rtn), 0);
782
783 if (rtn != NULL) cu_free_raster(rtn);
784 rtn = NULL;
785
786 rtdealloc(userargs);
787 rtdealloc(itrset);
788
789 cu_free_raster(rast1);
790 cu_free_raster(rast2);
791 cu_free_raster(rast3);
792
793 if (rtn != NULL) cu_free_raster(rtn);
794 }
795
test_band_reclass()796 static void test_band_reclass() {
797 rt_reclassexpr *exprset;
798
799 rt_raster raster;
800 rt_band band;
801 uint16_t x;
802 uint16_t y;
803 double nodata;
804 int cnt = 2;
805 int i = 0;
806 int rtn;
807 rt_band newband;
808 double val;
809
810 raster = rt_raster_new(100, 10);
811 CU_ASSERT(raster != NULL); /* or we're out of virtual memory */
812 band = cu_add_band(raster, PT_16BUI, 0, 0);
813 CU_ASSERT(band != NULL);
814 rt_band_set_nodata(band, 0, NULL);
815
816 for (x = 0; x < 100; x++) {
817 for (y = 0; y < 10; y++) {
818 rtn = rt_band_set_pixel(band, x, y, x * y + (x + y), NULL);
819 }
820 }
821
822 rt_band_get_nodata(band, &nodata);
823 CU_ASSERT_DOUBLE_EQUAL(nodata, 0, DBL_EPSILON);
824
825 exprset = rtalloc(cnt * sizeof(rt_reclassexpr));
826 CU_ASSERT(exprset != NULL);
827
828 for (i = 0; i < cnt; i++) {
829 exprset[i] = rtalloc(sizeof(struct rt_reclassexpr_t));
830 CU_ASSERT(exprset[i] != NULL);
831
832 if (i == 0) {
833 /* nodata */
834 exprset[i]->src.min = 0;
835 exprset[i]->src.inc_min = 0;
836 exprset[i]->src.exc_min = 0;
837
838 exprset[i]->src.max = 0;
839 exprset[i]->src.inc_max = 0;
840 exprset[i]->src.exc_max = 0;
841
842 exprset[i]->dst.min = 0;
843 exprset[i]->dst.max = 0;
844 }
845 else {
846 /* range */
847 exprset[i]->src.min = 0;
848 exprset[i]->src.inc_min = 0;
849 exprset[i]->src.exc_min = 0;
850
851 exprset[i]->src.max = 1000;
852 exprset[i]->src.inc_max = 1;
853 exprset[i]->src.exc_max = 0;
854
855 exprset[i]->dst.min = 1;
856 exprset[i]->dst.max = 255;
857 }
858 }
859
860 newband = rt_band_reclass(band, PT_8BUI, 0, 0, exprset, cnt);
861 CU_ASSERT(newband != NULL);
862
863 rtn = rt_band_get_pixel(newband, 0, 0, &val, NULL);
864 CU_ASSERT_EQUAL(rtn, ES_NONE);
865 CU_ASSERT_DOUBLE_EQUAL(val, 0, DBL_EPSILON);
866
867 rtn = rt_band_get_pixel(newband, 49, 5, &val, NULL);
868 CU_ASSERT_EQUAL(rtn, ES_NONE);
869 CU_ASSERT_DOUBLE_EQUAL(val, 77, DBL_EPSILON);
870
871 rtn = rt_band_get_pixel(newband, 99, 9, &val, NULL);
872 CU_ASSERT_EQUAL(rtn, ES_NONE);
873 CU_ASSERT_DOUBLE_EQUAL(val, 255, DBL_EPSILON);
874
875 for (i = cnt - 1; i >= 0; i--) rtdealloc(exprset[i]);
876 rtdealloc(exprset);
877 cu_free_raster(raster);
878
879 rt_band_destroy(newband);
880 }
881
test_raster_colormap()882 static void test_raster_colormap() {
883 rt_raster raster;
884 rt_raster rtn;
885 rt_band band;
886 int x;
887 int y;
888 rt_colormap colormap = NULL;
889 double value;
890 int nodata;
891
892 raster = rt_raster_new(9, 9);
893 CU_ASSERT(raster != NULL); /* or we're out of virtual memory */
894 band = cu_add_band(raster, PT_8BUI, 0, 0);
895 CU_ASSERT(band != NULL);
896 rt_band_set_nodata(band, 0, NULL);
897
898 for (y = 0; y < 9; y++) {
899 for (x = 0; x < 9; x++) {
900 rt_band_set_pixel(band, x, y, x, NULL);
901 }
902 }
903
904 colormap = (rt_colormap) rtalloc(sizeof(struct rt_colormap_t));
905 CU_ASSERT(colormap != NULL);
906 colormap->nentry = 3;
907 colormap->entry = (rt_colormap_entry) rtalloc(sizeof(struct rt_colormap_entry_t) * colormap->nentry);
908 CU_ASSERT(colormap->entry != NULL);
909
910 colormap->entry[0].isnodata = 0;
911 colormap->entry[0].value = 8;
912 colormap->entry[0].color[0] = 255;
913 colormap->entry[0].color[1] = 255;
914 colormap->entry[0].color[2] = 255;
915 colormap->entry[0].color[3] = 255;
916
917 colormap->entry[1].isnodata = 0;
918 colormap->entry[1].value = 3;
919 colormap->entry[1].color[0] = 127;
920 colormap->entry[1].color[1] = 127;
921 colormap->entry[1].color[2] = 127;
922 colormap->entry[1].color[3] = 255;
923
924 colormap->entry[2].isnodata = 0;
925 colormap->entry[2].value = 0;
926 colormap->entry[2].color[0] = 0;
927 colormap->entry[2].color[1] = 0;
928 colormap->entry[2].color[2] = 0;
929 colormap->entry[2].color[3] = 255;
930
931 /* 2 colors, 3 entries, INTERPOLATE */
932 colormap->ncolor = 2;
933 colormap->method = CM_INTERPOLATE;
934
935 rtn = rt_raster_colormap(
936 raster, 0,
937 colormap
938 );
939 CU_ASSERT(rtn != NULL);
940 CU_ASSERT_EQUAL(rt_raster_get_num_bands(rtn), colormap->ncolor);
941
942 band = rt_raster_get_band(rtn, 0);
943 CU_ASSERT(band != NULL);
944 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 0, 0, &value, &nodata), ES_NONE);
945 CU_ASSERT_DOUBLE_EQUAL(value, 0, DBL_EPSILON);
946 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 3, 0, &value, &nodata), ES_NONE);
947 CU_ASSERT_DOUBLE_EQUAL(value, 127, DBL_EPSILON);
948 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 8, 0, &value, &nodata), ES_NONE);
949 CU_ASSERT_DOUBLE_EQUAL(value, 255, DBL_EPSILON);
950
951 cu_free_raster(rtn);
952
953 /* 4 colors, 3 entries, INTERPOLATE */
954 colormap->ncolor = 4;
955
956 rtn = rt_raster_colormap(
957 raster, 0,
958 colormap
959 );
960 CU_ASSERT(rtn != NULL);
961 CU_ASSERT_EQUAL(rt_raster_get_num_bands(rtn), colormap->ncolor);
962 cu_free_raster(rtn);
963
964 /* 4 colors, 3 entries, EXACT */
965 colormap->method = CM_EXACT;
966
967 rtn = rt_raster_colormap(
968 raster, 0,
969 colormap
970 );
971 CU_ASSERT(rtn != NULL);
972 CU_ASSERT_EQUAL(rt_raster_get_num_bands(rtn), colormap->ncolor);
973
974 band = rt_raster_get_band(rtn, 0);
975 CU_ASSERT(band != NULL);
976 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 0, 0, &value, &nodata), ES_NONE);
977 CU_ASSERT_DOUBLE_EQUAL(value, 0, DBL_EPSILON);
978 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 3, 0, &value, &nodata), ES_NONE);
979 CU_ASSERT_DOUBLE_EQUAL(value, 127, DBL_EPSILON);
980 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 8, 0, &value, &nodata), ES_NONE);
981 CU_ASSERT_DOUBLE_EQUAL(value, 255, DBL_EPSILON);
982 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 1, 0, &value, &nodata), ES_NONE);
983 CU_ASSERT_DOUBLE_EQUAL(value, 0, DBL_EPSILON);
984 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 7, 0, &value, &nodata), ES_NONE);
985 CU_ASSERT_DOUBLE_EQUAL(value, 0, DBL_EPSILON);
986
987 cu_free_raster(rtn);
988
989 /* 4 colors, 3 entries, NEAREST */
990 colormap->method = CM_NEAREST;
991
992 rtn = rt_raster_colormap(
993 raster, 0,
994 colormap
995 );
996 CU_ASSERT(rtn != NULL);
997 CU_ASSERT_EQUAL(rt_raster_get_num_bands(rtn), colormap->ncolor);
998
999 band = rt_raster_get_band(rtn, 0);
1000 CU_ASSERT(band != NULL);
1001 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 0, 0, &value, &nodata), ES_NONE);
1002 CU_ASSERT_DOUBLE_EQUAL(value, 0, DBL_EPSILON);
1003 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 3, 0, &value, &nodata), ES_NONE);
1004 CU_ASSERT_DOUBLE_EQUAL(value, 127, DBL_EPSILON);
1005 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 8, 0, &value, &nodata), ES_NONE);
1006 CU_ASSERT_DOUBLE_EQUAL(value, 255, DBL_EPSILON);
1007 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 1, 0, &value, &nodata), ES_NONE);
1008 CU_ASSERT_DOUBLE_EQUAL(value, 0, DBL_EPSILON);
1009 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 2, 0, &value, &nodata), ES_NONE);
1010 CU_ASSERT_DOUBLE_EQUAL(value, 127, DBL_EPSILON);
1011 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 4, 0, &value, &nodata), ES_NONE);
1012 CU_ASSERT_DOUBLE_EQUAL(value, 127, DBL_EPSILON);
1013 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 7, 0, &value, &nodata), ES_NONE);
1014 CU_ASSERT_DOUBLE_EQUAL(value, 255, DBL_EPSILON);
1015
1016 cu_free_raster(rtn);
1017
1018 /* 4 colors, 2 entries, NEAREST */
1019 colormap->nentry = 2;
1020 colormap->method = CM_NEAREST;
1021
1022 rtn = rt_raster_colormap(
1023 raster, 0,
1024 colormap
1025 );
1026 CU_ASSERT(rtn != NULL);
1027 CU_ASSERT_EQUAL(rt_raster_get_num_bands(rtn), colormap->ncolor);
1028
1029 band = rt_raster_get_band(rtn, 0);
1030 CU_ASSERT(band != NULL);
1031 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 0, 0, &value, &nodata), ES_NONE);
1032 CU_ASSERT_DOUBLE_EQUAL(value, 127, DBL_EPSILON);
1033 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 3, 0, &value, &nodata), ES_NONE);
1034 CU_ASSERT_DOUBLE_EQUAL(value, 127, DBL_EPSILON);
1035 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 8, 0, &value, &nodata), ES_NONE);
1036 CU_ASSERT_DOUBLE_EQUAL(value, 255, DBL_EPSILON);
1037 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 1, 0, &value, &nodata), ES_NONE);
1038 CU_ASSERT_DOUBLE_EQUAL(value, 127, DBL_EPSILON);
1039 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 2, 0, &value, &nodata), ES_NONE);
1040 CU_ASSERT_DOUBLE_EQUAL(value, 127, DBL_EPSILON);
1041 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 4, 0, &value, &nodata), ES_NONE);
1042 CU_ASSERT_DOUBLE_EQUAL(value, 127, DBL_EPSILON);
1043 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 7, 0, &value, &nodata), ES_NONE);
1044 CU_ASSERT_DOUBLE_EQUAL(value, 255, DBL_EPSILON);
1045
1046 cu_free_raster(rtn);
1047
1048 rtdealloc(colormap->entry);
1049 rtdealloc(colormap);
1050
1051 cu_free_raster(raster);
1052
1053 /* new set of tests */
1054 raster = rt_raster_new(10, 10);
1055 CU_ASSERT(raster != NULL); /* or we're out of virtual memory */
1056 band = cu_add_band(raster, PT_8BUI, 0, 0);
1057 CU_ASSERT(band != NULL);
1058 rt_band_set_nodata(band, 0, NULL);
1059
1060 for (y = 0; y < 10; y++) {
1061 for (x = 0; x < 10; x++) {
1062 rt_band_set_pixel(band, x, y, (x * y) + x, NULL);
1063 }
1064 }
1065
1066 colormap = (rt_colormap) rtalloc(sizeof(struct rt_colormap_t));
1067 CU_ASSERT(colormap != NULL);
1068 colormap->nentry = 10;
1069 colormap->entry = (rt_colormap_entry) rtalloc(sizeof(struct rt_colormap_entry_t) * colormap->nentry);
1070 CU_ASSERT(colormap->entry != NULL);
1071
1072 colormap->entry[0].isnodata = 0;
1073 colormap->entry[0].value = 90;
1074 colormap->entry[0].color[0] = 255;
1075 colormap->entry[0].color[1] = 255;
1076 colormap->entry[0].color[2] = 255;
1077 colormap->entry[0].color[3] = 255;
1078
1079 colormap->entry[1].isnodata = 0;
1080 colormap->entry[1].value = 80;
1081 colormap->entry[1].color[0] = 255;
1082 colormap->entry[1].color[1] = 227;
1083 colormap->entry[1].color[2] = 227;
1084 colormap->entry[1].color[3] = 255;
1085
1086 colormap->entry[2].isnodata = 0;
1087 colormap->entry[2].value = 70;
1088 colormap->entry[2].color[0] = 255;
1089 colormap->entry[2].color[1] = 198;
1090 colormap->entry[2].color[2] = 198;
1091 colormap->entry[2].color[3] = 255;
1092
1093 colormap->entry[3].isnodata = 0;
1094 colormap->entry[3].value = 60;
1095 colormap->entry[3].color[0] = 255;
1096 colormap->entry[3].color[1] = 170;
1097 colormap->entry[3].color[2] = 170;
1098 colormap->entry[3].color[3] = 255;
1099
1100 colormap->entry[4].isnodata = 0;
1101 colormap->entry[4].value = 50;
1102 colormap->entry[4].color[0] = 255;
1103 colormap->entry[4].color[1] = 142;
1104 colormap->entry[4].color[2] = 142;
1105 colormap->entry[4].color[3] = 255;
1106
1107 colormap->entry[5].isnodata = 0;
1108 colormap->entry[5].value = 40;
1109 colormap->entry[5].color[0] = 255;
1110 colormap->entry[5].color[1] = 113;
1111 colormap->entry[5].color[2] = 113;
1112 colormap->entry[5].color[3] = 255;
1113
1114 colormap->entry[6].isnodata = 0;
1115 colormap->entry[6].value = 30;
1116 colormap->entry[6].color[0] = 255;
1117 colormap->entry[6].color[1] = 85;
1118 colormap->entry[6].color[2] = 85;
1119 colormap->entry[6].color[3] = 255;
1120
1121 colormap->entry[7].isnodata = 0;
1122 colormap->entry[7].value = 20;
1123 colormap->entry[7].color[0] = 255;
1124 colormap->entry[7].color[1] = 57;
1125 colormap->entry[7].color[2] = 57;
1126 colormap->entry[7].color[3] = 255;
1127
1128 colormap->entry[8].isnodata = 0;
1129 colormap->entry[8].value = 10;
1130 colormap->entry[8].color[0] = 255;
1131 colormap->entry[8].color[1] = 28;
1132 colormap->entry[8].color[2] = 28;
1133 colormap->entry[8].color[3] = 255;
1134
1135 colormap->entry[9].isnodata = 0;
1136 colormap->entry[9].value = 0;
1137 colormap->entry[9].color[0] = 255;
1138 colormap->entry[9].color[1] = 0;
1139 colormap->entry[9].color[2] = 0;
1140 colormap->entry[9].color[3] = 255;
1141
1142 /* 2 colors, 3 entries, INTERPOLATE */
1143 colormap->ncolor = 4;
1144 colormap->method = CM_INTERPOLATE;
1145
1146 rtn = rt_raster_colormap(
1147 raster, 0,
1148 colormap
1149 );
1150 CU_ASSERT(rtn != NULL);
1151 CU_ASSERT_EQUAL(rt_raster_get_num_bands(rtn), colormap->ncolor);
1152
1153 band = rt_raster_get_band(rtn, 2);
1154 CU_ASSERT(band != NULL);
1155 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 0, 0, &value, &nodata), ES_NONE);
1156 CU_ASSERT_DOUBLE_EQUAL(value, 0, DBL_EPSILON);
1157 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 5, 0, &value, &nodata), ES_NONE);
1158 CU_ASSERT_DOUBLE_EQUAL(value, 14, DBL_EPSILON);
1159 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 6, 0, &value, &nodata), ES_NONE);
1160 CU_ASSERT_DOUBLE_EQUAL(value, 17, DBL_EPSILON);
1161 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 9, 0, &value, &nodata), ES_NONE);
1162 CU_ASSERT_DOUBLE_EQUAL(value, 25, DBL_EPSILON);
1163
1164 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 2, 4, &value, &nodata), ES_NONE);
1165 CU_ASSERT_DOUBLE_EQUAL(value, 28, DBL_EPSILON);
1166 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 3, 4, &value, &nodata), ES_NONE);
1167 CU_ASSERT_DOUBLE_EQUAL(value, 43, DBL_EPSILON);
1168 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 4, 4, &value, &nodata), ES_NONE);
1169 CU_ASSERT_DOUBLE_EQUAL(value, 57, DBL_EPSILON);
1170
1171 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 6, 9, &value, &nodata), ES_NONE);
1172 CU_ASSERT_DOUBLE_EQUAL(value, 170, DBL_EPSILON);
1173 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 7, 9, &value, &nodata), ES_NONE);
1174 CU_ASSERT_DOUBLE_EQUAL(value, 198, DBL_EPSILON);
1175 CU_ASSERT_EQUAL(rt_band_get_pixel(band, 8, 9, &value, &nodata), ES_NONE);
1176 CU_ASSERT_DOUBLE_EQUAL(value, 227, DBL_EPSILON);
1177
1178 cu_free_raster(rtn);
1179
1180 rtdealloc(colormap->entry);
1181 rtdealloc(colormap);
1182
1183 cu_free_raster(raster);
1184 }
1185
1186 /* register tests */
1187 void mapalgebra_suite_setup(void);
mapalgebra_suite_setup(void)1188 void mapalgebra_suite_setup(void)
1189 {
1190 CU_pSuite suite = CU_add_suite("mapalgebra", NULL, NULL);
1191 PG_ADD_TEST(suite, test_raster_iterator);
1192 PG_ADD_TEST(suite, test_band_reclass);
1193 PG_ADD_TEST(suite, test_raster_colormap);
1194 }
1195
1196