diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2017-10-19 15:07:40 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2017-10-19 15:07:40 +0200 |
commit | 6424b637f41fbbb4fab27921a031dbfe62e84625 (patch) | |
tree | 73c265cab85243a59af96f6722863543ad9ebe34 | |
parent | 489e3a0c1458f0cbe0513bed8adbc5bac101b6bf (diff) | |
parent | 162cbde1dd62710a506d86bce2e57e26dad3d801 (diff) | |
download | barebox-6424b637f41fbbb4fab27921a031dbfe62e84625.tar.gz barebox-6424b637f41fbbb4fab27921a031dbfe62e84625.tar.xz |
Merge branch 'for-next/graphics'
-rw-r--r-- | commands/fbtest.c | 122 | ||||
-rw-r--r-- | lib/gui/2d-primitives.c | 4 |
2 files changed, 121 insertions, 5 deletions
diff --git a/commands/fbtest.c b/commands/fbtest.c index ca6ec21991..e5dd8ba7fa 100644 --- a/commands/fbtest.c +++ b/commands/fbtest.c @@ -9,6 +9,15 @@ #include <linux/gcd.h> #include <int_sqrt.h> +static void fbtest_pattern_solid(struct screen *sc, u32 color) +{ + const u8 r = (color >> 16) & 0xff; + const u8 g = (color >> 8) & 0xff; + const u8 b = (color >> 0) & 0xff; + + gu_fill_rectangle(sc, 0, 0, -1, -1, r, g, b, 0xff); +} + static void fbtest_pattern_bars(struct screen *sc, u32 unused) { int i; @@ -108,6 +117,111 @@ static void fbtest_pattern_geometry(struct screen *sc, u32 color) } } +static void draw_line_r(struct screen *sc, bool rotate_90_ccw, + int x1, int y1, int x2, int y2, + uint8_t r, uint8_t g, uint8_t b) +{ + if (rotate_90_ccw) + gu_draw_line(sc, + y1, sc->info->yres - x1, + y2, sc->info->yres - x2, + r, g, b, 0xff, 0); + else + gu_draw_line(sc, x1, y1, x2, y2, r, g, b, 0xff, 0); +} + +static void solid_rect_r(struct screen *sc, bool rotate_90_ccw, + int x1, int y1, int x2, int y2, + uint8_t r, uint8_t g, uint8_t b) +{ + if (rotate_90_ccw) + gu_fill_rectangle(sc, + y1, sc->info->yres - x1, + y2, sc->info->yres - x2, + r, g, b, 0xff); + else + gu_fill_rectangle(sc, x1, y1, x2, y2, r, g, b, 0xff); +} + +static void grad_rect_r(struct screen *sc, bool rotate_90_ccw, + int x1, int y1, int x2, int y2, + uint8_t r, uint8_t g, uint8_t b) +{ + int x; + + for (x = x1; x <= x2; x++) + draw_line_r(sc, rotate_90_ccw, x, y1, x, y2, + r * (x - x1 + 1) / (x2 - x1 + 1), + g * (x - x1 + 1) / (x2 - x1 + 1), + b * (x - x1 + 1) / (x2 - x1 + 1)); +} + +static void anchor_rect_r(struct screen *sc, bool rotate_90_ccw, + int x1, int y1, int x2, int y2) +{ + int dx = (x2 - x1 + 1) / 6, dy = (y2 - y1 + 1) / 6; + + solid_rect_r(sc, rotate_90_ccw, + x1, y1, x2, y2, + 0xff, 0xff, 0xff); + + solid_rect_r(sc, rotate_90_ccw, + x1 + dx, y1 + dy, x2 - dx, y2 - dy, + 0, 0, 0); + + solid_rect_r(sc, rotate_90_ccw, + x1 + 2 * dx, y1 + 2 * dy, x2 - 2 * dx, y2 - 2 * dy, + 0xff, 0xff, 0xff); +} + + +static void fbtest_pattern_gradient(struct screen *sc, u32 unused) +{ + bool rotate_90_ccw; + int w, h, border; + + if (sc->info->xres > sc->info->yres) { + w = sc->info->xres; + h = sc->info->yres; + rotate_90_ccw = false; + } else { + w = sc->info->yres; + h = sc->info->xres; + rotate_90_ccw = true; + } + + solid_rect_r(sc, rotate_90_ccw, 0, 0, w - 1, h - 1, 0, 0, 0); + + border = h / 5; + + anchor_rect_r(sc, rotate_90_ccw, + border * 3 / 10, border * 3 / 10, + border * 7 / 10, border * 7 / 10); + anchor_rect_r(sc, rotate_90_ccw, + w - border * 7 / 10, border * 3 / 10, + w - border * 3 / 10, border * 7 / 10); + anchor_rect_r(sc, rotate_90_ccw, + w - border * 7 / 10, h - border * 7 / 10, + w - border * 3 / 10, h - border * 3 / 10); + + grad_rect_r(sc, rotate_90_ccw, + border, border, + w - border, border + (h - 2 * border) / 4 - 1, + 0xff, 0, 0); + grad_rect_r(sc, rotate_90_ccw, + border, border + (h - 2 * border) / 4, + w - border, border + (h - 2 * border) / 2 - 1, + 0, 0xff, 0); + grad_rect_r(sc, rotate_90_ccw, + border, border + (h - 2 * border) / 2, + w - border, border + (h - 2 * border) * 3 / 4 - 1, + 0, 0, 0xff); + grad_rect_r(sc, rotate_90_ccw, + border, border + (h - 2 * border) * 3 / 4, + w - border, h - border, + 0xff, 0xff, 0xff); +} + static int do_fbtest(int argc, char *argv[]) { struct screen *sc; @@ -122,8 +236,10 @@ static int do_fbtest(int argc, char *argv[]) const char *name; void (*func) (struct screen *sc, u32 color); } patterns[] = { + { "solid", fbtest_pattern_solid }, { "geometry", fbtest_pattern_geometry }, - { "bars", fbtest_pattern_bars } + { "bars", fbtest_pattern_bars }, + { "gradient", fbtest_pattern_gradient }, }; while((opt = getopt(argc, argv, "d:p:c:")) > 0) { @@ -191,8 +307,8 @@ BAREBOX_CMD_HELP_TEXT("This command displays a test pattern on a screen") BAREBOX_CMD_HELP_TEXT("") BAREBOX_CMD_HELP_TEXT("Options:") BAREBOX_CMD_HELP_OPT ("-d <fbdev>\t", "framebuffer device (default /dev/fb0)") -BAREBOX_CMD_HELP_OPT ("-c color\t", "color") -BAREBOX_CMD_HELP_OPT ("-p pattern\t", "pattern name (geometry, bars)") +BAREBOX_CMD_HELP_OPT ("-c color\t", "color, in hex RRGGBB format") +BAREBOX_CMD_HELP_OPT ("-p pattern\t", "pattern name (solid, geometry, bars, gradient)") BAREBOX_CMD_HELP_END BAREBOX_CMD_START(fbtest) diff --git a/lib/gui/2d-primitives.c b/lib/gui/2d-primitives.c index 0f29b32bab..89acc092d5 100644 --- a/lib/gui/2d-primitives.c +++ b/lib/gui/2d-primitives.c @@ -61,7 +61,7 @@ static void draw_simple_line(struct screen *sc, swap(y1, y2); } - for (x = x1; x < x2 - 1; x++) { + for (x = x1; x <= x2; x++) { if (!dash || (++pixel % (2 * dash)) < dash) illuminate(sc->info, @@ -137,7 +137,7 @@ void gu_draw_line(struct screen *sc, j = y1; eps = dy - dx; - for (i = x1; i <= x2 - 1; i++) { + for (i = x1; i <= x2; i++) { if (!dash || (++pixel % (2 * dash)) > dash) { illuminate(sc->info, |