Index: firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c =================================================================== --- firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c (révision 17994) +++ firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c (copie de travail) @@ -359,10 +359,89 @@ void lcd_yuv_set_options(unsigned option } /* Line write helper function for lcd_yuv_blit. Write two lines of yuv420. */ -extern void lcd_write_yuv420_lines(fb_data *dst, - unsigned char const * const src[3], - int width, - int stride); +void lcd_write_yuv420_lines2(fb_data *dst, + unsigned char const * const src[3], + int width, + int stride) +{ + // TODO: make something much faster + unsigned int i = 0; + float y; + int r, g, b; + unsigned const char *y_p = src[0]; + + for (i; i < width; i++) { + y_p++; + // YCbCr -> RGB convertion + y = (*y_p - 16)*1.164; + r = y + 1.596*(src[2][i] - 128); + g = y + 0.813*(src[2][i] - 128) - 0.392*(src[1][i] - 128); + b = y + 2.017*(src[1][i] - 128); + if (r < 0) r = 0; + else if (r > 255) r = 255; + if (g < 0) g = 0; + else if (g > 255) g = 255; + if (b < 0) b = 0; + else if (b > 255) b = 255; + r = 31*r/255; + g = 63*g/255; + b = 31*b/255; + // Store pixel + dst[i*2] = (r << 11) | (g << 5) | b; + + // YCbCr -> RGB convertion + y = (*(y_p+stride) - 16)*1.164; + r = y + 1.596*(src[2][i] - 128); + g = y + 0.813*(src[2][i] - 128) - 0.392*(src[1][i] - 128); + b = y + 2.017*(src[1][i] - 128); + if (r < 0) r = 0; + else if (r > 255) r = 255; + if (g < 0) g = 0; + else if (g > 255) g = 255; + if (b < 0) b = 0; + else if (b > 255) b = 255; + r = 31*r/255; + g = 63*g/255; + b = 31*b/255; + // Store pixel + dst[i*2+width] = (r << 11) | (g << 5) | b; + + y_p++; + // YCbCr -> RGB convertion + y = (*y_p - 16)*1.164; + r = y + 1.596*(src[2][i] - 128); + g = y + 0.813*(src[2][i] - 128) - 0.392*(src[1][i] - 128); + b = y + 2.017*(src[1][i] - 128); + if (r < 0) r = 0; + else if (r > 255) r = 255; + if (g < 0) g = 0; + else if (g > 255) g = 255; + if (b < 0) b = 0; + else if (b > 255) b = 255; + r = 31*r/255; + g = 63*g/255; + b = 31*b/255; + // Store pixel + dst[i*2+1] = (r << 11) | (g << 5) | b; + + // YCbCr -> RGB convertion + y = (*(y_p+stride) - 16)*1.164; + r = y + 1.596*(src[2][i] - 128); + g = y + 0.813*(src[2][i] - 128) - 0.392*(src[1][i] - 128); + b = y + 2.017*(src[1][i] - 128); + if (r < 0) r = 0; + else if (r > 255) r = 255; + if (g < 0) g = 0; + else if (g > 255) g = 255; + if (b < 0) b = 0; + else if (b > 255) b = 255; + r = 31*r/255; + g = 63*g/255; + b = 31*b/255; + // Store pixel + dst[i*2+1+width] = (r << 11) | (g << 5) | b; + } +} extern void lcd_write_yuv420_lines_odither(fb_data *dst, unsigned char const * const src[3], int width, @@ -385,8 +464,8 @@ void lcd_blit_yuv(unsigned char * const width &= ~1; height >>= 1; - y = LCD_WIDTH - 1 - y; - fb_data *dst = &lcd_driver_framebuffer[x][y]; + //y = LCD_WIDTH - 1 - y; + fb_data *dst = &lcd_driver_framebuffer[y][x]; z = stride*src_y; yuv_src[0] = src[0] + z + src_x; @@ -401,7 +480,7 @@ void lcd_blit_yuv(unsigned char * const yuv_src[0] += stride << 1; /* Skip down two luma lines */ yuv_src[1] += stride >> 1; /* Skip down one chroma line */ yuv_src[2] += stride >> 1; - dst -= 2; + dst += 2*LCD_FBWIDTH; y -= 2; } while (--height > 0); @@ -410,11 +489,11 @@ void lcd_blit_yuv(unsigned char * const { do { - lcd_write_yuv420_lines(dst, yuv_src, width, stride); + lcd_write_yuv420_lines2(dst, yuv_src, width, stride); yuv_src[0] += stride << 1; /* Skip down two luma lines */ yuv_src[1] += stride >> 1; /* Skip down one chroma line */ yuv_src[2] += stride >> 1; - dst -= 2; + dst += 2*LCD_FBWIDTH; } while (--height > 0); }