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