rendered paste bodystatic void video_ipod_update_nano(unsigned short * x, int sx, int sy, int mx, int my)
{
int height,width,rect1, rect2, rect3, rect4;
unsigned short *addr;
unsigned short diff = 0;
addr=x;
/* sx=0;
sy=0;*/
//mx=175;//høyde (max 175)
//my=175;//bredde (max 175)
height = (my - sy);
width = (mx - sx);
//height=175;
// height=132;
// width=175;
/* sy=0;
height=132;//height = bredden
width=175;*/
/* {
int t;
t=my;
my=mx;
mx=t;
}*/
//ADDR16 addr = psd->addr;
//assert (addr != 0);
//diff = lcd_width - width;
if (my > lcd_height) {
my = lcd_height;
}
if (mx > lcd_width) {
//diff = (lcd_width -mx)*2;
mx = lcd_width;
}
/* height = lcd_height;
width = lcd_height;*/
//if (width & 1) width++;
/* calculate the drawing region */
//horiz=x vert=y
rect1 = sx;//start horiz
rect2 = sy;//start vert
rect3 = (sx + width) ;//max horiz
rect4 = (rect2+height);//max vert
/* setup the drawing region */
if (rect3 < rect1) {
int t;
t = rect1;
rect1 = rect3;
rect3 = t;
}
if (rect4 < rect2) {
int t;
t = rect2;
rect2 = rect4;
rect4 = t;
}
/* max horiz << 8 | start horiz */
video_lcd_cmd_data(0x44, (rect3 << 8) | rect1);
/* max vert << 8 | start vert */
video_lcd_cmd_data(0x45, (rect4 << 8) | rect2);
/* position cursor (set AD0-AD15) */
/* start vert << 8 | start horiz */
video_lcd_cmd_data(0x21, (rect2 << 8) | rect1);
/* start drawing */
video_lcd_send_lo(0x0);
video_lcd_send_lo(0x22);
//addr += sx + sy * lcd_width;
// height = lcd_height;
// width = lcd_height;
//height = (my - sy);
/* height=132;
width = 176;*/
while (height > 0) {
int h, x, y, pixels_to_write;
pixels_to_write = (width * height) * 2;
/* calculate how much we can do in one go */
h = height;
if (pixels_to_write > 64000) {
h = (64000/2) / width;
pixels_to_write = (width * h) * 2;
}
outl(0x10000080, 0x70008A20);
outl((pixels_to_write - 1) | 0xC0010000, 0x70008A24);
outl(0x34000000, 0x70008A20);
/* for each row */
for (y = 0; y < h; y++)
{
/* for each column */
for (x = 0; x < width; x += 2) {
/* unsigned two_pixels;
unsigned tm;
two_pixels = addr[0] | (addr[1] << 16);
addr += 2;
while ((inl(0x70008A20) & 0x1000000) == 0);
tm = (two_pixels & ~0xFF0000) >> 8;
two_pixels = two_pixels & ~0xFF00;
two_pixels = tm | (two_pixels << 8);
/-* output 2 pixels *-/
outl(two_pixels, 0x70008B00);*/
unsigned two_pixels;
two_pixels = addr[0] | (addr[1] << 16);
addr += 2;
while ((inl(0x70008a20) & 0x1000000) == 0);
/* output 2 pixels */
outl(two_pixels, 0x70008b00);
}
//addr += diff;
}
while ((inl(0x70008A20) & 0x4000000) == 0);
outl(0x0, 0x70008A24);
height = height - h;
}
}