#include /* Generic C versions, in case no md version exists yet for this machine */ #include "gl-md-asm.h" void gl_clear_fb1(struct gl_fb1 *fb) { bzero(fb->vram,fb->size); } void gl_copy_fb1_fb1_inverted(struct gl_fb1 *f, struct gl_fb1 *t) { unsigned char *fp; unsigned char *tp; int xc; int ys; int x; int y; xc = (f->xsize < t->xsize) ? f->xsize : t->xsize; xc = (xc + 7) >> 3; ys = (f->ysize < t->ysize) ? f->ysize : t->ysize; fp = f->vram; tp = t->vram; for (y=ys;y>0;y--) { for (x=xc;x>0;x--) { *tp++ = ~*fp++; } fp += f->stride - xc; tp += t->stride - xc; } } void gl_line_fb1(struct gl_fb1 *fb, int x0, int y0, int x1, int y1) { int dx; int dy; int adx; int ady; int d; int i; int x; int y; int c; dx = x1 - x0; dy = y1 - y0; adx = (dx < 0) ? -dx : dx; ady = (dy < 0) ? -dy : dy; if (adx < ady) { if (dy < 0) { i = x0; x0 = x1; x1 = i; dx = - dx; i = y0; y0 = y1; y1 = i; dy = - dy; } c = dy / 2; if (dx < 0) { i = -1; d = - dx; } else { i = 1; d = dx; } x = x0; y = y0; gl_point_fb1(fb,x,y); while (y != y1) { y ++; c -= d; if (c < 0) { c += dy; x += i; } gl_point_fb1(fb,x,y); } } else { if (dx < 0) { i = y0; y0 = y1; y1 = i; dy = - dy; i = x0; x0 = x1; x1 = i; dx = - dx; } c = dx / 2; if (dy < 0) { i = -1; d = - dy; } else { i = 1; d = dy; } x = x0; y = y0; gl_point_fb1(fb,x,y); while (x != x1) { x ++; c -= d; if (c < 0) { c += dx; y += i; } gl_point_fb1(fb,x,y); } } } void gl_point_fb1(struct gl_fb1 *fb, int x, int y) { if ((x < 0) || (y < 0) || (x >= fb->xsize) || (y >= fb->ysize)) return; fb->vram[(y*fb->stride)+(x>>3)] |= 0x80 >> (x & 7); } void gl_copy_fb1_fb8_bit(struct gl_fb1 *f, struct gl_fb8 *t, unsigned char bit) { unsigned char *fp0; unsigned char *fp; unsigned char *tp0; unsigned char *tp; int xs; int ys; int x; int y; unsigned long long int fbuf; int nfb; unsigned long long int tbuf; int tc; xs = (f->xsize < t->xsize) ? f->xsize : t->xsize; ys = (f->ysize < t->ysize) ? f->ysize : t->ysize; fp = f->vram; tp = t->vram; for (y=ys;y>0;y--) { fp0 = fp; tp0 = tp; fbuf = *(unsigned long long int *)(fp-(7&(int)fp)); nfb = 8 * (8 - (7 & (int)fp)); fp += 8 - (7 & (int)fp); fbuf <<= 64 - nfb; tc = 7 & (int)tp; tp -= tc; tbuf = *(unsigned long long int *)tp; for (x=xs;x>0;x--) { if (nfb < 1) { fbuf = *(unsigned long long int *)fp; fp += 8; nfb = 64; } if (fbuf & 0x8000000000000000ULL) tbuf |= ((unsigned long long int)bit) << ((7-tc) * 8); else tbuf &= ~(((unsigned long long int)bit) << ((7-tc) * 8)); tc ++; if (tc >= 8) { *(unsigned long long int *)tp = tbuf; tp += 8; tbuf = *(unsigned long long int *)tp; tc = 0; } fbuf <<= 1; nfb --; } if (tc > 0) *(unsigned long long int *)tp = tbuf; fp = fp0 + f->stride; tp = tp0 + t->stride; } } void gl_copy_fb1_fb8(struct gl_fb1 *f, struct gl_fb8 *t) { unsigned char *fp0; unsigned char *fp; unsigned char *tp0; unsigned char *tp; int xs; int ys; int x; int y; unsigned long long int fbuf; int nfb; unsigned long long int tbuf; int tc; xs = (f->xsize < t->xsize) ? f->xsize : t->xsize; ys = (f->ysize < t->ysize) ? f->ysize : t->ysize; fp = f->vram; tp = t->vram; for (y=ys;y>0;y--) { fp0 = fp; tp0 = tp; fbuf = *(unsigned long long int *)(fp-(7&(int)fp)); nfb = 8 * (8 - (7 & (int)fp)); fp += 8 - (7 & (int)fp); fbuf <<= 64 - nfb; tc = 7 & (int)tp; if (tc > 0) { tp -= tc; tbuf = (*(unsigned long long int *)tp) >> (64 - (8*tc)); } for (x=xs;x>0;x--) { if (nfb < 1) { fbuf = *(unsigned long long int *)fp; fp += 8; nfb = 64; } if (fbuf & 0x8000000000000000ULL) { tbuf = (tbuf << 8) | 255; } else { tbuf <<= 8; } tc ++; if (tc >= 8) { *(unsigned long long int *)tp = tbuf; tp += 8; tc = 0; } fbuf <<= 1; nfb --; } if (tc > 0) { tbuf = (tbuf << (8 * (8-tc))) | (((~0ULL) >> (8 * tc)) & *(unsigned long long int *)tp); *(unsigned long long int *)tp = tbuf; } fp = fp0 + f->stride; tp = tp0 + t->stride; } }