📄 fbvga16.c
字号:
return (addr[(x>>1) + y * psd->linelen] >> ((1-(x&1))<<2) ) & 0x0f;
src = SCREENBASE(psd) + (x>>3) + y * BYTESPERLINE(psd);
for(plane = 0; plane < 4; ++plane) {
set_read_plane(plane);
if(GETBYTE(src) & mask[x&7])
c |= 1 << plane;
}
return c;
}
/* Draw horizontal line from x1,y to x2,y including final point*/
static void fbvga16_drawhline (PSD psd, int x, int y, int w, gal_pixel c)
{
gal_uint8 *addr= (gal_uint8 *)psd->addr;
gal_uint8* dst, last;
int cc;
if (psd->flags & PSF_MEMORY) {
addr += (x>>1) + y * psd->linelen;
cc = c | (c << 4);
if(psd->gr_mode == MODE_XOR) {
if (x & 1) {
*addr = (*addr & notmask[1]) | (c ^ (*addr & notmask[0]));
addr++;
w --;
}
while (w > 1) {
*addr++ ^= cc ;
w -= 2;
}
if (w == 1)
*addr = (*addr & notmask[0]) | ((c << 4)^(*addr & notmask[1]));
} else {
if (x & 1) {
*addr = (*addr & notmask[1]) | c;
addr++;
w --;
}
while (w > 1) {
*addr++ = cc ;
w -= 2;
}
if (w == 1)
*addr = (*addr & notmask[0]) | (c << 4);
}
return;
}
set_color (c);
set_op(mode_table[psd->gr_mode]);
/*
* The following fast drawhline code is buggy for XOR drawing,
* for some reason. So, we use the equivalent slower drawpixel
* method when not drawing MODE_SET.
*/
if(psd->gr_mode == MODE_SET) {
dst = SCREENBASE(psd) + (x>>3) + y * BYTESPERLINE(psd);
if ((x>>3) == ( (x + w - 1)>>3) ) {
select_and_set_mask ((0xff >> (x & 7)) & (0xff << (7 - ((x + w - 1) & 7))));
RMW (dst);
} else {
select_and_set_mask (0xff >> (x & 7));
RMW (dst++);
set_mask (0xff);
last = SCREENBASE(psd) + ( (x + w - 1) >>3) + y * BYTESPERLINE(psd);
while (dst < last)
PUTBYTE(dst++, 1);
set_mask (0xff << (7 - ((x + w - 1) & 7)));
RMW (dst);
}
} else {
/* slower method, draw pixel by pixel*/
select_mask ();
while(w--) {
set_mask (mask[x&7]);
RMW ((gal_uint8*)SCREENBASE(psd) + (x++>>3) + y * BYTESPERLINE(psd));
}
}
}
static void fbvga16_drawvline(PSD psd, int x, int y, int h, gal_pixel c)
{
gal_uint8* addr= (gal_uint8 *)psd->addr;
gal_uint8* dst;
int linelen = psd->linelen;
if (psd->flags & PSF_MEMORY) {
addr += (x>>1) + y * linelen;
if(psd->gr_mode == MODE_XOR)
while(h--) {
*addr ^= (*addr & notmask[x&1]) | (c << ((1-(x&1))<<2) ^ (*addr¬mask[1 - (x&1)]));
addr += linelen;
}
else
while(h--) {
*addr = (*addr & notmask[x&1]) | (c << ((1-(x&1))<<2));
addr += linelen;
}
return;
}
set_op(mode_table[psd->gr_mode]);
set_color (c);
select_and_set_mask (mask[x&7]);
dst = SCREENBASE(psd) + (x>>3) + y * BYTESPERLINE(psd);
while (h--) {
RMW (dst);
dst += BYTESPERLINE(psd);
}
}
/*clip to screen*/
static void fbvga16_getbox ( PSD psd, int x, int y, int w, int h, void* buf )
{
gal_uint8 *dst = (gal_uint8*) buf;
int dstwidth = w;
if ( y < 0 ) {
h += y;
dst += -y * dstwidth;
y = 0;
}
if ( x < 0 ) {
w += x;
dst += -x;
x = 0;
}
if ( y + h - 1 >= psd->yres)
h = psd->yres - y ;
if ( x + w - 1 >= psd->xres)
w = psd->xres - x ;
if (psd->flags & PSF_MEMORY) {
gal_uint8 *src= (gal_uint8 *)psd->addr + y * psd->linelen + x;
while ( h--) {
memcpy(dst,src,w);
src += psd->linelen;
dst += dstwidth;
}
}
else
_vga16_getbox (psd, x, y, w, h, dst, dstwidth);
}
/*do clip*/
static void fbvga16_putbox ( PSD psd, int x, int y, int w, int h, void *buf)
{
gal_uint8 *src = (gal_uint8*) buf;
int srcwidth = w;
if (psd->doclip) {
if (y < psd->clipminy) {
h -= psd->clipminy - y;
src += (psd->clipminy - y) * srcwidth;
y = psd->clipminy;
}
if (x < psd->clipminx) {
w -= psd->clipminx - x;
src += psd->clipminx - x;
x = psd->clipminx;
}
if (y + h - 1 >= psd->clipmaxy)
h = psd->clipmaxy- y;
if (x + w - 1 >= psd->clipmaxx)
w = psd->clipmaxx- x;
}
else {
if ( y < 0 ) {
h += y;
src += -y * srcwidth;
y = 0;
}
if ( x < 0 ) {
w += x;
src += -x;
x = 0;
}
if ( y + h -1 >= psd->yres)
h = psd->yres - y ;
if ( x + w -1 >= psd->xres)
w = psd->xres - x ;
}
if (psd->flags & PSF_MEMORY) {
gal_uint8 *dst= (gal_uint8 *)psd->addr + y * psd->linelen + x;
while ( h--) {
memcpy(dst,src,w);
dst += psd->linelen;
src += srcwidth;
}
}
else
_vga16_putbox (psd, x, y, w, h, src, srcwidth);
}
static void fbvga16_putboxmask (PSD psd, int x, int y, int w, int h, void *buf, gal_pixel cxx)
{
gal_uint8 *src= (gal_uint8*) buf;
int srcwidth = w ;
if (psd->doclip) {
if (y < psd->clipminy) {
h -= psd->clipminy - y;
src += (psd->clipminy - y) * srcwidth;
y = psd->clipminy;
}
if (x < psd->clipminx) {
w -= psd->clipminx - x;
src += psd->clipminx - x;
x = psd->clipminx;
}
if (y + h - 1 >= psd->clipmaxy)
h = psd->clipmaxy- y;
if (x + w - 1 >= psd->clipmaxx)
w = psd->clipmaxx- x;
}
else {
if ( y < 0 ) {
h += y;
src += -y * srcwidth;
y = 0;
}
if ( x < 0 ) {
w += x;
src += -x;
x = 0;
}
if ( y + h -1 >= psd->yres)
h = psd->yres - y ;
if ( x + w -1 >= psd->xres)
w = psd->xres - x ;
}
if (psd->flags & PSF_MEMORY) {
gal_uint8 *dst= (gal_uint8 *)psd->addr + y * psd->linelen + x;
gal_uint8 c;
while ( h--) {
int w1 = w;
gal_uint8 *src1 = src;
gal_uint8 *dst1 = dst;
while(w1--) {
c = *src1;
if (c != cxx)
*dst1 = c;
src1++;
dst1++;
}
dst += psd->linelen;
src += srcwidth;
}
}
else
_vga16_putboxmask (psd, x, y, w, h, src, srcwidth, cxx);
}
static void fbvga16_copybox
(PSD psd,int x1, int y1, int w, int h, int x2, int y2)
{
gal_uint8 *buf;
buf = (gal_uint8 *) malloc (w * h);
if (psd->flags & PSF_MEMORY) {
_mem16_getbox (psd, x1, y1, w, h, buf, w);
_mem16_putbox (psd, x1, y1, w, h, buf, w);
} else {
_vga16_getbox (psd, x2, y2, w, h, buf, w);
_vga16_putbox (psd, x2, y2, w, h, buf, w);
}
free (buf);
}
/*
* Bitblt,not do clip
* opcode is currently ignored
* WARNING: src & dst can not be same psd!
*/
static void fbvga16_blit (PSD dstpsd, int dstx, int dsty, int w, int h,
PSD srcpsd, int srcx, int srcy)
{
int srcvga, dstvga;
srcvga = srcpsd->flags & PSF_SCREEN;
dstvga = dstpsd->flags & PSF_SCREEN;
if(srcvga) {
if(dstvga)
_vga16_to_vga16_blit(dstpsd, dstx, dsty, w, h,
srcpsd, srcx, srcy);
else
_vga16_to_mem16_blit(dstpsd, dstx, dsty, w, h,
srcpsd, srcx, srcy);
} else {
if(dstvga)
_mem16_to_vga16_blit(dstpsd, dstx, dsty, w, h,
srcpsd, srcx, srcy);
else {
gal_uint8 * dst;
gal_uint8 * src;
dst = (char *)dstpsd->addr + dstx + dsty * dstpsd->linelen;
src = (char *)srcpsd->addr + srcx + srcy * srcpsd->linelen;
memcpy(dst, src, w*h);
}
}
}
SUBDRIVER fbvga16 = {
fbvga16_init,
fbvga16_drawpixel,
fbvga16_readpixel,
fbvga16_drawhline,
fbvga16_drawvline,
fbvga16_blit,
fbvga16_putbox,
fbvga16_getbox,
fbvga16_putboxmask,
fbvga16_copybox
};
#endif /* _FBVGA16_SUPPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -