void ContourMetricsMasked(const uint8_t * src, size_t srcStride, size_t width, size_t height, const uint8_t * mask, size_t maskStride, uint8_t indexMin, uint8_t * dst, size_t dstStride) { assert(dstStride%sizeof(int16_t) == 0); ContourMetricsMasked(src, srcStride, width, height, mask, maskStride, indexMin, (uint16_t *)dst, dstStride/sizeof(int16_t)); }
SIMD_INLINE void ContourMetricsMasked(const uint8_t * src, size_t srcStride, size_t width, size_t height, const uint8_t * mask, size_t maskStride, uint8_t indexMin, int16_t * dst, size_t dstStride) { assert(width > A); size_t bodyWidth = Simd::AlignHi(width, A) - A; const uint8_t *src0, *src1, *src2; v16u8 _indexMin = Fill((uint8_t)indexMin); v16u8 a[3][3]; for (size_t row = 0; row < height; ++row) { src0 = src + srcStride*(row - 1); src1 = src0 + srcStride; src2 = src1 + srcStride; if (row == 0) src0 = src1; if (row == height - 1) src2 = src1; LoadNose(src0 + 0, a[0]); LoadNose(src1 + 0, a[1]); LoadNose(src2 + 0, a[2]); ContourMetricsMasked(a, mask + 0, _indexMin, dst + 0); for (size_t col = A; col < bodyWidth; col += A) { LoadBody(src0 + col, a[0]); LoadBody(src1 + col, a[1]); LoadBody(src2 + col, a[2]); ContourMetricsMasked(a, mask + col, _indexMin, dst + col); } LoadTail(src0 + width - A, a[0]); LoadTail(src1 + width - A, a[1]); LoadTail(src2 + width - A, a[2]); ContourMetricsMasked(a, mask + width - A, _indexMin, dst + width - A); dst += dstStride; mask += maskStride; } }