void _GrFrDrvGenericBitBlt(GrxFrame *dst,int dx,int dy,GrxFrame *src,int x,int y,int w,int h,GrxColor op) { GrxFrame csave; GrxColor (*readpix)(GrxFrame *,int,int); void (*drawpix)(int,int,GrxColor); GrxColor skipc; int step; GRX_ENTER(); readpix = src->driver->readpixel; drawpix = dst->driver->drawpixel; skipc = op ^ GRX_COLOR_MODE_IMAGE; step = 1; op &= GRX_COLOR_MODE_MASK; sttcopy(&csave,&CURC->frame); sttcopy(&CURC->frame,dst); if((dy > y) || ((dy == y) && (dx > x))) { x += (w - 1); dx += (w - 1); y += (h - 1); dy += (h - 1); step = (-1); } do { int dxx = dx,xx = x,ww = w; do { GrxColor c = (*readpix)(src,xx,y); if(c != skipc) (*drawpix)(dxx,dy,(c | op)); dxx += step; xx += step; } while(--ww > 0); dy += step; y += step; } while(--h > 0); sttcopy(&CURC->frame,&csave); GRX_LEAVE(); }
/* from svgalib.c, unmodified */ static void add_video_mode( GrxVideoMode *mp, GrxVideoModeExt *ep, GrxVideoMode **mpp,GrxVideoModeExt **epp ) { if(*mpp < &modes[NUM_MODES]) { if(!mp->extended_info) { GrxVideoModeExt *etp = &exts[0]; while(etp < *epp) { if(memcmp(etp,ep,sizeof(GrxVideoModeExt)) == 0) { mp->extended_info = etp; break; } etp++; } if(!mp->extended_info) { if(etp >= &exts[NUM_EXTS]) return; sttcopy(etp,ep); mp->extended_info = etp; *epp = ++etp; } } sttcopy(*mpp,mp); (*mpp)++; } }
static int buildframedriver(GrVideoMode *mp,GrFrameDriver *drv) { GrFrameDriver *d1, *d2; int res = TRUE; GRX_ENTER(); res = TRUE; d1 = _GrFindFrameDriver(mp->extinfo->mode); d2 = mp->extinfo->drv; if(d1) sttcopy(drv,d1); if(d2) { int compl = TRUE; # define MERGE(F) if(d2->F) drv->F = d2->F; else compl = FALSE; MERGE(readpixel); MERGE(drawpixel); MERGE(drawhline); MERGE(drawvline); MERGE(drawblock); MERGE(drawline); MERGE(drawbitmap); MERGE(drawpattern); MERGE(bitblt); MERGE(bltv2r); MERGE(bltr2v); MERGE(getindexedscanline); MERGE(putscanline); if(compl) { memcpy(drv,d2,offsetof(GrFrameDriver,readpixel)); goto done; /* TRUE */ } if(!d1) { res = FALSE; goto done; } if((d2->mode == d1->mode) && (d2->rmode == d1->rmode) && (d1->is_video ? d2->is_video : !d2->is_video) && (d2->row_align <= d1->row_align) && !(d1->row_align % d2->row_align) && (d2->num_planes == d1->num_planes) && (d2->max_plane_size >= d1->max_plane_size) && (d2->bits_per_pixel == d1->bits_per_pixel)) { drv->init = d2->init ? d2->init : d1->init; goto done; /* TRUE */ } } if(!d1) { res = FALSE; goto done; } sttcopy(drv,d1); done: GRX_RETURN(res); }
void _GrCloseVideoDriver(void) { sttcopy(&DRVINFO->fdriver,&DRVINFO->tdriver); if(DRVINFO->vdriver != NULL) { if(DRVINFO->vdriver->reset) (*DRVINFO->vdriver->reset)(); DRVINFO->vdriver = NULL; } }
int GrSetMode(GrGraphicsMode which,...) { int w,h,pl,vw,vh; int t,noclear,res; GrColor c; va_list ap; GRX_ENTER(); pl = 0; vw = 0; vh = 0; t = FALSE; noclear = FALSE; c = 0; res = FALSE; DBGPRINTF(DBG_SETMD,("Mode: %d\n",(int)which)); if(DRVINFO->vdriver == NULL) { GrSetDriver(NULL); if(DRVINFO->vdriver == NULL) { res = errhdlr("could not find suitable video driver"); goto done; } } va_start(ap,which); switch(which) { case GR_NC_default_text: noclear = TRUE; case GR_default_text: w = DRVINFO->deftw; h = DRVINFO->defth; c = DRVINFO->deftc; t = TRUE; break; case GR_NC_320_200_graphics: noclear = TRUE; case GR_320_200_graphics: w = 320; h = 200; c = DRVINFO->defgc; break; case GR_NC_default_graphics: noclear = TRUE; case GR_default_graphics: w = DRVINFO->defgw; h = DRVINFO->defgh; c = DRVINFO->defgc; break; case GR_NC_width_height_graphics: noclear = TRUE; case GR_width_height_graphics: w = va_arg(ap,int); h = va_arg(ap,int); c = DRVINFO->defgc; break; case GR_NC_biggest_graphics: noclear = TRUE; case GR_biggest_graphics: w = DRVINFO->biggw; h = DRVINFO->biggh; pl = 32; break; case GR_NC_width_height_color_graphics: noclear = TRUE; case GR_width_height_color_graphics: w = va_arg(ap,int); h = va_arg(ap,int); c = va_arg(ap,GrColor); break; case GR_NC_width_height_bpp_graphics: noclear = TRUE; case GR_width_height_bpp_graphics: w = va_arg(ap,int); h = va_arg(ap,int); pl = va_arg(ap,int); break; case GR_NC_custom_graphics: noclear = TRUE; case GR_custom_graphics: w = va_arg(ap,int); h = va_arg(ap,int); c = va_arg(ap,GrColor); vw = va_arg(ap,int); vh = va_arg(ap,int); break; case GR_NC_custom_bpp_graphics: noclear = TRUE; case GR_custom_bpp_graphics: w = va_arg(ap,int); h = va_arg(ap,int); pl = va_arg(ap,int); vw = va_arg(ap,int); vh = va_arg(ap,int); break; default: va_end(ap); res = errhdlr("unknown video mode"); goto done; } va_end(ap); if (c) for(pl = 1; (pl < 32) && ((1UL << pl) < (GrColor)c); pl++) ; for( ; ; ) { GrContext cxt; GrFrameDriver fdr; GrVideoMode *mdp,vmd; mdp = (DRVINFO->vdriver->selectmode)(DRVINFO->vdriver,w,h,pl,t,NULL); if(!mdp) { res = errhdlr("could not find suitable video mode"); goto done; } sttcopy(&vmd,mdp); if((t || buildframedriver(&vmd,&fdr)) && (*vmd.extinfo->setup)(&vmd,noclear) && (t || buildcontext(&vmd,&fdr,&cxt))) { if((!t) && ((vw > vmd.width) || (vh > vmd.height)) && (vmd.extinfo->setvsize != NULL) && (vmd.extinfo->scroll != NULL)) { int ww = vmd.width = imax(vw,vmd.width); int hh = vmd.height = imax(vh,vmd.height); if(!(*vmd.extinfo->setvsize)(&vmd,ww,hh,&vmd) || !buildcontext(&vmd,&fdr,&cxt)) { sttcopy(&vmd,mdp); buildcontext(&vmd,&fdr,&cxt); (*vmd.extinfo->setup)(&vmd,noclear); } } // DBGPRINTF(DBG_SETMD,("GrMouseUnInit ...\n")); // GrMouseUnInit(); // DBGPRINTF(DBG_SETMD,("GrMouseUnInit done\n")); DRVINFO->setbank = (void (*)(int ))_GrDummyFunction; DRVINFO->setrwbanks = (void (*)(int,int))_GrDummyFunction; DRVINFO->curbank = (-1); DRVINFO->splitbanks = FALSE; if(!t) { if(vmd.extinfo->setbank) { DRVINFO->setbank = vmd.extinfo->setbank; } if(vmd.extinfo->setrwbanks) { DRVINFO->setrwbanks = vmd.extinfo->setrwbanks; DRVINFO->splitbanks = TRUE; } if(umul32(vmd.lineoffset,vmd.height) <= 0x10000L) { DRVINFO->splitbanks = TRUE; } } else { sttzero(&cxt); sttcopy(&fdr,&DRVINFO->tdriver); cxt.gc_driver = &DRVINFO->tdriver; } sttcopy(&CXTINFO->current,&cxt); sttcopy(&CXTINFO->screen, &cxt); sttcopy(&DRVINFO->fdriver,&fdr); sttcopy(&DRVINFO->sdriver,&fdr); sttcopy(&DRVINFO->actmode,&vmd); DRVINFO->curmode = mdp; DRVINFO->mcode = which; DRVINFO->vposx = 0; DRVINFO->vposy = 0; DBGPRINTF(DBG_SETMD,("GrResetColors ...\n")); if ( !_GrResetColors() ) { res = errhdlr("could not set color mode"); goto done; } DBGPRINTF(DBG_SETMD,("GrResetColors done\n")); if(fdr.init) { DBGPRINTF(DBG_SETMD,("fdr.init ...\n")); (*fdr.init)(&DRVINFO->actmode); DBGPRINTF(DBG_SETMD,("fdr.init done\n")); } if(DRVINFO->mdsethook) { DBGPRINTF(DBG_SETMD,("mdsethook ...\n")); (*DRVINFO->mdsethook)(); DBGPRINTF(DBG_SETMD,("mdsethook done\n")); } DBGPRINTF(DBG_SETMD,("GrSetMode complete\n")); res = TRUE; goto done; } mdp->present = FALSE; } done: GRX_RETURN(res); }