📄 fb_sub.c
字号:
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 + -