mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 1/3] GUI: Add a function to draw solid rectangles
@ 2016-06-22  4:39 Andrey Smirnov
  2016-06-22  4:39 ` [PATCH 2/3] GUI: Add code to draw simple graphics Andrey Smirnov
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Andrey Smirnov @ 2016-06-22  4:39 UTC (permalink / raw)
  To: barebox; +Cc: Andrey Smirnov

Add a routine implementing midpoint circle algorithm

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
 include/gui/graphic_utils.h |  3 +++
 lib/gui/graphic_utils.c     | 26 ++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/include/gui/graphic_utils.h b/include/gui/graphic_utils.h
index 231b3a9..279fdf9 100644
--- a/include/gui/graphic_utils.h
+++ b/include/gui/graphic_utils.h
@@ -28,4 +28,7 @@ void gu_invert_area(struct fb_info *info, void *buf, int startx, int starty, int
 void gu_screen_blit_area(struct screen *sc, int startx, int starty, int width,
 		int height);
 
+void gu_fill_rectangle(struct screen *sc,
+		       int x1, int y1, int x2, int y2,
+		       u8 r, u8 g, u8 b, u8 a);
 #endif /* __GRAPHIC_UTILS_H__ */
diff --git a/lib/gui/graphic_utils.c b/lib/gui/graphic_utils.c
index 2fe9fa3..c6c4373 100644
--- a/lib/gui/graphic_utils.c
+++ b/lib/gui/graphic_utils.c
@@ -336,3 +336,29 @@ void gu_screen_blit(struct screen *sc)
 	if (info->screen_base_shadow)
 		memcpy(info->screen_base, info->screen_base_shadow, sc->fbsize);
 }
+
+void gu_fill_rectangle(struct screen *sc,
+		       int x1, int y1, int x2, int y2,
+		       u8 r, u8 g, u8 b, u8 a)
+{
+	int y;
+	void *buf = gui_screen_render_buffer(sc);
+
+	BUG_ON(x1 < 0 || y1 < 0 ||
+	       x2 < 0 || y2 < 0);
+
+	if (x2 < x1)
+		swap(x1, x2);
+	if (y2 < y1)
+		swap(y1, y2);
+
+	for(y = y1; y <= y2; y++) {
+		int x;
+		unsigned char *pixel = buf + y * sc->info->line_length +
+			x1 * (sc->info->bits_per_pixel / 8);
+		for(x = x1; x <= x2; x++) {
+			gu_set_rgba_pixel(sc->info, pixel, r, g, b, a);
+			pixel += sc->info->bits_per_pixel / 8;
+		}
+	}
+}
-- 
2.5.5


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 2/3] GUI: Add code to draw simple graphics
  2016-06-22  4:39 [PATCH 1/3] GUI: Add a function to draw solid rectangles Andrey Smirnov
@ 2016-06-22  4:39 ` Andrey Smirnov
  2016-06-23  7:30   ` Holger Schurig
  2016-06-22  4:39 ` [PATCH 3/3] GUI: Add fbtest command Andrey Smirnov
  2016-06-23  7:28 ` [PATCH 1/3] GUI: Add a function to draw solid rectangles Holger Schurig
  2 siblings, 1 reply; 16+ messages in thread
From: Andrey Smirnov @ 2016-06-22  4:39 UTC (permalink / raw)
  To: barebox; +Cc: Andrey Smirnov

Add code to draw simple graphics, namely lines(solid or dashed) and
circles.

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
 include/gui/2d-primitives.h |  15 ++++
 lib/gui/2d-primitives.c     | 199 ++++++++++++++++++++++++++++++++++++++++++++
 lib/gui/Kconfig             |   3 +
 lib/gui/Makefile            |   1 +
 4 files changed, 218 insertions(+)
 create mode 100644 include/gui/2d-primitives.h
 create mode 100644 lib/gui/2d-primitives.c

diff --git a/include/gui/2d-primitives.h b/include/gui/2d-primitives.h
new file mode 100644
index 0000000..06216bb
--- /dev/null
+++ b/include/gui/2d-primitives.h
@@ -0,0 +1,15 @@
+#ifndef __2D_PRIMITIVES__
+#define __2D_PRIMITIVES__
+
+#include <fb.h>
+
+void gu_draw_line(struct screen *sc,
+		  int x1, int y1, int x2, int y2,
+		  u8 r, u8 g, u8 b, u8 a,
+		  unsigned int dash);
+
+void gu_draw_circle(struct screen *sc,
+		    int x0, int y0, int radius,
+		    u8 r, u8 g, u8 b, u8 a);
+
+#endif
diff --git a/lib/gui/2d-primitives.c b/lib/gui/2d-primitives.c
new file mode 100644
index 0000000..f3814ee
--- /dev/null
+++ b/lib/gui/2d-primitives.c
@@ -0,0 +1,199 @@
+#include <common.h>
+#include <fb.h>
+#include <gui/graphic_utils.h>
+#include <linux/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <fs.h>
+#include <malloc.h>
+
+static void __illuminate(struct fb_info *info,
+			 int x, int y,
+			 u8 r, u8 g, u8 b, u8 a)
+{
+	void *pixel;
+
+	pixel  = fb_get_screen_base(info);
+	pixel += y * info->line_length + x * (info->bits_per_pixel >> 3);
+
+	gu_set_rgba_pixel(info, pixel, r, g, b, a);
+}
+
+static void illuminate(struct fb_info *info,
+		       bool invert,
+		       int x, int y,
+		       u8 r, u8 g, u8 b, u8 a)
+{
+	if (invert)
+		__illuminate(info, y, x,
+			     r, g, b, a);
+	else
+		__illuminate(info, x, y,
+			     r, g, b, a);
+
+}
+
+
+static void draw_simple_line(struct screen *sc,
+			     int x1, int y1,
+			     int x2, int y2,
+			     u8 r, u8 g, u8 b, u8 a,
+			     unsigned int dash)
+{
+	int x;
+	bool invert = false;
+	unsigned int pixel = 0;
+
+	BUG_ON(x1 != x2 &&
+	       y1 != y2);
+
+	if (x1 == x2) {
+		swap(x1, y1);
+		swap(x2, y2);
+		invert = true;
+	}
+
+	if (x1 > x2) {
+		swap(x1, x2);
+		swap(y1, y2);
+	}
+
+	for (x = x1; x < x2 - 1; x++) {
+		if (!dash ||
+		    (++pixel % (2 * dash)) < dash)
+			illuminate(sc->info,
+				   invert,
+				   x, y1,
+				   r, g, b, a);
+	}
+}
+
+/**
+ * gl_draw_line - draw a 2D dashed line between (x1, y1) and (x2,y2)
+ *
+ * @sc: screen to draw on
+ * @x1, @y1: first point defining the line
+ * @x2, @y2: second point defining the line
+ * @r, @g, @b, @a: line's color
+ * @dash: dash length (0 denotes solid line)
+ *
+ * gl_draw_line() implements integer version of Bresenham's algoritm
+ * as can be found here:
+ *
+ * http://www.idav.ucdavis.edu/education/GraphicsNotes/Bresenhams-Algorithm.pdf
+ */
+void gu_draw_line(struct screen *sc,
+		  int x1, int y1,
+		  int x2, int y2,
+		  u8 r, u8 g, u8 b, u8 a,
+		  unsigned int dash)
+{
+	int dx;
+	int dy;
+	int i, j, eps;
+	bool invert = false;
+	unsigned int pixel = 0;
+
+	BUG_ON(x1 < 0 || y1 < 0 ||
+	       x2 < 0 || y2 < 0);
+
+	if (x1 == x2 || y1 == y2) {
+		draw_simple_line(sc,
+				 x1, y1,
+				 x2, y2,
+				 r, g, b, a, dash);
+		return;
+	}
+
+	dx = abs(x2 - x1);
+	dy = abs(y2 - y1);
+
+	/*
+	 * First thing we need to determine "Driving Axis", as can be
+	 * seen below if Y-axis projection of the line is bigger than
+	 * X-axis projection we swap axes and pretend the X is Y and
+	 * vice versa
+	 */
+	if (dy > dx) {
+		swap(x1, y1);
+		swap(x2, y2);
+		swap(dx, dy);
+		invert = true;
+	}
+
+	/*
+	 * Second, we need to make sure that we will be traversing
+	 * driving axis in the direction of increment so we swap point
+	 * 1 with point 2 if x1 is greater than x2
+	 */
+	if (x1 > x2) {
+		swap(x1, x2);
+		swap(y1, y2);
+	}
+
+	j   = y1;
+	eps = dy - dx;
+
+	for (i = x1; i <= x2 - 1; i++) {
+		if (!dash ||
+		    (++pixel % (2 * dash)) > dash) {
+			illuminate(sc->info,
+				   invert,
+				   j, i,
+				   r, g, b, a);
+		} else {
+			printf("NOT illuminating pixel: %d\n", pixel);
+		}
+
+		if (eps >= 0) {
+			j += 1;
+			eps -= dx;
+		}
+
+		eps += dy;
+	}
+}
+
+/**
+ * gl_draw_circle - draw a 2D circle with center at (x0, y0)
+ *
+ * @sc: screen to draw on
+ * @x0, @y0: coordinates of circle's center
+ * @radius: circle's radius
+ * @r, @g, @b, @a: circle's color
+
+ *
+ * gu_draw_circle() implements midpoint circle algorithm as can be
+ * found here:
+ *
+ * https://en.wikipedia.org/wiki/Midpoint_circle_algorithm
+ */
+void gu_draw_circle(struct screen *sc,
+		    int x0, int y0, int radius,
+		    u8 r, u8 g, u8 b, u8 a)
+{
+	int x = radius;
+	int y = 0;
+	int e = 0;
+
+	BUG_ON(x0 < 0 || y0 < 0 || radius < 0);
+
+	while (x >= y) {
+		 __illuminate(sc->info, x0 + x, y0 + y, r, g, b, a);
+		 __illuminate(sc->info, x0 + y, y0 + x, r, g, b, a);
+		 __illuminate(sc->info, x0 - y, y0 + x, r, g, b, a);
+		 __illuminate(sc->info, x0 - x, y0 + y, r, g, b, a);
+		 __illuminate(sc->info, x0 - x, y0 - y, r, g, b, a);
+		 __illuminate(sc->info, x0 - y, y0 - x, r, g, b, a);
+		 __illuminate(sc->info, x0 + y, y0 - x, r, g, b, a);
+		 __illuminate(sc->info, x0 + x, y0 - y, r, g, b, a);
+
+		 y += 1;
+		 e += 1 + 2 * y;
+
+		 if (2 * (e - x) + 1 > 0) {
+			 x -= 1;
+			 e += 1 - 2 * x;
+		 }
+	}
+}
diff --git a/lib/gui/Kconfig b/lib/gui/Kconfig
index eac9597..2625d9f 100644
--- a/lib/gui/Kconfig
+++ b/lib/gui/Kconfig
@@ -6,6 +6,9 @@ config IMAGE_RENDERER
 
 if IMAGE_RENDERER
 
+config 2D_PRIMITIVES
+       bool
+
 config BMP
 	bool "bmp"
 
diff --git a/lib/gui/Makefile b/lib/gui/Makefile
index d4b26c4..31e6622 100644
--- a/lib/gui/Makefile
+++ b/lib/gui/Makefile
@@ -3,3 +3,4 @@ obj-$(CONFIG_IMAGE_RENDERER)	+= image_renderer.o graphic_utils.o
 obj-$(CONFIG_PNG)	+= png.o
 obj-$(CONFIG_LODEPNG)	+= png_lode.o lodepng.o
 obj-$(CONFIG_PICOPNG)	+= png_pico.o picopng.o
+obj-$(CONFIG_2D_PRIMITIVES) += 2d-primitives.o
-- 
2.5.5


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 3/3] GUI: Add fbtest command
  2016-06-22  4:39 [PATCH 1/3] GUI: Add a function to draw solid rectangles Andrey Smirnov
  2016-06-22  4:39 ` [PATCH 2/3] GUI: Add code to draw simple graphics Andrey Smirnov
@ 2016-06-22  4:39 ` Andrey Smirnov
  2016-06-22 10:49   ` Antony Pavlov
                     ` (3 more replies)
  2016-06-23  7:28 ` [PATCH 1/3] GUI: Add a function to draw solid rectangles Holger Schurig
  2 siblings, 4 replies; 16+ messages in thread
From: Andrey Smirnov @ 2016-06-22  4:39 UTC (permalink / raw)
  To: barebox; +Cc: Andrey Smirnov, Andrey Gusakov

Add 'fbtest' - a command to produce test patterns on a screen

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Andrey Gusakov <andrey.gusakov@cogentembedded.com>
---
 commands/Kconfig  |   9 +++
 commands/Makefile |   1 +
 commands/fbtest.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 197 insertions(+)
 create mode 100644 commands/fbtest.c

diff --git a/commands/Kconfig b/commands/Kconfig
index 880cd45..107cc3e 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -1417,6 +1417,15 @@ config CMD_SPLASH
 		  -b COLOR	background color in 0xttrrggbb
 		  -o		render offscreen
 
+config CMD_FBTEST
+	bool
+	depends on VIDEO
+	select 2D_PRIMITIVES
+	prompt "FB test"
+	help
+	  Framebuffer test command that allows to produce a number of
+	  test patterns on the screen.
+
 config CMD_READLINE
 	tristate
 	prompt "readline"
