11ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding/*
21ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * Copyright 2008 Tungsten Graphics
31ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding *   Jakob Bornecrantz <jakob@tungstengraphics.com>
41ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * Copyright 2008 Intel Corporation
51ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding *   Jesse Barnes <jesse.barnes@intel.com>
61ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding *
71ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * Permission is hereby granted, free of charge, to any person obtaining a
81ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * copy of this software and associated documentation files (the "Software"),
91ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * to deal in the Software without restriction, including without limitation
101ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * the rights to use, copy, modify, merge, publish, distribute, sublicense,
111ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * and/or sell copies of the Software, and to permit persons to whom the
121ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * Software is furnished to do so, subject to the following conditions:
131ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding *
141ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * The above copyright notice and this permission notice shall be included in
151ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * all copies or substantial portions of the Software.
161ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding *
171ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
181ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
191ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
201ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
211ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
221ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
231ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * IN THE SOFTWARE.
241ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding */
251ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
261ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#ifdef HAVE_CONFIG_H
271ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#include "config.h"
281ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#endif
291ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
301ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#include <stdint.h>
311ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#include <stdio.h>
321ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#include <stdlib.h>
331ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#include <string.h>
341ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
351ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#include <drm_fourcc.h>
361ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
371ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#ifdef HAVE_CAIRO
381ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#include <cairo.h>
391ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#include <math.h>
401ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#endif
411ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
421ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#include "format.h"
431ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#include "pattern.h"
441ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
451ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstruct color_rgb24 {
461ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int value:24;
471ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding} __attribute__((__packed__));
481ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
491ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstruct color_yuv {
501ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned char y;
511ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned char u;
521ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned char v;
531ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding};
541ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
551ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#define MAKE_YUV_601_Y(r, g, b) \
561ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	((( 66 * (r) + 129 * (g) +  25 * (b) + 128) >> 8) + 16)
571ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#define MAKE_YUV_601_U(r, g, b) \
581ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	(((-38 * (r) -  74 * (g) + 112 * (b) + 128) >> 8) + 128)
591ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#define MAKE_YUV_601_V(r, g, b) \
601ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	(((112 * (r) -  94 * (g) -  18 * (b) + 128) >> 8) + 128)
611ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
621ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#define MAKE_YUV_601(r, g, b) \
631ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	{ .y = MAKE_YUV_601_Y(r, g, b), \
641ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	  .u = MAKE_YUV_601_U(r, g, b), \
651ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	  .v = MAKE_YUV_601_V(r, g, b) }
661ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
671ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#define MAKE_RGBA(rgb, r, g, b, a) \
681ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	((((r) >> (8 - (rgb)->red.length)) << (rgb)->red.offset) | \
691ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	 (((g) >> (8 - (rgb)->green.length)) << (rgb)->green.offset) | \
701ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	 (((b) >> (8 - (rgb)->blue.length)) << (rgb)->blue.offset) | \
711ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	 (((a) >> (8 - (rgb)->alpha.length)) << (rgb)->alpha.offset))
721ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
731ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#define MAKE_RGB24(rgb, r, g, b) \
741ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	{ .value = MAKE_RGBA(rgb, r, g, b, 0) }
751ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
761ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_smpte_yuv_planar(const struct util_yuv_info *yuv,
771ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				  unsigned char *y_mem, unsigned char *u_mem,
781ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				  unsigned char *v_mem, unsigned int width,
791ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				  unsigned int height, unsigned int stride)
801ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
811ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct color_yuv colors_top[] = {
821ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(191, 192, 192),	/* grey */
831ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(192, 192, 0),	/* yellow */
841ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 192, 192),	/* cyan */
851ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 192, 0),	/* green */
861ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(192, 0, 192),	/* magenta */
871ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(192, 0, 0),	/* red */
881ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 0, 192),	/* blue */
891ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
901ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct color_yuv colors_middle[] = {
911ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 0, 192),	/* blue */
921ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* black */
931ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(192, 0, 192),	/* magenta */
941ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* black */
951ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 192, 192),	/* cyan */
961ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* black */
971ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(192, 192, 192),	/* grey */
981ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
991ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct color_yuv colors_bottom[] = {
1001ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 33, 76),	/* in-phase */
1011ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(255, 255, 255),	/* super white */
1021ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(50, 0, 106),	/* quadrature */
1031ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* black */
1041ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(9, 9, 9),		/* 3.5% */
1051ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* 7.5% */
1061ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(29, 29, 29),	/* 11.5% */
1071ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* black */
1081ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
1091ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int cs = yuv->chroma_stride;
1101ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int xsub = yuv->xsub;
1111ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int ysub = yuv->ysub;
1121ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int x;
1131ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int y;
1141ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
1151ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	/* Luma */
1161ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height * 6 / 9; ++y) {
1171ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x)
1181ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[x] = colors_top[x * 7 / width].y;
1191ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		y_mem += stride;
1201ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
1211ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
1221ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height * 7 / 9; ++y) {
1231ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x)
1241ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[x] = colors_middle[x * 7 / width].y;
1251ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		y_mem += stride;
1261ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
1271ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
1281ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height; ++y) {
1291ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width * 5 / 7; ++x)
1301ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[x] = colors_bottom[x * 4 / (width * 5 / 7)].y;
1311ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width * 6 / 7; ++x)
1321ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[x] = colors_bottom[(x - width * 5 / 7) * 3
1331ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding						 / (width / 7) + 4].y;
1341ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width; ++x)
1351ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[x] = colors_bottom[7].y;
1361ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		y_mem += stride;
1371ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
1381ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
1391ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	/* Chroma */
1401ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height / ysub * 6 / 9; ++y) {
1411ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; x += xsub) {
1421ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			u_mem[x*cs/xsub] = colors_top[x * 7 / width].u;
1431ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			v_mem[x*cs/xsub] = colors_top[x * 7 / width].v;
1441ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
1451ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		u_mem += stride * cs / xsub;
1461ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		v_mem += stride * cs / xsub;
1471ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
1481ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
1491ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height / ysub * 7 / 9; ++y) {
1501ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; x += xsub) {
1511ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			u_mem[x*cs/xsub] = colors_middle[x * 7 / width].u;
1521ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			v_mem[x*cs/xsub] = colors_middle[x * 7 / width].v;
1531ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
1541ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		u_mem += stride * cs / xsub;
1551ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		v_mem += stride * cs / xsub;
1561ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
1571ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
1581ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height / ysub; ++y) {
1591ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width * 5 / 7; x += xsub) {
1601ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			u_mem[x*cs/xsub] =
1611ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				colors_bottom[x * 4 / (width * 5 / 7)].u;
1621ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			v_mem[x*cs/xsub] =
1631ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				colors_bottom[x * 4 / (width * 5 / 7)].v;
1641ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
1651ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width * 6 / 7; x += xsub) {
1661ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			u_mem[x*cs/xsub] = colors_bottom[(x - width * 5 / 7) *
1671ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding							 3 / (width / 7) + 4].u;
1681ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			v_mem[x*cs/xsub] = colors_bottom[(x - width * 5 / 7) *
1691ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding							 3 / (width / 7) + 4].v;
1701ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
1711ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width; x += xsub) {
1721ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			u_mem[x*cs/xsub] = colors_bottom[7].u;
1731ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			v_mem[x*cs/xsub] = colors_bottom[7].v;
1741ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
1751ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		u_mem += stride * cs / xsub;
1761ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		v_mem += stride * cs / xsub;
1771ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
1781ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
1791ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
1801ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_smpte_yuv_packed(const struct util_yuv_info *yuv, void *mem,
1811ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				  unsigned int width, unsigned int height,
1821ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				  unsigned int stride)
1831ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
1841ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct color_yuv colors_top[] = {
1851ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(191, 192, 192),	/* grey */
1861ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(192, 192, 0),	/* yellow */
1871ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 192, 192),	/* cyan */
1881ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 192, 0),	/* green */
1891ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(192, 0, 192),	/* magenta */
1901ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(192, 0, 0),	/* red */
1911ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 0, 192),	/* blue */
1921ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
1931ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct color_yuv colors_middle[] = {
1941ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 0, 192),	/* blue */
1951ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* black */
1961ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(192, 0, 192),	/* magenta */
1971ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* black */
1981ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 192, 192),	/* cyan */
1991ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* black */
2001ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(192, 192, 192),	/* grey */
2011ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
2021ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct color_yuv colors_bottom[] = {
2031ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(0, 33, 76),	/* in-phase */
2041ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(255, 255, 255),	/* super white */
2051ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(50, 0, 106),	/* quadrature */
2061ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* black */
2071ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(9, 9, 9),		/* 3.5% */
2081ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* 7.5% */
2091ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(29, 29, 29),	/* 11.5% */
2101ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_YUV_601(19, 19, 19),	/* black */
2111ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
2121ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned char *y_mem = (yuv->order & YUV_YC) ? mem : mem + 1;
2131ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned char *c_mem = (yuv->order & YUV_CY) ? mem : mem + 1;
2141ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int u = (yuv->order & YUV_YCrCb) ? 2 : 0;
2151ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int v = (yuv->order & YUV_YCbCr) ? 2 : 0;
2161ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int x;
2171ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int y;
2181ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
2191ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	/* Luma */
2201ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height * 6 / 9; ++y) {
2211ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x)
2221ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[2*x] = colors_top[x * 7 / width].y;
2231ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		y_mem += stride;
2241ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
2251ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
2261ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height * 7 / 9; ++y) {
2271ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x)
2281ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[2*x] = colors_middle[x * 7 / width].y;
2291ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		y_mem += stride;
2301ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
2311ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
2321ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height; ++y) {
2331ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width * 5 / 7; ++x)
2341ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[2*x] = colors_bottom[x * 4 / (width * 5 / 7)].y;
2351ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width * 6 / 7; ++x)
2361ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[2*x] = colors_bottom[(x - width * 5 / 7) * 3
2371ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding						   / (width / 7) + 4].y;
2381ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width; ++x)
2391ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[2*x] = colors_bottom[7].y;
2401ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		y_mem += stride;
2411ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
2421ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
2431ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	/* Chroma */
2441ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height * 6 / 9; ++y) {
2451ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; x += 2) {
2461ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+u] = colors_top[x * 7 / width].u;
2471ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+v] = colors_top[x * 7 / width].v;
2481ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
2491ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		c_mem += stride;
2501ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
2511ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
2521ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height * 7 / 9; ++y) {
2531ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; x += 2) {
2541ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+u] = colors_middle[x * 7 / width].u;
2551ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+v] = colors_middle[x * 7 / width].v;
2561ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
2571ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		c_mem += stride;
2581ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
2591ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
2601ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height; ++y) {
2611ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width * 5 / 7; x += 2) {
2621ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+u] = colors_bottom[x * 4 / (width * 5 / 7)].u;
2631ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+v] = colors_bottom[x * 4 / (width * 5 / 7)].v;
2641ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
2651ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width * 6 / 7; x += 2) {
2661ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+u] = colors_bottom[(x - width * 5 / 7) *
2671ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding						     3 / (width / 7) + 4].u;
2681ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+v] = colors_bottom[(x - width * 5 / 7) *
2691ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding						     3 / (width / 7) + 4].v;
2701ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
2711ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width; x += 2) {
2721ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+u] = colors_bottom[7].u;
2731ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+v] = colors_bottom[7].v;
2741ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
2751ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		c_mem += stride;
2761ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
2771ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
2781ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
2791ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_smpte_rgb16(const struct util_rgb_info *rgb, void *mem,
2801ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int width, unsigned int height,
2811ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int stride)
2821ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
2831ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const uint16_t colors_top[] = {
2841ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 192, 192, 255),	/* grey */
2851ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 192, 0, 255),	/* yellow */
2861ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 192, 192, 255),	/* cyan */
2871ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 192, 0, 255),		/* green */
2881ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 0, 192, 255),	/* magenta */
2891ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 0, 0, 255),		/* red */
2901ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 0, 192, 255),		/* blue */
2911ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
2921ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const uint16_t colors_middle[] = {
2931ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 0, 192, 127),		/* blue */
2941ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 127),	/* black */
2951ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 0, 192, 127),	/* magenta */
2961ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 127),	/* black */
2971ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 192, 192, 127),	/* cyan */
2981ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 127),	/* black */
2991ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 192, 192, 127),	/* grey */
3001ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
3011ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const uint16_t colors_bottom[] = {
3021ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 33, 76, 255),		/* in-phase */
3031ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 255, 255, 255, 255),	/* super white */
3041ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 50, 0, 106, 255),	/* quadrature */
3051ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 255),	/* black */
3061ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 9, 9, 9, 255),		/* 3.5% */
3071ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 255),	/* 7.5% */
3081ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 29, 29, 29, 255),	/* 11.5% */
3091ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 255),	/* black */
3101ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
3111ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int x;
3121ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int y;
3131ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
3141ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height * 6 / 9; ++y) {
3151ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x)
3161ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint16_t *)mem)[x] = colors_top[x * 7 / width];
3171ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
3181ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
3191ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
3201ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height * 7 / 9; ++y) {
3211ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x)
3221ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint16_t *)mem)[x] = colors_middle[x * 7 / width];
3231ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
3241ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
3251ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
3261ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height; ++y) {
3271ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width * 5 / 7; ++x)
3281ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint16_t *)mem)[x] =
3291ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				colors_bottom[x * 4 / (width * 5 / 7)];
3301ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width * 6 / 7; ++x)
3311ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint16_t *)mem)[x] =
3321ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				colors_bottom[(x - width * 5 / 7) * 3
3331ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					      / (width / 7) + 4];
3341ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width; ++x)
3351ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint16_t *)mem)[x] = colors_bottom[7];
3361ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
3371ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
3381ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
3391ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
3401ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_smpte_rgb24(const struct util_rgb_info *rgb, void *mem,
3411ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int width, unsigned int height,
3421ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int stride)
3431ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
3441ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct color_rgb24 colors_top[] = {
3451ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 192, 192, 192),	/* grey */
3461ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 192, 192, 0),	/* yellow */
3471ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 0, 192, 192),	/* cyan */
3481ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 0, 192, 0),	/* green */
3491ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 192, 0, 192),	/* magenta */
3501ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 192, 0, 0),	/* red */
3511ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 0, 0, 192),	/* blue */
3521ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
3531ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct color_rgb24 colors_middle[] = {
3541ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 0, 0, 192),	/* blue */
3551ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 19, 19, 19),	/* black */
3561ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 192, 0, 192),	/* magenta */
3571ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 19, 19, 19),	/* black */
3581ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 0, 192, 192),	/* cyan */
3591ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 19, 19, 19),	/* black */
3601ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 192, 192, 192),	/* grey */
3611ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
3621ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct color_rgb24 colors_bottom[] = {
3631ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 0, 33, 76),	/* in-phase */
3641ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 255, 255, 255),	/* super white */
3651ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 50, 0, 106),	/* quadrature */
3661ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 19, 19, 19),	/* black */
3671ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 9, 9, 9),	/* 3.5% */
3681ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 19, 19, 19),	/* 7.5% */
3691ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 29, 29, 29),	/* 11.5% */
3701ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGB24(rgb, 19, 19, 19),	/* black */
3711ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
3721ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int x;
3731ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int y;
3741ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
3751ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height * 6 / 9; ++y) {
3761ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x)
3771ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((struct color_rgb24 *)mem)[x] =
3781ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				colors_top[x * 7 / width];
3791ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
3801ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
3811ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
3821ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height * 7 / 9; ++y) {
3831ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x)
3841ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((struct color_rgb24 *)mem)[x] =
3851ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				colors_middle[x * 7 / width];
3861ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
3871ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
3881ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
3891ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height; ++y) {
3901ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width * 5 / 7; ++x)
3911ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((struct color_rgb24 *)mem)[x] =
3921ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				colors_bottom[x * 4 / (width * 5 / 7)];
3931ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width * 6 / 7; ++x)
3941ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((struct color_rgb24 *)mem)[x] =
3951ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				colors_bottom[(x - width * 5 / 7) * 3
3961ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					      / (width / 7) + 4];
3971ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width; ++x)
3981ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((struct color_rgb24 *)mem)[x] = colors_bottom[7];
3991ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
4001ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
4011ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
4021ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
4031ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_smpte_rgb32(const struct util_rgb_info *rgb, void *mem,
4041ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int width, unsigned int height,
4051ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int stride)
4061ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
4071ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const uint32_t colors_top[] = {
4081ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 192, 192, 255),	/* grey */
4091ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 192, 0, 255),	/* yellow */
4101ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 192, 192, 255),	/* cyan */
4111ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 192, 0, 255),		/* green */
4121ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 0, 192, 255),	/* magenta */
4131ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 0, 0, 255),		/* red */
4141ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 0, 192, 255),		/* blue */
4151ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
4161ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const uint32_t colors_middle[] = {
4171ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 0, 192, 127),		/* blue */
4181ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 127),	/* black */
4191ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 0, 192, 127),	/* magenta */
4201ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 127),	/* black */
4211ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 192, 192, 127),	/* cyan */
4221ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 127),	/* black */
4231ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 192, 192, 192, 127),	/* grey */
4241ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
4251ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const uint32_t colors_bottom[] = {
4261ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 0, 33, 76, 255),		/* in-phase */
4271ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 255, 255, 255, 255),	/* super white */
4281ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 50, 0, 106, 255),	/* quadrature */
4291ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 255),	/* black */
4301ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 9, 9, 9, 255),		/* 3.5% */
4311ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 255),	/* 7.5% */
4321ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 29, 29, 29, 255),	/* 11.5% */
4331ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		MAKE_RGBA(rgb, 19, 19, 19, 255),	/* black */
4341ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	};
4351ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int x;
4361ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int y;
4371ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
4381ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height * 6 / 9; ++y) {
4391ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x)
4401ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint32_t *)mem)[x] = colors_top[x * 7 / width];
4411ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
4421ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
4431ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
4441ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height * 7 / 9; ++y) {
4451ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x)
4461ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint32_t *)mem)[x] = colors_middle[x * 7 / width];
4471ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
4481ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
4491ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
4501ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (; y < height; ++y) {
4511ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width * 5 / 7; ++x)
4521ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint32_t *)mem)[x] =
4531ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				colors_bottom[x * 4 / (width * 5 / 7)];
4541ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width * 6 / 7; ++x)
4551ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint32_t *)mem)[x] =
4561ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				colors_bottom[(x - width * 5 / 7) * 3
4571ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					      / (width / 7) + 4];
4581ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (; x < width; ++x)
4591ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint32_t *)mem)[x] = colors_bottom[7];
4601ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
4611ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
4621ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
4631ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
4641ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_smpte(const struct util_format_info *info, void *planes[3],
4651ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		       unsigned int width, unsigned int height,
4661ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		       unsigned int stride)
4671ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
4681ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned char *u, *v;
4691ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
4701ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	switch (info->format) {
4711ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_UYVY:
4721ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_VYUY:
4731ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_YUYV:
4741ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_YVYU:
4751ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_smpte_yuv_packed(&info->yuv, planes[0], width,
4761ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					     height, stride);
4771ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
4781ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_NV12:
4791ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_NV21:
4801ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_NV16:
4811ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_NV61:
4821ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		u = info->yuv.order & YUV_YCbCr ? planes[1] : planes[1] + 1;
4831ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		v = info->yuv.order & YUV_YCrCb ? planes[1] : planes[1] + 1;
4841ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_smpte_yuv_planar(&info->yuv, planes[0], u, v,
4851ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					     width, height, stride);
4861ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
4871ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_YUV420:
4881ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_smpte_yuv_planar(&info->yuv, planes[0], planes[1],
4891ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					     planes[2], width, height, stride);
4901ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
4911ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_YVU420:
4921ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_smpte_yuv_planar(&info->yuv, planes[0], planes[2],
4931ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					     planes[1], width, height, stride);
4941ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
4951ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ARGB4444:
4961ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XRGB4444:
4971ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ABGR4444:
4981ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XBGR4444:
4991ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBA4444:
5001ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBX4444:
5011ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRA4444:
5021ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRX4444:
5031ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGB565:
5041ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGR565:
5051ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ARGB1555:
5061ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XRGB1555:
5071ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ABGR1555:
5081ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XBGR1555:
5091ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBA5551:
5101ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBX5551:
5111ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRA5551:
5121ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRX5551:
5131ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_smpte_rgb16(&info->rgb, planes[0],
5141ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					width, height, stride);
5151ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
5161ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGR888:
5171ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGB888:
5181ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_smpte_rgb24(&info->rgb, planes[0],
5191ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					width, height, stride);
5201ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ARGB8888:
5211ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XRGB8888:
5221ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ABGR8888:
5231ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XBGR8888:
5241ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBA8888:
5251ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBX8888:
5261ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRA8888:
5271ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRX8888:
5281ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ARGB2101010:
5291ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XRGB2101010:
5301ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ABGR2101010:
5311ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XBGR2101010:
5321ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBA1010102:
5331ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBX1010102:
5341ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRA1010102:
5351ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRX1010102:
5361ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_smpte_rgb32(&info->rgb, planes[0],
5371ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					width, height, stride);
5381ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
5391ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
5401ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
5411ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding/* swap these for big endian.. */
5421ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#define RED   2
5431ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#define GREEN 1
5441ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#define BLUE  0
5451ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
5461ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void make_pwetty(void *data, unsigned int width, unsigned int height,
5471ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			unsigned int stride, uint32_t format)
5481ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
5491ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#ifdef HAVE_CAIRO
5501ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	cairo_surface_t *surface;
5511ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	cairo_t *cr;
5521ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	int x, y;
5531ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	cairo_format_t cairo_format;
5541ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
5551ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	/* we can ignore the order of R,G,B channels */
5561ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	switch (format) {
5571ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XRGB8888:
5581ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ARGB8888:
5591ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XBGR8888:
5601ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ABGR8888:
5611ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		cairo_format = CAIRO_FORMAT_ARGB32;
5621ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		break;
5631ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGB565:
5641ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGR565:
5651ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		cairo_format = CAIRO_FORMAT_RGB16_565;
5661ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		break;
5671ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	default:
5681ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return;
5691ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
5701ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
5711ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	surface = cairo_image_surface_create_for_data(data,
5721ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding						      cairo_format,
5731ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding						      width, height,
5741ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding						      stride);
5751ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	cr = cairo_create(surface);
5761ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	cairo_surface_destroy(surface);
5771ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
5781ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
5791ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (x = 0; x < width; x += 250)
5801ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (y = 0; y < height; y += 250) {
5811ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			char buf[64];
5821ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
5831ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_move_to(cr, x, y - 20);
5841ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_line_to(cr, x, y + 20);
5851ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_move_to(cr, x - 20, y);
5861ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_line_to(cr, x + 20, y);
5871ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_new_sub_path(cr);
5881ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_arc(cr, x, y, 10, 0, M_PI * 2);
5891ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_set_line_width(cr, 4);
5901ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_set_source_rgb(cr, 0, 0, 0);
5911ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_stroke_preserve(cr);
5921ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_set_source_rgb(cr, 1, 1, 1);
5931ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_set_line_width(cr, 2);
5941ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_stroke(cr);
5951ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
5961ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			snprintf(buf, sizeof buf, "%d, %d", x, y);
5971ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_move_to(cr, x + 20, y + 20);
5981ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_text_path(cr, buf);
5991ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_set_source_rgb(cr, 0, 0, 0);
6001ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_stroke_preserve(cr);
6011ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_set_source_rgb(cr, 1, 1, 1);
6021ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			cairo_fill(cr);
6031ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
6041ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6051ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	cairo_destroy(cr);
6061ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding#endif
6071ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
6081ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6091ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_tiles_yuv_planar(const struct util_format_info *info,
6101ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				  unsigned char *y_mem, unsigned char *u_mem,
6111ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				  unsigned char *v_mem, unsigned int width,
6121ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				  unsigned int height, unsigned int stride)
6131ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
6141ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct util_yuv_info *yuv = &info->yuv;
6151ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int cs = yuv->chroma_stride;
6161ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int xsub = yuv->xsub;
6171ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int ysub = yuv->ysub;
6181ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int x;
6191ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int y;
6201ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6211ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height; ++y) {
6221ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x) {
6231ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			div_t d = div(x+y, width);
6241ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			uint32_t rgb32 = 0x00130502 * (d.quot >> 6)
6251ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				       + 0x000a1120 * (d.rem >> 6);
6261ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			struct color_yuv color =
6271ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				MAKE_YUV_601((rgb32 >> 16) & 0xff,
6281ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					     (rgb32 >> 8) & 0xff, rgb32 & 0xff);
6291ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6301ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[x] = color.y;
6311ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			u_mem[x/xsub*cs] = color.u;
6321ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			v_mem[x/xsub*cs] = color.v;
6331ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
6341ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6351ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		y_mem += stride;
6361ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		if ((y + 1) % ysub == 0) {
6371ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			u_mem += stride * cs / xsub;
6381ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			v_mem += stride * cs / xsub;
6391ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
6401ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
6411ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
6421ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6431ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_tiles_yuv_packed(const struct util_format_info *info,
6441ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				  void *mem, unsigned int width,
6451ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				  unsigned int height, unsigned int stride)
6461ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
6471ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct util_yuv_info *yuv = &info->yuv;
6481ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned char *y_mem = (yuv->order & YUV_YC) ? mem : mem + 1;
6491ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned char *c_mem = (yuv->order & YUV_CY) ? mem : mem + 1;
6501ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int u = (yuv->order & YUV_YCrCb) ? 2 : 0;
6511ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int v = (yuv->order & YUV_YCbCr) ? 2 : 0;
6521ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int x;
6531ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int y;
6541ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6551ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height; ++y) {
6561ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; x += 2) {
6571ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			div_t d = div(x+y, width);
6581ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			uint32_t rgb32 = 0x00130502 * (d.quot >> 6)
6591ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				       + 0x000a1120 * (d.rem >> 6);
6601ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			struct color_yuv color =
6611ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				MAKE_YUV_601((rgb32 >> 16) & 0xff,
6621ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					     (rgb32 >> 8) & 0xff, rgb32 & 0xff);
6631ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6641ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[2*x] = color.y;
6651ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+u] = color.u;
6661ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			y_mem[2*x+2] = color.y;
6671ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			c_mem[2*x+v] = color.v;
6681ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
6691ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6701ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		y_mem += stride;
6711ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		c_mem += stride;
6721ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
6731ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
6741ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6751ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_tiles_rgb16(const struct util_format_info *info, void *mem,
6761ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int width, unsigned int height,
6771ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int stride)
6781ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
6791ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct util_rgb_info *rgb = &info->rgb;
6801ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	void *mem_base = mem;
6811ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int x, y;
6821ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6831ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height; ++y) {
6841ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x) {
6851ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			div_t d = div(x+y, width);
6861ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			uint32_t rgb32 = 0x00130502 * (d.quot >> 6)
6871ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				       + 0x000a1120 * (d.rem >> 6);
6881ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			uint16_t color =
6891ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				MAKE_RGBA(rgb, (rgb32 >> 16) & 0xff,
6901ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					  (rgb32 >> 8) & 0xff, rgb32 & 0xff,
6911ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					  255);
6921ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6931ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint16_t *)mem)[x] = color;
6941ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
6951ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
6961ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
6971ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
6981ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	make_pwetty(mem_base, width, height, stride, info->format);
6991ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
7001ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7011ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_tiles_rgb24(const struct util_format_info *info, void *mem,
7021ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int width, unsigned int height,
7031ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int stride)
7041ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
7051ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct util_rgb_info *rgb = &info->rgb;
7061ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int x, y;
7071ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7081ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height; ++y) {
7091ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x) {
7101ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			div_t d = div(x+y, width);
7111ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			uint32_t rgb32 = 0x00130502 * (d.quot >> 6)
7121ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				       + 0x000a1120 * (d.rem >> 6);
7131ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			struct color_rgb24 color =
7141ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				MAKE_RGB24(rgb, (rgb32 >> 16) & 0xff,
7151ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					   (rgb32 >> 8) & 0xff, rgb32 & 0xff);
7161ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7171ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((struct color_rgb24 *)mem)[x] = color;
7181ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
7191ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
7201ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
7211ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
7221ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7231ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_tiles_rgb32(const struct util_format_info *info, void *mem,
7241ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int width, unsigned int height,
7251ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			     unsigned int stride)
7261ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
7271ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct util_rgb_info *rgb = &info->rgb;
7281ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	void *mem_base = mem;
7291ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned int x, y;
7301ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7311ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	for (y = 0; y < height; ++y) {
7321ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		for (x = 0; x < width; ++x) {
7331ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			div_t d = div(x+y, width);
7341ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			uint32_t rgb32 = 0x00130502 * (d.quot >> 6)
7351ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				       + 0x000a1120 * (d.rem >> 6);
7361ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			uint32_t alpha = ((y < height/2) && (x < width/2)) ? 127 : 255;
7371ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			uint32_t color =
7381ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding				MAKE_RGBA(rgb, (rgb32 >> 16) & 0xff,
7391ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					  (rgb32 >> 8) & 0xff, rgb32 & 0xff,
7401ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					  alpha);
7411ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7421ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding			((uint32_t *)mem)[x] = color;
7431ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		}
7441ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		mem += stride;
7451ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
7461ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7471ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	make_pwetty(mem_base, width, height, stride, info->format);
7481ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
7491ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7501ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_tiles(const struct util_format_info *info, void *planes[3],
7511ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		       unsigned int width, unsigned int height,
7521ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		       unsigned int stride)
7531ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
7541ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	unsigned char *u, *v;
7551ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7561ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	switch (info->format) {
7571ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_UYVY:
7581ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_VYUY:
7591ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_YUYV:
7601ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_YVYU:
7611ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_tiles_yuv_packed(info, planes[0],
7621ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					     width, height, stride);
7631ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7641ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_NV12:
7651ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_NV21:
7661ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_NV16:
7671ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_NV61:
7681ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		u = info->yuv.order & YUV_YCbCr ? planes[1] : planes[1] + 1;
7691ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		v = info->yuv.order & YUV_YCrCb ? planes[1] : planes[1] + 1;
7701ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_tiles_yuv_planar(info, planes[0], u, v,
7711ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					     width, height, stride);
7721ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7731ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_YUV420:
7741ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_tiles_yuv_planar(info, planes[0], planes[1],
7751ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					     planes[2], width, height, stride);
7761ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7771ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_YVU420:
7781ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_tiles_yuv_planar(info, planes[0], planes[2],
7791ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					     planes[1], width, height, stride);
7801ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
7811ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ARGB4444:
7821ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XRGB4444:
7831ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ABGR4444:
7841ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XBGR4444:
7851ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBA4444:
7861ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBX4444:
7871ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRA4444:
7881ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRX4444:
7891ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGB565:
7901ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGR565:
7911ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ARGB1555:
7921ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XRGB1555:
7931ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ABGR1555:
7941ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XBGR1555:
7951ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBA5551:
7961ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBX5551:
7971ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRA5551:
7981ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRX5551:
7991ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_tiles_rgb16(info, planes[0],
8001ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					width, height, stride);
8011ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
8021ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGR888:
8031ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGB888:
8041ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_tiles_rgb24(info, planes[0],
8051ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					width, height, stride);
8061ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ARGB8888:
8071ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XRGB8888:
8081ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ABGR8888:
8091ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XBGR8888:
8101ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBA8888:
8111ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBX8888:
8121ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRA8888:
8131ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRX8888:
8141ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ARGB2101010:
8151ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XRGB2101010:
8161ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_ABGR2101010:
8171ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_XBGR2101010:
8181ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBA1010102:
8191ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_RGBX1010102:
8201ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRA1010102:
8211ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case DRM_FORMAT_BGRX1010102:
8221ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_tiles_rgb32(info, planes[0],
8231ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding					width, height, stride);
8241ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
8251ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
8261ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
8271ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingstatic void fill_plain(const struct util_format_info *info, void *planes[3],
8281ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		       unsigned int width, unsigned int height,
8291ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		       unsigned int stride)
8301ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
8311ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	memset(planes[0], 0x77, stride * height);
8321ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
8331ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
8341ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding/*
8351ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * util_fill_pattern - Fill a buffer with a test pattern
8361ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * @format: Pixel format
8371ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * @pattern: Test pattern
8381ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * @planes: Array of buffers
8391ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * @width: Width in pixels
8401ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * @height: Height in pixels
8411ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * @stride: Line stride (pitch) in bytes
8421ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding *
8431ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * Fill the buffers with the test pattern specified by the pattern parameter.
8441ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding * Supported formats vary depending on the selected pattern.
8451ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding */
8461ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Redingvoid util_fill_pattern(uint32_t format, enum util_fill_pattern pattern,
8471ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		       void *planes[3], unsigned int width,
8481ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		       unsigned int height, unsigned int stride)
8491ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding{
8501ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	const struct util_format_info *info;
8511ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
8521ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	info = util_format_info_find(format);
8531ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	if (info == NULL)
8541ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return;
8551ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
8561ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	switch (pattern) {
8571ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case UTIL_PATTERN_TILES:
8581ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_tiles(info, planes, width, height, stride);
8591ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
8601ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case UTIL_PATTERN_SMPTE:
8611ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_smpte(info, planes, width, height, stride);
8621ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
8631ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	case UTIL_PATTERN_PLAIN:
8641ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		return fill_plain(info, planes, width, height, stride);
8651ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding
8661ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	default:
8671ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		printf("Error: unsupported test pattern %u.\n", pattern);
8681ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding		break;
8691ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding	}
8701ec3c44bdd38051d870f64d0b2cc7dbd59760386Thierry Reding}
871