Exemple #1
0
        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));
        }
Exemple #2
0
		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;
			}
		}