7 #include "../utils/MirroredReindexer.hpp"
11 #define SEPARABLE_FILTER_ALGORITHM_GENERAL(ROW_INIT, PX_INIT, KERNEL_ACTION, PX_COMMIT, PX_INCREMENT) \
12 double * kernelEnd = kernel + kernelWidth;\
14 int noReindexFrom = kernelCenter < srcWidth ? kernelCenter : srcWidth; \
15 int noReindexTo = srcWidth - kernelCenter; \
17 int initialReindexLimit = (xSrcMax < noReindexFrom) ? xSrcMax : noReindexFrom;\
18 int noReindexLimit = (xSrcMax < noReindexTo) ? xSrcMax : noReindexTo;\
20 MirroredReindexer *loReindexer = NULL, *hiReindexer = NULL;\
23 if (xSrcMin < noReindexFrom) {\
24 loReindexer = new MirroredReindexer(-kernelCenter, kernelWidth - 1, srcWidth);\
25 if (loReindexer == NULL) {\
27 } else if (loReindexer->getVals() == NULL) {\
31 if ((noReindexTo < xSrcMax) && initOk) {\
32 hiReindexer = new MirroredReindexer(srcWidth - kernelWidth - 1, srcWidth + kernelCenter, srcWidth);\
33 if (hiReindexer == NULL) {\
35 } else if (hiReindexer->getVals() == NULL) {\
43 TPIXEL * sRowBgnPtr = src + ySrcMin * srcWidth;\
44 TPIXEL * sRowBgnPtrEnd = src + ySrcMax * srcWidth;\
46 TPIXEL * dPtrColBgn = dst + yDstMin * dstWidth + xDstMin;\
49 TCHANNEL * mPtrColBgn = msk + yMskMin * mskWidth + xMskMin;\
59 while (sRowBgnPtr < sRowBgnPtrEnd) {\
62 while (x < initialReindexLimit) {\
64 xx = x - kernelCenter;\
66 while (kernelPtr < kernelEnd) {\
67 sTmpPtr = sRowBgnPtr + loReindexer->reindex(xx++);\
76 sPtr = sRowBgnPtr + x;\
77 sPtrRowEnd = sRowBgnPtr + noReindexLimit;\
78 while (sPtr < sPtrRowEnd) {\
81 sTmpPtr = sPtr++ - kernelCenter;\
82 while (kernelPtr < kernelEnd) {\
92 while (x < xSrcMax) {\
94 xx = x - kernelCenter;\
96 while (kernelPtr < kernelEnd) {\
97 sTmpPtr = sRowBgnPtr + hiReindexer->reindex(xx++);\
105 sRowBgnPtr += srcWidth;\
110 if (loReindexer != NULL) {\
113 if (hiReindexer != NULL) {\
122 template<
typename TPIXEL,
typename TCHANNEL>
125 if (xKernel != NULL) {
128 if (yKernel != NULL) {
134 template<
typename TPIXEL,
typename TCHANNEL>
136 if (this->chCount != 1) {
140 if (xKernel == NULL || yKernel == NULL) {
144 TPIXEL *
const srcData = bitmap.
getData();
145 if (srcData == NULL) {
149 unsigned origWidth = bitmap.
getWidth();
150 unsigned origHeight = bitmap.
getHeight();
151 unsigned tmpWidth = origHeight;
152 unsigned tmpHeight = origWidth;
154 TPIXEL *
const tmpData = (TPIXEL *) malloc(tmpWidth * tmpHeight *
sizeof(TPIXEL));
155 if (tmpData == NULL) {
183 TPIXEL * src = srcData;
184 int srcWidth = origWidth;
185 int xSrcMin = crop.
tl.
x;
186 int xSrcMax = crop.
br.
x;
187 int ySrcMin = crop.
tl.
y - yKernelCenter;
188 ySrcMin = (ySrcMin < 0) ? 0 : ySrcMin;
189 int ySrcMax = crop.
br.
y + yKernelCenter;
190 ySrcMax = (ySrcMax > origHeight) ? origHeight : ySrcMax;
192 TPIXEL * dst = tmpData;
193 int dstWidth = tmpWidth;
195 TCHANNEL * msk = NULL;
200 int xDstMin = ySrcMin;
201 int yDstMin = xSrcMin;
203 double * kernel = xKernel;
204 int kernelCenter = xKernelCenter;
205 int kernelWidth = xKernelWidth;
216 TPIXEL * src = tmpData;
217 int srcWidth = tmpWidth;
218 int xSrcMin = crop.
tl.
y;
219 int xSrcMax = crop.
br.
y;
220 int ySrcMin = crop.
tl.
x;
221 int ySrcMax = crop.
br.
x;
223 TPIXEL * dst = srcData;
224 int dstWidth = origWidth;
225 int xDstMin = crop.
tl.
x;
226 int yDstMin = crop.
tl.
y;
228 TCHANNEL * msk = NULL;
233 double * kernel = yKernel;
234 int kernelCenter = yKernelCenter;
235 int kernelWidth = yKernelWidth;
248 template<
typename TPIXEL,
typename TCHANNEL>
250 if (this->chCount != 4) {
253 if (xKernel == NULL || yKernel == NULL) {
256 TPIXEL *
const srcData = bitmap.
getData();
257 if (srcData == NULL) {
260 unsigned origWidth = bitmap.
getWidth();
261 unsigned origHeight = bitmap.
getHeight();
263 unsigned tmpWidth = origHeight;
264 unsigned tmpHeight = origWidth;
266 TPIXEL *
const tmpData = (TPIXEL *) malloc(tmpWidth * tmpHeight *
sizeof(TPIXEL));
267 if (tmpData == NULL) {
278 TPIXEL * src = srcData;
279 int srcWidth = origWidth;
280 int xSrcMin = crop.
tl.
x;
281 int xSrcMax = crop.
br.
x;
282 int ySrcMin = crop.
tl.
y - yKernelCenter;
283 ySrcMin = (ySrcMin < 0) ? 0 : ySrcMin;
284 int ySrcMax = crop.
br.
y + yKernelCenter;
285 ySrcMax = (ySrcMax > origHeight) ? origHeight : ySrcMax;
287 TPIXEL * dst = tmpData;
288 int dstWidth = tmpWidth;
290 TCHANNEL * msk = NULL;
295 int xDstMin = ySrcMin;
296 int yDstMin = xSrcMin;
298 double * kernel = xKernel;
299 int kernelCenter = xKernelCenter;
300 int kernelWidth = xKernelWidth;
312 dPtr = dPtrColBgn++;,
314 sumR = 0; sumG = 0; sumB = 0; sumA = 0;,
317 chPtr = (TCHANNEL *) sTmpPtr;
318 A = *(chPtr + 3) * kv;
319 sumR += *(chPtr++) * A;
320 sumG += *(chPtr++) * A;
324 chPtr = (TCHANNEL *) dPtr;
325 *chPtr = sumR / (sumA) + 0.5; chPtr++;
326 *chPtr = sumG / (sumA) + 0.5; chPtr++;
327 *chPtr = sumB / (sumA) + 0.5; chPtr++;
328 *chPtr = sumA + 0.5;,
339 TPIXEL * src = tmpData;
340 int srcWidth = tmpWidth;
341 int xSrcMin = crop.
tl.
y;
342 int xSrcMax = crop.
br.
y;
343 int ySrcMin = crop.
tl.
x;
344 int ySrcMax = crop.
br.
x;
346 TPIXEL * dst = srcData;
347 int dstWidth = origWidth;
348 int xDstMin = crop.
tl.
x;
349 int yDstMin = crop.
tl.
y;
351 TCHANNEL * msk = NULL;
356 double * kernel = yKernel;
357 int kernelCenter = yKernelCenter;
358 int kernelWidth = yKernelWidth;
370 dPtr = dPtrColBgn++;,
372 sumR = 0; sumG = 0; sumB = 0; sumA = 0;,
375 chPtr = (TCHANNEL *) sTmpPtr;
376 A = *(chPtr + 3) * kv;
377 sumR += *(chPtr++) * A;
378 sumG += *(chPtr++) * A;
382 chPtr = (TCHANNEL *) dPtr;
383 *chPtr = sumR / (sumA) + 0.5; chPtr++;
384 *chPtr = sumG / (sumA) + 0.5; chPtr++;
385 *chPtr = sumB / (sumA) + 0.5; chPtr++;
386 *chPtr = sumA + 0.5;,
399 template<
typename TPIXEL,
typename TCHANNEL>
401 if (this->chCount != 4) {
404 if (xKernel == NULL || yKernel == NULL) {
407 TPIXEL *
const srcData = bitmap.
getData();
408 if (srcData == NULL) {
411 unsigned origWidth = bitmap.
getWidth();
412 unsigned origHeight = bitmap.
getHeight();
414 unsigned tmpWidth = origHeight;
415 unsigned tmpHeight = origWidth;
417 TPIXEL *
const tmpData = (TPIXEL *) malloc(tmpWidth * tmpHeight *
sizeof(TPIXEL));
418 if (tmpData == NULL) {
429 TPIXEL * src = srcData;
430 int srcWidth = origWidth;
431 int xSrcMin = crop.
tl.
x;
432 int xSrcMax = crop.
br.
x;
433 int ySrcMin = crop.
tl.
y - yKernelCenter;
434 ySrcMin = (ySrcMin < 0) ? 0 : ySrcMin;
435 int ySrcMax = crop.
br.
y + yKernelCenter;
436 ySrcMax = (ySrcMax > origHeight) ? origHeight : ySrcMax;
438 TPIXEL * dst = tmpData;
439 int dstWidth = tmpWidth;
441 TCHANNEL * msk = NULL;
446 int xDstMin = ySrcMin;
447 int yDstMin = xSrcMin;
449 double * kernel = xKernel;
450 int kernelCenter = xKernelCenter;
451 int kernelWidth = xKernelWidth;
463 dPtr = dPtrColBgn++;,
465 sumR = 0; sumG = 0; sumB = 0; sumA = 0;,
468 chPtr = (TCHANNEL *) sTmpPtr;
469 A = *(chPtr + 3) * kv;
470 sumR += *(chPtr++) * A;
471 sumG += *(chPtr++) * A;
475 chPtr = (TCHANNEL *) dPtr;
476 *chPtr = sumR / (sumA) + 0.5; chPtr++;
477 *chPtr = sumG / (sumA) + 0.5; chPtr++;
478 *chPtr = sumB / (sumA) + 0.5; chPtr++;
479 *chPtr = sumA + 0.5;,
490 TPIXEL * src = tmpData;
491 int srcWidth = tmpWidth;
492 int xSrcMin = crop.
tl.
y;
493 int xSrcMax = crop.
br.
y;
494 int ySrcMin = crop.
tl.
x;
495 int ySrcMax = crop.
br.
x;
497 TPIXEL * dst = srcData;
498 int dstWidth = origWidth;
499 int xDstMin = crop.
tl.
x;
500 int yDstMin = crop.
tl.
y;
502 TCHANNEL * msk = NULL;
507 double * kernel = yKernel;
508 int kernelCenter = yKernelCenter;
509 int kernelWidth = yKernelWidth;
527 dPtr = dPtrColBgn++;,
529 sumR = 0; sumG = 0; sumB = 0; sumA = 0;,
532 chPtr = (TCHANNEL *) sTmpPtr;
533 A = *(chPtr + 3) * kv;
534 sumR += *(chPtr++) * A;
535 sumG += *(chPtr++) * A;
539 chPtr = (TCHANNEL *) dPtr;
543 sa = sumA * alpha / 255.0;
547 *chPtr = ((sumR / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
548 *chPtr = ((sumG / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
549 *chPtr = ((sumB / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
550 *chPtr = ra * 255 + 0.5;,
563 template<
typename TPIXEL,
typename TCHANNEL>
565 if (this->chCount != 4) {
568 if (xKernel == NULL || yKernel == NULL) {
571 TPIXEL *
const srcData = bitmap.
getData();
572 if (srcData == NULL) {
575 unsigned origWidth = bitmap.
getWidth();
576 unsigned origHeight = bitmap.
getHeight();
578 unsigned tmpWidth = origHeight;
579 unsigned tmpHeight = origWidth;
581 TPIXEL *
const tmpData = (TPIXEL *) malloc(tmpWidth * tmpHeight *
sizeof(TPIXEL));
582 if (tmpData == NULL) {
595 Rect crop = dstArea.getArea();
596 Rect mskCrop = mskArea.getArea();
602 TPIXEL * src = srcData;
603 int srcWidth = origWidth;
604 int xSrcMin = crop.
tl.
x;
605 int xSrcMax = crop.
br.
x;
606 int ySrcMin = crop.
tl.
y - yKernelCenter;
607 ySrcMin = (ySrcMin < 0) ? 0 : ySrcMin;
608 int ySrcMax = crop.
br.
y + yKernelCenter;
609 ySrcMax = (ySrcMax > origHeight) ? origHeight : ySrcMax;
611 TPIXEL * dst = tmpData;
612 int dstWidth = tmpWidth;
614 TCHANNEL * msk = NULL;
619 int xDstMin = ySrcMin;
620 int yDstMin = xSrcMin;
622 double * kernel = xKernel;
623 int kernelCenter = xKernelCenter;
624 int kernelWidth = xKernelWidth;
636 dPtr = dPtrColBgn++;,
638 sumR = 0; sumG = 0; sumB = 0; sumA = 0;,
641 chPtr = (TCHANNEL *) sTmpPtr;
642 A = *(chPtr + 3) * kv;
643 sumR += *(chPtr++) * A;
644 sumG += *(chPtr++) * A;
648 chPtr = (TCHANNEL *) dPtr;
649 *chPtr = sumR / (sumA) + 0.5; chPtr++;
650 *chPtr = sumG / (sumA) + 0.5; chPtr++;
651 *chPtr = sumB / (sumA) + 0.5; chPtr++;
652 *chPtr = sumA + 0.5;,
663 TPIXEL * src = tmpData;
664 int srcWidth = tmpWidth;
665 int xSrcMin = crop.
tl.
y;
666 int xSrcMax = crop.
br.
y;
667 int ySrcMin = crop.
tl.
x;
668 int ySrcMax = crop.
br.
x;
670 TPIXEL * dst = srcData;
671 int dstWidth = origWidth;
672 int xDstMin = crop.
tl.
x;
673 int yDstMin = crop.
tl.
y;
675 TCHANNEL * msk = mask.
getData();
677 int xMskMin = mskCrop.
tl.
x;
678 int yMskMin = mskCrop.
tl.
y;
680 double * kernel = yKernel;
681 int kernelCenter = yKernelCenter;
682 int kernelWidth = yKernelWidth;
701 mPtr = mPtrColBgn++;,
703 sumR = 0; sumG = 0; sumB = 0; sumA = 0;,
706 chPtr = (TCHANNEL *) sTmpPtr;
707 A = *(chPtr + 3) * kv;
708 sumR += *(chPtr++) * A;
709 sumG += *(chPtr++) * A;
713 chPtr = (TCHANNEL *) dPtr;
717 sa = sumA * *mPtr/ 65025.0;
721 *chPtr = ((sumR / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
722 *chPtr = ((sumG / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
723 *chPtr = ((sumB / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
724 *chPtr = ra * 255 + 0.5;,
738 template<
typename TPIXEL,
typename TCHANNEL>
740 if (this->chCount != 4) {
743 if (xKernel == NULL || yKernel == NULL) {
746 TPIXEL *
const srcData = bitmap.
getData();
747 if (srcData == NULL) {
750 unsigned origWidth = bitmap.
getWidth();
751 unsigned origHeight = bitmap.
getHeight();
753 unsigned tmpWidth = origHeight;
754 unsigned tmpHeight = origWidth;
756 TPIXEL *
const tmpData = (TPIXEL *) malloc(tmpWidth * tmpHeight *
sizeof(TPIXEL));
757 if (tmpData == NULL) {
770 Rect crop = dstArea.getArea();
771 Rect mskCrop = mskArea.getArea();
777 TPIXEL * src = srcData;
778 int srcWidth = origWidth;
779 int xSrcMin = crop.
tl.
x;
780 int xSrcMax = crop.
br.
x;
781 int ySrcMin = crop.
tl.
y - yKernelCenter;
782 ySrcMin = (ySrcMin < 0) ? 0 : ySrcMin;
783 int ySrcMax = crop.
br.
y + yKernelCenter;
784 ySrcMax = (ySrcMax > origHeight) ? origHeight : ySrcMax;
786 TPIXEL * dst = tmpData;
787 int dstWidth = tmpWidth;
789 TCHANNEL * msk = NULL;
794 int xDstMin = ySrcMin;
795 int yDstMin = xSrcMin;
797 double * kernel = xKernel;
798 int kernelCenter = xKernelCenter;
799 int kernelWidth = xKernelWidth;
811 dPtr = dPtrColBgn++;,
813 sumR = 0; sumG = 0; sumB = 0; sumA = 0;,
816 chPtr = (TCHANNEL *) sTmpPtr;
817 A = *(chPtr + 3) * kv;
818 sumR += *(chPtr++) * A;
819 sumG += *(chPtr++) * A;
823 chPtr = (TCHANNEL *) dPtr;
824 *chPtr = sumR / (sumA) + 0.5; chPtr++;
825 *chPtr = sumG / (sumA) + 0.5; chPtr++;
826 *chPtr = sumB / (sumA) + 0.5; chPtr++;
827 *chPtr = sumA + 0.5;,
838 TPIXEL * src = tmpData;
839 int srcWidth = tmpWidth;
840 int xSrcMin = crop.
tl.
y;
841 int xSrcMax = crop.
br.
y;
842 int ySrcMin = crop.
tl.
x;
843 int ySrcMax = crop.
br.
x;
845 TPIXEL * dst = srcData;
846 int dstWidth = origWidth;
847 int xDstMin = crop.
tl.
x;
848 int yDstMin = crop.
tl.
y;
850 TCHANNEL * msk = mask.
getData();
852 int xMskMin = mskCrop.
tl.
x;
853 int yMskMin = mskCrop.
tl.
y;
855 double * kernel = yKernel;
856 int kernelCenter = yKernelCenter;
857 int kernelWidth = yKernelWidth;
876 mPtr = mPtrColBgn++;,
878 sumR = 0; sumG = 0; sumB = 0; sumA = 0;,
881 chPtr = (TCHANNEL *) sTmpPtr;
882 A = *(chPtr + 3) * kv;
883 sumR += *(chPtr++) * A;
884 sumG += *(chPtr++) * A;
888 chPtr = (TCHANNEL *) dPtr;
892 sa = sumA * *mPtr * alpha / 65025.0;
896 *chPtr = ((sumR / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
897 *chPtr = ((sumG / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
898 *chPtr = ((sumB / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
899 *chPtr = ra * 255 + 0.5;,