00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 #include "common.h"
00157
00158 #include <stdio.h>
00159 #ifdef HAVE_STRING_H
00160 #include <string.h>
00161 #endif
00162
00163 #include "machine.h"
00164 #include "bu.h"
00165 #include "vmath.h"
00166 #include "bn.h"
00167
00168
00169 #ifdef __STDC__
00170 #define decompose_1d(DATATYPE) bn_wlt_haar_1d_ ## DATATYPE ## _decompose
00171 #else
00172 #define decompose_1d(DATATYPE) bn_wlt_haar_1d_DATATYPE_decompose
00173 #endif
00174
00175
00176
00177 #define make_wlt_haar_1d_decompose(DATATYPE) \
00178 void \
00179 decompose_1d(DATATYPE) \
00180 ( tbuffer, buffer, dimen, channels, limit ) \
00181 DATATYPE *tbuffer; \
00182 DATATYPE *buffer; \
00183 unsigned long dimen; \
00184 unsigned long channels; \
00185 unsigned long limit; \
00186 { \
00187 register DATATYPE *detail; \
00188 register DATATYPE *avg; \
00189 unsigned long img_size; \
00190 unsigned long half_size; \
00191 int do_free = 0; \
00192 unsigned long x, x_tmp, d, i, j; \
00193 register fastf_t onehalf = (fastf_t)0.5; \
00194 \
00195 CK_POW_2( dimen ); \
00196 \
00197 if ( ! tbuffer ) { \
00198 tbuffer = (DATATYPE *)bu_malloc( \
00199 (dimen/2) * channels * sizeof( *buffer ), \
00200 "1d wavelet buffer"); \
00201 do_free = 1; \
00202 } \
00203 \
00204
00205
00206 \
00207 for (img_size = dimen ; img_size > limit ; img_size = half_size ){ \
00208 \
00209 half_size = img_size/2; \
00210 \
00211 detail = tbuffer; \
00212 avg = buffer; \
00213 \
00214 for ( x=0 ; x < img_size ; x += 2 ) { \
00215 x_tmp = x*channels; \
00216 \
00217 for (d=0 ; d < channels ; d++, avg++, detail++) { \
00218 i = x_tmp + d; \
00219 j = i + channels; \
00220 *detail = (buffer[i] - buffer[j]) * onehalf; \
00221 *avg = (buffer[i] + buffer[j]) * onehalf; \
00222 } \
00223 } \
00224 \
00225
00226
00227
00228
00229
00230 \
00231 memcpy(avg, tbuffer, sizeof(*buffer) * channels * half_size); \
00232 } \
00233 \
00234 if (do_free) \
00235 bu_free( (genptr_t)tbuffer, "1d wavelet buffer"); \
00236 }
00237
00238
00239 #if defined(__STDC__)
00240 #define reconstruct(DATATYPE ) bn_wlt_haar_1d_ ## DATATYPE ## _reconstruct
00241 #else
00242 #define reconstruct(DATATYPE) bn_wlt_haar_1d_DATATYPE_reconstruct
00243 #endif
00244
00245 #define make_wlt_haar_1d_reconstruct( DATATYPE ) \
00246 void \
00247 reconstruct(DATATYPE) \
00248 ( tbuffer, buffer, dimen, channels, subimage_size, limit )\
00249 DATATYPE *tbuffer; \
00250 DATATYPE *buffer; \
00251 unsigned long dimen; \
00252 unsigned long channels; \
00253 unsigned long subimage_size; \
00254 unsigned long limit; \
00255 { \
00256 register DATATYPE *detail; \
00257 register DATATYPE *avg; \
00258 unsigned long img_size; \
00259 unsigned long dbl_size; \
00260 int do_free = 0; \
00261 unsigned long x_tmp, d, x, i, j; \
00262 \
00263 CK_POW_2( subimage_size ); \
00264 CK_POW_2( dimen ); \
00265 CK_POW_2( limit ); \
00266 \
00267 if ( ! (subimage_size < dimen) ) { \
00268 bu_log("%s:%d Dimension %d should be greater than subimage size (%d)\n", \
00269 __FILE__, __LINE__, dimen, subimage_size); \
00270 bu_bomb("reconstruct"); \
00271 } \
00272 \
00273 if ( ! (subimage_size < limit) ) { \
00274 bu_log("%s:%d Channels limit %d should be greater than subimage size (%d)\n", \
00275 __FILE__, __LINE__, limit, subimage_size); \
00276 bu_bomb("reconstruct"); \
00277 } \
00278 \
00279 if ( ! (limit <= dimen) ) { \
00280 bu_log("%s:%d Dimension %d should be greater than or equal to the channels limit (%d)\n", \
00281 __FILE__, __LINE__, dimen, limit); \
00282 bu_bomb("reconstruct"); \
00283 } \
00284 \
00285 \
00286 if ( ! tbuffer ) { \
00287 tbuffer = ( DATATYPE *)bu_malloc((dimen/2) * channels * sizeof( *buffer ), \
00288 "1d wavelet reconstruct tmp buffer"); \
00289 do_free = 1; \
00290 } \
00291 \
00292
00293
00294 \
00295 for (img_size=subimage_size ; img_size < limit ; img_size=dbl_size) { \
00296 dbl_size = img_size * 2; \
00297 \
00298 d = img_size * channels; \
00299 detail = &buffer[ d ]; \
00300 \
00301 \
00302 avg = tbuffer; \
00303 memcpy(avg, buffer, sizeof(*buffer) * d ); \
00304 \
00305 \
00306 for (x=0 ; x < dbl_size ; x += 2 ) { \
00307 x_tmp = x * channels; \
00308 for (d=0 ; d < channels ; d++, avg++, detail++ ) { \
00309 i = x_tmp + d; \
00310 j = i + channels; \
00311 buffer[i] = *avg + *detail; \
00312 buffer[j] = *avg - *detail; \
00313 } \
00314 } \
00315 } \
00316 \
00317 if (do_free) \
00318 bu_free( (genptr_t)tbuffer, \
00319 "1d wavelet reconstruct tmp buffer"); \
00320 }
00321
00322
00323
00324 make_wlt_haar_1d_decompose(double)
00325 make_wlt_haar_1d_reconstruct(double)
00326
00327 make_wlt_haar_1d_decompose(float)
00328 make_wlt_haar_1d_reconstruct(float)
00329
00330 make_wlt_haar_1d_decompose(char)
00331 make_wlt_haar_1d_reconstruct(char)
00332
00333 make_wlt_haar_1d_decompose(int)
00334 make_wlt_haar_1d_reconstruct(int)
00335
00336 make_wlt_haar_1d_decompose(short)
00337 make_wlt_haar_1d_reconstruct(short)
00338
00339 make_wlt_haar_1d_decompose(long)
00340 make_wlt_haar_1d_reconstruct(long)
00341
00342
00343 #ifdef __STDC__
00344 #define decompose_2d( DATATYPE ) bn_wlt_haar_2d_ ## DATATYPE ## _decompose
00345 #else
00346 #define decompose_2d(DATATYPE) bn_wlt_haar_2d_DATATYPE_decompose
00347 #endif
00348
00349 #define make_wlt_haar_2d_decompose(DATATYPE) \
00350 void \
00351 decompose_2d(DATATYPE) \
00352 (tbuffer, buffer, dimen, channels, limit) \
00353 DATATYPE *tbuffer; \
00354 DATATYPE *buffer; \
00355 unsigned long dimen; \
00356 unsigned long channels; \
00357 unsigned long limit; \
00358 { \
00359 register DATATYPE *detail; \
00360 register DATATYPE *avg; \
00361 unsigned long img_size; \
00362 unsigned long half_size; \
00363 unsigned long x, y, x_tmp, y_tmp, d, i, j; \
00364 register fastf_t onehalf = (fastf_t)0.5; \
00365 \
00366 CK_POW_2( dimen ); \
00367 \
00368 if ( ! tbuffer ) { \
00369 tbuffer = (DATATYPE *)bu_malloc( \
00370 (dimen/2) * channels * sizeof( *buffer ), \
00371 "1d wavelet buffer"); \
00372 } \
00373 \
00374
00375
00376
00377 \
00378 for (img_size = dimen ; img_size > limit ; img_size = half_size ) { \
00379 half_size = img_size/2; \
00380 \
00381 \
00382 for (y=0 ; y < img_size ; y++ ) { \
00383 y_tmp = y * dimen * channels; \
00384 \
00385 detail = tbuffer; \
00386 avg = &buffer[y_tmp]; \
00387 \
00388 for (x=0 ; x < img_size ; x += 2 ) { \
00389 x_tmp = x*channels + y_tmp; \
00390 \
00391 for (d=0 ; d < channels ; d++, avg++, detail++){ \
00392 i = x_tmp + d; \
00393 j = i + channels; \
00394 *detail = (buffer[i] - buffer[j]) * onehalf; \
00395 *avg = (buffer[i] + buffer[j]) * onehalf; \
00396 } \
00397 } \
00398
00399
00400
00401
00402
00403 \
00404 memcpy(avg, tbuffer, sizeof(*buffer) * channels * half_size); \
00405 } \
00406 \
00407 \
00408 for (x=0 ; x < img_size ; x ++ ) { \
00409 x_tmp = x*channels; \
00410 \
00411 detail = tbuffer; \
00412 avg = &buffer[x_tmp]; \
00413 \
00414 for (y=0 ; y < img_size ; y += 2) { \
00415 y_tmp =y*dimen*channels + x_tmp; \
00416 \
00417 for (d=0 ; d < channels ; d++, avg++, detail++) { \
00418 i = y_tmp + d; \
00419 j = i + dimen*channels; \
00420 *detail = (buffer[i] - buffer[j]) * onehalf; \
00421 *avg = (buffer[i] + buffer[j]) * onehalf; \
00422 } \
00423 avg += (dimen-1)*channels; \
00424 } \
00425 \
00426
00427
00428
00429
00430
00431
00432 \
00433 detail = tbuffer; \
00434 for (y=half_size ; y < img_size ; y++) { \
00435 for (d=0; d < channels ; d++) { \
00436 *avg++ = *detail++; \
00437 } \
00438 avg += (dimen-1)*channels; \
00439 } \
00440 } \
00441 } \
00442 }
00443
00444
00445 #ifdef __STDC__
00446 #define reconstruct_2d( DATATYPE ) bn_wlt_haar_2d_ ## DATATYPE ## _reconstruct
00447 #else
00448 #define reconstruct_2d(DATATYPE) bn_wlt_haar_2d_DATATYPE_reconstruct
00449 #endif
00450
00451 #define make_wlt_haar_2d_reconstruct(DATATYPE) \
00452 void \
00453 reconstruct_2d(DATATYPE) \
00454 (tbuf, buf, width, channels, avg_size, limit) \
00455 DATATYPE *tbuf; \
00456 DATATYPE *buf; \
00457 unsigned long width; \
00458 unsigned long channels; \
00459 unsigned long avg_size; \
00460 unsigned long limit; \
00461 { \
00462 register DATATYPE *detail; \
00463 register DATATYPE *avg; \
00464 unsigned long img_size; \
00465 unsigned long dbl_size; \
00466 unsigned long x_tmp, d, x, i, j; \
00467 unsigned long y, row_len, row_start; \
00468 \
00469 CK_POW_2( avg_size ); \
00470 CK_POW_2( width ); \
00471 CK_POW_2( limit ); \
00472 \
00473
00474
00475
00476 \
00477 \
00478 \
00479 if ( ! tbuf ) { \
00480 tbuf = ( DATATYPE *)bu_malloc((width/2) * channels * sizeof( *buf ), \
00481 "1d wavelet reconstruct tmp buffer"); \
00482 } \
00483 \
00484 row_len = width * channels; \
00485 \
00486
00487
00488 \
00489 \
00490 for (img_size = avg_size ; img_size < limit ; img_size = dbl_size) { \
00491 dbl_size = img_size * 2; \
00492 \
00493 \
00494 \
00495 for (x=0 ; x < dbl_size ; x++ ) { \
00496 \
00497 \
00498 \
00499 x_tmp = x*channels; \
00500 for (y=0 ; y < img_size ; y++) { \
00501 i = x_tmp + y*row_len; \
00502 j = y * channels; \
00503 for (d=0 ; d < channels ; d++) { \
00504 tbuf[j++] = buf[i++]; \
00505 } \
00506 } \
00507 avg = tbuf; \
00508 detail = &buf[x_tmp + img_size*row_len]; \
00509 \
00510 \
00511 for (y=0 ; y < dbl_size ; y += 2) { \
00512 \
00513 i = x_tmp + y*row_len; \
00514 j = i + row_len; \
00515 \
00516 for (d=0 ; d < channels ; d++,avg++,detail++){ \
00517 buf[i++] = *avg + *detail; \
00518 buf[j++] = *avg - *detail; \
00519 } \
00520 detail += row_len - channels; \
00521 } \
00522 } \
00523 \
00524 \
00525 for (y=0 ; y < dbl_size ; y++ ) { \
00526 \
00527 \
00528
00529
00530 \
00531 d = img_size * channels; \
00532 row_start = y*row_len; \
00533 \
00534 \
00535 avg = &buf[ row_start ]; \
00536 detail = &buf[ row_start + d]; \
00537 \
00538 memcpy(tbuf, avg, sizeof(*buf) * d ); \
00539 avg = tbuf; \
00540 \
00541 \
00542 for (x=0 ; x < dbl_size ; x += 2 ) { \
00543 x_tmp = x * channels; \
00544 i = row_start + x * channels; \
00545 j = i + channels; \
00546 \
00547 for (d=0 ; d < channels ; d++,avg++,detail++){ \
00548 buf[i++] = *avg + *detail; \
00549 buf[j++] = *avg - *detail; \
00550 } \
00551 } \
00552 } \
00553 } \
00554 }
00555
00556
00557 make_wlt_haar_2d_decompose(double)
00558 make_wlt_haar_2d_decompose(float)
00559 make_wlt_haar_2d_decompose(char)
00560 make_wlt_haar_2d_decompose(int)
00561 make_wlt_haar_2d_decompose(short)
00562 make_wlt_haar_2d_decompose(long)
00563
00564 make_wlt_haar_2d_reconstruct(double)
00565 make_wlt_haar_2d_reconstruct(float)
00566 make_wlt_haar_2d_reconstruct(char)
00567 make_wlt_haar_2d_reconstruct(int)
00568 make_wlt_haar_2d_reconstruct(short)
00569 make_wlt_haar_2d_reconstruct(long)
00570
00571
00572
00573 #ifdef __STDC__
00574 #define decompose_2d_2( DATATYPE ) bn_wlt_haar_2d_ ## DATATYPE ## _decompose2
00575 #else
00576 #define decompose_2d_2(DATATYPE) bn_wlt_haar_2d_DATATYPE_decompose2
00577 #endif
00578
00579 #define make_wlt_haar_2d_decompose2(DATATYPE) \
00580 void \
00581 decompose_2d_2(DATATYPE) \
00582 (tbuffer, buffer, width, height, channels, limit) \
00583 DATATYPE *tbuffer; \
00584 DATATYPE *buffer; \
00585 unsigned long width; \
00586 unsigned long height; \
00587 unsigned long channels; \
00588 unsigned long limit; \
00589 { \
00590 register DATATYPE *detail; \
00591 register DATATYPE *avg; \
00592 unsigned long img_wsize; \
00593 unsigned long img_hsize; \
00594 unsigned long half_wsize; \
00595 unsigned long half_hsize; \
00596 unsigned long x, y, x_tmp, y_tmp, d, i, j; \
00597 register fastf_t onehalf = (fastf_t)0.5; \
00598 \
00599 CK_POW_2( width ); \
00600 CK_POW_2( height ); \
00601 \
00602
00603 \
00604 if ( ! tbuffer ) { \
00605 tbuffer = (DATATYPE *)bu_malloc( \
00606 (((width>height)?width:height)/2) * channels * sizeof( *buffer ), \
00607 "1d wavelet buffer"); \
00608 } \
00609 \
00610
00611
00612
00613 \
00614 for (img_wsize = width, img_hsize = height ; (img_wsize > limit) && (img_hsize > limit) ; img_wsize = half_wsize, img_hsize = half_hsize ) { \
00615 half_wsize = img_wsize/2; \
00616 half_hsize = img_hsize/2; \
00617 \
00618 \
00619 for (y=0 ; y < img_hsize ; y++ ) { \
00620 y_tmp = y * width * channels; \
00621 \
00622 detail = tbuffer; \
00623 avg = &buffer[y_tmp]; \
00624 \
00625 for (x=0 ; x < img_wsize ; x += 2 ) { \
00626 x_tmp = x*channels + y_tmp; \
00627 \
00628 for (d=0 ; d < channels ; d++, avg++, detail++){ \
00629 i = x_tmp + d; \
00630 j = i + channels; \
00631 *detail = (buffer[i] - buffer[j]) * onehalf; \
00632 *avg = (buffer[i] + buffer[j]) * onehalf; \
00633 } \
00634 } \
00635
00636
00637
00638
00639
00640 \
00641 memcpy(avg, tbuffer, sizeof(*buffer) * channels * half_wsize); \
00642 } \
00643 \
00644 \
00645 for (x=0 ; x < img_wsize ; x ++ ) { \
00646 x_tmp = x*channels; \
00647 \
00648 detail = tbuffer; \
00649 avg = &buffer[x_tmp]; \
00650 \
00651 for (y=0 ; y < img_hsize ; y += 2) { \
00652 y_tmp =y*width*channels + x_tmp; \
00653 \
00654 for (d=0 ; d < channels ; d++, avg++, detail++) { \
00655 i = y_tmp + d; \
00656 j = i + width*channels; \
00657 *detail = (buffer[i] - buffer[j]) * onehalf; \
00658 *avg = (buffer[i] + buffer[j]) * onehalf; \
00659 } \
00660 avg += (width-1)*channels; \
00661 } \
00662 \
00663
00664
00665
00666
00667
00668
00669 \
00670 detail = tbuffer; \
00671 for (y=half_hsize ; y < img_hsize ; y++) { \
00672 for (d=0; d < channels ; d++) { \
00673 *avg++ = *detail++; \
00674 } \
00675 avg += (width-1)*channels; \
00676 } \
00677 } \
00678 } \
00679 }
00680
00681 make_wlt_haar_2d_decompose2(double)
00682 make_wlt_haar_2d_decompose2(float)
00683 make_wlt_haar_2d_decompose2(char)
00684 make_wlt_haar_2d_decompose2(int)
00685 make_wlt_haar_2d_decompose2(short)
00686 make_wlt_haar_2d_decompose2(long)
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698