summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2017-10-19 15:07:40 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2017-10-19 15:07:40 +0200
commit6424b637f41fbbb4fab27921a031dbfe62e84625 (patch)
tree73c265cab85243a59af96f6722863543ad9ebe34
parent489e3a0c1458f0cbe0513bed8adbc5bac101b6bf (diff)
parent162cbde1dd62710a506d86bce2e57e26dad3d801 (diff)
downloadbarebox-6424b637f41fbbb4fab27921a031dbfe62e84625.tar.gz
barebox-6424b637f41fbbb4fab27921a031dbfe62e84625.tar.xz
Merge branch 'for-next/graphics'
-rw-r--r--commands/fbtest.c122
-rw-r--r--lib/gui/2d-primitives.c4
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,