depth, dcn, bidx, hrange, 6.f/hrange));
break;
}
+ case COLOR_RGBA2mRGBA: case COLOR_mRGBA2RGBA:
+ {
+ CV_Assert(scn == 4 && depth == CV_8U);
+ dcn = 4;
+
+ k.create(code == COLOR_RGBA2mRGBA ? "RGBA2mRGBA" : "mRGBA2RGBA", ocl::imgproc::cvtcolor_oclsrc,
+ format("-D depth=%d -D dcn=4 -D scn=4 -D bidx=3", depth));
+ break;
+ }
default:
;
}
#endif
+/////////////////////////// RGBA <-> mRGBA (alpha premultiplied) //////////////
+#ifdef DEPTH_0
+__kernel void RGBA2mRGBA(__global const uchar* src, int src_step, int src_offset,
+ __global uchar* dst, int dst_step, int dst_offset,
+ int rows, int cols)
+{
+ int x = get_global_id(0);
+ int y = get_global_id(1);
+ if (y < rows && x < cols)
+ {
+ x <<= 2;
+ int src_idx = mad24(y, src_step, src_offset + x);
+ int dst_idx = mad24(y, dst_step, dst_offset + x);
+ uchar v0 = src[src_idx], v1 = src[src_idx + 1];
+ uchar v2 = src[src_idx + 2], v3 = src[src_idx + 3];
+ dst[dst_idx] = (v0 * v3 + HALF_MAX) / MAX_NUM;
+ dst[dst_idx + 1] = (v1 * v3 + HALF_MAX) / MAX_NUM;
+ dst[dst_idx + 2] = (v2 * v3 + HALF_MAX) / MAX_NUM;
+ dst[dst_idx + 3] = v3;
+ }
+}
+__kernel void mRGBA2RGBA(__global const uchar* src, int src_step, int src_offset,
+ __global uchar* dst, int dst_step, int dst_offset,
+ int rows, int cols)
+{
+ int x = get_global_id(0);
+ int y = get_global_id(1);
+
+ if (y < rows && x < cols)
+ {
+ x <<= 2;
+ int src_idx = mad24(y, src_step, src_offset + x);
+ int dst_idx = mad24(y, dst_step, dst_offset + x);
+ uchar v0 = src[src_idx], v1 = src[src_idx + 1];
+ uchar v2 = src[src_idx + 2], v3 = src[src_idx + 3];
+ uchar v3_half = v3 / 2;
+ dst[dst_idx] = v3 == 0 ? 0 : (v0 * MAX_NUM + v3_half) / v3;
+ dst[dst_idx + 1] = v3 == 0 ? 0 : (v1 * MAX_NUM + v3_half) / v3;
+ dst[dst_idx + 2] = v3 == 0 ? 0 : (v2 * MAX_NUM + v3_half) / v3;
+ dst[dst_idx + 3] = v3;
+ }
+}
+#endif
// RGBA <-> mRGBA
-//OCL_TEST_P(CvtColor8u, RGBA2mRGBA) { performTest(4, 4, CVTCODE(RGBA2mRGBA)); }
-//OCL_TEST_P(CvtColor8u, mRGBA2RGBA) { performTest(4, 4, CVTCODE(mRGBA2RGBA)); }
+OCL_TEST_P(CvtColor8u, RGBA2mRGBA) { performTest(4, 4, CVTCODE(RGBA2mRGBA)); }
+OCL_TEST_P(CvtColor8u, mRGBA2RGBA) { performTest(4, 4, CVTCODE(mRGBA2RGBA)); }
// YUV -> RGBA_NV12