diff --git a/commands/Makefile b/commands/Makefile
index b8c07f3..5a899ab 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -57,6 +57,7 @@ obj-$(CONFIG_CMD_HELP)		+= help.o
 obj-$(CONFIG_CMD_LSMOD)		+= lsmod.o
 obj-$(CONFIG_CMD_INSMOD)	+= insmod.o
 obj-$(CONFIG_CMD_SPLASH)	+= splash.o
+obj-$(CONFIG_CMD_FBTEST)	+= fbtest.o
 obj-$(CONFIG_USB_GADGET_DFU)	+= dfu.o
 obj-$(CONFIG_USB_GADGET_SERIAL)	+= usbserial.o
 obj-$(CONFIG_CMD_GPIO)		+= gpio.o
diff --git a/commands/fbtest.c b/commands/fbtest.c
new file mode 100644
index 0000000..cf80274
--- /dev/null
+++ b/commands/fbtest.c
@@ -0,0 +1,187 @@
+#include <common.h>
+#include <command.h>
+#include <errno.h>
+#include <malloc.h>
+#include <getopt.h>
+#include <fb.h>
+#include <gui/graphic_utils.h>
+#include <gui/2d-primitives.h>
+#include <linux/gcd.h>
+
+unsigned long int_sqrt(unsigned long x);
+
+static void fbtest_pattern_bars(struct screen *sc, u32 unused)
+{
+	int i;
+
+	const u32 xres = sc->info->xres;
+	const u32 yres = sc->info->yres;
+
+	const u32 colors[] =  {
+		0xFFFFFF, 	/* white */
+		0xFFFF00,	/* yellow */
+		0x00FFFF,	/* cyan */
+		0x00FF00,	/* green */
+		0xFF00FF,	/* magenta */
+		0xFF0000,	/* red */
+		0x0000FF,	/* blue */
+		0x000000,	/* black */
+	};
+
+	for (i = 0; i < ARRAY_SIZE(colors); i++) {
+		const u8 r = (colors[i] >> 16) & 0xff;
+		const u8 g = (colors[i] >>  8) & 0xff;
+		const u8 b = (colors[i] >>  0) & 0xff;
+		const int dx = xres / ARRAY_SIZE(colors);
+
+		gu_fill_rectangle(sc,
+				  i * dx, 0, (i + 1) * dx - 1, yres - 1,
+				  r, g, b, 0xff);
+	}
+}
+
+static void fbtest_pattern_geometry(struct screen *sc, u32 color)
+{
+	int i;
+
+	const u8 r = (color >> 16) & 0xff;
+	const u8 g = (color >>  8) & 0xff;
+	const u8 b = (color >>  0) & 0xff;
+
+	const u32 xres = sc->info->xres;
+	const u32 yres = sc->info->yres;
+
+	const u8 xcount = xres / gcd(xres, yres);
+	const u8 ycount = yres / gcd(xres, yres);
+
+	const struct {
+		int x1, y1, x2, y2;
+	} borders[] = {
+		{ 0,        0,        xres - 1, 0        },
+		{ xres - 1, 0,        xres - 1, yres - 1 },
+		{ 0,        yres - 1, xres - 1, yres - 1 },
+		{ 0,        0,        0,        yres - 1 },
+	};
+
+	const int R1 = min(xres, yres) / 2;
+	const int h  = xres * xres + yres * yres;
+	const int R2 = (int_sqrt(h) / 2 - R1) * 5 / 12;
+
+	const  struct {
+		int x0, y0, radius;
+	} circles[] = {
+		{ xres / 2,  yres / 2,  R1 - 1 },
+		{ R2,        R2,        R2 - 1 },
+		{ xres - R2, R2,        R2 - 1 },
+		{ xres - R2, yres - R2, R2 - 1 },
+		{ R2,        yres - R2, R2 - 1 }
+	};
+
+	void *buf = gui_screen_render_buffer(sc);
+
+	gu_memset_pixel(sc->info, buf, ~color,
+			sc->s.width * sc->s.height);
+
+	for (i = 0; i < ARRAY_SIZE(borders); i++)
+		gu_draw_line(sc,
+			     borders[i].x1, borders[i].y1,
+			     borders[i].x2, borders[i].y2,
+			     r, g, b, 0xff, 10);
+
+	for (i = 0; i < ARRAY_SIZE(circles); i++)
+		gu_draw_circle(sc,
+			       circles[i].x0, circles[i].y0,
+			       circles[i].radius,
+			       r, g, b, 0xff);
+
+	for (i = 1; i < ycount; i++) {
+		const int y = (yres - 1) * i / ycount;
+		gu_draw_line(sc,
+			     0, y, xres - 1, y,
+			     r, g, b, 0xff, 0);
+	}
+
+
+	for (i = 1; i < xcount; i++) {
+		const int x = (xres - 1) * i / xcount;
+		gu_draw_line(sc,
+			     x, 0, x, yres - 1,
+			     r, g, b, 0xff, 0);
+	}
+}
+
+static int do_fbtest(int argc, char *argv[])
+{
+	struct screen *sc;
+	int opt, i;
+	const char *pattern_name = NULL;
+	char *fbdev = "/dev/fb0";
+	void (*pattern) (struct screen *sc, u32 color) = NULL;
+	u32 color = 0xffffff;
+
+	struct {
+		const char *name;
+		void (*func) (struct screen *sc, u32 color);
+	} patterns[] = {
+		{ "geometry", fbtest_pattern_geometry },
+		{ "bars",     fbtest_pattern_bars     }
+	};
+
+	while((opt = getopt(argc, argv, "d:p:c:")) > 0) {
+		switch(opt) {
+		case 'd':
+			fbdev = optarg;
+			break;
+		case 'p':
+			pattern_name = optarg;
+			break;
+		case 'c':
+			color = simple_strtoul(optarg, NULL, 16);
+			break;
+		}
+	}
+
+	if (!pattern_name) {
+		printf("No pattern name specified\n");
+		return -EINVAL;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(patterns); i++)
+		if (!strcmp(pattern_name, patterns[i].name))
+			pattern = patterns[i].func;
+
+	if (!pattern) {
+		printf("Unknonw pattern: %s\n", pattern_name);
+		return -EINVAL;
+	}
+
+	sc = fb_open(fbdev);
+	if (IS_ERR(sc)) {
+		perror("fd_open");
+		return PTR_ERR(sc);
+	}
+
+	pattern(sc, color);
+
+	gu_screen_blit(sc);
+	fb_close(sc);
+
+	return 0;
+}
+
+BAREBOX_CMD_HELP_START(fbtest)
+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_END
+
+BAREBOX_CMD_START(fbtest)
+	.cmd		= do_fbtest,
+	BAREBOX_CMD_DESC("display a test pattern")
+	BAREBOX_CMD_OPTS("[-dcp]")
+	BAREBOX_CMD_GROUP(CMD_GRP_CONSOLE)
+	BAREBOX_CMD_HELP(cmd_fbtest_help)
+BAREBOX_CMD_END
-- 
2.5.5


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/3] GUI: Add fbtest command
  2016-06-22  4:39 ` [PATCH 3/3] GUI: Add fbtest command Andrey Smirnov
@ 2016-06-22 10:49   ` Antony Pavlov
  2016-06-24  4:50     ` Andrey Smirnov
  2016-06-22 10:57   ` Antony Pavlov
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 16+ messages in thread
From: Antony Pavlov @ 2016-06-22 10:49 UTC (permalink / raw)
  To: Andrey Smirnov; +Cc: barebox, Andrey Gusakov

On Tue, 21 Jun 2016 21:39:29 -0700
Andrey Smirnov <andrew.smirnov@gmail.com> wrote:

> Add 'fbtest' - a command to produce test patterns on a screen
                                                    ^^^^^^^^^^^ "on A screen" here


...

> --- a/commands/Kconfig
> +++ b/commands/Kconfig
> @@ -1417,6 +1417,15 @@ config CMD_SPLASH
>  		  -b COLOR	background color in 0xttrrggbb
>  		  -o		render offscreen
>  
> +config CMD_FBTEST
> +	bool
> +	depends on VIDEO
> +	select 2D_PRIMITIVES
> +	prompt "FB test"
> +	help
> +	  Framebuffer test command that allows to produce a number of
> +	  test patterns on the screen.
                        ^^^^^^^^^^^^^ "on THE screen" here

Can you fix this inconsistency, please?

-- 
Best regards,
  Antony Pavlov

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/3] GUI: Add fbtest command
  2016-06-22  4:39 ` [PATCH 3/3] GUI: Add fbtest command Andrey Smirnov
  2016-06-22 10:49   ` Antony Pavlov
@ 2016-06-22 10:57   ` Antony Pavlov
  2016-06-24  3:18     ` Andrey Smirnov
  2016-06-23  6:22   ` Sascha Hauer
  2016-06-23  7:31   ` Holger Schurig
  3 siblings, 1 reply; 16+ messages in thread
From: Antony Pavlov @ 2016-06-22 10:57 UTC (permalink / raw)
  To: Andrey Smirnov; +Cc: barebox, Andrey Gusakov

On Tue, 21 Jun 2016 21:39:29 -0700
Andrey Smirnov <andrew.smirnov@gmail.com> wrote:

> Add 'fbtest' - a command to produce test patterns on a screen
> 
> Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
> Signed-off-by: Andrey Gusakov <andrey.gusakov@cogentembedded.com>
> ---
>  commands/Kconfig  |   9 +++
>  commands/Makefile |   1 +
>  commands/fbtest.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 197 insertions(+)
>  create mode 100644 commands/fbtest.c
> 
> diff --git a/commands/Kconfig b/commands/Kconfig
> index 880cd45..107cc3e 100644
> --- a/commands/Kconfig
> +++ b/commands/Kconfig
> @@ -1417,6 +1417,15 @@ config CMD_SPLASH
>  		  -b COLOR	background color in 0xttrrggbb
>  		  -o		render offscreen
>  
> +config CMD_FBTEST
> +	bool
> +	depends on VIDEO
> +	select 2D_PRIMITIVES
> +	prompt "FB test"
> +	help
> +	  Framebuffer test command that allows to produce a number of
> +	  test patterns on the screen.
> +
>  config CMD_READLINE
>  	tristate
>  	prompt "readline"
> diff --git a/commands/Makefile b/commands/Makefile
> index b8c07f3..5a899ab 100644
> --- a/commands/Makefile
> +++ b/commands/Makefile
> @@ -57,6 +57,7 @@ obj-$(CONFIG_CMD_HELP)		+= help.o
>  obj-$(CONFIG_CMD_LSMOD)		+= lsmod.o
>  obj-$(CONFIG_CMD_INSMOD)	+= insmod.o
>  obj-$(CONFIG_CMD_SPLASH)	+= splash.o
> +obj-$(CONFIG_CMD_FBTEST)	+= fbtest.o
>  obj-$(CONFIG_USB_GADGET_DFU)	+= dfu.o
>  obj-$(CONFIG_USB_GADGET_SERIAL)	+= usbserial.o
>  obj-$(CONFIG_CMD_GPIO)		+= gpio.o
> diff --git a/commands/fbtest.c b/commands/fbtest.c
> new file mode 100644
> index 0000000..cf80274
> --- /dev/null
> +++ b/commands/fbtest.c
> @@ -0,0 +1,187 @@
> +#include <common.h>
> +#include <command.h>
> +#include <errno.h>
> +#include <malloc.h>
> +#include <getopt.h>
> +#include <fb.h>
> +#include <gui/graphic_utils.h>
> +#include <gui/2d-primitives.h>
> +#include <linux/gcd.h>
> +
> +unsigned long int_sqrt(unsigned long x);

the int_sqrt() function is defined in the drivers/video/edid.c file.
To use it we have to keep CONFIG_DRIVER_VIDEO_EDID enabled.
But I have see no measures on enabling CONFIG_DRIVER_VIDEO_EDID in your patch.
Have I missed something?

Can we move int_sqrt() in a separate C library file,
so edid.c and fbtest.c can both use it?

-- 
Best regards,
  Antony Pavlov

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/3] GUI: Add fbtest command
  2016-06-22  4:39 ` [PATCH 3/3] GUI: Add fbtest command Andrey Smirnov
  2016-06-22 10:49   ` Antony Pavlov
  2016-06-22 10:57   ` Antony Pavlov
@ 2016-06-23  6:22   ` Sascha Hauer
  2016-06-24  3:21     ` Andrey Smirnov
  2016-06-23  7:31   ` Holger Schurig
  3 siblings, 1 reply; 16+ messages in thread
From: Sascha Hauer @ 2016-06-23  6:22 UTC (permalink / raw)
  To: Andrey Smirnov; +Cc: barebox, Andrey Gusakov

On Tue, Jun 21, 2016 at 09:39:29PM -0700, Andrey Smirnov wrote:
> Add 'fbtest' - a command to produce test patterns on a screen
> 
> Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
> Signed-off-by: Andrey Gusakov <andrey.gusakov@cogentembedded.com>
> ---
>  commands/Kconfig  |   9 +++
>  commands/Makefile |   1 +
>  commands/fbtest.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 197 insertions(+)
>  create mode 100644 commands/fbtest.c
> 
> diff --git a/commands/Kconfig b/commands/Kconfig
> index 880cd45..107cc3e 100644
> --- a/commands/Kconfig
> +++ b/commands/Kconfig
> @@ -1417,6 +1417,15 @@ config CMD_SPLASH
>  		  -b COLOR	background color in 0xttrrggbb
>  		  -o		render offscreen
>  

> +
> +static int do_fbtest(int argc, char *argv[])
> +{
> +	struct screen *sc;
> +	int opt, i;
> +	const char *pattern_name = NULL;
> +	char *fbdev = "/dev/fb0";
> +	void (*pattern) (struct screen *sc, u32 color) = NULL;
> +	u32 color = 0xffffff;
> +
> +	struct {
> +		const char *name;
> +		void (*func) (struct screen *sc, u32 color);
> +	} patterns[] = {
> +		{ "geometry", fbtest_pattern_geometry },
> +		{ "bars",     fbtest_pattern_bars     }
> +	};
> +
> +	while((opt = getopt(argc, argv, "d:p:c:")) > 0) {
> +		switch(opt) {
> +		case 'd':
> +			fbdev = optarg;
> +			break;
> +		case 'p':
> +			pattern_name = optarg;
> +			break;
> +		case 'c':
> +			color = simple_strtoul(optarg, NULL, 16);
> +			break;
> +		}
> +	}
> +
> +	if (!pattern_name) {
> +		printf("No pattern name specified\n");
> +		return -EINVAL;
> +	}

Maybe we can iterate over the patterns if no pattern is given like the
Linux variant does?

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 1/3] GUI: Add a function to draw solid rectangles
  2016-06-22  4:39 [PATCH 1/3] GUI: Add a function to draw solid rectangles Andrey Smirnov
  2016-06-22  4:39 ` [PATCH 2/3] GUI: Add code to draw simple graphics Andrey Smirnov
  2016-06-22  4:39 ` [PATCH 3/3] GUI: Add fbtest command Andrey Smirnov
@ 2016-06-23  7:28 ` Holger Schurig
  2016-06-24  5:00   ` Andrey Smirnov
  2 siblings, 1 reply; 16+ messages in thread
From: Holger Schurig @ 2016-06-23  7:28 UTC (permalink / raw)
  To: Andrey Smirnov, barebox

Hi,

is it rectanges or circles?  :-)

> Subject: Re: [PATCH 1/3] GUI: Add a function to draw solid rectangles
                                                             ^^^^^^^^^^
> Add a routine implementing midpoint circle algorithm

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 2/3] GUI: Add code to draw simple graphics
  2016-06-22  4:39 ` [PATCH 2/3] GUI: Add code to draw simple graphics Andrey Smirnov
@ 2016-06-23  7:30   ` Holger Schurig
  2016-06-24  4:57     ` Andrey Smirnov
  0 siblings, 1 reply; 16+ messages in thread
From: Holger Schurig @ 2016-06-23  7:30 UTC (permalink / raw)
  To: Andrey Smirnov, barebox

> +config 2D_PRIMITIVES
> +       bool
> +

Why no help text?   With help text, it will be discoverable in "make
xconfig".

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/3] GUI: Add fbtest command
  2016-06-22  4:39 ` [PATCH 3/3] GUI: Add fbtest command Andrey Smirnov
                     ` (2 preceding siblings ...)
  2016-06-23  6:22   ` Sascha Hauer
@ 2016-06-23  7:31   ` Holger Schurig
  2016-06-23  9:28     ` Sascha Hauer
  2016-06-24  4:49     ` Andrey Smirnov
  3 siblings, 2 replies; 16+ messages in thread
From: Holger Schurig @ 2016-06-23  7:31 UTC (permalink / raw)
  To: Andrey Smirnov, barebox; +Cc: Andrey Gusakov

I'm unsure if an "fbtest" command will be helpful.

Why don't you expose the various primitives (lines, circles, lines) with
some commands?  Then people could use this in their boot scripts,
including the equivalent of an fbtest program.

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/3] GUI: Add fbtest command
  2016-06-23  7:31   ` Holger Schurig
@ 2016-06-23  9:28     ` Sascha Hauer
  2016-06-24  4:49     ` Andrey Smirnov
  1 sibling, 0 replies; 16+ messages in thread
From: Sascha Hauer @ 2016-06-23  9:28 UTC (permalink / raw)
  To: Holger Schurig; +Cc: Andrey Smirnov, barebox, Andrey Gusakov

On Thu, Jun 23, 2016 at 09:31:44AM +0200, Holger Schurig wrote:
> I'm unsure if an "fbtest" command will be helpful.
> 
> Why don't you expose the various primitives (lines, circles, lines) with
> some commands?  Then people could use this in their boot scripts,
> including the equivalent of an fbtest program.

I for myself would prefer a fbtest command over drawing primitives, at
least when it includes some coloured boxes from which I know which
colour thy shall have. Anyway, I wouldn't recommend implementing fbtest
as a script.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/3] GUI: Add fbtest command
  2016-06-22 10:57   ` Antony Pavlov
@ 2016-06-24  3:18     ` Andrey Smirnov
  0 siblings, 0 replies; 16+ messages in thread
From: Andrey Smirnov @ 2016-06-24  3:18 UTC (permalink / raw)
  To: Antony Pavlov; +Cc: barebox, Andrey Gusakov

>
> the int_sqrt() function is defined in the drivers/video/edid.c file.
> To use it we have to keep CONFIG_DRIVER_VIDEO_EDID enabled.
> But I have see no measures on enabling CONFIG_DRIVER_VIDEO_EDID in your patch.
> Have I missed something?

Nope, I missed this function and forgot to deal with it properly.

>
> Can we move int_sqrt() in a separate C library file,
> so edid.c and fbtest.c can both use it?

Absolutely, will fix in v2

Thanks,
Andrey

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/3] GUI: Add fbtest command
  2016-06-23  6:22   ` Sascha Hauer
@ 2016-06-24  3:21     ` Andrey Smirnov
  0 siblings, 0 replies; 16+ messages in thread
From: Andrey Smirnov @ 2016-06-24  3:21 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox, Andrey Gusakov

On Wed, Jun 22, 2016 at 11:22 PM, Sascha Hauer <s.hauer@pengutronix.de> wrote:
> On Tue, Jun 21, 2016 at 09:39:29PM -0700, Andrey Smirnov wrote:
>> Add 'fbtest' - a command to produce test patterns on a screen
>>
>> Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
>> Signed-off-by: Andrey Gusakov <andrey.gusakov@cogentembedded.com>
>> ---
>>  commands/Kconfig  |   9 +++
>>  commands/Makefile |   1 +
>>  commands/fbtest.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 197 insertions(+)
>>  create mode 100644 commands/fbtest.c
>>
>> diff --git a/commands/Kconfig b/commands/Kconfig
>> index 880cd45..107cc3e 100644
>> --- a/commands/Kconfig
>> +++ b/commands/Kconfig
>> @@ -1417,6 +1417,15 @@ config CMD_SPLASH
>>                 -b COLOR      background color in 0xttrrggbb
>>                 -o            render offscreen
>>
>
>> +
>> +static int do_fbtest(int argc, char *argv[])
>> +{
>> +     struct screen *sc;
>> +     int opt, i;
>> +     const char *pattern_name = NULL;
>> +     char *fbdev = "/dev/fb0";
>> +     void (*pattern) (struct screen *sc, u32 color) = NULL;
>> +     u32 color = 0xffffff;
>> +
>> +     struct {
>> +             const char *name;
>> +             void (*func) (struct screen *sc, u32 color);
>> +     } patterns[] = {
>> +             { "geometry", fbtest_pattern_geometry },
>> +             { "bars",     fbtest_pattern_bars     }
>> +     };
>> +
>> +     while((opt = getopt(argc, argv, "d:p:c:")) > 0) {
>> +             switch(opt) {
>> +             case 'd':
>> +                     fbdev = optarg;
>> +                     break;
>> +             case 'p':
>> +                     pattern_name = optarg;
>> +                     break;
>> +             case 'c':
>> +                     color = simple_strtoul(optarg, NULL, 16);
>> +                     break;
>> +             }
>> +     }
>> +
>> +     if (!pattern_name) {
>> +             printf("No pattern name specified\n");
>> +             return -EINVAL;
>> +     }
>
> Maybe we can iterate over the patterns if no pattern is given like the
> Linux variant does?
>

I like this idea, I wasn't able to find the source code of a fbtest
version that does that, so I am not sure if I'll match the behavior
exactly. I'll make it loop over patterns and wait for Ctrl-C in v2 if
no pattern is given.

Thanks,
Andrey

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/3] GUI: Add fbtest command
  2016-06-23  7:31   ` Holger Schurig
  2016-06-23  9:28     ` Sascha Hauer
