mlib_status mlib_ImageConvZeroEdge(mlib_image *dst, mlib_s32 dx_l, mlib_s32 dx_r, mlib_s32 dy_t, mlib_s32 dy_b, mlib_s32 cmask) { mlib_d64 zero[4] = { 0, 0, 0, 0 }; mlib_type type = mlib_ImageGetType(dst); if (type == MLIB_FLOAT || type == MLIB_DOUBLE) { return mlib_ImageConvClearEdge_Fp(dst, dx_l, dx_r, dy_t, dy_b, zero, cmask); } else { return mlib_ImageConvClearEdge(dst, dx_l, dx_r, dy_t, dy_b, (mlib_s32 *) zero, cmask); } }
mlib_status __mlib_ImageConv4x4_Fp( mlib_image *dst, const mlib_image *src, const mlib_d64 *kernel, mlib_s32 cmask, mlib_edge edge) { mlib_s32 ksize = 4, ksize2 = (ksize - 1) / 2; mlib_image dst_i[1], src_i[1], dst_e[1], src_e[1]; mlib_s32 edg_sizes[8]; mlib_type type; mlib_s32 nchan, dx_l, dx_r, dy_t, dy_b; mlib_d64 zero[4] = { 0, 0, 0, 0 }; mlib_status ret; ret = mlib_ImageClipping(dst_i, src_i, dst_e, src_e, edg_sizes, dst, src, ksize); if (ret != MLIB_SUCCESS) return (ret); if (kernel == NULL) return (MLIB_FAILURE); type = mlib_ImageGetType(dst); nchan = mlib_ImageGetChannels(dst); if (nchan == 1) cmask = 1; if ((cmask & ((1 << nchan) - 1)) == 0) return (MLIB_SUCCESS); dx_l = edg_sizes[0]; dx_r = edg_sizes[1]; dy_t = edg_sizes[2]; dy_b = edg_sizes[3]; if (dx_l + dx_r + dy_t + dy_b == 0) edge = MLIB_EDGE_DST_NO_WRITE; if (edge != MLIB_EDGE_SRC_EXTEND) { if (mlib_ImageGetWidth(src_i) >= ksize && mlib_ImageGetHeight(src_i) >= ksize) switch (type) { case MLIB_FLOAT: mlib_conv4x4nw_f32(dst_i, src_i, kernel, cmask); break; case MLIB_DOUBLE: mlib_conv4x4nw_d64(dst_i, src_i, kernel, cmask); break; default: return (MLIB_FAILURE); } switch (edge) { case MLIB_EDGE_DST_FILL_ZERO: mlib_ImageConvClearEdge_Fp(dst_e, dx_l, dx_r, dy_t, dy_b, zero, cmask); break; case MLIB_EDGE_DST_COPY_SRC: mlib_ImageConvCopyEdge_Fp(dst_e, src_e, dx_l, dx_r, dy_t, dy_b, cmask); break; default: return (MLIB_SUCCESS); } } else { /* MLIB_EDGE_SRC_EXTEND */ /* adjust src_e image */ mlib_ImageSetSubimage(src_e, src_e, dx_l - ksize2, dy_t - ksize2, mlib_ImageGetWidth(src_e), mlib_ImageGetHeight(src_e)); switch (type) { case MLIB_FLOAT: mlib_conv4x4ext_f32(dst_e, src_e, dx_l, dx_r, dy_t, dy_b, kernel, cmask); break; case MLIB_DOUBLE: mlib_conv4x4ext_d64(dst_e, src_e, dx_l, dx_r, dy_t, dy_b, kernel, cmask); break; default: return (MLIB_FAILURE); } } return (MLIB_SUCCESS); }