X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=platform%2Flinux%2Fblit.c;h=96326fe138e3294fa13919c30b2dbfda73f8b2c5;hb=refs%2Fremotes%2Fgithub%2Fmaster;hp=fbaac03ff92eea42564003d1ce91b84366528b21;hpb=19954be1966a04304b16d9180b003ec8ca3bc532;p=picodrive.git diff --git a/platform/linux/blit.c b/platform/linux/blit.c index fbaac03f..e10aa6b7 100644 --- a/platform/linux/blit.c +++ b/platform/linux/blit.c @@ -1,15 +1,25 @@ +/* + * PicoDrive + * (C) notaz, 2006,2009 + * (C) irixxxx, 2022 + * + * This work is licensed under the terms of MAME license. + * See COPYING file in the top-level directory. + */ + +#include // Convert 0000bbb0 ggg0rrr0 0000bbb0 ggg0rrr0 // to 00000000 rrr00000 ggg00000 bbb00000 ... // TODO: rm when gp2x/emu.c is no longer used -void bgr444_to_rgb32(void *to, void *from) +void bgr444_to_rgb32(void *to, void *from, unsigned entries) { unsigned short *ps = from; unsigned int *pd = to; int pixels; - for (pixels = 0x40; pixels; pixels--, ps++, pd++) + for (pixels = entries; pixels; pixels--, ps++, pd++) { *pd = ((*ps<<20)&0xe00000) | ((*ps<<8)&0xe000) | ((*ps>>4)&0xe0); *pd |= *pd >> 3; @@ -45,39 +55,88 @@ void bgr444_to_rgb32_sh(void *to, void *from) } } -void vidcpy_m2(void *dest, void *src, int m32col, int with_32c_border) +#define X (x_y >> 16) +#define Y (x_y & 0xffff) +#define W (w_h >> 16) +#define H (w_h & 0xffff) + +// gp2x: 0-> X wiz: Y <-0 +// | | +// v v +// +// Y X + +void vidcpy_8bit(void *dest, void *src, int x_y, int w_h) { unsigned char *pd = dest, *ps = src; - int i, u; + int i; - if (m32col) { - for (i = 0; i < 224; i++) - { - ps += 8; - pd += 32; - for (u = 0; u < 256; u++) - *pd++ = *ps++; - ps += 64; - pd += 32; - } - } else { - for (i = 0; i < 224; i++) - { - ps += 8; - for (u = 0; u < 320; u++) - *pd++ = *ps++; - } + pd += X + Y*320; + ps += X + Y*328 + 8; + for (i = 0; i < H; i++) { + memcpy(pd, ps, W); + ps += 328; pd += 320; } } -void vidcpy_m2_rot(void *dest, void *src, int m32col, int with_32c_border) +void vidcpy_8bit_rot(void *dest, void *src, int x_y, int w_h) { + unsigned char *pd = dest, *ps = src; + int i, u; + + pd += Y + (319-X)*240; + ps += X + Y*328 + 8; + for (i = 0; i < H; i += 4) { + unsigned char *p = (void *)ps; + unsigned int *q = (void *)pd; + for (u = 0; u < W; u++) { + *q = (p[3*328]<<24) + (p[2*328]<<16) + (p[1*328]<<8) + p[0*328]; + p += 1; + q -= 240/4; + } + ps += 4*328; pd += 4; + } } void rotated_blit8 (void *dst, void *linesx4, int y, int is_32col) { + unsigned char *pd = dst, *ps = linesx4; + int x, w, u; + + x = (is_32col ? 32 : 0); + w = (is_32col ? 256 : 320); + y -= 4; + + pd += y + (319-x)*240; + ps += x; + + unsigned char *p = (void *)ps; + unsigned int *q = (void *)pd; + for (u = 0; u < w; u++) { + *q = (p[3*328]<<24) + (p[2*328]<<16) + (p[1*328]<<8) + p[0*328]; + p += 1; + q -= 240/4; + } } void rotated_blit16(void *dst, void *linesx4, int y, int is_32col) { + unsigned short *pd = dst, *ps = linesx4; + int x, w, u; + + x = (is_32col ? 32 : 0); + w = (is_32col ? 256 : 320); + y -= 4; + + pd += y + (319-x)*240; + ps += x; + + unsigned short *p = (void *)ps; + unsigned int *q = (void *)pd; + for (u = 0; u < w; u++) { + q[0] = (p[1*328]<<16) + p[0*328]; + q[1] = (p[3*328]<<16) + p[2*328]; + p += 1; + q -= 2*240/4; + } }