iPod: Fix the lcd_update_rect() function for the Color LCD, ensure rect is word-aligned and minor cosmetic cleanup
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8066 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
9589324082
commit
1946922c61
1 changed files with 36 additions and 31 deletions
|
@ -185,68 +185,73 @@ void lcd_blit(const fb_data* data, int x, int by, int width,
|
|||
/* Update a fraction of the display. */
|
||||
void lcd_update_rect(int x, int y, int width, int height)
|
||||
{
|
||||
int rect1, rect2, rect3, rect4;
|
||||
int y0, x0, y1, x1;
|
||||
int newx,newwidth;
|
||||
|
||||
unsigned long *addr = (unsigned long *)lcd_framebuffer;
|
||||
|
||||
/* TODO: Ensure x is even - so we read 32-bit aligned data from
|
||||
lcd_framebuffer */
|
||||
|
||||
/* Ensure x and width are both even - so we can read 32-bit aligned
|
||||
data from lcd_framebuffer */
|
||||
newx=x&~1;
|
||||
newwidth=width&~1;
|
||||
if (newx+newwidth < x+width) { newwidth+=2; }
|
||||
x=newx; width=newwidth;
|
||||
|
||||
/* calculate the drawing region */
|
||||
#if CONFIG_LCD == LCD_IPODCOLOR
|
||||
rect1 = x; /* start vert */
|
||||
rect2 = (LCD_WIDTH - 1) - y; /* start horiz */
|
||||
rect3 = (x + height) - 1; /* end vert */
|
||||
rect4 = (rect2 - width) + 1; /* end horiz */
|
||||
#else
|
||||
rect1 = y; /* start horiz */
|
||||
rect2 = x; /* start vert */
|
||||
rect3 = (y + width) - 1; /* max horiz */
|
||||
rect4 = (x + height) - 1; /* max vert */
|
||||
#if CONFIG_LCD == LCD_IPODNANO
|
||||
y0 = x; /* start horiz */
|
||||
x0 = y; /* start vert */
|
||||
y1 = (x + width) - 1; /* max horiz */
|
||||
x1 = (y + height) - 1; /* max vert */
|
||||
#elif CONFIG_LCD == LCD_IPODCOLOR
|
||||
y0 = y; /* start vert */
|
||||
x0 = (LCD_WIDTH - 1) - x; /* start horiz */
|
||||
y1 = (y + height) - 1; /* end vert */
|
||||
x1 = (x0 - width) + 1; /* end horiz */
|
||||
#endif
|
||||
/* setup the drawing region */
|
||||
if (lcd_type == 0) {
|
||||
lcd_cmd_data(0x12, rect1); /* start vert */
|
||||
lcd_cmd_data(0x13, rect2); /* start horiz */
|
||||
lcd_cmd_data(0x15, rect3); /* end vert */
|
||||
lcd_cmd_data(0x16, rect4); /* end horiz */
|
||||
lcd_cmd_data(0x12, y0); /* start vert */
|
||||
lcd_cmd_data(0x13, x0); /* start horiz */
|
||||
lcd_cmd_data(0x15, y1); /* end vert */
|
||||
lcd_cmd_data(0x16, x1); /* end horiz */
|
||||
} else {
|
||||
/* swap max horiz < start horiz */
|
||||
if (rect3 < rect1) {
|
||||
if (y1 < y0) {
|
||||
int t;
|
||||
t = rect1;
|
||||
rect1 = rect3;
|
||||
rect3 = t;
|
||||
t = y0;
|
||||
y0 = y1;
|
||||
y1 = t;
|
||||
}
|
||||
|
||||
/* swap max vert < start vert */
|
||||
if (rect4 < rect2) {
|
||||
if (x1 < x0) {
|
||||
int t;
|
||||
t = rect2;
|
||||
rect2 = rect4;
|
||||
rect4 = t;
|
||||
t = x0;
|
||||
x0 = x1;
|
||||
x1 = t;
|
||||
}
|
||||
|
||||
/* max horiz << 8 | start horiz */
|
||||
lcd_cmd_data(LCD_CNTL_HORIZ_RAM_ADDR_POS, (rect3 << 8) | rect1);
|
||||
lcd_cmd_data(LCD_CNTL_HORIZ_RAM_ADDR_POS, (y1 << 8) | y0);
|
||||
/* max vert << 8 | start vert */
|
||||
lcd_cmd_data(LCD_CNTL_VERT_RAM_ADDR_POS, (rect4 << 8) | rect2);
|
||||
lcd_cmd_data(LCD_CNTL_VERT_RAM_ADDR_POS, (x1 << 8) | x0);
|
||||
|
||||
/* start vert = max vert */
|
||||
#if CONFIG_LCD == LCD_IPODCOLOR
|
||||
rect2 = rect4;
|
||||
x0 = x1;
|
||||
#endif
|
||||
|
||||
/* position cursor (set AD0-AD15) */
|
||||
/* start vert << 8 | start horiz */
|
||||
lcd_cmd_data(LCD_CNTL_RAM_ADDR_SET, (rect2 << 8) | rect1);
|
||||
lcd_cmd_data(LCD_CNTL_RAM_ADDR_SET, ((x0 << 8) | y0));
|
||||
|
||||
/* start drawing */
|
||||
lcd_send_lo(0x0);
|
||||
lcd_send_lo(LCD_CNTL_WRITE_TO_GRAM);
|
||||
}
|
||||
|
||||
addr += x * LCD_WIDTH + y/2;
|
||||
addr = (unsigned long*)&lcd_framebuffer[y][x];
|
||||
|
||||
while (height > 0) {
|
||||
int c, r;
|
||||
|
|
Loading…
Reference in a new issue