@ 2016-06-24  4:49     ` Andrey Smirnov
  1 sibling, 0 replies; 16+ messages in thread
From: Andrey Smirnov @ 2016-06-24  4:49 UTC (permalink / raw)
  To: Holger Schurig; +Cc: barebox, Andrey Gusakov

On Thu, Jun 23, 2016 at 12:31 AM, Holger Schurig
<holgerschurig@gmail.com> wrote:
> I'm unsure if an "fbtest" command will be helpful.
>
> Why don't you expose the various primitives (lines, circles, lines) with
> some commands?  Then people could use this in their boot scripts,
> including the equivalent of an fbtest program.

I don't have a use-case for developing a drawing framework like you
describe, I do however have a use-case for "fbtest" command where it
is being used for manufacturing testing. I also am of the opinion that
expressing algorithms like that would be better in C rather in hush
script.

Thanks,
Andrey Smirnov

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/3] GUI: Add fbtest command
  2016-06-22 10:49   ` Antony Pavlov
@ 2016-06-24  4:50     ` Andrey Smirnov
  0 siblings, 0 replies; 16+ messages in thread
From: Andrey Smirnov @ 2016-06-24  4:50 UTC (permalink / raw)
  To: Antony Pavlov; +Cc: barebox, Andrey Gusakov

On Wed, Jun 22, 2016 at 3:49 AM, Antony Pavlov <antonynpavlov@gmail.com> wrote:
> On Tue, 21 Jun 2016 21:39:29 -0700
> Andrey Smirnov <andrew.smirnov@gmail.com> wrote:
>
>> Add 'fbtest' - a command to produce test patterns on a screen
>                                                     ^^^^^^^^^^^ "on A screen" here
>
>
> ...
>
>> --- a/commands/Kconfig
>> +++ b/commands/Kconfig
>> @@ -1417,6 +1417,15 @@ config CMD_SPLASH
>>                 -b COLOR      background color in 0xttrrggbb
>>                 -o            render offscreen
>>
>> +config CMD_FBTEST
>> +     bool
>> +     depends on VIDEO
>> +     select 2D_PRIMITIVES
>> +     prompt "FB test"
>> +     help
>> +       Framebuffer test command that allows to produce a number of
>> +       test patterns on the screen.
>                         ^^^^^^^^^^^^^ "on THE screen" here
>
> Can you fix this inconsistency, please?
>

Sure, will fix in v2.

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 2/3] GUI: Add code to draw simple graphics
  2016-06-23  7:30   ` Holger Schurig
@ 2016-06-24  4:57     ` Andrey Smirnov
  0 siblings, 0 replies; 16+ messages in thread
From: Andrey Smirnov @ 2016-06-24  4:57 UTC (permalink / raw)
  To: Holger Schurig; +Cc: barebox

On Thu, Jun 23, 2016 at 12:30 AM, Holger Schurig
<holgerschurig@gmail.com> wrote:
>> +config 2D_PRIMITIVES
>> +       bool
>> +
>
> Why no help text?   With help text, it will be discoverable in "make
> xconfig".

It's an internal configuration symbol meant to be specified as a
dependency of other configuration options (other examples of such
options would be OFTREE or DTC). There's no benefit in exposing that
symbol to a user.

Thanks,
Andrey

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 1/3] GUI: Add a function to draw solid rectangles
  2016-06-23  7:28 ` [PATCH 1/3] GUI: Add a function to draw solid rectangles Holger Schurig
@ 2016-06-24  5:00   ` Andrey Smirnov
  0 siblings, 0 replies; 16+ messages in thread
From: Andrey Smirnov @ 2016-06-24  5:00 UTC (permalink / raw)
  To: Holger Schurig; +Cc: barebox

On Thu, Jun 23, 2016 at 12:28 AM, Holger Schurig
<holgerschurig@gmail.com> wrote:
> Hi,
>
> is it rectanges or circles?  :-)
>

Oops, my bad. Thanks for noticing!

>> Subject: Re: [PATCH 1/3] GUI: Add a function to draw solid rectangles
>                                                              ^^^^^^^^^^
>> Add a routine implementing midpoint circle algorithm

I am not sure why you highlighted "function" there. What am I missing?

Thanks,
Andrey

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2016-06-24  5:00 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-22  4:39 [PATCH 1/3] GUI: Add a function to draw solid rectangles Andrey Smirnov
2016-06-22  4:39 ` [PATCH 2/3] GUI: Add code to draw simple graphics Andrey Smirnov
2016-06-23  7:30   ` Holger Schurig
2016-06-24  4:57     ` Andrey Smirnov
2016-06-22  4:39 ` [PATCH 3/3] GUI: Add fbtest command Andrey Smirnov
2016-06-22 10:49   ` Antony Pavlov
2016-06-24  4:50     ` Andrey Smirnov
2016-06-22 10:57   ` Antony Pavlov
2016-06-24  3:18     ` Andrey Smirnov
2016-06-23  6:22   ` Sascha Hauer
2016-06-24  3:21     ` Andrey Smirnov
2016-06-23  7:31   ` Holger Schurig
2016-06-23  9:28     ` Sascha Hauer
2016-06-24  4:49     ` Andrey Smirnov
2016-06-23  7:28 ` [PATCH 1/3] GUI: Add a function to draw solid rectangles Holger Schurig
2016-06-24  5:00   ` Andrey Smirnov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox