⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fblin8.c

📁 在ecos 下mingui 的移植开发
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -