185 int winx = roi_out->
x;
186 int winy = roi_out->
y;
187 int winw = roi_in->
width;
188 int winh = roi_in->
height;
193 const float clip_pt8 = 0.8f * clip_pt;
204 constexpr int tsh = ts / 2;
210 if(
FC(0, 0, filters) == 1)
212 if(
FC(0, 1, filters) == 0)
225 if(
FC(0, 0, filters) == 0)
238 constexpr int v1 = ts, v2 = 2 * ts, v3 = 3 * ts, p1 = -ts + 1, p2 = -2 * ts + 2, p3 = -3 * ts + 3,
239 m1 = ts + 1, m2 = 2 * ts + 2, m3 = 3 * ts + 3;
242 constexpr float eps = 1e-5,
epssq = 1e-10;
245 constexpr float arthresh = 0.75;
248 constexpr float gaussodd[4]
249 = { 0.14659727707323927f, 0.103592713382435f, 0.0732036125103057f, 0.0365543548389495f };
251 constexpr float nyqthresh = 0.5;
254 constexpr float gaussgrad[6] = { nyqthresh * 0.07384411893421103f, nyqthresh * 0.06207511968171489f,
255 nyqthresh * 0.0521818194747806f, nyqthresh * 0.03687419286733595f,
256 nyqthresh * 0.03099732204057846f, nyqthresh * 0.018413194161458882f };
258 constexpr float gausseven[2] = { 0.13719494435797422f, 0.05640252782101291f };
260 constexpr float gquinc[4] = { 0.169917f, 0.108947f, 0.069855f, 0.0287182f };
274 constexpr int cldf = 2;
277 = (
char *)calloc(
sizeof(
float) * 14 * ts * ts +
sizeof(char) * ts * tsh + 18 * cldf * 64 + 63, 1);
279 char *data = (
char *)((uintptr_t(buffer) + uintptr_t(63)) / 64 * 64);
282 float *rgbgreen = (float(*))data;
284 float *delhvsqsum = (float(*))((
char *)rgbgreen +
sizeof(float) * ts * ts + cldf * 64);
286 float *dirwts0 = (float(*))((
char *)delhvsqsum +
sizeof(float) * ts * ts + cldf * 64);
287 float *dirwts1 = (float(*))((
char *)dirwts0 +
sizeof(float) * ts * ts + cldf * 64);
289 float *vcd = (float(*))((
char *)dirwts1 +
sizeof(float) * ts * ts + cldf * 64);
291 float *hcd = (float(*))((
char *)vcd +
sizeof(float) * ts * ts + cldf * 64);
293 float *vcdalt = (float(*))((
char *)hcd +
sizeof(float) * ts * ts + cldf * 64);
295 float *hcdalt = (float(*))((
char *)vcdalt +
sizeof(float) * ts * ts + cldf * 64);
297 float *cddiffsq = (float(*))((
char *)hcdalt +
sizeof(float) * ts * ts + cldf * 64);
299 float *hvwt = (float(*))((
char *)cddiffsq +
sizeof(float) * ts * ts + 2 * cldf * 64);
301 float(*Dgrb)[ts * tsh] = (float(*)[ts * tsh])vcdalt;
303 float *delp = (float(*))cddiffsq;
305 float *delm = (float(*))((
char *)delp +
sizeof(float) * ts * tsh + cldf * 64);
307 float *rbint = (float(*))delm;
310 s_hv *Dgrb2 = (s_hv(*))((
char *)hvwt +
sizeof(float) * ts * tsh + cldf * 64);
312 float *dgintv = (float(*))Dgrb2;
314 float *dginth = (float(*))((
char *)dgintv +
sizeof(float) * ts * ts + cldf * 64);
316 float *Dgrbsq1m = (float(*))((
char *)dginth +
sizeof(float) * ts * ts + cldf * 64);
317 float *Dgrbsq1p = (float(*))((
char *)Dgrbsq1m +
sizeof(float) * ts * tsh + cldf * 64);
319 float *cfa = (float(*))((
char *)Dgrbsq1p +
sizeof(float) * ts * tsh + cldf * 64);
321 float *pmwt = (float(*))delhvsqsum;
323 float *rbm = (float(*))vcd;
324 float *rbp = (float(*))((
char *)rbm +
sizeof(float) * ts * tsh + cldf * 64);
326 unsigned char *nyquist = (
unsigned char(*))((
char *)cfa +
sizeof(float) * ts * ts + cldf * 64);
327 unsigned char *nyquist2 = (
unsigned char(*))cddiffsq;
328 float *nyqutest = (float(*))((
char *)nyquist +
sizeof(
unsigned char) * ts * tsh + cldf * 64);
337 for(
int left = winx - 16; left < winx +
width; left += ts - 32)
339 memset(&nyquist[3 * tsh], 0,
sizeof(
unsigned char) * (ts - 6) * tsh);
343 int right =
MIN(left + ts, winx +
width + 16);
345 int rr1 = bottom -
top;
347 int cc1 = right - left;
350 int rrmin =
top < winy ? 16 : 0;
351 int ccmin = left < winx ? 16 : 0;
353 int ccmax = right > (winx +
width) ? winx +
width - left : cc1;
364 for(
int rr = 0; rr < 16; rr++)
365 for(
int cc = ccmin,
row = 32 - rr +
top; cc < ccmax; cc++)
367 cfa[rr * ts + cc] = (in[
row *
width + (cc + left)]);
368 rgbgreen[rr * ts + cc] = cfa[rr * ts + cc];
373 for(
int rr = rrmin; rr < rrmax; rr++)
377 for(
int cc = ccmin; cc < ccmax; cc++)
379 int indx1 = rr * ts + cc;
380 cfa[indx1] = (in[
row *
width + (cc + left)]);
381 rgbgreen[indx1] = cfa[indx1];
388 for(
int rr = 0; rr < 16; rr++)
389 for(
int cc = ccmin; cc < ccmax; cc++)
391 cfa[(rrmax + rr) * ts + cc] = (in[(winy +
height - rr - 2) *
width + (left + cc)]);
392 rgbgreen[(rrmax + rr) * ts + cc] = cfa[(rrmax + rr) * ts + cc];
401 for(
int rr = rrmin; rr < rrmax; rr++)
402 for(
int cc = 0,
row = rr +
top; cc < 16; cc++)
404 cfa[rr * ts + cc] = (in[
row *
width + (32 - cc + left)]);
405 rgbgreen[rr * ts + cc] = cfa[rr * ts + cc];
412 for(
int rr = rrmin; rr < rrmax; rr++)
413 for(
int cc = 0; cc < 16; cc++)
415 cfa[rr * ts + ccmax + cc] = (in[(
top + rr) *
width + ((winx +
width - cc - 2))]);
416 rgbgreen[rr * ts + ccmax + cc] = cfa[rr * ts + ccmax + cc];
421 if(rrmin > 0 && ccmin > 0)
423 for(
int rr = 0; rr < 16; rr++)
424 for(
int cc = 0; cc < 16; cc++)
426 cfa[(rr)*ts + cc] = (in[(winy + 32 - rr) *
width + (winx + 32 - cc)]);
427 rgbgreen[(rr)*ts + cc] = cfa[(rr)*ts + cc];
431 if(rrmax < rr1 && ccmax < cc1)
433 for(
int rr = 0; rr < 16; rr++)
434 for(
int cc = 0; cc < 16; cc++)
436 cfa[(rrmax + rr) * ts + ccmax + cc]
438 rgbgreen[(rrmax + rr) * ts + ccmax + cc] = cfa[(rrmax + rr) * ts + ccmax + cc];
442 if(rrmin > 0 && ccmax < cc1)
444 for(
int rr = 0; rr < 16; rr++)
445 for(
int cc = 0; cc < 16; cc++)
447 cfa[(rr)*ts + ccmax + cc] = (in[(winy + 32 - rr) *
width + ((winx +
width - cc - 2))]);
448 rgbgreen[(rr)*ts + ccmax + cc] = cfa[(rr)*ts + ccmax + cc];
452 if(rrmax < rr1 && ccmin > 0)
454 for(
int rr = 0; rr < 16; rr++)
455 for(
int cc = 0; cc < 16; cc++)
457 cfa[(rrmax + rr) * ts + cc] = (in[(winy +
height - rr - 2) *
width + ((winx + 32 - cc))]);
458 rgbgreen[(rrmax + rr) * ts + cc] = cfa[(rrmax + rr) * ts + cc];
465 for(
int rr = 2; rr < rr1 - 2; rr++)
466 for(
int cc = 2, indx = (rr)*ts + cc; cc < cc1 - 2; cc++, indx++)
468 float delh = fabsf(cfa[indx + 1] - cfa[indx - 1]);
469 float delv = fabsf(cfa[indx + v1] - cfa[indx - v1]);
471 =
eps + fabsf(cfa[indx + v2] - cfa[indx]) + fabsf(cfa[indx] - cfa[indx - v2]) + delv;
472 dirwts1[indx] =
eps + fabsf(cfa[indx + 2] - cfa[indx]) + fabsf(cfa[indx] - cfa[indx - 2]) + delh;
473 delhvsqsum[indx] =
SQR(delh) +
SQR(delv);
478 for(
int rr = 4; rr < rr1 - 4; rr++)
480 bool fcswitch =
FC(rr, 4, filters) & 1;
482 for(
int cc = 4, indx = rr * ts + cc; cc < cc1 - 4; cc++, indx++)
486 float cru = cfa[indx - v1] * (dirwts0[indx - v2] + dirwts0[indx])
487 / (dirwts0[indx - v2] * (
eps + cfa[indx]) + dirwts0[indx] * (
eps + cfa[indx - v2]));
488 float crd = cfa[indx + v1] * (dirwts0[indx + v2] + dirwts0[indx])
489 / (dirwts0[indx + v2] * (
eps + cfa[indx]) + dirwts0[indx] * (
eps + cfa[indx + v2]));
490 float crl = cfa[indx - 1] * (dirwts1[indx - 2] + dirwts1[indx])
491 / (dirwts1[indx - 2] * (
eps + cfa[indx]) + dirwts1[indx] * (
eps + cfa[indx - 2]));
492 float crr = cfa[indx + 1] * (dirwts1[indx + 2] + dirwts1[indx])
493 / (dirwts1[indx + 2] * (
eps + cfa[indx]) + dirwts1[indx] * (
eps + cfa[indx + 2]));
496 float guha = cfa[indx - v1] +
xdiv2f(cfa[indx] - cfa[indx - v2]);
497 float gdha = cfa[indx + v1] +
xdiv2f(cfa[indx] - cfa[indx + v2]);
498 float glha = cfa[indx - 1] +
xdiv2f(cfa[indx] - cfa[indx - 2]);
499 float grha = cfa[indx + 1] +
xdiv2f(cfa[indx] - cfa[indx + 2]);
502 float guar, gdar, glar, grar;
504 if(fabsf(1.f - cru) < arthresh)
506 guar = cfa[indx] * cru;
513 if(fabsf(1.f - crd) < arthresh)
515 gdar = cfa[indx] * crd;
522 if(fabsf(1.f - crl) < arthresh)
524 glar = cfa[indx] * crl;
531 if(fabsf(1.f - crr) < arthresh)
533 grar = cfa[indx] * crr;
541 float hwt = dirwts1[indx - 1] / (dirwts1[indx - 1] + dirwts1[indx + 1]);
542 float vwt = dirwts0[indx - v1] / (dirwts0[indx + v1] + dirwts0[indx - v1]);
545 float Gintvha = vwt * gdha + (1.f - vwt) * guha;
546 float Ginthha = hwt * grha + (1.f - hwt) * glha;
551 vcd[indx] = cfa[indx] - (vwt * gdar + (1.f - vwt) * guar);
552 hcd[indx] = cfa[indx] - (hwt * grar + (1.f - hwt) * glar);
553 vcdalt[indx] = cfa[indx] - Gintvha;
554 hcdalt[indx] = cfa[indx] - Ginthha;
559 vcd[indx] = (vwt * gdar + (1.f - vwt) * guar) - cfa[indx];
560 hcd[indx] = (hwt * grar + (1.f - hwt) * glar) - cfa[indx];
561 vcdalt[indx] = Gintvha - cfa[indx];
562 hcdalt[indx] = Ginthha - cfa[indx];
565 fcswitch = !fcswitch;
567 if(cfa[indx] > clip_pt8 || Gintvha > clip_pt8 || Ginthha > clip_pt8)
574 vcd[indx] = vcdalt[indx];
575 hcd[indx] = hcdalt[indx];
579 dgintv[indx] =
MIN(
SQR(guha - gdha),
SQR(guar - gdar));
580 dginth[indx] =
MIN(
SQR(glha - grha),
SQR(glar - grar));
585 for(
int rr = 4; rr < rr1 - 4; rr++)
587 for(
int cc = 4, indx = rr * ts + cc, c =
FC(rr, cc, filters) & 1; cc < cc1 - 4; cc++, indx++)
589 float hcdvar = 3.f * (
SQR(hcd[indx - 2]) +
SQR(hcd[indx]) +
SQR(hcd[indx + 2]))
590 -
SQR(hcd[indx - 2] + hcd[indx] + hcd[indx + 2]);
591 float hcdaltvar = 3.f * (
SQR(hcdalt[indx - 2]) +
SQR(hcdalt[indx]) +
SQR(hcdalt[indx + 2]))
592 -
SQR(hcdalt[indx - 2] + hcdalt[indx] + hcdalt[indx + 2]);
593 float vcdvar = 3.f * (
SQR(vcd[indx - v2]) +
SQR(vcd[indx]) +
SQR(vcd[indx + v2]))
594 -
SQR(vcd[indx - v2] + vcd[indx] + vcd[indx + v2]);
595 float vcdaltvar = 3.f * (
SQR(vcdalt[indx - v2]) +
SQR(vcdalt[indx]) +
SQR(vcdalt[indx + v2]))
596 -
SQR(vcdalt[indx - v2] + vcdalt[indx] + vcdalt[indx + v2]);
599 if(hcdaltvar < hcdvar)
601 hcd[indx] = hcdalt[indx];
604 if(vcdaltvar < vcdvar)
606 vcd[indx] = vcdalt[indx];
615 Ginth = -hcd[indx] + cfa[indx];
616 Gintv = -vcd[indx] + cfa[indx];
620 if(3.f * hcd[indx] > (Ginth + cfa[indx]))
622 hcd[indx] = -
ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) + cfa[indx];
626 float hwt = 1.f - 3.f * hcd[indx] / (
eps + Ginth + cfa[indx]);
627 hcd[indx] = hwt * hcd[indx]
628 + (1.f - hwt) * (-
ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) + cfa[indx]);
634 if(3.f * vcd[indx] > (Gintv + cfa[indx]))
636 vcd[indx] = -
ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) + cfa[indx];
640 float vwt = 1.f - 3.f * vcd[indx] / (
eps + Gintv + cfa[indx]);
641 vcd[indx] = vwt * vcd[indx]
642 + (1.f - vwt) * (-
ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) + cfa[indx]);
648 hcd[indx] = -
ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) + cfa[indx];
653 vcd[indx] = -
ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) + cfa[indx];
659 Ginth = hcd[indx] + cfa[indx];
660 Gintv = vcd[indx] + cfa[indx];
664 if(3.f * hcd[indx] < -(Ginth + cfa[indx]))
666 hcd[indx] =
ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) - cfa[indx];
670 float hwt = 1.f + 3.f * hcd[indx] / (
eps + Ginth + cfa[indx]);
671 hcd[indx] = hwt * hcd[indx]
672 + (1.f - hwt) * (
ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) - cfa[indx]);
678 if(3.f * vcd[indx] < -(Gintv + cfa[indx]))
680 vcd[indx] =
ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) - cfa[indx];
684 float vwt = 1.f + 3.f * vcd[indx] / (
eps + Gintv + cfa[indx]);
685 vcd[indx] = vwt * vcd[indx]
686 + (1.f - vwt) * (
ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) - cfa[indx]);
692 hcd[indx] =
ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]) - cfa[indx];
697 vcd[indx] =
ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]) - cfa[indx];
700 cddiffsq[indx] =
SQR(vcd[indx] - hcd[indx]);
707 for(
int rr = 6; rr < rr1 - 6; rr++)
709 for(
int cc = 6 + (
FC(rr, 2, filters) & 1), indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2)
714 float uave = vcd[indx] + vcd[indx - v1] + vcd[indx - v2] + vcd[indx - v3];
715 float dave = vcd[indx] + vcd[indx + v1] + vcd[indx + v2] + vcd[indx + v3];
716 float lave = hcd[indx] + hcd[indx - 1] + hcd[indx - 2] + hcd[indx - 3];
717 float rave = hcd[indx] + hcd[indx + 1] + hcd[indx + 2] + hcd[indx + 3];
720 float Dgrbvvaru =
SQR(vcd[indx] - uave) +
SQR(vcd[indx - v1] - uave) +
SQR(vcd[indx - v2] - uave)
721 +
SQR(vcd[indx - v3] - uave);
722 float Dgrbvvard =
SQR(vcd[indx] - dave) +
SQR(vcd[indx + v1] - dave) +
SQR(vcd[indx + v2] - dave)
723 +
SQR(vcd[indx + v3] - dave);
724 float Dgrbhvarl =
SQR(hcd[indx] - lave) +
SQR(hcd[indx - 1] - lave) +
SQR(hcd[indx - 2] - lave)
725 +
SQR(hcd[indx - 3] - lave);
726 float Dgrbhvarr =
SQR(hcd[indx] - rave) +
SQR(hcd[indx + 1] - rave) +
SQR(hcd[indx + 2] - rave)
727 +
SQR(hcd[indx + 3] - rave);
729 float hwt = dirwts1[indx - 1] / (dirwts1[indx - 1] + dirwts1[indx + 1]);
730 float vwt = dirwts0[indx - v1] / (dirwts0[indx + v1] + dirwts0[indx - v1]);
732 float vcdvar =
epssq + vwt * Dgrbvvard + (1.f - vwt) * Dgrbvvaru;
733 float hcdvar =
epssq + hwt * Dgrbhvarr + (1.f - hwt) * Dgrbhvarl;
736 Dgrbvvaru = (dgintv[indx]) + (dgintv[indx - v1]) + (dgintv[indx - v2]);
737 Dgrbvvard = (dgintv[indx]) + (dgintv[indx + v1]) + (dgintv[indx + v2]);
738 Dgrbhvarl = (dginth[indx]) + (dginth[indx - 1]) + (dginth[indx - 2]);
739 Dgrbhvarr = (dginth[indx]) + (dginth[indx + 1]) + (dginth[indx + 2]);
741 float vcdvar1 =
epssq + vwt * Dgrbvvard + (1.f - vwt) * Dgrbvvaru;
742 float hcdvar1 =
epssq + hwt * Dgrbhvarr + (1.f - hwt) * Dgrbhvarl;
745 float varwt = hcdvar / (vcdvar + hcdvar);
746 float diffwt = hcdvar1 / (vcdvar1 + hcdvar1);
751 if((0.5 - varwt) * (0.5 - diffwt) > 0 && fabsf(0.5f - diffwt) < fabsf(0.5f - varwt))
753 hvwt[indx >> 1] = varwt;
757 hvwt[indx >> 1] = diffwt;
763 for(
int rr = 6; rr < rr1 - 6; rr++)
765 int cc = 6 + (
FC(rr, 2, filters) & 1);
766 int indx = rr * ts + cc;
768 for(; cc < cc1 - 6; cc += 2, indx += 2)
771 = (gaussodd[0] * cddiffsq[indx]
772 + gaussodd[1] * (cddiffsq[(indx - m1)] + cddiffsq[(indx + p1)] + cddiffsq[(indx - p1)]
773 + cddiffsq[(indx + m1)])
774 + gaussodd[2] * (cddiffsq[(indx - v2)] + cddiffsq[(indx - 2)] + cddiffsq[(indx + 2)]
775 + cddiffsq[(indx + v2)])
776 + gaussodd[3] * (cddiffsq[(indx - m2)] + cddiffsq[(indx + p2)] + cddiffsq[(indx - p2)]
777 + cddiffsq[(indx + m2)]))
778 - (gaussgrad[0] * delhvsqsum[indx]
779 + gaussgrad[1] * (delhvsqsum[indx - v1] + delhvsqsum[indx + 1] + delhvsqsum[indx - 1]
780 + delhvsqsum[indx + v1])
781 + gaussgrad[2] * (delhvsqsum[indx - m1] + delhvsqsum[indx + p1] + delhvsqsum[indx - p1]
782 + delhvsqsum[indx + m1])
783 + gaussgrad[3] * (delhvsqsum[indx - v2] + delhvsqsum[indx - 2] + delhvsqsum[indx + 2]
784 + delhvsqsum[indx + v2])
785 + gaussgrad[4] * (delhvsqsum[indx - v2 - 1] + delhvsqsum[indx - v2 + 1]
786 + delhvsqsum[indx - ts - 2] + delhvsqsum[indx - ts + 2]
787 + delhvsqsum[indx + ts - 2] + delhvsqsum[indx + ts + 2]
788 + delhvsqsum[indx + v2 - 1] + delhvsqsum[indx + v2 + 1])
789 + gaussgrad[5] * (delhvsqsum[indx - m2] + delhvsqsum[indx + p2] + delhvsqsum[indx - p2]
790 + delhvsqsum[indx + m2]));
797 int nystartcol = ts + 1;
800 for(
int rr = 6; rr < rr1 - 6; rr++)
802 for(
int cc = 6 + (
FC(rr, 2, filters) & 1), indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2)
807 if(nyqutest[indx >> 1] > 0.f)
809 nyquist[indx >> 1] = 1;
810 nystartrow = nystartrow ? nystartrow : rr;
812 nystartcol = nystartcol > cc ? cc : nystartcol;
813 nyendcol = nyendcol < cc ? cc : nyendcol;
819 bool doNyquist = nystartrow != nyendrow && nystartcol != nyendcol;
825 nystartcol -= (nystartcol & 1);
826 nystartrow = std::max(8, nystartrow);
827 nyendrow = std::min(rr1 - 8, nyendrow);
828 nystartcol = std::max(8, nystartcol);
829 nyendcol = std::min(cc1 - 8, nyendcol);
830 memset(&nyquist2[4 * tsh], 0,
sizeof(
char) * (ts - 8) * tsh);
832 for(
int rr = nystartrow; rr < nyendrow; rr++)
834 for(
int indx = rr * ts + nystartcol + (
FC(rr, 2, filters) & 1); indx < rr * ts + nyendcol;
837 unsigned int nyquisttemp
838 = (nyquist[(indx - v2) >> 1] + nyquist[(indx - m1) >> 1] + nyquist[(indx + p1) >> 1]
839 + nyquist[(indx - 2) >> 1] + nyquist[(indx + 2) >> 1] + nyquist[(indx - p1) >> 1]
840 + nyquist[(indx + m1) >> 1] + nyquist[(indx + v2) >> 1]);
842 nyquist2[indx >> 1] = nyquisttemp > 4 ? 1 : (nyquisttemp < 4 ? 0 : nyquist[indx >> 1]);
849 for(
int rr = nystartrow; rr < nyendrow; rr++)
850 for(
int indx = rr * ts + nystartcol + (
FC(rr, 2, filters) & 1); indx < rr * ts + nyendcol;
854 if(nyquist2[indx >> 1])
858 float sumcfa = 0.f, sumh = 0.f, sumv = 0.f, sumsqh = 0.f, sumsqv = 0.f, areawt = 0.f;
860 for(
int i = -6;
i < 7;
i += 2)
862 int indx1 = indx + (
i * ts) - 6;
864 for(
int j = -6; j < 7; j += 2, indx1 += 2)
866 if(nyquist2[indx1 >> 1])
868 float cfatemp = cfa[indx1];
870 sumh += (cfa[indx1 - 1] + cfa[indx1 + 1]);
871 sumv += (cfa[indx1 - v1] + cfa[indx1 + v1]);
872 sumsqh +=
SQR(cfatemp - cfa[indx1 - 1]) +
SQR(cfatemp - cfa[indx1 + 1]);
873 sumsqv +=
SQR(cfatemp - cfa[indx1 - v1]) +
SQR(cfatemp - cfa[indx1 + v1]);
880 sumh = sumcfa -
xdiv2f(sumh);
881 sumv = sumcfa -
xdiv2f(sumv);
883 float hcdvar =
epssq + fabsf(areawt * sumsqh - sumh * sumh);
884 float vcdvar =
epssq + fabsf(areawt * sumsqv - sumv * sumv);
885 hvwt[indx >> 1] = hcdvar / (vcdvar + hcdvar);
894 for(
int rr = 8; rr < rr1 - 8; rr++)
895 for(
int indx = rr * ts + 8 + (
FC(rr, 2, filters) & 1); indx < rr * ts + cc1 - 8; indx += 2)
899 float hvwtalt =
xdivf(hvwt[(indx - m1) >> 1] + hvwt[(indx + p1) >> 1] + hvwt[(indx - p1) >> 1]
900 + hvwt[(indx + m1) >> 1],
904 = fabsf(0.5f - hvwt[indx >> 1]) < fabsf(0.5f - hvwtalt) ? hvwtalt : hvwt[indx >> 1];
907 Dgrb[0][indx >> 1] =
intp(hvwt[indx >> 1], vcd[indx], hcd[indx]);
909 rgbgreen[indx] = cfa[indx] + Dgrb[0][indx >> 1];
912 Dgrb2[indx >> 1].h = nyquist2[indx >> 1]
913 ?
SQR(rgbgreen[indx] -
xdiv2f(rgbgreen[indx - 1] + rgbgreen[indx + 1]))
915 Dgrb2[indx >> 1].v = nyquist2[indx >> 1]
916 ?
SQR(rgbgreen[indx] -
xdiv2f(rgbgreen[indx - v1] + rgbgreen[indx + v1]))
926 for(
int rr = nystartrow; rr < nyendrow; rr++)
927 for(
int indx = rr * ts + nystartcol + (
FC(rr, 2, filters) & 1); indx < rr * ts + nyendcol;
931 if(nyquist2[indx >> 1])
935 =
epssq + (gquinc[0] * Dgrb2[indx >> 1].h
936 + gquinc[1] * (Dgrb2[(indx - m1) >> 1].h + Dgrb2[(indx + p1) >> 1].h
937 + Dgrb2[(indx - p1) >> 1].h + Dgrb2[(indx + m1) >> 1].h)
938 + gquinc[2] * (Dgrb2[(indx - v2) >> 1].h + Dgrb2[(indx - 2) >> 1].h
939 + Dgrb2[(indx + 2) >> 1].h + Dgrb2[(indx + v2) >> 1].h)
940 + gquinc[3] * (Dgrb2[(indx - m2) >> 1].h + Dgrb2[(indx + p2) >> 1].h
941 + Dgrb2[(indx - p2) >> 1].h + Dgrb2[(indx + m2) >> 1].h));
943 =
epssq + (gquinc[0] * Dgrb2[indx >> 1].v
944 + gquinc[1] * (Dgrb2[(indx - m1) >> 1].
v + Dgrb2[(indx + p1) >> 1].v
945 + Dgrb2[(indx - p1) >> 1].
v + Dgrb2[(indx + m1) >> 1].v)
946 + gquinc[2] * (Dgrb2[(indx - v2) >> 1].v + Dgrb2[(indx - 2) >> 1].
v
947 + Dgrb2[(indx + 2) >> 1].v + Dgrb2[(indx + v2) >> 1].
v)
948 + gquinc[3] * (Dgrb2[(indx - m2) >> 1].
v + Dgrb2[(indx + p2) >> 1].v
949 + Dgrb2[(indx - p2) >> 1].
v + Dgrb2[(indx + m2) >> 1].v));
951 Dgrb[0][indx >> 1] = (hcd[indx] * gvarv + vcd[indx] * gvarh) / (gvarv + gvarh);
952 rgbgreen[indx] = cfa[indx] + Dgrb[0][indx >> 1];
957 for(
int rr = 6; rr < rr1 - 6; rr++)
959 if((
FC(rr, 2, filters) & 1) == 0)
961 for(
int cc = 6, indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2)
963 delp[indx >> 1] = fabsf(cfa[indx + p1] - cfa[indx - p1]);
964 delm[indx >> 1] = fabsf(cfa[indx + m1] - cfa[indx - m1]);
966 = (
SQR(cfa[indx + 1] - cfa[indx + 1 - p1]) +
SQR(cfa[indx + 1] - cfa[indx + 1 + p1]));
968 = (
SQR(cfa[indx + 1] - cfa[indx + 1 - m1]) +
SQR(cfa[indx + 1] - cfa[indx + 1 + m1]));
973 for(
int cc = 6, indx = rr * ts + cc; cc < cc1 - 6; cc += 2, indx += 2)
975 Dgrbsq1p[indx >> 1] = (
SQR(cfa[indx] - cfa[indx - p1]) +
SQR(cfa[indx] - cfa[indx + p1]));
976 Dgrbsq1m[indx >> 1] = (
SQR(cfa[indx] - cfa[indx - m1]) +
SQR(cfa[indx] - cfa[indx + m1]));
977 delp[indx >> 1] = fabsf(cfa[indx + 1 + p1] - cfa[indx + 1 - p1]);
978 delm[indx >> 1] = fabsf(cfa[indx + 1 + m1] - cfa[indx + 1 - m1]);
986 for(
int rr = 8; rr < rr1 - 8; rr++)
988 for(
int cc = 8 + (
FC(rr, 2, filters) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 8;
989 cc += 2, indx += 2, indx1++)
993 float crse =
xmul2f(cfa[indx + m1]) / (
eps + cfa[indx] + (cfa[indx + m2]));
994 float crnw =
xmul2f(cfa[indx - m1]) / (
eps + cfa[indx] + (cfa[indx - m2]));
995 float crne =
xmul2f(cfa[indx + p1]) / (
eps + cfa[indx] + (cfa[indx + p2]));
996 float crsw =
xmul2f(cfa[indx - p1]) / (
eps + cfa[indx] + (cfa[indx - p2]));
998 float rbse, rbnw, rbne, rbsw;
1001 if(fabsf(1.f - crse) < arthresh)
1003 rbse = cfa[indx] * crse;
1007 rbse = (cfa[indx + m1]) +
xdiv2f(cfa[indx] - cfa[indx + m2]);
1010 if(fabsf(1.f - crnw) < arthresh)
1012 rbnw = cfa[indx] * crnw;
1016 rbnw = (cfa[indx - m1]) +
xdiv2f(cfa[indx] - cfa[indx - m2]);
1019 if(fabsf(1.f - crne) < arthresh)
1021 rbne = cfa[indx] * crne;
1025 rbne = (cfa[indx + p1]) +
xdiv2f(cfa[indx] - cfa[indx + p2]);
1028 if(fabsf(1.f - crsw) < arthresh)
1030 rbsw = cfa[indx] * crsw;
1034 rbsw = (cfa[indx - p1]) +
xdiv2f(cfa[indx] - cfa[indx - p2]);
1037 float wtse =
eps + delm[indx1] + delm[(indx + m1) >> 1]
1038 + delm[(indx + m2) >> 1];
1039 float wtnw =
eps + delm[indx1] + delm[(indx - m1) >> 1] + delm[(indx - m2) >> 1];
1040 float wtne =
eps + delp[indx1] + delp[(indx + p1) >> 1] + delp[(indx + p2) >> 1];
1041 float wtsw =
eps + delp[indx1] + delp[(indx - p1) >> 1] + delp[(indx - p2) >> 1];
1044 rbm[indx1] = (wtse * rbnw + wtnw * rbse) / (wtse + wtnw);
1045 rbp[indx1] = (wtne * rbsw + wtsw * rbne) / (wtne + wtsw);
1050 + (gausseven[0] * (Dgrbsq1m[(indx - v1) >> 1] + Dgrbsq1m[(indx - 1) >> 1]
1051 + Dgrbsq1m[(indx + 1) >> 1] + Dgrbsq1m[(indx + v1) >> 1])
1052 + gausseven[1] * (Dgrbsq1m[(indx - v2 - 1) >> 1] + Dgrbsq1m[(indx - v2 + 1) >> 1]
1053 + Dgrbsq1m[(indx - 2 - v1) >> 1] + Dgrbsq1m[(indx + 2 - v1) >> 1]
1054 + Dgrbsq1m[(indx - 2 + v1) >> 1] + Dgrbsq1m[(indx + 2 + v1) >> 1]
1055 + Dgrbsq1m[(indx + v2 - 1) >> 1] + Dgrbsq1m[(indx + v2 + 1) >> 1]));
1058 / ((
epssq + (gausseven[0] * (Dgrbsq1p[(indx - v1) >> 1] + Dgrbsq1p[(indx - 1) >> 1]
1059 + Dgrbsq1p[(indx + 1) >> 1] + Dgrbsq1p[(indx + v1) >> 1])
1061 * (Dgrbsq1p[(indx - v2 - 1) >> 1] + Dgrbsq1p[(indx - v2 + 1) >> 1]
1062 + Dgrbsq1p[(indx - 2 - v1) >> 1] + Dgrbsq1p[(indx + 2 - v1) >> 1]
1063 + Dgrbsq1p[(indx - 2 + v1) >> 1] + Dgrbsq1p[(indx + 2 + v1) >> 1]
1064 + Dgrbsq1p[(indx + v2 - 1) >> 1] + Dgrbsq1p[(indx + v2 + 1) >> 1])))
1069 if(rbp[indx1] < cfa[indx])
1071 if(
xmul2f(rbp[indx1]) < cfa[indx])
1073 rbp[indx1] =
ULIM(rbp[indx1], cfa[indx - p1], cfa[indx + p1]);
1077 float pwt =
xmul2f(cfa[indx] - rbp[indx1]) / (
eps + rbp[indx1] + cfa[indx]);
1079 = pwt * rbp[indx1] + (1.f - pwt) *
ULIM(rbp[indx1], cfa[indx - p1], cfa[indx + p1]);
1083 if(rbm[indx1] < cfa[indx])
1085 if(
xmul2f(rbm[indx1]) < cfa[indx])
1087 rbm[indx1] =
ULIM(rbm[indx1], cfa[indx - m1], cfa[indx + m1]);
1091 float mwt =
xmul2f(cfa[indx] - rbm[indx1]) / (
eps + rbm[indx1] + cfa[indx]);
1093 = mwt * rbm[indx1] + (1.f - mwt) *
ULIM(rbm[indx1], cfa[indx - m1], cfa[indx + m1]);
1097 if(rbp[indx1] > clip_pt)
1099 rbp[indx1] =
ULIM(rbp[indx1], cfa[indx - p1], cfa[indx + p1]);
1102 if(rbm[indx1] > clip_pt)
1104 rbm[indx1] =
ULIM(rbm[indx1], cfa[indx - m1], cfa[indx + m1]);
1109 for(
int rr = 10; rr < rr1 - 10; rr++)
1110 for(
int cc = 10 + (
FC(rr, 2, filters) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 10;
1111 cc += 2, indx += 2, indx1++)
1115 float pmwtalt =
xdivf(pmwt[(indx - m1) >> 1] + pmwt[(indx + p1) >> 1] + pmwt[(indx - p1) >> 1]
1116 + pmwt[(indx + m1) >> 1],
1119 if(fabsf(0.5f - pmwt[indx1]) < fabsf(0.5f - pmwtalt))
1121 pmwt[indx1] = pmwtalt;
1124 rbint[indx1] =
xdiv2f(cfa[indx] + rbm[indx1] * (1.f - pmwt[indx1])
1125 + rbp[indx1] * pmwt[indx1]);
1129 for(
int rr = 12; rr < rr1 - 12; rr++)
1130 for(
int cc = 12 + (
FC(rr, 2, filters) & 1), indx = rr * ts + cc, indx1 = indx >> 1; cc < cc1 - 12;
1131 cc += 2, indx += 2, indx1++)
1134 if(fabsf(0.5f - pmwt[indx >> 1]) < fabsf(0.5f - hvwt[indx >> 1]))
1143 float cru = cfa[indx - v1] * 2.0 / (
eps + rbint[indx1] + rbint[(indx1 - v1)]);
1144 float crd = cfa[indx + v1] * 2.0 / (
eps + rbint[indx1] + rbint[(indx1 + v1)]);
1145 float crl = cfa[indx - 1] * 2.0 / (
eps + rbint[indx1] + rbint[(indx1 - 1)]);
1146 float crr = cfa[indx + 1] * 2.0 / (
eps + rbint[indx1] + rbint[(indx1 + 1)]);
1149 float gu, gd, gl, gr;
1152 if(fabsf(1.f - cru) < arthresh)
1154 gu = rbint[indx1] * cru;
1158 gu = cfa[indx - v1] +
xdiv2f(rbint[indx1] - rbint[(indx1 - v1)]);
1161 if(fabsf(1.f - crd) < arthresh)
1163 gd = rbint[indx1] * crd;
1167 gd = cfa[indx + v1] +
xdiv2f(rbint[indx1] - rbint[(indx1 + v1)]);
1170 if(fabsf(1.f - crl) < arthresh)
1172 gl = rbint[indx1] * crl;
1176 gl = cfa[indx - 1] +
xdiv2f(rbint[indx1] - rbint[(indx1 - 1)]);
1179 if(fabsf(1.f - crr) < arthresh)
1181 gr = rbint[indx1] * crr;
1185 gr = cfa[indx + 1] +
xdiv2f(rbint[indx1] - rbint[(indx1 + 1)]);
1189 float Gintv = (dirwts0[indx - v1] * gd + dirwts0[indx + v1] * gu)
1190 / (dirwts0[indx + v1] + dirwts0[indx - v1]);
1192 = (dirwts1[indx - 1] * gr + dirwts1[indx + 1] * gl) / (dirwts1[indx - 1] + dirwts1[indx + 1]);
1195 if(Gintv < rbint[indx1])
1197 if(2 * Gintv < rbint[indx1])
1199 Gintv =
ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]);
1203 float vwt = 2.0 * (rbint[indx1] - Gintv) / (
eps + Gintv + rbint[indx1]);
1204 Gintv = vwt * Gintv + (1.f - vwt) *
ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]);
1208 if(Ginth < rbint[indx1])
1210 if(2 * Ginth < rbint[indx1])
1212 Ginth =
ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]);
1216 float hwt = 2.0 * (rbint[indx1] - Ginth) / (
eps + Ginth + rbint[indx1]);
1217 Ginth = hwt * Ginth + (1.f - hwt) *
ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]);
1223 Ginth =
ULIM(Ginth, cfa[indx - 1], cfa[indx + 1]);
1228 Gintv =
ULIM(Gintv, cfa[indx - v1], cfa[indx + v1]);
1231 rgbgreen[indx] = Ginth * (1.f - hvwt[indx1]) + Gintv * hvwt[indx1];
1232 Dgrb[0][indx >> 1] = rgbgreen[indx] - cfa[indx];
1239 for(
int rr = 13 - ey; rr < rr1 - 12; rr += 2)
1240 for(
int indx1 = (rr * ts + 13 - ex) >> 1; indx1<(rr * ts + cc1 - 12)>> 1; indx1++)
1242 Dgrb[1][indx1] = Dgrb[0][indx1];
1246 for(
int rr = 14; rr < rr1 - 14; rr++)
1247 for(
int cc = 14 + (
FC(rr, 2, filters) & 1), indx = rr * ts + cc, c = 1 -
FC(rr, cc, filters) / 2;
1248 cc < cc1 - 14; cc += 2, indx += 2)
1250 float wtnw = 1.f / (
eps + fabsf(Dgrb[c][(indx - m1) >> 1] - Dgrb[c][(indx + m1) >> 1])
1251 + fabsf(Dgrb[c][(indx - m1) >> 1] - Dgrb[c][(indx - m3) >> 1])
1252 + fabsf(Dgrb[c][(indx + m1) >> 1] - Dgrb[c][(indx - m3) >> 1]));
1253 float wtne = 1.f / (
eps + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx - p1) >> 1])
1254 + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx + p3) >> 1])
1255 + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + p3) >> 1]));
1256 float wtsw = 1.f / (
eps + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + p1) >> 1])
1257 + fabsf(Dgrb[c][(indx - p1) >> 1] - Dgrb[c][(indx + m3) >> 1])
1258 + fabsf(Dgrb[c][(indx + p1) >> 1] - Dgrb[c][(indx - p3) >> 1]));
1259 float wtse = 1.f / (
eps + fabsf(Dgrb[c][(indx + m1) >> 1] - Dgrb[c][(indx - m1) >> 1])
1260 + fabsf(Dgrb[c][(indx + m1) >> 1] - Dgrb[c][(indx - p3) >> 1])
1261 + fabsf(Dgrb[c][(indx - m1) >> 1] - Dgrb[c][(indx + m3) >> 1]));
1264 = (wtnw * (1.325f * Dgrb[c][(indx - m1) >> 1] - 0.175f * Dgrb[c][(indx - m3) >> 1]
1265 - 0.075f * Dgrb[c][(indx - m1 - 2) >> 1] - 0.075f * Dgrb[c][(indx - m1 - v2) >> 1])
1266 + wtne * (1.325f * Dgrb[c][(indx + p1) >> 1] - 0.175f * Dgrb[c][(indx + p3) >> 1]
1267 - 0.075f * Dgrb[c][(indx + p1 + 2) >> 1]
1268 - 0.075f * Dgrb[c][(indx + p1 + v2) >> 1])
1269 + wtsw * (1.325f * Dgrb[c][(indx - p1) >> 1] - 0.175f * Dgrb[c][(indx - p3) >> 1]
1270 - 0.075f * Dgrb[c][(indx - p1 - 2) >> 1]
1271 - 0.075f * Dgrb[c][(indx - p1 - v2) >> 1])
1272 + wtse * (1.325f * Dgrb[c][(indx + m1) >> 1] - 0.175f * Dgrb[c][(indx + m3) >> 1]
1273 - 0.075f * Dgrb[c][(indx + m1 + 2) >> 1]
1274 - 0.075f * Dgrb[c][(indx + m1 + v2) >> 1]))
1275 / (wtnw + wtne + wtsw + wtse);
1278 for(
int rr = 16; rr < rr1 - 16; rr++)
1281 int col = left + 16;
1282 int indx = rr * ts + 16;
1284 if((
FC(rr, 2, filters) & 1) == 1)
1286 for(; indx < rr * ts + cc1 - 16 - (cc1 & 1); indx++, col++)
1290 float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1]
1291 - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]);
1294 - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1]
1295 + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1]
1296 + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1]
1297 + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1])
1302 - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1]
1303 + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1]
1304 + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1]
1305 + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1])
1315 =
clampnan(rgbgreen[indx] - Dgrb[0][indx >> 1], 0.0, 1.0);
1317 =
clampnan(rgbgreen[indx] - Dgrb[1][indx >> 1], 0.0, 1.0);
1325 float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1]
1326 - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]);
1329 - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1]
1330 + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1]
1331 + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1]
1332 + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1])
1337 - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1]
1338 + (1.f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1]
1339 + (1.f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1]
1340 + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1])
1348 for(; indx < rr * ts + cc1 - 16 - (cc1 & 1); indx++, col++)
1353 =
clampnan(rgbgreen[indx] - Dgrb[0][indx >> 1], 0.0f, 1.0f);
1355 =
clampnan(rgbgreen[indx] - Dgrb[1][indx >> 1], 0.0f, 1.0f);
1362 float temp = 1.f / (hvwt[(indx - v1) >> 1] + 2.f - hvwt[(indx + 1) >> 1]
1363 - hvwt[(indx - 1) >> 1] + hvwt[(indx + v1) >> 1]);
1367 - ((hvwt[(indx - v1) >> 1]) * Dgrb[0][(indx - v1) >> 1]
1368 + (1.0f - hvwt[(indx + 1) >> 1]) * Dgrb[0][(indx + 1) >> 1]
1369 + (1.0f - hvwt[(indx - 1) >> 1]) * Dgrb[0][(indx - 1) >> 1]
1370 + (hvwt[(indx + v1) >> 1]) * Dgrb[0][(indx + v1) >> 1])
1376 - ((hvwt[(indx - v1) >> 1]) * Dgrb[1][(indx - v1) >> 1]
1377 + (1.0f - hvwt[(indx + 1) >> 1]) * Dgrb[1][(indx + 1) >> 1]
1378 + (1.0f - hvwt[(indx - 1) >> 1]) * Dgrb[1][(indx - 1) >> 1]
1379 + (hvwt[(indx + v1) >> 1]) * Dgrb[1][(indx + v1) >> 1])
1390 =
clampnan(rgbgreen[indx] - Dgrb[0][indx >> 1], 0.0f, 1.0f);
1392 =
clampnan(rgbgreen[indx] - Dgrb[1][indx >> 1], 0.0f, 1.0f);
1399 for(
int rr = 16; rr < rr1 - 16; rr++)
1403 for(; cc < cc1 - 16; cc++)
1405 int col = cc + left;
1406 int indx = rr * ts + cc;