summaryrefslogtreecommitdiff
path: root/firmware/drivers/lcd-color-common.c
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2022-09-26 08:37:00 +0100
committerAidan MacDonald <amachronic@protonmail.com>2022-10-09 22:07:44 +0100
commit4b8fe8acd1c079e75bb9229791170c549188fc08 (patch)
treee3f3a8ab80a6a603488781a933bb16ba90e8a68e /firmware/drivers/lcd-color-common.c
parent70d5b2cd45b29e64ab17b04d995dce1080d7fca9 (diff)
downloadrockbox-4b8fe8acd1c079e75bb9229791170c549188fc08.tar.gz
rockbox-4b8fe8acd1c079e75bb9229791170c549188fc08.zip
lcd: Consolidate in-viewport clipping routines
In-viewport clipping code is duplicated across 8 files, making it a chore to change anything related to clipping; refactor the clipping logic into dedicated functions. Change-Id: I4ab20bb3c59b0406098d0c7d23833025f17a320a
Diffstat (limited to 'firmware/drivers/lcd-color-common.c')
-rw-r--r--firmware/drivers/lcd-color-common.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/firmware/drivers/lcd-color-common.c b/firmware/drivers/lcd-color-common.c
index 72ce7c209f..8a9ef64cea 100644
--- a/firmware/drivers/lcd-color-common.c
+++ b/firmware/drivers/lcd-color-common.c
@@ -40,6 +40,7 @@ static fb_data lcd_static_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH]
40 IRAM_LCDFRAMEBUFFER CACHEALIGN_AT_LEAST_ATTR(16); 40 IRAM_LCDFRAMEBUFFER CACHEALIGN_AT_LEAST_ATTR(16);
41 41
42static void *lcd_frameaddress_default(int x, int y); 42static void *lcd_frameaddress_default(int x, int y);
43static bool lcd_clip_viewport_pixel(int *x, int *y);
43 44
44static fb_data* lcd_backdrop = NULL; 45static fb_data* lcd_backdrop = NULL;
45static long lcd_backdrop_offset IDATA_ATTR = 0; 46static long lcd_backdrop_offset IDATA_ATTR = 0;
@@ -196,10 +197,8 @@ fb_data* lcd_get_backdrop(void)
196/* Set a single pixel */ 197/* Set a single pixel */
197void lcd_drawpixel(int x, int y) 198void lcd_drawpixel(int x, int y)
198{ 199{
199 if ( ((unsigned)x < (unsigned)lcd_current_viewport->width) 200 if (lcd_clip_viewport_pixel(&x, &y))
200 && ((unsigned)y < (unsigned)lcd_current_viewport->height) 201 lcd_fastpixelfuncs[lcd_current_viewport->drawmode](FBADDR(x, y));
201 )
202 lcd_fastpixelfuncs[lcd_current_viewport->drawmode](FBADDR(lcd_current_viewport->x+x, lcd_current_viewport->y+y));
203} 202}
204 203
205/* Draw a line */ 204/* Draw a line */
@@ -274,11 +273,8 @@ void lcd_drawline(int x1, int y1, int x2, int y2)
274 273
275 for (i = 0; i < numpixels; i++) 274 for (i = 0; i < numpixels; i++)
276 { 275 {
277 if ((x >= 0 && y >= 0) 276 if (x >= 0 && y >= 0 && x < w_vp && y < h_vp)
278 && (x < w_vp) 277 pfunc(fbaddr(x + x_vp, y + y_vp));
279 && (y < h_vp)
280 )
281 pfunc(fbaddr( x + x_vp, y + y_vp));
282 278
283 if (d < 0) 279 if (d < 0)
284 { 280 {
@@ -401,7 +397,7 @@ void lcd_gradient_fillrect_part(int x, int y, int width, int height,
401 x1 = x; 397 x1 = x;
402 x2 = x + width; 398 x2 = x + width;
403 399
404 if (height == 0) return; 400 if (height <= 0) return;
405 401
406 step_mul = (1 << 16) / src_height; 402 step_mul = (1 << 16) / src_height;
407 int h_r = RGB_UNPACK_RED(start_rgb); 403 int h_r = RGB_UNPACK_RED(start_rgb);