Mercurial > ecos
diff packages/services/gfx/mw/current/src/drivers/genmem.c @ 208:e0c0827131d1 ecos
Merge from eCos master repository on 2002-05-20-20:11:54-BST
| author | jlarmour |
|---|---|
| date | Mon, 20 May 2002 22:19:26 +0000 |
| parents | |
| children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/services/gfx/mw/current/src/drivers/genmem.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2000, 2001 Greg Haerr <greg@censoft.com> + * + * Screen Driver Utilities + * + * Microwindows memory device routines + */ +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include "device.h" +#include "fb.h" +#include "genmem.h" + +/* allocate a memory screen device*/ +PSD +gen_allocatememgc(PSD psd) +{ + PSD mempsd; + + /* if driver doesn't have blit, fail*/ + if((psd->flags & PSF_HAVEBLIT) == 0) + return NULL; + + mempsd = malloc(sizeof(SCREENDEVICE)); + if (!mempsd) + return NULL; + + /* copy passed device get initial values*/ + *mempsd = *psd; + + /* initialize*/ + mempsd->flags |= PSF_MEMORY; + mempsd->flags &= ~PSF_SCREEN; + mempsd->addr = NULL; + + return mempsd; +} + +/* initialize memory device with passed parms*/ +void +initmemgc(PSD mempsd,MWCOORD w,MWCOORD h,int planes,int bpp,int linelen, + int size,void *addr) +{ + assert(mempsd->flags & PSF_MEMORY); + + /* create mem psd w/h aligned with hw screen w/h*/ + if (mempsd->portrait & (MWPORTRAIT_LEFT|MWPORTRAIT_RIGHT)) { + mempsd->yres = w; + mempsd->xres = h; + } else { + mempsd->xres = w; + mempsd->yres = h; + } + mempsd->xvirtres = w; + mempsd->yvirtres = h; + mempsd->planes = planes; + mempsd->bpp = bpp; + mempsd->linelen = linelen; + mempsd->size = size; + mempsd->addr = addr; +} + +void +gen_freememgc(PSD mempsd) +{ + assert(mempsd->flags & PSF_MEMORY); + + /* note: mempsd->addr must be freed elsewhere*/ + + free(mempsd); +} + +void +gen_fillrect(PSD psd,MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, + MWPIXELVAL c) +{ + while(y1 <= y2) + psd->DrawHorzLine(psd, x1, x2, y1++, c); +} + +/* + * Set subdriver entry points in screen device + * Initialize subdriver if init flag is TRUE + * Return 0 on fail + */ +MWBOOL +set_subdriver(PSD psd, PSUBDRIVER subdriver, MWBOOL init) +{ + /* set subdriver entry points in screen driver*/ + psd->DrawPixel = subdriver->DrawPixel; + psd->ReadPixel = subdriver->ReadPixel; + psd->DrawHorzLine = subdriver->DrawHorzLine; + psd->DrawVertLine = subdriver->DrawVertLine; + psd->FillRect = subdriver->FillRect; + psd->Blit = subdriver->Blit; + psd->DrawArea = subdriver->DrawArea; + psd->StretchBlit = subdriver->StretchBlit; + + /* call driver init procedure to calc map size and linelen*/ + if (init && !subdriver->Init(psd)) + return 0; + return 1; +} + +/* fill in a subdriver struct from passed screen device*/ +void +get_subdriver(PSD psd, PSUBDRIVER subdriver) +{ + /* set subdriver entry points in screen driver*/ + subdriver->DrawPixel = psd->DrawPixel; + subdriver->ReadPixel = psd->ReadPixel; + subdriver->DrawHorzLine = psd->DrawHorzLine; + subdriver->DrawVertLine = psd->DrawVertLine; + subdriver->FillRect = psd->FillRect; + subdriver->Blit = psd->Blit; + subdriver->DrawArea = psd->DrawArea; + subdriver->StretchBlit = psd->StretchBlit; +}
