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

📄 fb_sub.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 4 页
字号:
	lcmdp->ptnBM.type = cmd->ptnBM.type;	lcmdp->ptnBM.depth = cmd->ptnBM.depth;	lcmdp->ptnBM.width = cmd->ptnBM.width;	lcmdp->ptnBM.rect.origin.x = cmd->ptnBM.rect.origin.x;	lcmdp->ptnBM.rect.origin.y = cmd->ptnBM.rect.origin.y;	lcmdp->ptnBM.rect.extent.x = cmd->ptnBM.rect.extent.x;	lcmdp->ptnBM.rect.extent.y = cmd->ptnBM.rect.extent.y;	lcmdp->ptnBM.base = cmd->ptnBM.base;	lcmdp->drawBM.type = cmd->drawBM.type;	lcmdp->drawBM.depth = cmd->drawBM.depth;	lcmdp->drawBM.width = cmd->drawBM.width;	lcmdp->drawBM.rect.origin.x = cmd->drawBM.rect.origin.x;	lcmdp->drawBM.rect.origin.y = cmd->drawBM.rect.origin.y;	lcmdp->drawBM.rect.extent.x = cmd->drawBM.rect.extent.x;	lcmdp->drawBM.rect.extent.y = cmd->drawBM.rect.extent.y;	lcmdp->drawBM.base = cmd->drawBM.base;	lcmdp->clip.origin.x = cmd->clip.origin.x;	lcmdp->clip.origin.y = cmd->clip.origin.y;	lcmdp->clip.extent.x = cmd->clip.extent.x;	lcmdp->clip.extent.y = cmd->clip.extent.y;	lcmdp->plist = pl;	sp = (sPoint *)cmd->plist;	while (cmd->np) {		lcmdp->np = np = min(cmd->np, 100);		cmd->np -= np;		while (np-- > 0) {			int error;			sPoint tmp;			if (error = copyin((caddr_t)sp, (caddr_t)&tmp, sizeof (tmp)))				return (error);			lp->x = tmp.x;			lp->y = tmp.y;			lp++;			sp++;		}		fbnpolymarker(fbp, lcmdp, UIO_SYSSPACE);	}}fbnpolydot(fbp, cmd, seg)	register struct fbreg *fbp;	register lPrimDot *cmd;	int seg;{	register int error;	register int len;#ifdef CPU_DOUBLE	if (cmd->drawBM.type == BM_MEM)		return (mfbnpolydot(fbp, cmd, seg));#endif	fbinitlock();	fbp->fb_command = FB_CPOLYDOT;	fbp->fb_polydot = *cmd;#ifdef CPU_SINGLE	if (error = fblocksbitmap(&fbp->fb_polydot.drawBM, B_READ, fbmap + 1))		return error;	if ((len = cmd->np * sizeof(lPoint)) <= 0)		return EINVAL;	if (error = fblockmem(cmd->plist, len, B_WRITE, fbmap + 2, seg))		return error;	fbp->fb_polydot.plist = (lPoint *)ipc_phys(fbmap + 2);	fbdolock();	fbstart(fbp, 1);	fbunlock();#else /* CPU_SINGLE */	fbp->fb_polydot.plist = (lPoint *)ipc_phys(srcdestlist);	while (cmd->np > 0) {		len = min(cmd->np, (MAX_SIZE / sizeof(lPoint)));		fbp->fb_polydot.np = len;		if (error = COPYIN((caddr_t)cmd->plist, (caddr_t)srcdestlist,				   len * sizeof(lPoint), seg)) {			return error;		}		cmd->np -= len;		cmd->plist += len;		if (fbp->fb_polydot.drawBM.type == BM_MEM) {			if (error = fblocksbitmap(&fbp->fb_polydot.drawBM,						  B_READ, fbmap + 1)) {				return error;			}			fbdolock();			fbstart(fbp, 1);			fbunlock();		} else if (cmd->np)			fbstart(fbp, 1);		else			fbstart(fbp, 0);	}#endif /* CPU_SINGLE */	return error;}fbpolydot(fbp, cmd)	struct fbreg *fbp;	register sPrimDot *cmd;{	lPrimDot lcmd;	register lPrimDot *lcmdp;	static lPoint	pl[100];	register lPoint	*lp;	register sPoint	*sp;	register int	np;	lcmdp = &lcmd;	lcmdp->func = cmd->func;	lcmdp->transp = cmd->transp;	lcmdp->fore_color = cmd->fore_color;	lcmdp->aux_color = cmd->aux_color;	lcmdp->planemask = cmd->planemask;	lcmdp->drawBM.type = cmd->drawBM.type;	lcmdp->drawBM.depth = cmd->drawBM.depth;	lcmdp->drawBM.width = cmd->drawBM.width;	lcmdp->drawBM.rect.origin.x = cmd->drawBM.rect.origin.x;	lcmdp->drawBM.rect.origin.y = cmd->drawBM.rect.origin.y;	lcmdp->drawBM.rect.extent.x = cmd->drawBM.rect.extent.x;	lcmdp->drawBM.rect.extent.y = cmd->drawBM.rect.extent.y;	lcmdp->drawBM.base = cmd->drawBM.base;	lcmdp->clip.origin.x = cmd->clip.origin.x;	lcmdp->clip.origin.y = cmd->clip.origin.y;	lcmdp->clip.extent.x = cmd->clip.extent.x;	lcmdp->clip.extent.y = cmd->clip.extent.y;	lcmdp->plist = pl;	sp = (sPoint *)cmd->plist;	while (cmd->np) {		lcmdp->np = np = min(cmd->np, 100);		cmd->np -= np;		while (np-- > 0) {			int error;			sPoint tmp;			if (error = copyin((caddr_t)sp, (caddr_t)&tmp, sizeof (tmp)))				return (error);			lp->x = tmp.x;			lp->y = tmp.y;			lp++;			sp++;		}		fbnpolydot(fbp, lcmdp, UIO_SYSSPACE);	}}fbntext(fbp, cmd)	register struct fbreg *fbp;	register lPrimText *cmd;{	register int error;#ifdef CPU_DOUBLE	int blttype = BLTTYPE(cmd->fontBM.type, cmd->drawBM.type);	if ((cmd->type == ASCII) &&	    ((blttype == BLTTYPE(BM_MEM, BM_MEM)) ||	     (blttype == BLTTYPE(BM_0, BM_MEM)) ||	     (blttype == BLTTYPE(BM_1, BM_MEM)))	) {		return(mfbntext(fbp, cmd));		/* NOTREACHED */	}#endif /* CPU_DOUBLE */	fbinitlock();	fbp->fb_command = FB_CTEXT;	fbp->fb_text = *cmd;	if (error = fblocksbitmap(&fbp->fb_text.drawBM, B_READ, fbmap))		return error;	if (cmd->type == ASCII) {		if (error = fblocksbitmap(&fbp->fb_text.fontBM,					  B_WRITE, fbmap + 1)) {			return error;		}	}#ifdef CPU_SINGLE	if (error = fblockmem(cmd->str, cmd->len, B_WRITE, fbmap + 2, UIO_USERSPACE))		return error;	fbp->fb_text.str = (unsigned char *)ipc_phys(fbmap + 2);	fbdolock();	fbstart(fbp, 1);	fbunlock();#else /* CPU_SINGLE */	fbp->fb_text.str = (unsigned char *)ipc_phys(srcdestlist);	if (error = COPYIN((caddr_t)cmd->str,			   (caddr_t)srcdestlist, cmd->len, UIO_USERSPACE)) {		return error;	}	if (fbp->fb_text.drawBM.type == BM_MEM ||	    (cmd->type == ASCII && fbp->fb_text.fontBM.type == BM_MEM)) {		fbdolock();		fbstart(fbp, 1);		fbunlock();	} else		fbstart(fbp, 0);#endif /* CPU_SINGLE */	return error;}fbtext(fbp, cmd)	struct fbreg *fbp;	register sPrimText *cmd;{	lPrimText lcmd;	register lPrimText *lcmdp;	lcmdp = &lcmd;	lcmdp->func = cmd->func;	lcmdp->transp = cmd->transp;	lcmdp->fore_color = cmd->fore_color;	lcmdp->aux_color = cmd->aux_color;	lcmdp->planemask = cmd->planemask;	lcmdp->type = cmd->type;	lcmdp->p.x = cmd->p.x;	lcmdp->p.y = cmd->p.y;	lcmdp->dx = cmd->dx;	lcmdp->dy = cmd->dy;	lcmdp->ex_factor = cmd->ex_factor;	lcmdp->fp.x = cmd->fp.x;	lcmdp->fp.y = cmd->fp.y;	lcmdp->width = cmd->width;	lcmdp->height = cmd->height;	lcmdp->column = cmd->column;	lcmdp->first_chr = cmd->first_chr;	lcmdp->last_chr = cmd->last_chr;	lcmdp->fontBM.type = cmd->fontBM.type;	lcmdp->fontBM.depth = cmd->fontBM.depth;	lcmdp->fontBM.width = cmd->fontBM.width;	lcmdp->fontBM.rect.origin.x = cmd->fontBM.rect.origin.x;	lcmdp->fontBM.rect.origin.y = cmd->fontBM.rect.origin.y;	lcmdp->fontBM.rect.extent.x = cmd->fontBM.rect.extent.x;	lcmdp->fontBM.rect.extent.y = cmd->fontBM.rect.extent.y;	lcmdp->fontBM.base = cmd->fontBM.base;	lcmdp->drawBM.type = cmd->drawBM.type;	lcmdp->drawBM.depth = cmd->drawBM.depth;	lcmdp->drawBM.width = cmd->drawBM.width;	lcmdp->drawBM.rect.origin.x = cmd->drawBM.rect.origin.x;	lcmdp->drawBM.rect.origin.y = cmd->drawBM.rect.origin.y;	lcmdp->drawBM.rect.extent.x = cmd->drawBM.rect.extent.x;	lcmdp->drawBM.rect.extent.y = cmd->drawBM.rect.extent.y;	lcmdp->drawBM.base = cmd->drawBM.base;	lcmdp->clip.origin.x = cmd->clip.origin.x;	lcmdp->clip.origin.y = cmd->clip.origin.y;	lcmdp->clip.extent.x = cmd->clip.extent.x;	lcmdp->clip.extent.y = cmd->clip.extent.y;	lcmdp->len = cmd->len;	lcmdp->str = cmd->str;	return (fbntext(fbp, lcmdp));}fbsetcursor(fbp, data)	struct fbreg *fbp;	sCursor	*data;{	register struct fbreg *fbregp;	fbregp = fbp;	fbregp->fb_command = FB_CSETCURSOR;	fbregp->fb_cursor.func = data->func;	fbregp->fb_cursor.cursor_color = data->cursor_color;	fbregp->fb_cursor.mask_color = data->mask_color;	fbregp->fb_cursor.hot.x = data->hot.x;	fbregp->fb_cursor.hot.y = data->hot.y;	fbregp->fb_cursor.size.x = data->size.x;	fbregp->fb_cursor.size.y = data->size.y;	fbregp->fb_cursor.cursorRect.origin.x = data->cursorRect.origin.x;	fbregp->fb_cursor.cursorRect.origin.y = data->cursorRect.origin.y;	fbregp->fb_cursor.cursorRect.extent.x = data->cursorRect.extent.x;	fbregp->fb_cursor.cursorRect.extent.y = data->cursorRect.extent.y;	fbregp->fb_cursor.maskRect.origin.x = data->maskRect.origin.x;	fbregp->fb_cursor.maskRect.origin.y = data->maskRect.origin.y;	fbregp->fb_cursor.maskRect.extent.x = data->maskRect.extent.x;	fbregp->fb_cursor.maskRect.extent.y = data->maskRect.extent.y;	fbregp->fb_cursor.saveRect.origin.x = data->saveRect.origin.x;	fbregp->fb_cursor.saveRect.origin.y = data->saveRect.origin.y;	fbregp->fb_cursor.saveRect.extent.x = data->saveRect.extent.x;	fbregp->fb_cursor.saveRect.extent.y = data->saveRect.extent.y;	fbregp->fb_cursor.moveArea.origin.x = data->moveArea.origin.x;	fbregp->fb_cursor.moveArea.origin.y = data->moveArea.origin.y;	fbregp->fb_cursor.moveArea.extent.x = data->moveArea.extent.x;	fbregp->fb_cursor.moveArea.extent.y = data->moveArea.extent.y;	fbstart(fbp, 0);	return 0;}fbnsetcursor(fbp, data)	struct fbreg *fbp;	lCursor	*data;{	register struct fbreg *fbregp;	fbregp = fbp;	fbregp->fb_command = FB_CSETCURSOR;	fbregp->fb_cursor.func = data->func;	fbregp->fb_cursor.cursor_color = data->cursor_color;	fbregp->fb_cursor.mask_color = data->mask_color;	fbregp->fb_cursor.hot.x = data->hot.x;	fbregp->fb_cursor.hot.y = data->hot.y;	fbregp->fb_cursor.size.x = data->size.x;	fbregp->fb_cursor.size.y = data->size.y;	fbregp->fb_cursor.cursorRect.origin.x = data->cursorRect.origin.x;	fbregp->fb_cursor.cursorRect.origin.y = data->cursorRect.origin.y;	fbregp->fb_cursor.cursorRect.extent.x = data->cursorRect.extent.x;	fbregp->fb_cursor.cursorRect.extent.y = data->cursorRect.extent.y;	fbregp->fb_cursor.maskRect.origin.x = data->maskRect.origin.x;	fbregp->fb_cursor.maskRect.origin.y = data->maskRect.origin.y;	fbregp->fb_cursor.maskRect.extent.x = data->maskRect.extent.x;	fbregp->fb_cursor.maskRect.extent.y = data->maskRect.extent.y;	fbregp->fb_cursor.saveRect.origin.x = data->saveRect.origin.x;	fbregp->fb_cursor.saveRect.origin.y = data->saveRect.origin.y;	fbregp->fb_cursor.saveRect.extent.x = data->saveRect.extent.x;	fbregp->fb_cursor.saveRect.extent.y = data->saveRect.extent.y;	fbregp->fb_cursor.moveArea.origin.x = data->moveArea.origin.x;	fbregp->fb_cursor.moveArea.origin.y = data->moveArea.origin.y;	fbregp->fb_cursor.moveArea.extent.x = data->moveArea.extent.x;	fbregp->fb_cursor.moveArea.extent.y = data->moveArea.extent.y;	fbstart(fbp, 0);	return 0;}fbgetscrtype(fbp, data)	struct fbreg *fbp;	sScrType *data;{	fbp->fb_command = FB_CGETSCRTYPE;	fbstart(fbp, 1);	data->colorwidth = fbp->fb_scrtype.colorwidth;	data->plane = fbp->fb_scrtype.plane;	data->bufferrect.origin.x = fbp->fb_scrtype.bufferrect.origin.x;	data->bufferrect.origin.y = fbp->fb_scrtype.bufferrect.origin.y;	data->bufferrect.extent.x = fbp->fb_scrtype.bufferrect.extent.x;	data->bufferrect.extent.y = fbp->fb_scrtype.bufferrect.extent.y;	data->visiblerect.origin.x = fbp->fb_scrtype.visiblerect.origin.x;	data->visiblerect.origin.y = fbp->fb_scrtype.visiblerect.origin.y;	data->visiblerect.extent.x = fbp->fb_scrtype.visiblerect.extent.x;	data->visiblerect.extent.y = fbp->fb_scrtype.visiblerect.extent.y;	return 0;}fbsetxy(fbp, data)	struct fbreg *fbp;	sPoint *data;{	fbp->fb_command = FB_CSETXY;	fbp->fb_point.x = data->x;	fbp->fb_point.y = data->y;	fbstart(fbp, 0);	return 0;}fbsetpalette(fbp, data)	struct fbreg *fbp;	sPalette *data;{	lPalette	pal;	fbp->fb_command = FB_CSETPALETTE;	fbp->fb_palette.count = 1;	*(sPalette *)srcdestlist = *data;#ifdef CPU_SINGLE	fbmap[0].fm_vaddr = (caddr_t)srcdestlist;	fbmap[0].fm_offset = 0;	fbp->fb_palette.palette = (sPalette *)ipc_phys(fbmap);#else	fbp->fb_palette.palette = (sPalette *)ipc_phys(srcdestlist);#endif	fbstart(fbp, 0);	return 0;}fbnsetpalette(fbp, cmd)	struct fbreg *fbp;	lPalette *cmd;{	register int error;	register int count;#ifdef CPU_SINGLE	register int len;#endif	fbinitlock();	fbp->fb_command = FB_CSETPALETTE;#ifdef CPU_SINGLE	fbp->fb_palette.count = cmd->count;	if ((len = cmd->count * sizeof(sPalette)) <= 0)		return EINVAL;	if (error = fblockmem(cmd->palette, len, B_WRITE, fbmap, UIO_USERSPACE))		return error;	fbp->fb_palette.palette = (sPalette *)ipc_phys(fbmap);	fbdolock();	fbstart(fbp, 1);	fbunlock();#else /* CPU_SINGLE */	fbp->fb_palette.palette = (sPalette *)ipc_phys(srcdestlist);	while (cmd->count > 0) {		count = min(cmd->count, (MAX_SIZE / sizeof(sPalette)));		fbp->fb_palette.count = count;		if (error = COPYIN((caddr_t)cmd->palette, (caddr_t)srcdestlist,				   count * sizeof(sPalette), UIO_USERSPACE)) {			break;		}		cmd->count -= count;		cmd->palette += count;		fbstart(fbp, 0);	}#endif /* CPU_SINGLE */	return error;}fbgetpalette(fbp, data)	struct fbreg *fbp;	sPalette *data;{	lPalette pal;	fbp->fb_command = FB_CGETPALETTE;	fbp->fb_palette.count = 1;	*(sPalette *)srcdestlist = *data;#ifdef CPU_SINGLE	fbmap[0].fm_vaddr = (caddr_t)srcdestlist;	fbmap[0].fm_offset = 0;	fbp->fb_palette.palette = (sPalette *)ipc_phys(fbmap);#else	fbp->fb_palette.palette = (sPalette *)ipc_phys(srcdestlist);#endif	fbstart(fbp, 1);#ifdef mips	MachFlushDCache((caddr_t)srcdestlist, sizeof (sPalette));	*data = *(sPalette *)MACH_CACHED_TO_UNCACHED(srcdestlist);#else	*data = *(sPalette *)srcdestlist;#endif	return fbp->fb_result;}fbngetpalette(fbp, cmd)	struct fbreg *fbp;	lPalette *cmd;{	register int error;	register int count;#ifdef CPU_SINGLE	register int len;#else	register int savecount;	register sPalette *savep;#endif	fbinitlock();	fbp->fb_command = FB_CGETPALETTE;#ifdef CPU_SINGLE	fbp->fb_palette.count = cmd->count;	if ((len = cmd->count * sizeof(sPalette)) <= 0)		return EINVAL;	if (error = fblockmem(cmd->palette, len, B_WRITE, fbmap, UIO_USERSPACE))		return error;	fbp->fb_palette.palette = (sPalette *)ipc_phys(fbmap);	fbdolock();	fbstart(fbp, 1);	fbunlock();#else /* CPU_SINGLE */	savecount = cmd->count;	savep = cmd->palette;	fbp->fb_palette.palette = (sPalette *)ipc_phys(srcdestlist);	while (cmd->count > 0) {		count = min(cmd->count, (MAX_SIZE / sizeof(sPalette)));		fbp->fb_palette.count = count;		if (error = COPYIN((caddr_t)cmd->palette, (caddr_t)srcdestlist,				   count * sizeof(sPalette), UIO_USERSPACE)) {			break;		}		fbstart(fbp, 1);#ifdef mips		MachFlushDCache((caddr_t)srcdestlist, sizeof (sPalette));		error = copyout((caddr_t)MACH_CACHED_TO_UNCACHED(srcdestlist),				(caddr_t)cmd->palette,				count * sizeof(sPalette));#else		error = copyout((caddr_t)srcdestlist,				(caddr_t)cmd->palette,				count * sizeof(sPalette));#endif		if (error)			break;		cmd->count -= count;		cmd->palette += count;	}	cmd->count = savecount;	cmd->palette = savep;#endif /* CPU_SINGLE */	return fbp->fb_result;}#endif /* NFB > 0 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -