diff options
author | Aidan MacDonald <amachronic@protonmail.com> | 2022-09-26 08:37:00 +0100 |
---|---|---|
committer | Aidan MacDonald <amachronic@protonmail.com> | 2022-10-09 22:07:44 +0100 |
commit | 4b8fe8acd1c079e75bb9229791170c549188fc08 (patch) | |
tree | e3f3a8ab80a6a603488781a933bb16ba90e8a68e /firmware/drivers/lcd-color-common.c | |
parent | 70d5b2cd45b29e64ab17b04d995dce1080d7fca9 (diff) | |
download | rockbox-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.c | 16 |
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 | ||
42 | static void *lcd_frameaddress_default(int x, int y); | 42 | static void *lcd_frameaddress_default(int x, int y); |
43 | static bool lcd_clip_viewport_pixel(int *x, int *y); | ||
43 | 44 | ||
44 | static fb_data* lcd_backdrop = NULL; | 45 | static fb_data* lcd_backdrop = NULL; |
45 | static long lcd_backdrop_offset IDATA_ATTR = 0; | 46 | static 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 */ |
197 | void lcd_drawpixel(int x, int y) | 198 | void 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); |