From 1b6f92da6b7c4649804213f1c07032aad7eb8364 Mon Sep 17 00:00:00 2001 From: Florian Loeffler Date: Mon, 2 May 2022 18:08:45 +0200 Subject: [PATCH] separated main and lib --- .fblib.c.swp | Bin 0 -> 20480 bytes .fblib.h.swp | Bin 0 -> 12288 bytes .gitignore | 1 + Makefile | 9 ++- fbdash | Bin 0 -> 17268 bytes fbdash.c | 113 ++++++++++++++++++++++++++++++++++ fblib.c | 168 +++++++++++++++++++++++++++++++++++++++++++++++++++ fblib.h | 48 +++++++++++++++ 8 files changed, 336 insertions(+), 3 deletions(-) create mode 100644 .fblib.c.swp create mode 100644 .fblib.h.swp create mode 100755 fbdash create mode 100644 fbdash.c create mode 100644 fblib.c create mode 100644 fblib.h diff --git a/.fblib.c.swp b/.fblib.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..a4e571778d273224d9f3ce62c99dd7471d1f6e98 GIT binary patch literal 20480 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 F&Yx|J+s_f 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 y) + { + // top left + put_pixel(fbp, -y + x0, -x + y0, r, g, b); + // top right + put_pixel(fbp, y + x0, -x + y0, r, g, b); + // upper middle left + put_pixel(fbp, -x + x0, -y + y0, r, g, b); + // upper middle right + put_pixel(fbp, x + x0, -y + y0, r, g, b); + // lower middle left + put_pixel(fbp, -x + x0, y + y0, r, g, b); + // lower middle right + put_pixel(fbp, x + x0, y + y0, r, g, b); + // bottom left + put_pixel(fbp, -y + x0, x + y0, r, g, b); + // bottom right + put_pixel(fbp, y + x0, x + y0, r, g, b); + + y++; + if (radiusError < 0) + { + radiusError += 2 * y + 1; + } else { + x--; + radiusError+= 2 * (y - x + 1); + } + } +} + +// helper function to draw a filled circle in given color +// (uses Bresenham's circle algorithm) +void fill_circle(char *fbp, int x0, int y0, int radius, int r, int g, int b) { + int x = radius; + int y = 0; + int radiusError = 1 - x; + + while(x >= y) + { + // top + draw_line(fbp, -y + x0, -x + y0, y + x0, -x + y0, r, g, b); + // upper middle + draw_line(fbp, -x + x0, -y + y0, x + x0, -y + y0, r, g, b); + // lower middle + draw_line(fbp, -x + x0, y + y0, x + x0, y + y0, r, g, b); + // bottom + draw_line(fbp, -y + x0, x + y0, y + x0, x + y0, r, g, b); + + y++; + if (radiusError < 0) + { + radiusError += 2 * y + 1; + } else { + x--; + radiusError+= 2 * (y - x + 1); + } + } +} + +// helper function to clear the screen - fill whole +// screen with given color +void clear_screen(char *fbp) { + //memset(fbp, 0, vinfo.xres * vinfo.yres * 2); // 16Bit = 8Bit * 2 + memset(fbp, 0, WIDTH * HEIGHT * 2); // 16Bit = 8Bit * 2 +} + +// helper function to draw a line in given color +// (uses Bresenham's line algorithm) +void draw_line(char *fbp, int x0, int y0, int x1, int y1, int r, int g, int b) { + int dx = x1 - x0; + dx = (dx >= 0) ? dx : -dx; // abs() + int dy = y1 - y0; + dy = (dy >= 0) ? dy : -dy; // abs() + int sx; + int sy; + if (x0 < x1) + sx = 1; + else + sx = -1; + if (y0 < y1) + sy = 1; + else + sy = -1; + int err = dx - dy; + int e2; + int done = 0; + while (!done) { + put_pixel(fbp, x0, y0, r, g, b); + if ((x0 == x1) && (y0 == y1)) + done = 1; + else { + e2 = 2 * err; + if (e2 > -dy) { + err = err - dy; + x0 = x0 + sx; + } + if (e2 < dx) { + err = err + dx; + y0 = y0 + sy; + } + } + } +} diff --git a/fblib.h b/fblib.h new file mode 100644 index 0000000..07ffbf1 --- /dev/null +++ b/fblib.h @@ -0,0 +1,48 @@ +/* + * fblib.h + * + * Adapted by Florian Klemenz for use in the fb_dash project + * + * Source and all credit goes to + * http://raspberrycompote.blogspot.ie/2014/03/low-level-graphics-on-raspberry-pi-part_14.html + * + * Original work by J-P Rosti (a.k.a -rst- and 'Raspberry Compote') + * + * Licensed under the Creative Commons Attribution 3.0 Unported License + * (http://creativecommons.org/licenses/by/3.0/deed.en_US) + * + * Distributed in the hope that this will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + + +#ifndef FBLIB_H +#define FBLIB_H + +#include +#include +#include +#include +#include +#include +#include +#include + + +#define WIDTH 240 +#define HEIGHT 320 + +void put_pixel(char *fbp, int x, int y, int r, int g, int b); +void clear_screen(char *fbp); + +void draw_line(char *fbp, int x0, int y0, int x1, int y1, int r, int g, int b); + +void draw_rect(char *fbp, int x0, int y0, int w, int h, int r, int g, int b); +void fill_rect(char *fbp, int x, int y, int w, int h, int r, int g, int b); + +void draw_circle(char *fbp, int x0, int y0, int radius, int r, int g, int b); +void fill_circle(char *fbp, int x0, int y0, int radius, int r, int g, int b); + +#endif