X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/b23e0f70b3b0e6815b784f29cbe7d09982116c41..35b79c13bc95e26dfae5cb1cda2eef2f265ad9db:/lib/gdi/bcm.cpp diff --git a/lib/gdi/bcm.cpp b/lib/gdi/bcm.cpp index bd820913..b215b108 100644 --- a/lib/gdi/bcm.cpp +++ b/lib/gdi/bcm.cpp @@ -23,10 +23,10 @@ static int exec_list(void); int bcm_accel_init(void) { - fb_fd = open("/dev/fb/0", O_RDWR); + fb_fd = open("/dev/fb0", O_RDWR); if (fb_fd < 0) { - perror("/dev/fb/0"); + perror("/dev/fb0"); return 1; } if (exec_list()) @@ -60,10 +60,11 @@ static int exec_list(void) } void bcm_accel_blit( - int src_addr, int src_width, int src_height, int src_stride, + int src_addr, int src_width, int src_height, int src_stride, int src_format, int dst_addr, int dst_width, int dst_height, int dst_stride, int src_x, int src_y, int width, int height, - int dst_x, int dst_y, int dwidth, int dheight) + int dst_x, int dst_y, int dwidth, int dheight, + int pal_addr, int flags) { C(0x43); // reset source C(0x53); // reset dest @@ -75,7 +76,18 @@ void bcm_accel_blit( P(0x1, src_stride); // set source pitch P(0x2, src_width); // source width P(0x3, src_height); // height - P(0x4, 0x7e48888); // format: ARGB 8888 + switch (src_format) + { + case 0: + P(0x4, 0x7e48888); // format: ARGB 8888 + break; + case 1: + P(0x4, 0x12e40008); // indexed 8bit + P(0x78, 256); + P(0x79, pal_addr); + P(0x7a, 0x7e48888); + break; + } C(0x5); // set source surface (based on last parameters) @@ -111,6 +123,51 @@ void bcm_accel_fill( int x, int y, int width, int height, unsigned long color) { -// printf("unimplemented bcm_accel_fill\n"); + C(0x43); // reset source + C(0x53); // reset dest + C(0x5b); // reset pattern + C(0x67); // reset blend + C(0x75); // reset output + + // clear dest surface + P(0x0, 0); + P(0x1, 0); + P(0x2, 0); + P(0x3, 0); + P(0x4, 0); + C(0x45); + + // clear src surface + P(0x0, 0); + P(0x1, 0); + P(0x2, 0); + P(0x3, 0); + P(0x4, 0); + C(0x5); + + P(0x2d, color); + + P(0x2e, x); // prepare output rect + P(0x2f, y); + P(0x30, width); + P(0x31, height); + C(0x6e); // set this rect as output rect + + P(0x0, dst_addr); // prepare output surface + P(0x1, dst_stride); + P(0x2, dst_width); + P(0x3, dst_height); + P(0x4, 0x7e48888); + C(0x69); // set output surface + + P(0x6f, 0); + P(0x70, 0); + P(0x71, 2); + P(0x72, 2); + C(0x73); // select color keying + + C(0x77); // do it + + exec_list(); }