/****************************************************************************
- * Copyright (c) 2018 Free Software Foundation, Inc. *
+ * Copyright (c) 2018,2019 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
* authorization. *
****************************************************************************/
/*
- * $Id: color_content.c,v 1.2 2018/12/30 00:52:58 tom Exp $
+ * $Id: color_content.c,v 1.11 2019/08/17 21:29:13 tom Exp $
*/
#define NEED_TIME_H
#include <test.priv.h>
+#if USE_EXTENDED_COLOR
+typedef int my_color_t;
+#else
+typedef NCURSES_COLOR_T my_color_t;
+#endif
+
typedef struct {
- NCURSES_COLOR_T r;
- NCURSES_COLOR_T g;
- NCURSES_COLOR_T b;
+ my_color_t r;
+ my_color_t g;
+ my_color_t b;
} MYCOLOR;
+static int f_opt;
static int i_opt;
static int l_opt;
static int n_opt;
+static int p_opt;
static int r_opt;
static int s_opt;
+#if USE_EXTENDED_COLOR
+static int x_opt;
+#endif
+
static MYCOLOR *expected;
#if HAVE_GETTIMEOFDAY
ExitProgram(EXIT_FAILURE);
}
-static NCURSES_COLOR_T
+#if USE_EXTENDED_COLOR
+static int
+InitColor(int pair, int r, int g, int b)
+{
+ int rc;
+ if (x_opt) {
+ rc = init_extended_color(pair, r, g, b);
+ } else {
+ rc = init_color((NCURSES_PAIRS_T) pair,
+ (NCURSES_COLOR_T) r,
+ (NCURSES_COLOR_T) g,
+ (NCURSES_COLOR_T) b);
+ }
+ return rc;
+}
+
+static int
+ColorContent(int color, int *rp, int *gp, int *bp)
+{
+ int rc;
+ if (x_opt) {
+ rc = extended_color_content(color, rp, gp, bp);
+ } else {
+ NCURSES_COLOR_T r, g, b;
+ if ((rc = color_content((NCURSES_COLOR_T) color, &r, &g, &b)) == OK) {
+ *rp = r;
+ *gp = g;
+ *bp = b;
+ }
+ }
+ return rc;
+}
+#else
+#define InitColor(color,r,g,b) init_color((NCURSES_COLOR_T)color,(NCURSES_COLOR_T)r,(NCURSES_COLOR_T)g,(NCURSES_COLOR_T)b)
+#define ColorContent(color,rp,gp,bp) color_content((NCURSES_COLOR_T)color,rp,gp,bp)
+#endif
+
+static my_color_t
random_color(void)
{
- return (NCURSES_COLOR_T) (rand() % 1000);
+ return (my_color_t) (rand() % 1000);
}
static void
scrollok(stdscr, TRUE);
if (has_colors()) {
start_color();
- if (!can_change_color())
+ if (!can_change_color() && !p_opt)
failed("this terminal cannot initialize colors");
+ if (!f_opt)
+ f_opt = 0;
if (!l_opt)
l_opt = COLORS;
if (l_opt <= 0)
failed("color limit must be greater than zero");
if (!n_opt) {
- NCURSES_PAIRS_T color;
+ int color;
+ size_t need = (size_t) ((l_opt > COLORS) ? l_opt : COLORS) + 1;
- expected = typeCalloc(MYCOLOR, l_opt);
+ expected = typeCalloc(MYCOLOR, need);
if (s_opt) {
- NCURSES_COLOR_T r;
- NCURSES_COLOR_T g;
- NCURSES_COLOR_T b;
- color = 0;
+ int r;
+ int g;
+ int b;
+ color = f_opt;
for (r = 0; r < 1000; ++r) {
for (g = 0; g < 1000; ++g) {
for (b = 0; b < 1000; ++b) {
if (color < l_opt) {
- init_color(color, r, g, b);
- expected[color].r = r;
- expected[color].g = g;
- expected[color].b = b;
+ InitColor(color, r, g, b);
+ expected[color].r = (my_color_t) r;
+ expected[color].g = (my_color_t) g;
+ expected[color].b = (my_color_t) b;
++color;
} else {
break;
}
}
} else {
- for (color = 1; color < l_opt; ++color) {
+ for (color = f_opt; color < l_opt; ++color) {
expected[color].r = random_color();
expected[color].g = random_color();
expected[color].b = random_color();
- init_color(color, expected[color].r, expected[color].g,
- expected[color].b);
+ InitColor(color,
+ expected[color].r,
+ expected[color].g,
+ expected[color].b);
}
}
}
static void
run_test(void)
{
- NCURSES_PAIRS_T color;
+ int color;
bool success = TRUE;
- for (color = 0; color < l_opt; ++color) {
- NCURSES_COLOR_T r;
- NCURSES_COLOR_T g;
- NCURSES_COLOR_T b;
- if (color_content(color, &r, &g, &b) == OK) {
+ for (color = f_opt; color < l_opt; ++color) {
+ my_color_t r;
+ my_color_t g;
+ my_color_t b;
+ if (ColorContent(color, &r, &g, &b) == OK) {
if (expected != 0) {
if (r != expected[color].r)
success = FALSE;
{
static const char *msg[] =
{
- "Usage: pair_content [options]"
+ "Usage: color_content [options]"
,""
,"Options:"
+ ," -f COLOR first color value to test (default: 0)"
," -i interactive, showing test-progress"
- ," -l NUM test NUM color pairs, rather than terminal description"
+ ," -l COLOR last color value to test (default: max_colors-1)"
," -n do not initialize color pairs"
+ ," -p print data for color content instead of testing"
," -r COUNT repeat for given count"
," -s initialize pairs sequentially rather than random"
+#if USE_EXTENDED_COLOR
+ ," -x use extended color pairs/values"
+#endif
};
size_t n;
for (n = 0; n < SIZEOF(msg); n++)
main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
{
int i;
- int repeat;
- while ((i = getopt(argc, argv, "il:nr:s")) != -1) {
+ while ((i = getopt(argc, argv, "f:il:npr:sx")) != -1) {
switch (i) {
+ case 'f':
+ if ((f_opt = atoi(optarg)) <= 0)
+ usage();
+ break;
case 'i':
i_opt = 1;
break;
case 'n':
n_opt = 1;
break;
+ case 'p':
+ p_opt = 1;
+ break;
case 'r':
if ((r_opt = atoi(optarg)) <= 0)
usage();
case 's':
s_opt = 1;
break;
+#if USE_EXTENDED_COLOR
+ case 'x':
+ x_opt = 1;
+ break;
+#endif
default:
usage();
}
r_opt = 1;
setup_test();
+ if (p_opt) {
+ endwin();
+ for (i = 0; i < COLORS; ++i) {
+ my_color_t r, g, b;
+ if (ColorContent(i, &r, &g, &b) == OK) {
+ printf("%d: %d %d %d\n", i, r, g, b);
+ } else {
+ printf("%d: ? ?\n", i);
+ }
+ }
+ } else {
+ int repeat;
- for (repeat = 0; repeat < r_opt; ++repeat) {
- run_test();
- if (i_opt) {
- addch('.');
- refresh();
+ for (repeat = 0; repeat < r_opt; ++repeat) {
+ run_test();
+ if (i_opt) {
+ addch('.');
+ refresh();
+ }
}
- }
- if (i_opt) {
- addch('\n');
- }
- printw("DONE: ");
+ if (i_opt) {
+ addch('\n');
+ }
+ printw("DONE: ");
#if HAVE_GETTIMEOFDAY
- gettimeofday(&finish_time, 0);
- printw("%.03f seconds",
- seconds(&finish_time)
- - seconds(&initial_time));
+ gettimeofday(&finish_time, 0);
+ printw("%.03f seconds",
+ seconds(&finish_time)
+ - seconds(&initial_time));
#endif
- finish_test();
+ finish_test();
+ }
ExitProgram(EXIT_SUCCESS);
}