📄 fblin8.c
字号:
/* * 8bpp Linear Video Driver for MiniGUI * * 2000/10/20 Updated by Song Lixin to be used under MiniGUI. * * Partly Copyright (c) 1999 Greg Haerr <greg@censoft.com> * * We do clip & paramter check at high level.But in some function such * as putbox , we have to do it at low level. */#include <stdlib.h>#include <assert.h>#ifndef __ECOS# include <syslog.h>#endif/* We want to do string copying fast, so inline assembly if possible */#ifndef __OPTIMIZE__#define __OPTIMIZE__#endif#include <string.h>#include "native.h"#include "fb.h"static int linear8_init (PSD psd){ if (!psd->size) { /* ONLY init ONCE !!! --- by adoal, :p */#ifndef NDEBUG assert (psd->yres>0); assert (psd->linelen>0);#endif psd->size = psd->yres * psd->linelen; /* convert linelen from byte to pixel len for bpp 16, 24, 32*/ } return 1;}/* Set pixel at x, y, to gal_pixel c*/static void linear8_drawpixel (PSD psd, int x, int y, gal_pixel c){ gal_uint8 * addr = (gal_uint8 *) psd->addr;#ifndef NDEBUG assert (addr); assert (c < psd->ncolors); if (psd->doclip) { assert ((x >= psd->clipminx) && (x < psd->clipmaxx)); assert ((y >= psd->clipminy) && (y < psd->clipmaxy)); } else { assert ((x >= 0) && (x < psd->xres)); assert ((y >= 0) && (y < psd->yres)); }#endif DRAWON; if (psd->gr_mode == MODE_XOR) addr[x + y * psd->linelen] ^= (gal_uint8) c; else addr[x + y * psd->linelen] = (gal_uint8) c; DRAWOFF;}/* Read pixel at x, y*/static gal_pixel linear8_readpixel (PSD psd, int x, int y){ gal_uint8 *addr = (gal_uint8 *) psd->addr;#ifndef NDEBUG assert (addr); assert ((x >= 0) && (x < psd->xres)); assert ((y >= 0) && (y < psd->yres));#endif return (gal_pixel) addr[x + y * psd->linelen];}/* Draw horizontal line from x1,y to x2,y including final point*/static void linear8_drawhline (PSD psd, int x, int y, int w, gal_pixel c){ gal_uint8 *dst;#ifndef NDEBUG assert (w > 0); assert (c < psd->ncolors);// syslog(LOG_INFO,"fb16:x:%d,y:%d,w:%d",x,y,w);// syslog(LOG_INFO,"fb16:psd->clipminx:%d,psd->clipmaxx:%d",psd->clipminx,psd->clipmaxx);// syslog(LOG_INFO,"fb16:psd->clipminy:%d,psd->clipmaxy:%d",psd->clipminy,psd->clipmaxy); if (psd->doclip) { assert ((x >= psd->clipminx) && (x + w - 1 < psd->clipmaxx)); assert ((y >= psd->clipminy) && (y < psd->clipmaxy)); } else { assert ((x >= 0) && (x + w - 1 < psd->xres)); assert ((y >= 0) && (y < psd->yres)); }#endif dst = (gal_uint8 *)(psd->addr) + y * psd->linelen + x; DRAWON; if (psd->gr_mode == MODE_XOR) { while (w --) *dst++ ^= (gal_uint8)c; } else { while (w --) *dst++ = (gal_uint8)c; } DRAWOFF;}/*do clip*/static void linear8_puthline (PSD psd,int x, int y, int w, void *buf){ gal_uint8 *mem; gal_uint8 *src = (gal_uint8 *) buf; #ifndef NDEBUG assert (w > 0); assert (buf); if (psd->doclip) { assert ((x + w - 1 >= psd->clipminx) && (x < psd->clipmaxx)); assert ((y >= psd->clipminy) && (y < psd->clipmaxy)); } else { assert ((x + w - 1 >= 0) && (x < psd->xres)); assert ((y >= 0) && (y < psd->yres)); }#endif if (psd->doclip) { if (x < psd->clipminx) { src += psd->clipminx - x; w -= psd->clipminx - x; x = psd->clipminx; } if (x + w - 1 >= psd->clipmaxx) { w = psd->clipmaxx - x ; } } else { if (x < 0) { src -= x; w += x; x = 0; } if (x + w -1 >= psd->xres) { w = psd->xres - x; } } DRAWON; mem = (gal_uint8 *)(psd->addr) + y * psd->linelen + x; memcpy(mem,src,w); DRAWOFF;}/*do clip*/static void linear8_gethline (PSD psd, int x, int y, int w, void *buf){ gal_uint8 *mem; gal_uint8 *dst = (gal_uint8 *) buf;#ifndef NDEBUG assert (w > 0); assert (buf); assert ((x + w - 1 >= 0) && (x < psd->xres)); assert ((y >= 0) && (y < psd->yres));#endif if (x < 0) { dst -= x; w += x; x = 0; } if (x + w -1 >= psd->xres) { w = psd->xres - x; } mem = (gal_uint8 *)(psd->addr) + (y * psd->linelen + x); memcpy(dst,mem,w); }static void linear8_drawvline(PSD psd, int x, int y, int h, gal_pixel c){ gal_uint8 *dst; int linelen = psd->linelen;#ifndef NDEBUG assert (h > 0); assert (c < psd->ncolors); //syslog(LOG_INFO,"linear8_drawvline : x:%d,y:%d,h:%d",x,y,h);// syslog(LOG_INFO,"psd->doclip:%d,psd->clipminx:%d,psd->clipmaxx:%d,psd->clipminy:%d, psd->clipmaxy:%d",psd->doclip,psd->clipminx,psd->clipmaxx,psd->clipminy,psd->clipmaxy); if (psd->doclip) { assert ((x >= psd->clipminx) && (x < psd->clipmaxx)); assert ((y >= psd->clipminy) && (y + h - 1 < psd->clipmaxy)); } else { assert ((x >= 0) && (x < psd->xres)); assert ((y >= 0) && (y + h - 1 < psd->yres)); } #endif dst = (gal_uint8 *)(psd->addr) + y * psd->linelen + x; DRAWON; if (psd->gr_mode == MODE_XOR) { while (h --) { *dst^= (gal_uint8)c; dst+= linelen; } } else { while (h --) { *dst = (gal_uint8)c; dst+= linelen; } } DRAWOFF;}/*do clip*/static void linear8_putvline (PSD psd,int x, int y, int h, void *buf){ gal_uint8 *mem; gal_uint8 *src= (gal_uint8 *) buf;#ifndef NDEBUG assert (h > 0); assert (buf); if (psd->doclip) { assert ((x >= psd->clipminx) && (x < psd->clipmaxx)); assert ((y + h - 1 >= psd->clipminy) && (y < psd->clipmaxy)); } else { assert ((x >= 0) && (x < psd->xres)); assert ((y + h - 1 >= 0) && (y < psd->yres)); }#endif if (psd->doclip) { if (y < psd->clipminy) { src += psd->clipminy - y; h -= psd->clipminy - y; y = psd->clipminy; } if (y + h - 1 >= psd->clipmaxy) { h = psd->clipmaxy - y ; } } else { if (y < 0) { src -= y; h += y; y = 0; } if (y + h -1 >= psd->yres) { h = psd->yres - y; } } mem = (gal_uint8 *)(psd->addr) + y * psd->linelen + x; DRAWON; while (h --) { *mem = *src++; mem += psd->linelen; } DRAWOFF;}/*do clip*/static void linear8_getvline (PSD psd, int x, int y, int h, void *buf){ gal_uint8 *mem; gal_uint8 *dst= (gal_uint8 *) buf;#ifndef NDEBUG assert (h > 0); assert (buf); assert ((x >= 0) && (x < psd->xres)); assert ((y + h - 1 >= 0) && (y < psd->yres));#endif if (y < 0) { dst -= y; h += y; y = 0; } if (y + h -1 >= psd->yres) { h = psd->yres - y; } mem = (gal_uint8 *)(psd->addr) + y * psd->linelen + x; while (h --) { *dst++ = *mem; mem+= psd->linelen; } return;}/* srccopy bitblt,not do clip*/static void linear8_blit (PSD dstpsd, int dstx, int dsty, int w, int h, PSD srcpsd, int srcx, int srcy){ gal_uint8 *dst = (gal_uint8 *) dstpsd->addr; gal_uint8 *src = (gal_uint8 *) srcpsd->addr; int dlinelen = dstpsd->linelen; int slinelen = srcpsd->linelen;// syslog(LOG_INFO,"fb16blit:srcpsd:doclip:%d",srcpsd->doclip);// syslog(LOG_INFO,"fb16blit:clipminx:%d,clipmaxx:%d",srcpsd->clipminx,srcpsd->clipmaxx);// syslog(LOG_INFO,"fb16blit:clipminy:%d,clipmaxy:%d",srcpsd->clipminy,srcpsd->clipmaxy);// syslog(LOG_INFO,"fb16blit:dstpsd:",dstpsd->doclip);// syslog(LOG_INFO,"fb16blit:clipminx:%d,clipmaxx:%d",dstpsd->clipminx,dstpsd->clipmaxx);// syslog(LOG_INFO,"fb16blit:clipminy:%d,clipmaxy:%d",dstpsd->clipminy,dstpsd->clipmaxy);#ifndef NDEBUG assert (dst); assert (src); assert (w > 0); assert (h > 0); assert ((srcx >= 0) && (srcx + w - 1 < srcpsd->xres)); assert ((srcy >= 0) && (srcy + h - 1 < srcpsd->yres)); if (dstpsd->doclip) { assert ((dstx >= dstpsd->clipminx) && (dstx + w - 1 < dstpsd->clipmaxx)); assert ((dsty >= dstpsd->clipminy) && (dsty + h - 1 < dstpsd->clipmaxy)); } else { assert ((dstx >= 0) && (dstx + w -1 < dstpsd->xres)); assert ((dsty >= 0) && (dsty + h -1 < dstpsd->yres)); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -