summaryrefslogtreecommitdiff
path: root/firmware/target/arm/tcc780x/cowond2
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 /firmware/target/arm/tcc780x/cowond2
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
Diffstat (limited to 'firmware/target/arm/tcc780x/cowond2')
-rw-r--r--firmware/target/arm/tcc780x/cowond2/lcd-cowond2.c93
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. */
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 }