Skip to content
Snippets Groups Projects
Commit 14d5abcc authored by Philip Stewart's avatar Philip Stewart Committed by rahix
Browse files

fix(gfx/display): Draw partially clipped primitives

Fix two bugs in the display/gfx module:

1. The animation of the simple_menu used in the main menu had the issue
   that there is a black line visible at the top.  This is due the
   gfx_puts method ignoring lines, where the top pixel of the string is
   above the top of the screen.  As gfx_puts uses gfx_setpixel which in
   turn ignores pixels outside of the screen, remove the check in
   gfx_puts.
2. X and Y coordinates were cast to unsigned-ints before being given to
   the gfx-library which means calls like circ(0, -10, 30) would be draw
   at coordinates like [0,65526].  Fix this by changing the data-type of
   all coordinates to signed-integers.

Also remove the x and y ranges from the documentation of the individual
python functions and instead add a general documentation about the
screen and it's size/coordinate system.
parent d926fa5d
No related branches found
No related tags found
No related merge requests found
``display`` - Display ``display`` - Display
===================== =====================
The display module let's you draw on the card10's display.
Pixels are addressed from top left to bottom right with a range of x: 0 to 159 and y: 0 to 79.
.. code-block:: text
0,0
+---------------------+
| |
| |
| |
| |
+---------------------+
159,79
Drawing operations are clipped, pixels outside of the screen will be ignored.
.. automodule:: display .. automodule:: display
:members: :members:
...@@ -1327,8 +1327,8 @@ API(API_DISP_UPDATE, int epic_disp_update()); ...@@ -1327,8 +1327,8 @@ API(API_DISP_UPDATE, int epic_disp_update());
/** /**
* Prints a string into the display framebuffer * Prints a string into the display framebuffer
* *
* :param posx: x position to print to. 0 <= x <= 160 * :param posx: x position to print to.
* :param posy: y position to print to. 0 <= y <= 80 * :param posy: y position to print to.
* :param pString: string to print * :param pString: string to print
* :param fg: foreground color in rgb565 * :param fg: foreground color in rgb565
* :param bg: background color in rgb565 * :param bg: background color in rgb565
...@@ -1338,8 +1338,8 @@ API(API_DISP_UPDATE, int epic_disp_update()); ...@@ -1338,8 +1338,8 @@ API(API_DISP_UPDATE, int epic_disp_update());
*/ */
API(API_DISP_PRINT, API(API_DISP_PRINT,
int epic_disp_print( int epic_disp_print(
uint16_t posx, int16_t posx,
uint16_t posy, int16_t posy,
const char *pString, const char *pString,
uint16_t fg, uint16_t fg,
uint16_t bg) uint16_t bg)
...@@ -1360,8 +1360,8 @@ enum disp_font_name { ...@@ -1360,8 +1360,8 @@ enum disp_font_name {
* Prints a string into the display framebuffer with font type selectable * Prints a string into the display framebuffer with font type selectable
* *
* :param fontName: number of font, use FontName enum * :param fontName: number of font, use FontName enum
* :param posx: x position to print to. 0 <= x <= 160 * :param posx: x position to print to.
* :param posy: y position to print to. 0 <= y <= 80 * :param posy: y position to print to.
* :param pString: string to print * :param pString: string to print
* :param fg: foreground color in rgb565 * :param fg: foreground color in rgb565
* :param bg: background color in rgb565, no background is drawn if bg==fg * :param bg: background color in rgb565, no background is drawn if bg==fg
...@@ -1371,8 +1371,8 @@ enum disp_font_name { ...@@ -1371,8 +1371,8 @@ enum disp_font_name {
*/ */
API(API_DISP_PRINT_ADV, int epic_disp_print_adv( API(API_DISP_PRINT_ADV, int epic_disp_print_adv(
uint8_t font, uint8_t font,
uint16_t posx, int16_t posx,
uint16_t posy, int16_t posy,
const char *pString, const char *pString,
uint16_t fg, uint16_t fg,
uint16_t bg uint16_t bg
...@@ -1391,24 +1391,24 @@ API(API_DISP_CLEAR, int epic_disp_clear(uint16_t color)); ...@@ -1391,24 +1391,24 @@ API(API_DISP_CLEAR, int epic_disp_clear(uint16_t color));
/** /**
* Draws a pixel on the display * Draws a pixel on the display
* *
* :param x: x position; 0 <= x <= 160 * :param x: x position;
* :param y: y position; 0 <= y <= 80 * :param y: y position;
* :param color: pixel color in rgb565 * :param color: pixel color in rgb565
* :return: ``0`` on success or a negative value in case of an error: * :return: ``0`` on success or a negative value in case of an error:
* *
* - ``-EBUSY``: Display was already locked from another task. * - ``-EBUSY``: Display was already locked from another task.
*/ */
API(API_DISP_PIXEL, int epic_disp_pixel( API(API_DISP_PIXEL, int epic_disp_pixel(
uint16_t x, uint16_t y, uint16_t color int16_t x, int16_t y, uint16_t color
)); ));
/** /**
* Draws a line on the display * Draws a line on the display
* *
* :param xstart: x starting position; 0 <= x <= 160 * :param xstart: x starting position
* :param ystart: y starting position; 0 <= y <= 80 * :param ystart: y starting position
* :param xend: x ending position; 0 <= x <= 160 * :param xend: x ending position
* :param yend: y ending position; 0 <= y <= 80 * :param yend: y ending position
* :param color: line color in rgb565 * :param color: line color in rgb565
* :param linestyle: 0 for solid, 1 for dottet (almost no visual difference) * :param linestyle: 0 for solid, 1 for dottet (almost no visual difference)
* :param pixelsize: thickness of the line; 1 <= pixelsize <= 8 * :param pixelsize: thickness of the line; 1 <= pixelsize <= 8
...@@ -1417,10 +1417,10 @@ API(API_DISP_PIXEL, int epic_disp_pixel( ...@@ -1417,10 +1417,10 @@ API(API_DISP_PIXEL, int epic_disp_pixel(
* - ``-EBUSY``: Display was already locked from another task. * - ``-EBUSY``: Display was already locked from another task.
*/ */
API(API_DISP_LINE, int epic_disp_line( API(API_DISP_LINE, int epic_disp_line(
uint16_t xstart, int16_t xstart,
uint16_t ystart, int16_t ystart,
uint16_t xend, int16_t xend,
uint16_t yend, int16_t yend,
uint16_t color, uint16_t color,
enum disp_linestyle linestyle, enum disp_linestyle linestyle,
uint16_t pixelsize uint16_t pixelsize
...@@ -1429,10 +1429,10 @@ API(API_DISP_LINE, int epic_disp_line( ...@@ -1429,10 +1429,10 @@ API(API_DISP_LINE, int epic_disp_line(
/** /**
* Draws a rectangle on the display * Draws a rectangle on the display
* *
* :param xstart: x coordinate of top left corner; 0 <= x <= 160 * :param xstart: x coordinate of top left corner
* :param ystart: y coordinate of top left corner; 0 <= y <= 80 * :param ystart: y coordinate of top left corner
* :param xend: x coordinate of bottom right corner; 0 <= x <= 160 * :param xend: x coordinate of bottom right corner
* :param yend: y coordinate of bottom right corner; 0 <= y <= 80 * :param yend: y coordinate of bottom right corner
* :param color: line color in rgb565 * :param color: line color in rgb565
* :param fillstyle: 0 for empty, 1 for filled * :param fillstyle: 0 for empty, 1 for filled
* :param pixelsize: thickness of the rectangle outline; 1 <= pixelsize <= 8 * :param pixelsize: thickness of the rectangle outline; 1 <= pixelsize <= 8
...@@ -1441,10 +1441,10 @@ API(API_DISP_LINE, int epic_disp_line( ...@@ -1441,10 +1441,10 @@ API(API_DISP_LINE, int epic_disp_line(
* - ``-EBUSY``: Display was already locked from another task. * - ``-EBUSY``: Display was already locked from another task.
*/ */
API(API_DISP_RECT, int epic_disp_rect( API(API_DISP_RECT, int epic_disp_rect(
uint16_t xstart, int16_t xstart,
uint16_t ystart, int16_t ystart,
uint16_t xend, int16_t xend,
uint16_t yend, int16_t yend,
uint16_t color, uint16_t color,
enum disp_fillstyle fillstyle, enum disp_fillstyle fillstyle,
uint16_t pixelsize uint16_t pixelsize
...@@ -1464,8 +1464,8 @@ API(API_DISP_RECT, int epic_disp_rect( ...@@ -1464,8 +1464,8 @@ API(API_DISP_RECT, int epic_disp_rect(
* - ``-EBUSY``: Display was already locked from another task. * - ``-EBUSY``: Display was already locked from another task.
*/ */
API(API_DISP_CIRC, int epic_disp_circ( API(API_DISP_CIRC, int epic_disp_circ(
uint16_t x, int16_t x,
uint16_t y, int16_t y,
uint16_t rad, uint16_t rad,
uint16_t color, uint16_t color,
enum disp_fillstyle fillstyle, enum disp_fillstyle fillstyle,
......
...@@ -22,8 +22,8 @@ static int check_lock() ...@@ -22,8 +22,8 @@ static int check_lock()
} }
int epic_disp_print( int epic_disp_print(
uint16_t posx, int16_t posx,
uint16_t posy, int16_t posy,
const char *pString, const char *pString,
uint16_t fg, uint16_t fg,
uint16_t bg uint16_t bg
...@@ -39,8 +39,8 @@ static const sFONT *font_map[] = { ...@@ -39,8 +39,8 @@ static const sFONT *font_map[] = {
int epic_disp_print_adv( int epic_disp_print_adv(
uint8_t font, uint8_t font,
uint16_t posx, int16_t posx,
uint16_t posy, int16_t posy,
const char *pString, const char *pString,
uint16_t fg, uint16_t fg,
uint16_t bg uint16_t bg
...@@ -76,7 +76,7 @@ int epic_disp_clear(uint16_t color) ...@@ -76,7 +76,7 @@ int epic_disp_clear(uint16_t color)
} }
} }
int epic_disp_pixel(uint16_t x, uint16_t y, uint16_t color) int epic_disp_pixel(int16_t x, int16_t y, uint16_t color)
{ {
int cl = check_lock(); int cl = check_lock();
if (cl < 0) { if (cl < 0) {
...@@ -88,10 +88,10 @@ int epic_disp_pixel(uint16_t x, uint16_t y, uint16_t color) ...@@ -88,10 +88,10 @@ int epic_disp_pixel(uint16_t x, uint16_t y, uint16_t color)
} }
int epic_disp_line( int epic_disp_line(
uint16_t xstart, int16_t xstart,
uint16_t ystart, int16_t ystart,
uint16_t xend, int16_t xend,
uint16_t yend, int16_t yend,
uint16_t color, uint16_t color,
enum disp_linestyle linestyle, enum disp_linestyle linestyle,
uint16_t pixelsize uint16_t pixelsize
...@@ -115,10 +115,10 @@ int epic_disp_line( ...@@ -115,10 +115,10 @@ int epic_disp_line(
} }
int epic_disp_rect( int epic_disp_rect(
uint16_t xstart, int16_t xstart,
uint16_t ystart, int16_t ystart,
uint16_t xend, int16_t xend,
uint16_t yend, int16_t yend,
uint16_t color, uint16_t color,
enum disp_fillstyle fillstyle, enum disp_fillstyle fillstyle,
uint16_t pixelsize uint16_t pixelsize
...@@ -154,8 +154,8 @@ int epic_disp_rect( ...@@ -154,8 +154,8 @@ int epic_disp_rect(
} }
int epic_disp_circ( int epic_disp_circ(
uint16_t x, int16_t x,
uint16_t y, int16_t y,
uint16_t rad, uint16_t rad,
uint16_t color, uint16_t color,
enum disp_fillstyle fillstyle, enum disp_fillstyle fillstyle,
......
...@@ -95,9 +95,6 @@ void gfx_puts( ...@@ -95,9 +95,6 @@ void gfx_puts(
x = 0; x = 0;
y += font->Height; y += font->Height;
} }
// if the line is outside the display we return
if (y >= r->height)
return;
// now print the character // now print the character
gfx_putchar(font, r, x, y, *str, fg, bg); gfx_putchar(font, r, x, y, *str, fg, bg);
......
...@@ -75,8 +75,8 @@ class Display: ...@@ -75,8 +75,8 @@ class Display:
:param text: Text to print :param text: Text to print
:param fg: Foreground color (expects RGB triple) :param fg: Foreground color (expects RGB triple)
:param bg: Background color (expects RGB triple) or None for transparent background :param bg: Background color (expects RGB triple) or None for transparent background
:param posx: X-Position of the first character, 0 <= posx <= 159 :param posx: X-Position of the first character
:param posy: Y-Position of the first character, 0 <= posy <= 79 :param posy: Y-Position of the first character
:param font: 0 <= font <= 4 (currently) selects a font :param font: 0 <= font <= 4 (currently) selects a font
Avaiable Fonts: Avaiable Fonts:
...@@ -110,8 +110,8 @@ class Display: ...@@ -110,8 +110,8 @@ class Display:
""" """
Draws a pixel on the display Draws a pixel on the display
:param x: X coordinate, 0<= x <= 159 :param x: X coordinate
:param y: Y coordinate, 0<= y <= 79 :param y: Y coordinate
:param col: color of the pixel (expects RGB tripple) :param col: color of the pixel (expects RGB tripple)
""" """
...@@ -134,10 +134,10 @@ class Display: ...@@ -134,10 +134,10 @@ class Display:
""" """
Draws a line on the display. Draws a line on the display.
:param xs: X start coordinate, 0 <= xs <= 159 :param xs: X start coordinate
:param ys: Y start coordinate, 0 <= ys <= 79 :param ys: Y start coordinate
:param xe: X end coordinate, 0 <= xe <= 159 :param xe: X end coordinate
:param ye: Y end coordinate, 0 <= ye <= 79 :param ye: Y end coordinate
:param col: color of the line (expects RGB triple) :param col: color of the line (expects RGB triple)
:param dotted: whether the line should be dotted or not :param dotted: whether the line should be dotted or not
(questionable implementation: draws every other pixel white, draws (questionable implementation: draws every other pixel white, draws
...@@ -154,10 +154,10 @@ class Display: ...@@ -154,10 +154,10 @@ class Display:
""" """
Draws a rectangle on the display. Draws a rectangle on the display.
:param xs: X start coordinate, 0 <= xs <= 159 :param xs: X start coordinate
:param ys: Y start coordinate, 0 <= ys <= 79 :param ys: Y start coordinate
:param xe: X end coordinate, 0 <= xe <= 159 :param xe: X end coordinate
:param ye: Y end coordinate, 0 <= ye <= 79 :param ye: Y end coordinate
:param col: color of the outline and fill (expects RGB triple) :param col: color of the outline and fill (expects RGB triple)
:param filled: whether the rectangle should be filled or not :param filled: whether the rectangle should be filled or not
:param size: size of the individual pixels, ranges from 1 to 8 :param size: size of the individual pixels, ranges from 1 to 8
...@@ -172,8 +172,8 @@ class Display: ...@@ -172,8 +172,8 @@ class Display:
""" """
Draws a circle on the display. Draws a circle on the display.
:param x: center x coordinate, 0 <= x <= 159 :param x: center x coordinate
:param y: center y coordinate, 0 <= y <= 79 :param y: center y coordinate
:param rad: radius :param rad: radius
:param col: color of the outline and fill (expects RGB triple) :param col: color of the outline and fill (expects RGB triple)
:param filled: whether the rectangle should be filled or not :param filled: whether the rectangle should be filled or not
......
...@@ -39,8 +39,8 @@ static mp_obj_t mp_display_print(size_t n_args, const mp_obj_t *args) ...@@ -39,8 +39,8 @@ static mp_obj_t mp_display_print(size_t n_args, const mp_obj_t *args)
mp_raise_TypeError("input text must be a string"); mp_raise_TypeError("input text must be a string");
} }
GET_STR_DATA_LEN(args[0], print, print_len); GET_STR_DATA_LEN(args[0], print, print_len);
uint32_t posx = mp_obj_get_int(args[1]); int32_t posx = mp_obj_get_int(args[1]);
uint32_t posy = mp_obj_get_int(args[2]); int32_t posy = mp_obj_get_int(args[2]);
uint32_t fg = get_color(args[3]); uint32_t fg = get_color(args[3]);
uint32_t bg = get_color(args[4]); uint32_t bg = get_color(args[4]);
int res = epic_disp_print(posx, posy, (const char *)print, fg, bg); int res = epic_disp_print(posx, posy, (const char *)print, fg, bg);
...@@ -60,8 +60,8 @@ static mp_obj_t mp_display_print_adv(size_t n_args, const mp_obj_t *args) ...@@ -60,8 +60,8 @@ static mp_obj_t mp_display_print_adv(size_t n_args, const mp_obj_t *args)
mp_raise_TypeError("input text must be a string"); mp_raise_TypeError("input text must be a string");
} }
GET_STR_DATA_LEN(args[0], print, print_len); GET_STR_DATA_LEN(args[0], print, print_len);
uint32_t posx = mp_obj_get_int(args[1]); int32_t posx = mp_obj_get_int(args[1]);
uint32_t posy = mp_obj_get_int(args[2]); int32_t posy = mp_obj_get_int(args[2]);
uint32_t fg = get_color(args[3]); uint32_t fg = get_color(args[3]);
uint32_t bg = get_color(args[4]); uint32_t bg = get_color(args[4]);
uint8_t fontName = mp_obj_get_int(args[5]); uint8_t fontName = mp_obj_get_int(args[5]);
...@@ -80,8 +80,8 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( ...@@ -80,8 +80,8 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
/* draw pixel on the display */ /* draw pixel on the display */
static mp_obj_t mp_display_pixel(size_t n_args, const mp_obj_t *args) static mp_obj_t mp_display_pixel(size_t n_args, const mp_obj_t *args)
{ {
uint16_t x = mp_obj_get_int(args[0]); int16_t x = mp_obj_get_int(args[0]);
uint16_t y = mp_obj_get_int(args[1]); int16_t y = mp_obj_get_int(args[1]);
uint16_t col = get_color(args[2]); uint16_t col = get_color(args[2]);
//TODO: Move sanity checks to epicardium //TODO: Move sanity checks to epicardium
...@@ -121,10 +121,10 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( ...@@ -121,10 +121,10 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
/* draw line on the display */ /* draw line on the display */
static mp_obj_t mp_display_line(size_t n_args, const mp_obj_t *args) static mp_obj_t mp_display_line(size_t n_args, const mp_obj_t *args)
{ {
uint16_t xs = mp_obj_get_int(args[0]); int16_t xs = mp_obj_get_int(args[0]);
uint16_t ys = mp_obj_get_int(args[1]); int16_t ys = mp_obj_get_int(args[1]);
uint16_t xe = mp_obj_get_int(args[2]); int16_t xe = mp_obj_get_int(args[2]);
uint16_t ye = mp_obj_get_int(args[3]); int16_t ye = mp_obj_get_int(args[3]);
uint16_t col = get_color(args[4]); uint16_t col = get_color(args[4]);
uint16_t ls = mp_obj_get_int(args[5]); uint16_t ls = mp_obj_get_int(args[5]);
uint16_t ps = mp_obj_get_int(args[6]); uint16_t ps = mp_obj_get_int(args[6]);
...@@ -155,10 +155,10 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( ...@@ -155,10 +155,10 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
/* draw rectangle on the display */ /* draw rectangle on the display */
static mp_obj_t mp_display_rect(size_t n_args, const mp_obj_t *args) static mp_obj_t mp_display_rect(size_t n_args, const mp_obj_t *args)
{ {
uint16_t xs = mp_obj_get_int(args[0]); int16_t xs = mp_obj_get_int(args[0]);
uint16_t ys = mp_obj_get_int(args[1]); int16_t ys = mp_obj_get_int(args[1]);
uint16_t xe = mp_obj_get_int(args[2]); int16_t xe = mp_obj_get_int(args[2]);
uint16_t ye = mp_obj_get_int(args[3]); int16_t ye = mp_obj_get_int(args[3]);
uint16_t col = get_color(args[4]); uint16_t col = get_color(args[4]);
uint16_t fs = mp_obj_get_int(args[5]); uint16_t fs = mp_obj_get_int(args[5]);
uint16_t ps = mp_obj_get_int(args[6]); uint16_t ps = mp_obj_get_int(args[6]);
...@@ -189,8 +189,8 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( ...@@ -189,8 +189,8 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
/* draw rectangle on the display */ /* draw rectangle on the display */
static mp_obj_t mp_display_circ(size_t n_args, const mp_obj_t *args) static mp_obj_t mp_display_circ(size_t n_args, const mp_obj_t *args)
{ {
uint16_t x = mp_obj_get_int(args[0]); int16_t x = mp_obj_get_int(args[0]);
uint16_t y = mp_obj_get_int(args[1]); int16_t y = mp_obj_get_int(args[1]);
uint16_t rad = mp_obj_get_int(args[2]); uint16_t rad = mp_obj_get_int(args[2]);
uint16_t col = get_color(args[3]); uint16_t col = get_color(args[3]);
uint16_t fs = mp_obj_get_int(args[4]); uint16_t fs = mp_obj_get_int(args[4]);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment