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
This commit is contained in:
Thomas Martitz 2010-01-07 19:35:36 +00:00
parent 2f2213d63e
commit 5fd54dee4f
2 changed files with 39 additions and 39 deletions

View file

@ -493,41 +493,41 @@ void lcd_update(void)
void lcd_update_rect(int x, int y, int width, int height) void lcd_update_rect(int x, int y, int width, int height)
{ {
const fb_data *ptr; const fb_data *ptr;
int xmax, ymax;
if (!display_on) if (!display_on)
return; return;
xmax = x + width; /* nothing to draw? */
if (xmax >= LCD_WIDTH) if ((width <= 0) || (height <= 0) || (x >= LCD_WIDTH) ||
xmax = LCD_WIDTH - 1; /* Clip right */ (y >= LCD_HEIGHT) || (x + width <= 0) || (y + height <= 0))
return;
if (x < 0) if (x < 0)
x = 0; /* Clip left */ { /* clip left */
if (x >= xmax) width += x;
return; /* nothing left to do */ x = 0;
}
width = xmax - x + 1; /* Fix width */
ymax = y + height;
if (ymax >= LCD_HEIGHT)
ymax = LCD_HEIGHT - 1; /* Clip bottom */
if (y < 0) if (y < 0)
y = 0; /* Clip top */ { /* clip top */
if (y >= ymax) height += y;
return; /* nothing left to do */ 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_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); lcd_write_cmd(R_WRITE_DATA_2_GRAM);
ptr = &lcd_framebuffer[y][x]; ptr = &lcd_framebuffer[y][x];
height = ymax - y; /* fix height */
do do
{ {
lcd_write_data(ptr, width); lcd_write_data(ptr, width);
ptr += LCD_WIDTH; ptr += LCD_WIDTH;
} }
while (--height >= 0); while (--height > 0);
} }

View file

@ -444,43 +444,43 @@ void lcd_update(void)
void lcd_update_rect(int x, int y, int width, int height) void lcd_update_rect(int x, int y, int width, int height)
{ {
const fb_data *ptr; const fb_data *ptr;
int xmax, ymax;
if (!display_on) if (!display_on)
return; return;
xmax = x + width; /* nothing to draw? */
if (xmax >= LCD_WIDTH) if ((width <= 0) || (height <= 0) || (x >= LCD_WIDTH) ||
xmax = LCD_WIDTH - 1; /* Clip right */ (y >= LCD_HEIGHT) || (x + width <= 0) || (y + height <= 0))
return;
if (x < 0) if (x < 0)
x = 0; /* Clip left */ { /* clip left */
if (x >= xmax) width += x;
return; /* nothing left to do */ x = 0;
}
width = xmax - x + 1; /* Fix width */
ymax = y + height;
if (ymax >= LCD_HEIGHT)
ymax = LCD_HEIGHT - 1; /* Clip bottom */
if (y < 0) if (y < 0)
y = 0; /* Clip top */ { /* clip top */
if (y >= ymax) height += y;
return; /* nothing left to do */ 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_write_reg(R_ENTRY_MODE, r_entry_mode);
lcd_window_x(x, xmax); lcd_window_x(x, x + width - 1);
lcd_window_y(y, ymax); lcd_window_y(y, y + height -1);
lcd_write_cmd(R_WRITE_DATA_2_GRAM); lcd_write_cmd(R_WRITE_DATA_2_GRAM);
ptr = &lcd_framebuffer[y][x]; ptr = &lcd_framebuffer[y][x];
height = ymax - y; /* fix height */
do do
{ {
lcd_write_data(ptr, width); lcd_write_data(ptr, width);
ptr += LCD_WIDTH; ptr += LCD_WIDTH;
} }
while (--height >= 0); while (--height > 0);
} }