From 5ecaf5a26618caa074b52c1e3a54d439239f0d81 Mon Sep 17 00:00:00 2001 From: kugel Date: Thu, 7 Jan 2010 19:35:36 +0000 Subject: [PATCH] e200v2/Fuze: Correct and simplify clipping clipping code in lcd_update_rect(). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24197 a1c6a512-1295-4272-9138-f99709370657 --- .../target/arm/as3525/sansa-e200v2/lcd-e200v2.c | 38 ++++++++++---------- firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c | 40 +++++++++++----------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c b/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c index 0d990dc53..f4d1a7cf5 100644 --- a/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c +++ b/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c @@ -493,41 +493,41 @@ void lcd_update(void) void lcd_update_rect(int x, int y, int width, int height) { const fb_data *ptr; - int xmax, ymax; if (!display_on) return; - xmax = x + width; - if (xmax >= LCD_WIDTH) - xmax = LCD_WIDTH - 1; /* Clip right */ - if (x < 0) - x = 0; /* Clip left */ - if (x >= xmax) - return; /* nothing left to do */ - - width = xmax - x + 1; /* Fix width */ + /* nothing to draw? */ + if ((width <= 0) || (height <= 0) || (x >= LCD_WIDTH) || + (y >= LCD_HEIGHT) || (x + width <= 0) || (y + height <= 0)) + return; - ymax = y + height; - if (ymax >= LCD_HEIGHT) - ymax = LCD_HEIGHT - 1; /* Clip bottom */ + if (x < 0) + { /* clip left */ + width += x; + x = 0; + } if (y < 0) - y = 0; /* Clip top */ - if (y >= ymax) - return; /* nothing left to do */ + { /* clip top */ + height += y; + y = 0; + } + if (x + width > LCD_WIDTH) + width = LCD_WIDTH - x; /* clip right */ + if (y + height > LCD_HEIGHT) + height = LCD_HEIGHT - y; /* clip bottom */ lcd_write_reg(R_ENTRY_MODE, r_entry_mode); - lcd_window(x, y, xmax, ymax); + lcd_window(x, y, x+width-1, y+height-1); lcd_write_cmd(R_WRITE_DATA_2_GRAM); ptr = &lcd_framebuffer[y][x]; - height = ymax - y; /* fix height */ do { lcd_write_data(ptr, width); ptr += LCD_WIDTH; } - while (--height >= 0); + while (--height > 0); } diff --git a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c index f9d5e5ace..3332e0c78 100644 --- a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c +++ b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c @@ -444,43 +444,43 @@ void lcd_update(void) void lcd_update_rect(int x, int y, int width, int height) { const fb_data *ptr; - int xmax, ymax; if (!display_on) return; - xmax = x + width; - if (xmax >= LCD_WIDTH) - xmax = LCD_WIDTH - 1; /* Clip right */ - if (x < 0) - x = 0; /* Clip left */ - if (x >= xmax) - return; /* nothing left to do */ - - width = xmax - x + 1; /* Fix width */ + /* nothing to draw? */ + if ((width <= 0) || (height <= 0) || (x >= LCD_WIDTH) || + (y >= LCD_HEIGHT) || (x + width <= 0) || (y + height <= 0)) + return; - ymax = y + height; - if (ymax >= LCD_HEIGHT) - ymax = LCD_HEIGHT - 1; /* Clip bottom */ + if (x < 0) + { /* clip left */ + width += x; + x = 0; + } if (y < 0) - y = 0; /* Clip top */ - if (y >= ymax) - return; /* nothing left to do */ + { /* clip top */ + height += y; + y = 0; + } + if (x + width > LCD_WIDTH) + width = LCD_WIDTH - x; /* clip right */ + if (y + height > LCD_HEIGHT) + height = LCD_HEIGHT - y; /* clip bottom */ lcd_write_reg(R_ENTRY_MODE, r_entry_mode); - lcd_window_x(x, xmax); - lcd_window_y(y, ymax); + lcd_window_x(x, x + width - 1); + lcd_window_y(y, y + height -1); lcd_write_cmd(R_WRITE_DATA_2_GRAM); ptr = &lcd_framebuffer[y][x]; - height = ymax - y; /* fix height */ do { lcd_write_data(ptr, width); ptr += LCD_WIDTH; } - while (--height >= 0); + while (--height > 0); } -- 2.11.4.GIT