Index: target/arm/tcc780x/cowond2/lcd-cowond2.c =================================================================== --- target/arm/tcc780x/cowond2/lcd-cowond2.c (révision 18008) +++ target/arm/tcc780x/cowond2/lcd-cowond2.c (copie de travail) @@ -359,88 +359,11 @@ void lcd_yuv_set_options(unsigned option } /* Line write helper function for lcd_yuv_blit. Write two lines of yuv420. */ -static void lcd_write_yuv420_lines(fb_data *dst, - unsigned char const * const src[3], - int width, - int stride) -{ - int i = 0; - int y; - int rv, guv, bu; - int cb, cr; - int r, g, b; - unsigned const char *y_p = src[0]; +extern void lcd_write_yuv420_lines(fb_data *dst, + unsigned char const * const src[3], + int width, + int stride); - for (i = 0; i < width/2; i++) - { - y_p++; - - /* YCbCr -> RGB conversion */ - cb = src[1][i] - 128; - cr = src[2][i] - 128; - - rv = (cr*101 + 56) >> 9; - guv = (128 - cr*51 + cb*24) >> 8; - bu = (cb*128 + 256) >> 9; - - y = (*y_p - 16)*74; - r = (y >> 9) + rv; - g = (y >> 8) + guv; - b = (y >> 9) + bu; - if (r < 0) r = 0; - else if (r > 31) r = 31; - if (g < 0) g = 0; - else if (g > 63) g = 63; - if (b < 0) b = 0; - else if (b > 31) b = 31; - - dst[i*2] = (r << 11) | (g << 5) | b; - - /* YCbCr -> RGB conversion */ - y = (*(y_p+stride) - 16)*74; - r = (y >> 9) + rv; - g = (y >> 8) + guv; - b = (y >> 9) + bu; - if (r < 0) r = 0; - else if (r > 31) r = 31; - if (g < 0) g = 0; - else if (g > 63) g = 63; - if (b < 0) b = 0; - else if (b > 31) b = 31; - - dst[i*2+LCD_FBWIDTH] = (r << 11) | (g << 5) | b; - - y_p++; - - /* YCbCr -> RGB conversion */ - y = (*y_p - 16)*74; - r = (y >> 9) + rv; - g = (y >> 8) + guv; - b = (y >> 9) + bu; - if (r < 0) r = 0; - else if (r > 31) r = 31; - if (g < 0) g = 0; - else if (g > 63) g = 63; - if (b < 0) b = 0; - else if (b > 31) b = 31; - - dst[i*2+1] = (r << 11) | (g << 5) | b; - - /* YCbCr -> RGB conversion */ - y = (*(y_p+stride) - 16)*74; - r = (y >> 9) + rv; - g = (y >> 8) + guv; - b = (y >> 9) + bu; - if (r < 0) r = 0; - else if (r > 31) r = 31; - if (g < 0) g = 0; - else if (g > 63) g = 63; - if (b < 0) b = 0; - else if (b > 31) b = 31; - - dst[i*2+1+LCD_FBWIDTH] = (r << 11) | (g << 5) | b; - } -} extern void lcd_write_yuv420_lines_odither(fb_data *dst, unsigned char const * const src[3], int width, Index: target/arm/lcd-as-memframe.S =================================================================== --- target/arm/lcd-as-memframe.S (révision 18008) +++ target/arm/lcd-as-memframe.S (copie de travail) @@ -189,7 +189,9 @@ lcd_write_yuv420_lines: @ orr r1, r1, r7, lsl #5 @ r4 |= (g << 5) orr r1, r1, r11, lsl #11 @ r4 = b | (r << 11) -#if LCD_WIDTH < 256 +#if LCD_HEIGHT < LCD_WIDTH + strh r1, [r0] +#elif LCD_WIDTH < 256 strh r1, [r0], #LCD_WIDTH @ store pixel #else strh r1, [r0] @ @@ -222,7 +224,15 @@ lcd_write_yuv420_lines: @ orr r1, r1, r11, lsl #11 @ r1 = b | (r << 11) orr r1, r1, r7, lsl #5 @ r1 |= (g << 5) -#if LCD_WIDTH < 256 +#if LCD_HEIGHT < LCD_WIDTH +#if LCD_WIDTH < 128 + strh r1, [r0, #2*LCD_WIDTH] +#else + add r0, r0, #2*LCD_WIDTH + strh r1, [r0] + sub r0, r0, #2*LCD_WIDTH +#endif +#elif LCD_WIDTH < 256 strh r1, [r0, #-LCD_WIDTH-2] @ store pixel #else strh r1, [r0, #-2] @ @@ -256,7 +266,9 @@ lcd_write_yuv420_lines: @ orr r1, r1, r7, lsl #5 @ r1 = b | (g << 5) orr r1, r1, r11, lsl #11 @ r1 |= (r << 11) -#if LCD_WIDTH < 256 +#if LCD_HEIGHT < LCD_WIDTH + strh r1, [r0, #2] +#elif LCD_WIDTH < 256 strh r1, [r0, #LCD_WIDTH]! @ store pixel #else strh r1, [r0] @ @@ -287,8 +299,20 @@ lcd_write_yuv420_lines: @ orr r12, r1, r11, lsl #11 @ r12 = b | (r << 11) orr r12, r12, r7, lsl #5 @ r12 |= (g << 5) +#if LCD_HEIGHT < LCD_WIDTH +#if LCD_WIDTH < 126 + strh r12, [r0, #2*LCD_WIDTH+2] +#else + add r0, r0, #2*LCD_WIDTH + strh r12, [r0, #2] + sub r0, r0, #2*LCD_WIDTH +#endif +#else strh r12, [r0, #-2] @ store pixel -#if LCD_WIDTH < 256 +#endif +#if LCD_HEIGHT < LCD_WIDTH + add r0, r0, #4 +#elif LCD_WIDTH < 256 add r0, r0, #2*LCD_WIDTH @ #else add r0, r0, #LCD_WIDTH @