diff options
Diffstat (limited to 'firmware/target')
-rw-r--r-- | firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c | 93 |
1 files changed, 85 insertions, 8 deletions
diff --git a/firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c b/firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c index eafc8a414f..48ae99ddcd 100644 --- a/firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c +++ b/firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c | |||
@@ -359,10 +359,88 @@ void lcd_yuv_set_options(unsigned options) | |||
359 | } | 359 | } |
360 | 360 | ||
361 | /* Line write helper function for lcd_yuv_blit. Write two lines of yuv420. */ | 361 | /* Line write helper function for lcd_yuv_blit. Write two lines of yuv420. */ |
362 | extern void lcd_write_yuv420_lines(fb_data *dst, | 362 | static void lcd_write_yuv420_lines(fb_data *dst, |
363 | unsigned char const * const src[3], | 363 | unsigned char const * const src[3], |
364 | int width, | 364 | int width, |
365 | int stride); | 365 | int stride) |
366 | { | ||
367 | int i = 0; | ||
368 | int y; | ||
369 | int rv, guv, bu; | ||
370 | int cb, cr; | ||
371 | int r, g, b; | ||
372 | unsigned const char *y_p = src[0]; | ||
373 | |||
374 | for (i = 0; i < width/2; i++) | ||
375 | { | ||
376 | y_p++; | ||
377 | |||
378 | /* YCbCr -> RGB conversion */ | ||
379 | cb = src[1][i] - 128; | ||
380 | cr = src[2][i] - 128; | ||
381 | |||
382 | rv = (cr*101 + 56) >> 9; | ||
383 | guv = (128 - cr*51 + cb*24) >> 8; | ||
384 | bu = (cb*128 + 256) >> 9; | ||
385 | |||
386 | y = (*y_p - 16)*74; | ||
387 | r = (y >> 9) + rv; | ||
388 | g = (y >> 8) + guv; | ||
389 | b = (y >> 9) + bu; | ||
390 | if (r < 0) r = 0; | ||
391 | else if (r > 31) r = 31; | ||
392 | if (g < 0) g = 0; | ||
393 | else if (g > 63) g = 63; | ||
394 | if (b < 0) b = 0; | ||
395 | else if (b > 31) b = 31; | ||
396 | |||
397 | dst[i*2] = (r << 11) | (g << 5) | b; | ||
398 | |||
399 | /* YCbCr -> RGB conversion */ | ||
400 | y = (*(y_p+stride) - 16)*74; | ||
401 | r = (y >> 9) + rv; | ||
402 | g = (y >> 8) + guv; | ||
403 | b = (y >> 9) + bu; | ||
404 | if (r < 0) r = 0; | ||
405 | else if (r > 31) r = 31; | ||
406 | if (g < 0) g = 0; | ||
407 | else if (g > 63) g = 63; | ||
408 | if (b < 0) b = 0; | ||
409 | else if (b > 31) b = 31; | ||
410 | |||
411 | dst[i*2+LCD_FBWIDTH] = (r << 11) | (g << 5) | b; | ||
412 | |||
413 | y_p++; | ||
414 | |||
415 | /* YCbCr -> RGB conversion */ | ||
416 | y = (*y_p - 16)*74; | ||
417 | r = (y >> 9) + rv; | ||
418 | g = (y >> 8) + guv; | ||
419 | b = (y >> 9) + bu; | ||
420 | if (r < 0) r = 0; | ||
421 | else if (r > 31) r = 31; | ||
422 | if (g < 0) g = 0; | ||
423 | else if (g > 63) g = 63; | ||
424 | if (b < 0) b = 0; | ||
425 | else if (b > 31) b = 31; | ||
426 | |||
427 | dst[i*2+1] = (r << 11) | (g << 5) | b; | ||
428 | |||
429 | /* YCbCr -> RGB conversion */ | ||
430 | y = (*(y_p+stride) - 16)*74; | ||
431 | r = (y >> 9) + rv; | ||
432 | g = (y >> 8) + guv; | ||
433 | b = (y >> 9) + bu; | ||
434 | if (r < 0) r = 0; | ||
435 | else if (r > 31) r = 31; | ||
436 | if (g < 0) g = 0; | ||
437 | else if (g > 63) g = 63; | ||
438 | if (b < 0) b = 0; | ||
439 | else if (b > 31) b = 31; | ||
440 | |||
441 | dst[i*2+1+LCD_FBWIDTH] = (r << 11) | (g << 5) | b; | ||
442 | } | ||
443 | } | ||
366 | extern void lcd_write_yuv420_lines_odither(fb_data *dst, | 444 | extern void lcd_write_yuv420_lines_odither(fb_data *dst, |
367 | unsigned char const * const src[3], | 445 | unsigned char const * const src[3], |
368 | int width, | 446 | int width, |
@@ -385,8 +463,7 @@ void lcd_blit_yuv(unsigned char * const src[3], | |||
385 | width &= ~1; | 463 | width &= ~1; |
386 | height >>= 1; | 464 | height >>= 1; |
387 | 465 | ||
388 | y = LCD_WIDTH - 1 - y; | 466 | fb_data *dst = &lcd_driver_framebuffer[y][x]; |
389 | fb_data *dst = &lcd_driver_framebuffer[x][y]; | ||
390 | 467 | ||
391 | z = stride*src_y; | 468 | z = stride*src_y; |
392 | yuv_src[0] = src[0] + z + src_x; | 469 | yuv_src[0] = src[0] + z + src_x; |
@@ -401,7 +478,7 @@ void lcd_blit_yuv(unsigned char * const src[3], | |||
401 | yuv_src[0] += stride << 1; /* Skip down two luma lines */ | 478 | yuv_src[0] += stride << 1; /* Skip down two luma lines */ |
402 | yuv_src[1] += stride >> 1; /* Skip down one chroma line */ | 479 | yuv_src[1] += stride >> 1; /* Skip down one chroma line */ |
403 | yuv_src[2] += stride >> 1; | 480 | yuv_src[2] += stride >> 1; |
404 | dst -= 2; | 481 | dst += 2*LCD_FBWIDTH; |
405 | y -= 2; | 482 | y -= 2; |
406 | } | 483 | } |
407 | while (--height > 0); | 484 | while (--height > 0); |
@@ -414,7 +491,7 @@ void lcd_blit_yuv(unsigned char * const src[3], | |||
414 | yuv_src[0] += stride << 1; /* Skip down two luma lines */ | 491 | yuv_src[0] += stride << 1; /* Skip down two luma lines */ |
415 | yuv_src[1] += stride >> 1; /* Skip down one chroma line */ | 492 | yuv_src[1] += stride >> 1; /* Skip down one chroma line */ |
416 | yuv_src[2] += stride >> 1; | 493 | yuv_src[2] += stride >> 1; |
417 | dst -= 2; | 494 | dst += 2*LCD_FBWIDTH; |
418 | } | 495 | } |
419 | while (--height > 0); | 496 | while (--height > 0); |
420 | } | 497 | } |