Ejemplo n.º 1
0
Archivo: genblit.c Proyecto: ev3dev/grx
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();
}
Ejemplo n.º 2
0
Archivo: vd_sdl.c Proyecto: ev3dev/grx
/* 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)++;
        }
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
void _GrCloseVideoDriver(void)
{
    sttcopy(&DRVINFO->fdriver,&DRVINFO->tdriver);
    if(DRVINFO->vdriver != NULL) {
        if(DRVINFO->vdriver->reset) (*DRVINFO->vdriver->reset)();
        DRVINFO->vdriver = NULL;
    }
}
Ejemplo n.º 5
0
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);
}