static void gen_twopix()

in common/v4l2-tpg/v4l2-tpg-core.c [1097:1505]


static void gen_twopix(struct tpg_data *tpg,
		u8 buf[TPG_MAX_PLANES][8], int color, bool odd)
{
	unsigned offset = odd * tpg->twopixelsize[0] / 2;
	u8 alpha = tpg->alpha_component;
	u8 r_y_h, g_u_s, b_v;

	if (tpg->alpha_red_only && color != TPG_COLOR_CSC_RED &&
				   color != TPG_COLOR_100_RED &&
				   color != TPG_COLOR_75_RED)
		alpha = 0;
	if (color == TPG_COLOR_RANDOM)
		precalculate_color(tpg, color);
	r_y_h = tpg->colors[color][0]; /* R or precalculated Y, H */
	g_u_s = tpg->colors[color][1]; /* G or precalculated U, V */
	b_v = tpg->colors[color][2]; /* B or precalculated V */

	switch (tpg->fourcc) {
	case V4L2_PIX_FMT_GREY:
		buf[0][offset] = r_y_h;
		break;
	case V4L2_PIX_FMT_Y10:
		buf[0][offset] = (r_y_h << 2) & 0xff;
		buf[0][offset+1] = r_y_h >> 6;
		break;
	case V4L2_PIX_FMT_Y12:
		buf[0][offset] = (r_y_h << 4) & 0xff;
		buf[0][offset+1] = r_y_h >> 4;
		break;
	case V4L2_PIX_FMT_Y16:
	case V4L2_PIX_FMT_Z16:
		/*
		 * Ideally both bytes should be set to r_y_h, but then you won't
		 * be able to detect endian problems. So keep it 0 except for
		 * the corner case where r_y_h is 0xff so white really will be
		 * white (0xffff).
		 */
		buf[0][offset] = r_y_h == 0xff ? r_y_h : 0;
		buf[0][offset+1] = r_y_h;
		break;
	case V4L2_PIX_FMT_Y16_BE:
		/* See comment for V4L2_PIX_FMT_Y16 above */
		buf[0][offset] = r_y_h;
		buf[0][offset+1] = r_y_h == 0xff ? r_y_h : 0;
		break;
	case V4L2_PIX_FMT_YUV422M:
	case V4L2_PIX_FMT_YUV422P:
	case V4L2_PIX_FMT_YUV420:
	case V4L2_PIX_FMT_YUV420M:
		buf[0][offset] = r_y_h;
		if (odd) {
			buf[1][0] = (buf[1][0] + g_u_s) / 2;
			buf[2][0] = (buf[2][0] + b_v) / 2;
			buf[1][1] = buf[1][0];
			buf[2][1] = buf[2][0];
			break;
		}
		buf[1][0] = g_u_s;
		buf[2][0] = b_v;
		break;
	case V4L2_PIX_FMT_YVU422M:
	case V4L2_PIX_FMT_YVU420:
	case V4L2_PIX_FMT_YVU420M:
		buf[0][offset] = r_y_h;
		if (odd) {
			buf[1][0] = (buf[1][0] + b_v) / 2;
			buf[2][0] = (buf[2][0] + g_u_s) / 2;
			buf[1][1] = buf[1][0];
			buf[2][1] = buf[2][0];
			break;
		}
		buf[1][0] = b_v;
		buf[2][0] = g_u_s;
		break;

	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV12M:
	case V4L2_PIX_FMT_NV16:
	case V4L2_PIX_FMT_NV16M:
		buf[0][offset] = r_y_h;
		if (odd) {
			buf[1][0] = (buf[1][0] + g_u_s) / 2;
			buf[1][1] = (buf[1][1] + b_v) / 2;
			break;
		}
		buf[1][0] = g_u_s;
		buf[1][1] = b_v;
		break;
	case V4L2_PIX_FMT_NV21:
	case V4L2_PIX_FMT_NV21M:
	case V4L2_PIX_FMT_NV61:
	case V4L2_PIX_FMT_NV61M:
		buf[0][offset] = r_y_h;
		if (odd) {
			buf[1][0] = (buf[1][0] + b_v) / 2;
			buf[1][1] = (buf[1][1] + g_u_s) / 2;
			break;
		}
		buf[1][0] = b_v;
		buf[1][1] = g_u_s;
		break;

	case V4L2_PIX_FMT_YUV444M:
		buf[0][offset] = r_y_h;
		buf[1][offset] = g_u_s;
		buf[2][offset] = b_v;
		break;

	case V4L2_PIX_FMT_YVU444M:
		buf[0][offset] = r_y_h;
		buf[1][offset] = b_v;
		buf[2][offset] = g_u_s;
		break;

	case V4L2_PIX_FMT_NV24:
		buf[0][offset] = r_y_h;
		buf[1][2 * offset] = g_u_s;
		buf[1][(2 * offset + 1) % 8] = b_v;
		break;

	case V4L2_PIX_FMT_NV42:
		buf[0][offset] = r_y_h;
		buf[1][2 * offset] = b_v;
		buf[1][(2 * offset + 1) % 8] = g_u_s;
		break;

	case V4L2_PIX_FMT_YUYV:
		buf[0][offset] = r_y_h;
		if (odd) {
			buf[0][1] = (buf[0][1] + g_u_s) / 2;
			buf[0][3] = (buf[0][3] + b_v) / 2;
			break;
		}
		buf[0][1] = g_u_s;
		buf[0][3] = b_v;
		break;
	case V4L2_PIX_FMT_UYVY:
		buf[0][offset + 1] = r_y_h;
		if (odd) {
			buf[0][0] = (buf[0][0] + g_u_s) / 2;
			buf[0][2] = (buf[0][2] + b_v) / 2;
			break;
		}
		buf[0][0] = g_u_s;
		buf[0][2] = b_v;
		break;
	case V4L2_PIX_FMT_YVYU:
		buf[0][offset] = r_y_h;
		if (odd) {
			buf[0][1] = (buf[0][1] + b_v) / 2;
			buf[0][3] = (buf[0][3] + g_u_s) / 2;
			break;
		}
		buf[0][1] = b_v;
		buf[0][3] = g_u_s;
		break;
	case V4L2_PIX_FMT_VYUY:
		buf[0][offset + 1] = r_y_h;
		if (odd) {
			buf[0][0] = (buf[0][0] + b_v) / 2;
			buf[0][2] = (buf[0][2] + g_u_s) / 2;
			break;
		}
		buf[0][0] = b_v;
		buf[0][2] = g_u_s;
		break;
	case V4L2_PIX_FMT_RGB332:
		buf[0][offset] = (r_y_h << 5) | (g_u_s << 2) | b_v;
		break;
	case V4L2_PIX_FMT_YUV565:
	case V4L2_PIX_FMT_RGB565:
		buf[0][offset] = (g_u_s << 5) | b_v;
		buf[0][offset + 1] = (r_y_h << 3) | (g_u_s >> 3);
		break;
	case V4L2_PIX_FMT_RGB565X:
		buf[0][offset] = (r_y_h << 3) | (g_u_s >> 3);
		buf[0][offset + 1] = (g_u_s << 5) | b_v;
		break;
	case V4L2_PIX_FMT_RGB444:
	case V4L2_PIX_FMT_XRGB444:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_YUV444:
	case V4L2_PIX_FMT_ARGB444:
		buf[0][offset] = (g_u_s << 4) | b_v;
		buf[0][offset + 1] = (alpha & 0xf0) | r_y_h;
		break;
	case V4L2_PIX_FMT_RGBX444:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_RGBA444:
		buf[0][offset] = (b_v << 4) | (alpha >> 4);
		buf[0][offset + 1] = (r_y_h << 4) | g_u_s;
		break;
	case V4L2_PIX_FMT_XBGR444:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_ABGR444:
		buf[0][offset] = (g_u_s << 4) | r_y_h;
		buf[0][offset + 1] = (alpha & 0xf0) | b_v;
		break;
	case V4L2_PIX_FMT_BGRX444:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_BGRA444:
		buf[0][offset] = (r_y_h << 4) | (alpha >> 4);
		buf[0][offset + 1] = (b_v << 4) | g_u_s;
		break;
	case V4L2_PIX_FMT_RGB555:
	case V4L2_PIX_FMT_XRGB555:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_YUV555:
	case V4L2_PIX_FMT_ARGB555:
		buf[0][offset] = (g_u_s << 5) | b_v;
		buf[0][offset + 1] = (alpha & 0x80) | (r_y_h << 2)
						    | (g_u_s >> 3);
		break;
	case V4L2_PIX_FMT_RGBX555:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_RGBA555:
		buf[0][offset] = (g_u_s << 6) | (b_v << 1) |
				 ((alpha & 0x80) >> 7);
		buf[0][offset + 1] = (r_y_h << 3) | (g_u_s >> 2);
		break;
	case V4L2_PIX_FMT_XBGR555:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_ABGR555:
		buf[0][offset] = (g_u_s << 5) | r_y_h;
		buf[0][offset + 1] = (alpha & 0x80) | (b_v << 2)
						    | (g_u_s >> 3);
		break;
	case V4L2_PIX_FMT_BGRX555:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_BGRA555:
		buf[0][offset] = (g_u_s << 6) | (r_y_h << 1) |
				 ((alpha & 0x80) >> 7);
		buf[0][offset + 1] = (b_v << 3) | (g_u_s >> 2);
		break;
	case V4L2_PIX_FMT_RGB555X:
	case V4L2_PIX_FMT_XRGB555X:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_ARGB555X:
		buf[0][offset] = (alpha & 0x80) | (r_y_h << 2) | (g_u_s >> 3);
		buf[0][offset + 1] = (g_u_s << 5) | b_v;
		break;
	case V4L2_PIX_FMT_RGB24:
	case V4L2_PIX_FMT_HSV24:
		buf[0][offset] = r_y_h;
		buf[0][offset + 1] = g_u_s;
		buf[0][offset + 2] = b_v;
		break;
	case V4L2_PIX_FMT_BGR24:
		buf[0][offset] = b_v;
		buf[0][offset + 1] = g_u_s;
		buf[0][offset + 2] = r_y_h;
		break;
	case V4L2_PIX_FMT_BGR666:
		buf[0][offset] = (b_v << 2) | (g_u_s >> 4);
		buf[0][offset + 1] = (g_u_s << 4) | (r_y_h >> 2);
		buf[0][offset + 2] = r_y_h << 6;
		buf[0][offset + 3] = 0;
		break;
	case V4L2_PIX_FMT_RGB32:
	case V4L2_PIX_FMT_XRGB32:
	case V4L2_PIX_FMT_HSV32:
	case V4L2_PIX_FMT_XYUV32:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_YUV32:
	case V4L2_PIX_FMT_ARGB32:
	case V4L2_PIX_FMT_AYUV32:
		buf[0][offset] = alpha;
		buf[0][offset + 1] = r_y_h;
		buf[0][offset + 2] = g_u_s;
		buf[0][offset + 3] = b_v;
		break;
	case V4L2_PIX_FMT_RGBX32:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_RGBA32:
		buf[0][offset] = r_y_h;
		buf[0][offset + 1] = g_u_s;
		buf[0][offset + 2] = b_v;
		buf[0][offset + 3] = alpha;
		break;
	case V4L2_PIX_FMT_BGR32:
	case V4L2_PIX_FMT_XBGR32:
	case V4L2_PIX_FMT_VUYX32:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_ABGR32:
	case V4L2_PIX_FMT_VUYA32:
		buf[0][offset] = b_v;
		buf[0][offset + 1] = g_u_s;
		buf[0][offset + 2] = r_y_h;
		buf[0][offset + 3] = alpha;
		break;
	case V4L2_PIX_FMT_BGRX32:
		alpha = 0;
		fallthrough;
	case V4L2_PIX_FMT_BGRA32:
		buf[0][offset] = alpha;
		buf[0][offset + 1] = b_v;
		buf[0][offset + 2] = g_u_s;
		buf[0][offset + 3] = r_y_h;
		break;
	case V4L2_PIX_FMT_SBGGR8:
		buf[0][offset] = odd ? g_u_s : b_v;
		buf[1][offset] = odd ? r_y_h : g_u_s;
		break;
	case V4L2_PIX_FMT_SGBRG8:
		buf[0][offset] = odd ? b_v : g_u_s;
		buf[1][offset] = odd ? g_u_s : r_y_h;
		break;
	case V4L2_PIX_FMT_SGRBG8:
		buf[0][offset] = odd ? r_y_h : g_u_s;
		buf[1][offset] = odd ? g_u_s : b_v;
		break;
	case V4L2_PIX_FMT_SRGGB8:
		buf[0][offset] = odd ? g_u_s : r_y_h;
		buf[1][offset] = odd ? b_v : g_u_s;
		break;
	case V4L2_PIX_FMT_SBGGR10:
		buf[0][offset] = odd ? g_u_s << 2 : b_v << 2;
		buf[0][offset + 1] = odd ? g_u_s >> 6 : b_v >> 6;
		buf[1][offset] = odd ? r_y_h << 2 : g_u_s << 2;
		buf[1][offset + 1] = odd ? r_y_h >> 6 : g_u_s >> 6;
		buf[0][offset] |= (buf[0][offset] >> 2) & 3;
		buf[1][offset] |= (buf[1][offset] >> 2) & 3;
		break;
	case V4L2_PIX_FMT_SGBRG10:
		buf[0][offset] = odd ? b_v << 2 : g_u_s << 2;
		buf[0][offset + 1] = odd ? b_v >> 6 : g_u_s >> 6;
		buf[1][offset] = odd ? g_u_s << 2 : r_y_h << 2;
		buf[1][offset + 1] = odd ? g_u_s >> 6 : r_y_h >> 6;
		buf[0][offset] |= (buf[0][offset] >> 2) & 3;
		buf[1][offset] |= (buf[1][offset] >> 2) & 3;
		break;
	case V4L2_PIX_FMT_SGRBG10:
		buf[0][offset] = odd ? r_y_h << 2 : g_u_s << 2;
		buf[0][offset + 1] = odd ? r_y_h >> 6 : g_u_s >> 6;
		buf[1][offset] = odd ? g_u_s << 2 : b_v << 2;
		buf[1][offset + 1] = odd ? g_u_s >> 6 : b_v >> 6;
		buf[0][offset] |= (buf[0][offset] >> 2) & 3;
		buf[1][offset] |= (buf[1][offset] >> 2) & 3;
		break;
	case V4L2_PIX_FMT_SRGGB10:
		buf[0][offset] = odd ? g_u_s << 2 : r_y_h << 2;
		buf[0][offset + 1] = odd ? g_u_s >> 6 : r_y_h >> 6;
		buf[1][offset] = odd ? b_v << 2 : g_u_s << 2;
		buf[1][offset + 1] = odd ? b_v >> 6 : g_u_s >> 6;
		buf[0][offset] |= (buf[0][offset] >> 2) & 3;
		buf[1][offset] |= (buf[1][offset] >> 2) & 3;
		break;
	case V4L2_PIX_FMT_SBGGR12:
		buf[0][offset] = odd ? g_u_s << 4 : b_v << 4;
		buf[0][offset + 1] = odd ? g_u_s >> 4 : b_v >> 4;
		buf[1][offset] = odd ? r_y_h << 4 : g_u_s << 4;
		buf[1][offset + 1] = odd ? r_y_h >> 4 : g_u_s >> 4;
		buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
		buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
		break;
	case V4L2_PIX_FMT_SGBRG12:
		buf[0][offset] = odd ? b_v << 4 : g_u_s << 4;
		buf[0][offset + 1] = odd ? b_v >> 4 : g_u_s >> 4;
		buf[1][offset] = odd ? g_u_s << 4 : r_y_h << 4;
		buf[1][offset + 1] = odd ? g_u_s >> 4 : r_y_h >> 4;
		buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
		buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
		break;
	case V4L2_PIX_FMT_SGRBG12:
		buf[0][offset] = odd ? r_y_h << 4 : g_u_s << 4;
		buf[0][offset + 1] = odd ? r_y_h >> 4 : g_u_s >> 4;
		buf[1][offset] = odd ? g_u_s << 4 : b_v << 4;
		buf[1][offset + 1] = odd ? g_u_s >> 4 : b_v >> 4;
		buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
		buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
		break;
	case V4L2_PIX_FMT_SRGGB12:
		buf[0][offset] = odd ? g_u_s << 4 : r_y_h << 4;
		buf[0][offset + 1] = odd ? g_u_s >> 4 : r_y_h >> 4;
		buf[1][offset] = odd ? b_v << 4 : g_u_s << 4;
		buf[1][offset + 1] = odd ? b_v >> 4 : g_u_s >> 4;
		buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
		buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
		break;
	case V4L2_PIX_FMT_SBGGR16:
		buf[0][offset] = buf[0][offset + 1] = odd ? g_u_s : b_v;
		buf[1][offset] = buf[1][offset + 1] = odd ? r_y_h : g_u_s;
		break;
	case V4L2_PIX_FMT_SGBRG16:
		buf[0][offset] = buf[0][offset + 1] = odd ? b_v : g_u_s;
		buf[1][offset] = buf[1][offset + 1] = odd ? g_u_s : r_y_h;
		break;
	case V4L2_PIX_FMT_SGRBG16:
		buf[0][offset] = buf[0][offset + 1] = odd ? r_y_h : g_u_s;
		buf[1][offset] = buf[1][offset + 1] = odd ? g_u_s : b_v;
		break;
	case V4L2_PIX_FMT_SRGGB16:
		buf[0][offset] = buf[0][offset + 1] = odd ? g_u_s : r_y_h;
		buf[1][offset] = buf[1][offset + 1] = odd ? b_v : g_u_s;
		break;
	}
}