X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=common%2Fhost_fb.c;h=f577bb94505ad8eaad2e29d35f734feab901476e;hb=830ba1bf77492eb259dad9dea3d9531b51376009;hp=46467d469acea8e65468bc9a53e3623248753470;hpb=4d0451847a77d420284c7fb0f50b1f167c1118ee;p=ginge.git diff --git a/common/host_fb.c b/common/host_fb.c index 46467d4..f577bb9 100644 --- a/common/host_fb.c +++ b/common/host_fb.c @@ -14,6 +14,7 @@ static int host_stride; #include "fbdev.c" static struct vout_fbdev *fbdev; +static unsigned short host_pal[256]; void *host_video_flip(void) { @@ -42,6 +43,77 @@ int host_video_init(int *stride, int no_dblbuf) return 0; } +void host_video_finish(void) +{ + vout_fbdev_finish(fbdev); + fbdev = NULL; +} + +void host_video_update_pal16(unsigned short *pal) +{ + memcpy(host_pal, pal, sizeof(host_pal)); +} + +void host_video_update_pal32(unsigned int *pal) +{ + unsigned short *dstp = host_pal; + int i; + + for (i = 0; i < 256; i++, pal++, dstp++) { + unsigned int t = *pal; + *dstp = ((t >> 8) & 0xf800) | ((t >> 5) & 0x07e0) | ((t >> 3) & 0x001f); + } +} + +void host_video_change_bpp(int bpp) +{ +} + +void host_video_blit4(const unsigned char *src, int w, int h, int stride) +{ + unsigned short *dst = host_screen; + unsigned short *hpal = host_pal; + int i, u; + + for (i = 0; i < 240; i++, dst += host_stride / 2, src += stride) { + for (u = 0; i < w / 2; u++) { + dst[u*2 + 0] = hpal[src[u] >> 4]; + dst[u*2 + 1] = hpal[src[u] & 0x0f]; + } + } + + host_video_flip(); +} + +void host_video_blit8(const unsigned char *src, int w, int h, int stride) +{ + unsigned short *dst = host_screen; + unsigned short *hpal = host_pal; + int i, u; + + for (i = 0; i < 240; i++, dst += host_stride / 2, src += stride) { + for (u = 0; u < w; u += 4) { + dst[u + 0] = hpal[src[u + 0]]; + dst[u + 1] = hpal[src[u + 1]]; + dst[u + 2] = hpal[src[u + 2]]; + dst[u + 3] = hpal[src[u + 3]]; + } + } + + host_video_flip(); +} + +void host_video_blit16(const unsigned short *src, int w, int h, int stride) +{ + unsigned short *dst = host_screen; + int i; + + for (i = 0; i < 240; i++, dst += host_stride / 2, src += stride / 2) + memcpy(dst, src, w*2); + + host_video_flip(); +} + #elif defined(WIZ) #include "warm.c" @@ -66,73 +138,54 @@ int host_video_init(int *stride, int no_dblbuf) if (ret != 0) return ret; + vout_gp2x_set_mode(16, !no_dblbuf); host_video_flip(); return 0; } -#endif - -static unsigned short host_pal[256]; - -static void host_update_pal(unsigned int *pal) +void host_video_finish(void) { - unsigned short *dstp = host_pal; - int i; - - for (i = 0; i < 256; i++, pal++, dstp++) { - unsigned int t = *pal; - *dstp = ((t >> 8) & 0xf800) | ((t >> 5) & 0x07e0) | ((t >> 3) & 0x001f); - } + vout_gp2x_finish(); } -void host_video_blit4(const unsigned char *src, int w, int h, unsigned int *pal) +void host_video_update_pal16(unsigned short *pal) { - unsigned short *dst = host_screen; - unsigned short *hpal = host_pal; - int i, u; + vout_gp2x_set_palette16(pal, 256); +} - if (pal != NULL) - host_update_pal(pal); +void host_video_update_pal32(unsigned int *pal) +{ + vout_gp2x_set_palette32(pal, 256); +} - for (i = 0; i < 240; i++, dst += host_stride / 2 - 320) { - for (u = 320 / 2; u > 0; u--, src++) { - *dst++ = hpal[*src >> 4]; - *dst++ = hpal[*src & 0x0f]; - } - } +void host_video_change_bpp(int bpp) +{ + vout_gp2x_set_mode(bpp, 1); +} +#ifdef LOADER +void host_video_blit4(const unsigned char *src, int w, int h, int stride) +{ + memcpy(host_screen, src, 320*240/2); // FIXME host_video_flip(); } -void host_video_blit8(const unsigned char *src, int w, int h, unsigned int *pal) +void host_video_blit8(const unsigned char *src, int w, int h, int stride) { - unsigned short *dst = host_screen; - unsigned short *hpal = host_pal; - int i, u; - - if (pal != NULL) - host_update_pal(pal); - - for (i = 0; i < 240; i++, dst += host_stride / 2 - 320) { - for (u = 320 / 4; u > 0; u--) { - *dst++ = hpal[*src++]; - *dst++ = hpal[*src++]; - *dst++ = hpal[*src++]; - *dst++ = hpal[*src++]; - } - } + extern void rotated_blit8(void *dst, const void *linesx4); + rotated_blit8(host_screen, src); host_video_flip(); } -void host_video_blit16(const unsigned short *src, int w, int h) +void host_video_blit16(const unsigned short *src, int w, int h, int stride) { - unsigned short *dst = host_screen; - int i; - - for (i = 0; i < 240; i++, dst += host_stride / 2, src += 320) - memcpy(dst, src, 320*2); + extern void rotated_blit16(void *dst, const void *linesx4); + rotated_blit16(host_screen, src); host_video_flip(); } +#endif // LOADER + +#endif // WIZ