From ef0e5e32f8e503d1270353d3488850edc8b665b4 Mon Sep 17 00:00:00 2001 From: Lephe Date: Sat, 7 Sep 2019 11:26:11 +0200 Subject: [PATCH] render: add one-parameter dvline() and dhline() Behave like Basic's Horizontal and Vertical commands. Internal dline() optimizations are renamed gint_dhline() and gint_dvline(). Also supports ghline() and gvline() in the gray engine. Optimization cases here are amost negligible due to limiting RAM access frequencies and the very limited amount of work accomplished in the functions. Code maintainability is prioritized by using dline(). --- include/display/common.h | 8 ++++---- include/gint/display.h | 18 ++++++++++++++++++ include/gint/gray.h | 10 ++++++++++ src/gray/ghline.c | 7 +++++++ src/gray/gvline.c | 7 +++++++ src/render-cg/dhline.c | 7 +++++++ src/render-cg/dline.c | 8 ++++---- src/render-cg/dvline.c | 7 +++++++ src/render-fx/dhline.c | 7 +++++++ src/render-fx/dline.c | 8 ++++---- src/render-fx/dvline.c | 7 +++++++ src/render/dline.c | 6 +++--- 12 files changed, 85 insertions(+), 15 deletions(-) create mode 100644 src/gray/ghline.c create mode 100644 src/gray/gvline.c create mode 100644 src/render-cg/dhline.c create mode 100644 src/render-cg/dvline.c create mode 100644 src/render-fx/dhline.c create mode 100644 src/render-fx/dvline.c diff --git a/include/display/common.h b/include/display/common.h index a1ec4b2..0075e64 100644 --- a/include/display/common.h +++ b/include/display/common.h @@ -7,15 +7,15 @@ #include -/* dhline() - optimized drawing of a horizontal line +/* gint_dhline(): Optimized horizontal line @x1 @x2 @y Coordinates of endpoints of line (both included) @color Any color suitable for dline() */ -void dhline(int x1, int x2, int y, color_t color); +void gint_dhline(int x1, int x2, int y, color_t color); -/* dvline() - optimized drawing of a vertical line +/* gint_dvline(): Optimized vertical line @y1 @y2 @x Coordinates of endpoints of line (both included) @color Any color suitable for dline() */ -void dvline(int y1, int y2, int x, color_t color); +void gint_dvline(int y1, int y2, int x, color_t color); //--- // Font rendering (topti) diff --git a/include/gint/display.h b/include/gint/display.h index 1ec139c..92dae6e 100644 --- a/include/gint/display.h +++ b/include/gint/display.h @@ -95,6 +95,24 @@ void dpixel(int x, int y, color_t color); fxcg50: Any R5G6B5 color */ void dline(int x1, int y1, int x2, int y2, color_t color); +/* dhline(): Full-width horizontal line + This function draws a horizontal line from the left end of the screen to the + right end, much like the Basic command "Horizontal". + + @y Line number + @color fx9860g: white, black, none, invert + fxcg50: Any R5G6B5 color */ +void dhline(int y, color_t color); + +/* dvline(): Full-height vertical line + This function draws a vertical line from the top end of the screen to the + bottom end, much like the Basic command "Vertical". + + @x Column number + @color fx9860g: white, black, none, invert + fxcg50: Any R5G6B5 color */ +void dvline(int x, color_t color); + //--- // Text rendering (topti) //--- diff --git a/include/gint/gray.h b/include/gint/gray.h index b0325df..5def1a0 100644 --- a/include/gint/gray.h +++ b/include/gint/gray.h @@ -130,6 +130,16 @@ void gpixel(int x, int y, color_t color); @color white, light, dark, black, none, invert, lighten, darken */ void gline(int x1, int y1, int x2, int y2, color_t color); +/* ghline(): Full-width horizontal line + @y Line number + @color white, light, dark, black, none, invert, lighten, darken */ +void ghline(int y, color_t color); + +/* gvline(): Full-height vertical line + @x Column number + @color white, light, dark, black, none, invert, lighten, darken */ +void gvline(int x, color_t color); + //--- // Text rendering //--- diff --git a/src/gray/ghline.c b/src/gray/ghline.c new file mode 100644 index 0000000..5d6a15c --- /dev/null +++ b/src/gray/ghline.c @@ -0,0 +1,7 @@ +#include + +/* ghline(): Full-width horizontal line */ +void ghline(int y, color_t color) +{ + gline(0, y, 127, y, color); +} diff --git a/src/gray/gvline.c b/src/gray/gvline.c new file mode 100644 index 0000000..6e298ab --- /dev/null +++ b/src/gray/gvline.c @@ -0,0 +1,7 @@ +#include + +/* gvline(): Full-height vertical line */ +void gvline(int x, color_t color) +{ + gline(x, 0, x, 63, color); +} diff --git a/src/render-cg/dhline.c b/src/render-cg/dhline.c new file mode 100644 index 0000000..a7a88da --- /dev/null +++ b/src/render-cg/dhline.c @@ -0,0 +1,7 @@ +#include + +/* dhline(): Full-width horizontal line */ +void dhline(int y, color_t color) +{ + dline(0, y, 395, y, color); +} diff --git a/src/render-cg/dline.c b/src/render-cg/dline.c index ec01ba3..fcbf915 100644 --- a/src/render-cg/dline.c +++ b/src/render-cg/dline.c @@ -2,8 +2,8 @@ #include #include -/* dhline() - optimized drawing of a horizontal line */ -void dhline(int x1, int x2, int y, uint16_t color) +/* gint_dhline(): Optimized horizontal line */ +void gint_dhline(int x1, int x2, int y, uint16_t color) { /* Order and bounds */ if((uint)y >= 224) return; @@ -30,8 +30,8 @@ void dhline(int x1, int x2, int y, uint16_t color) while(end > start) *--end = op; } -/* dvline() - optimized drawing of a vertical line */ -void dvline(int y1, int y2, int x, uint16_t color) +/* gint_dvline(): Optimized vertical line */ +void gint_dvline(int y1, int y2, int x, uint16_t color) { /* Order and bounds */ if((uint)x >= 395) return; diff --git a/src/render-cg/dvline.c b/src/render-cg/dvline.c new file mode 100644 index 0000000..2c11797 --- /dev/null +++ b/src/render-cg/dvline.c @@ -0,0 +1,7 @@ +#include + +/* dvline(): Full-height vertical line */ +void dvline(int x, color_t color) +{ + dline(x, 0, x, 223, color); +} diff --git a/src/render-fx/dhline.c b/src/render-fx/dhline.c new file mode 100644 index 0000000..5fb6edf --- /dev/null +++ b/src/render-fx/dhline.c @@ -0,0 +1,7 @@ +#include + +/* dhline(): Full-width horizontal line */ +void dhline(int y, color_t color) +{ + dline(0, y, 127, y, color); +} diff --git a/src/render-fx/dline.c b/src/render-fx/dline.c index ebf6d9e..dba5118 100644 --- a/src/render-fx/dline.c +++ b/src/render-fx/dline.c @@ -3,8 +3,8 @@ #include #include -/* dhline() - optimized drawing of a horizontal line using a rectangle mask */ -void dhline(int x1, int x2, int y, color_t color) +/* gint_dhline(): Optimized horizontal line using a rectangle mask */ +void gint_dhline(int x1, int x2, int y, color_t color) { if((uint)y >= 64) return; if(x1 > x2) swap(x1, x2); @@ -38,8 +38,8 @@ void dhline(int x1, int x2, int y, color_t color) } } -/* dvline() - optimized drawing of a vertical line */ -void dvline(int y1, int y2, int x, color_t color) +/* gint_dvline(): Optimized vertical line */ +void gint_dvline(int y1, int y2, int x, color_t color) { if((uint)x >= 128) return; if(y1 > y2) swap(y1, y2); diff --git a/src/render-fx/dvline.c b/src/render-fx/dvline.c new file mode 100644 index 0000000..b31dd0d --- /dev/null +++ b/src/render-fx/dvline.c @@ -0,0 +1,7 @@ +#include + +/* dvline(): Full-height vertical line */ +void dvline(int x, color_t color) +{ + dline(x, 0, x, 63, color); +} diff --git a/src/render/dline.c b/src/render/dline.c index c9f9134..0328783 100644 --- a/src/render/dline.c +++ b/src/render/dline.c @@ -2,7 +2,7 @@ #include #include -/* dline() - Bresenham line drawing algorithm +/* dline(): Bresenham line drawing algorithm Remotely adapted from MonochromeLib code by Pierre "PerriotLL" Le Gall. Relies on platform-dependent dhline() and dvline() for optimized situations. @x1 @y1 @x2 @y2 Coordinates of endpoints of line (included) @@ -12,12 +12,12 @@ void dline(int x1, int y1, int x2, int y2, color_t color) /* Possible optimizations */ if(y1 == y2) { - dhline(x1, x2, y1, color); + gint_dhline(x1, x2, y1, color); return; } if(x1 == x2) { - dvline(y1, y2, x1, color); + gint_dvline(y1, y2, x1, color); return; }