497 fscale *= 1.0/(1 << 30);
498 scale -= 30;
499 }
500
501 fscale /= (1 << scale);
502
503 mn = m*n;
504
505 if (mn > 256) {
506 k = mlib_malloc(mn*sizeof(mlib_d64));
507
508 if (k == NULL) return MLIB_FAILURE;
509 }
510
511 for (i = 0; i < mn; i++) {
512 k[i] = kernel[i]*fscale;
513 }
514
515 if (m == 1) {
516 status = mlib_ImageConv1xN_ext(dst, src, k, n, dy_t, dy_b, cmask);
517 FREE_AND_RETURN_STATUS;
518 }
519
520 swid = wid + (m - 1);
521
522 bsize = (n + 3)*swid;
523
524 if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
525 pbuff = mlib_malloc(sizeof(FTYPE)*bsize + sizeof(FTYPE *)*2*(n + 1));
526
527 if (pbuff == NULL) {
528 status = MLIB_FAILURE;
529 FREE_AND_RETURN_STATUS;
530 }
531 buffs = (FTYPE **)(pbuff + bsize);
532 }
533
534 for (l = 0; l < (n + 1); l++) buffs[l] = pbuff + l*swid;
535 for (l = 0; l < (n + 1); l++) buffs[l + (n + 1)] = buffs[l];
536 buffd = buffs[n] + swid;
537 buffi = (mlib_s32*)(buffd + swid);
538
539 chan1 = nchannel;
540 chan2 = chan1 + chan1;
541
542 swid -= (dx_l + dx_r);
543
544 for (c = 0; c < nchannel; c++) {
545 if (!(cmask & (1 << (chan1 - 1 - c)))) continue;
546
547 sl = adr_src + c;
548 dl = adr_dst + c;
549
914
915 for (; i < swid; i++) {
916 buffn[i + dx_l] = (FTYPE)sp[0];
917 sp += chan1;
918 }
919
920 for (i = 0; i < dx_l; i++) buffn[i] = buffn[dx_l];
921 for (i = 0; i < dx_r; i++) buffn[swid + dx_l + i] = buffn[swid + dx_l - 1];
922
923 /* next line */
924
925 if (j < hgt - dy_b - 2) sl += sll;
926 dl += dll;
927
928 buff_ind++;
929
930 if (buff_ind >= n + 1) buff_ind = 0;
931 }
932 }
933
934 FREE_AND_RETURN_STATUS;
935 }
936
937 /***************************************************************/
938 #ifndef __sparc /* for x86, using integer multiplies is faster */
939
940 #define STORE_RES(res, x) \
941 x >>= shift2; \
942 CLAMP_STORE(res, x)
943
944 mlib_status CONV_FUNC_MxN_I
945 {
946 DTYPE *adr_src, *sl, *sp = NULL;
947 DTYPE *adr_dst, *dl, *dp = NULL;
948 mlib_s32 buff[BUFF_SIZE], *buffs_arr[2*(MAX_N + 1)];
949 mlib_s32 *pbuff = buff;
950 mlib_s32 **buffs = buffs_arr, *buffd;
951 mlib_s32 l, off, kw, bsize, buff_ind;
952 mlib_s32 d0, d1, shift1, shift2;
953 mlib_s32 k0, k1, k2, k3, k4, k5, k6;
954 mlib_s32 p0, p1, p2, p3, p4, p5, p6, p7;
|
497 fscale *= 1.0/(1 << 30);
498 scale -= 30;
499 }
500
501 fscale /= (1 << scale);
502
503 mn = m*n;
504
505 if (mn > 256) {
506 k = mlib_malloc(mn*sizeof(mlib_d64));
507
508 if (k == NULL) return MLIB_FAILURE;
509 }
510
511 for (i = 0; i < mn; i++) {
512 k[i] = kernel[i]*fscale;
513 }
514
515 if (m == 1) {
516 status = mlib_ImageConv1xN_ext(dst, src, k, n, dy_t, dy_b, cmask);
517 FREE_AND_RETURN_STATUS
518 }
519
520 swid = wid + (m - 1);
521
522 bsize = (n + 3)*swid;
523
524 if ((bsize > BUFF_SIZE) || (n > MAX_N)) {
525 pbuff = mlib_malloc(sizeof(FTYPE)*bsize + sizeof(FTYPE *)*2*(n + 1));
526
527 if (pbuff == NULL) {
528 status = MLIB_FAILURE;
529 FREE_AND_RETURN_STATUS
530 }
531 buffs = (FTYPE **)(pbuff + bsize);
532 }
533
534 for (l = 0; l < (n + 1); l++) buffs[l] = pbuff + l*swid;
535 for (l = 0; l < (n + 1); l++) buffs[l + (n + 1)] = buffs[l];
536 buffd = buffs[n] + swid;
537 buffi = (mlib_s32*)(buffd + swid);
538
539 chan1 = nchannel;
540 chan2 = chan1 + chan1;
541
542 swid -= (dx_l + dx_r);
543
544 for (c = 0; c < nchannel; c++) {
545 if (!(cmask & (1 << (chan1 - 1 - c)))) continue;
546
547 sl = adr_src + c;
548 dl = adr_dst + c;
549
914
915 for (; i < swid; i++) {
916 buffn[i + dx_l] = (FTYPE)sp[0];
917 sp += chan1;
918 }
919
920 for (i = 0; i < dx_l; i++) buffn[i] = buffn[dx_l];
921 for (i = 0; i < dx_r; i++) buffn[swid + dx_l + i] = buffn[swid + dx_l - 1];
922
923 /* next line */
924
925 if (j < hgt - dy_b - 2) sl += sll;
926 dl += dll;
927
928 buff_ind++;
929
930 if (buff_ind >= n + 1) buff_ind = 0;
931 }
932 }
933
934 FREE_AND_RETURN_STATUS
935 }
936
937 /***************************************************************/
938 #ifndef __sparc /* for x86, using integer multiplies is faster */
939
940 #define STORE_RES(res, x) \
941 x >>= shift2; \
942 CLAMP_STORE(res, x)
943
944 mlib_status CONV_FUNC_MxN_I
945 {
946 DTYPE *adr_src, *sl, *sp = NULL;
947 DTYPE *adr_dst, *dl, *dp = NULL;
948 mlib_s32 buff[BUFF_SIZE], *buffs_arr[2*(MAX_N + 1)];
949 mlib_s32 *pbuff = buff;
950 mlib_s32 **buffs = buffs_arr, *buffd;
951 mlib_s32 l, off, kw, bsize, buff_ind;
952 mlib_s32 d0, d1, shift1, shift2;
953 mlib_s32 k0, k1, k2, k3, k4, k5, k6;
954 mlib_s32 p0, p1, p2, p3, p4, p5, p6, p7;
|