* [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
* 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 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
* [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 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 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 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-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 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-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-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 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 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