summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Purchase <shotofadds@rockbox.org>2008-07-09 20:51:47 +0000
committerRob Purchase <shotofadds@rockbox.org>2008-07-09 20:51:47 +0000
commitb564ac44cd81e77d59f12a67ec4e82593ad02e43 (patch)
tree360a64ef9e035d73bd7c52b2ee7041f8ae82db90
parent0eb51e8a73be0713579dfade63447fd5e7858160 (diff)
downloadrockbox-b564ac44cd81e77d59f12a67ec4e82593ad02e43.tar.gz
rockbox-b564ac44cd81e77d59f12a67ec4e82593ad02e43.zip
D2: A working implementation of lcd_blit_yuv() by Thibaut Girka.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18000 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--docs/CREDITS1
-rw-r--r--firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c93
2 files changed, 86 insertions, 8 deletions
diff --git a/docs/CREDITS b/docs/CREDITS
index 6c8540779e..55ed57b6a9 100644
--- a/docs/CREDITS
+++ b/docs/CREDITS
@@ -397,6 +397,7 @@ Mike Burke
397Michael Chicoine 397Michael Chicoine
398Maciej Adamczak 398Maciej Adamczak
399Tomer Shalev 399Tomer Shalev
400Thibaut Girka
400 401
401The libmad team 402The libmad team
402The wavpack team 403The wavpack team
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. */
362extern void lcd_write_yuv420_lines(fb_data *dst, 362static 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}
366extern void lcd_write_yuv420_lines_odither(fb_data *dst, 444extern 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 }