OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [MW_0_8_9PRE7/] [mw/] [src/] [drivers/] [scr_bogl.x] - Rev 1765

Compare with Previous | Blame | View Log

/*
 * Copyright (c) 1999 Greg Haerr <greg@censoft.com>
 *
 * Screen Driver using BOGL Library
 *
 * This driver now requires only the following BOGL entry points:
 *      bogl_init, bogl_done, 
 *      bogl_pixel, bogl_readpixel,
 *      bogl_vline, bogl_hline
 *
 * All graphics drawing primitives are based on top of these functions.
 *
 * This file also contains the generalized low-level font/text
 * drawing routines, which will be split out into another file.
 * Both fixed and proportional fonts are supported, with fixed
 * pitch structure allowing much smaller font files.
 */
#include <stdio.h>
#include "../device.h"
#include "bogl/bogl.h"

/* specific bogl driver entry points*/
static int  BOGL_open(SCREENDEVICE *psd);
static void BOGL_close(void);
static void BOGL_getscreeninfo(PSCREENINFO psi);
static void BOGL_setpalette(int first,int count,RGBENTRY *pal);
static void BOGL_drawpixel(COORD x, COORD y, PIXELVAL c);
static PIXELVAL BOGL_readpixel(COORD x, COORD y);
static void BOGL_drawhline(COORD x1, COORD x2, COORD y, PIXELVAL c);
static void BOGL_drawvline(COORD x, COORD y1, COORD y2, PIXELVAL c);
static void BOGL_fillrect(COORD x1, COORD y1, COORD x2, COORD y2, PIXELVAL c);

/* generalized text/font routines*/
static BOOL gen_getfontinfo(FONTID fontid,PFONTINFO pfontinfo);
static void gen_gettextsize(const UCHAR *str,int cc,COORD *retwd,
                COORD *retht,FONTID fontid);
static void gen_gettextbits(UCHAR ch,IMAGEBITS *retmap,COORD *retwd,
                COORD *retht,FONTID fontid);
/*static void gen_drawtext(COORD x, COORD y, const UCHAR *s, int n,
                        PIXELVAL fg, FONTID fontid);
static void gen_drawbitmap(COORD x, COORD y, COORD width, COORD height,
                        IMAGEBITS *table, PIXELVAL fgcolor);*/

SCREENDEVICE    scrdev = {
        BOGL_open,
        BOGL_close,
        BOGL_getscreeninfo,
        BOGL_setpalette,
        BOGL_drawpixel,
        BOGL_readpixel,
        BOGL_drawhline,
        BOGL_drawvline,
        BOGL_fillrect,
        gen_getfontinfo,
        gen_gettextsize,
        gen_gettextbits,
        640, 480, 256, PF_PALETTE
};

/* compiled in fonts*/
#define NUMBER_FONTS    3
extern FONT font_rom8x16, font_rom8x8;
extern FONT font_winFreeSansSerif11x13;
extern FONT font_winFreeSystem14x16;
extern FONT font_winSystem14x16;
extern FONT font_winMSSansSerif11x13;
extern FONT font_winTerminal8x12;
extern FONT font_helvB10, font_helvB12, font_helvR10;

/* first font is default font*/
PFONT fonts[NUMBER_FONTS] = {
#if HAVEMSFONTS
        &font_winSystem14x16,           /* FONT_SYSTEM_VAR*/
        &font_winMSSansSerif11x13,      /* FONT_GUI_VAR*/
        &font_winTerminal8x12           /* FONT_OEM_FIXED*/
#else
        &font_winFreeSystem14x16,       /* FONT_SYSTEM_VAR*/
        &font_winFreeSansSerif11x13,    /* FONT_GUI_VAR*/
        &font_rom8x16                   /* FONT_OEM_FIXED*/
#endif
};

static int
BOGL_open(SCREENDEVICE *psd)
{
        if(bogl_init() == 0)
                return -1;
        psd->xres = bogl_xres;
        psd->yres = bogl_yres;
        psd->ncolors = bogl_ncols;

        /* set pixel format*/
        if(bogl_ncols > 256)
                psd->pixtype = PF_TRUECOLOR24;
        else if(bogl_ncols == 256 && bogl_truecolor)
                psd->pixtype = PF_TRUECOLOR332;
        else
                psd->pixtype = PF_PALETTE;
        return 1;
}

static void
BOGL_close(void)
{
        bogl_done();
}

static void
BOGL_getscreeninfo(PSCREENINFO psi)
{
        psi->rows = scrdev.yres;
        psi->cols = scrdev.xres;
        psi->ncolors = scrdev.ncolors;
        psi->pixtype = scrdev.pixtype;
        psi->black = 0;
        psi->white = 15;
        psi->fonts = NUMBER_FONTS;

        if(scrdev.yres > 480) {
                /* SVGA 800x600*/
                psi->xdpcm = 33;        /* assumes screen width of 24 cm*/
                psi->ydpcm = 33;        /* assumes screen height of 18 cm*/
        } else if(scrdev.yres > 350) {
                /* VGA 640x480*/
                psi->xdpcm = 27;        /* assumes screen width of 24 cm*/
                psi->ydpcm = 27;        /* assumes screen height of 18 cm*/
        } else {
                /* EGA 640x350*/
                psi->xdpcm = 27;        /* assumes screen width of 24 cm*/
                psi->ydpcm = 19;        /* assumes screen height of 18 cm*/
        }
}

/*
 * Set count palette entries starting from first
 */
static void
BOGL_setpalette(int first,int count,RGBENTRY *pal)
{
        bogl_set_palette(first, count, (void*)pal);
}

static void
BOGL_drawpixel(COORD x, COORD y, PIXELVAL c)
{
        bogl_pixel(x, y, c);
}

static PIXELVAL
BOGL_readpixel(COORD x, COORD y)
{
        return bogl_readpixel(x, y);
}

static void
BOGL_drawhline(COORD x1, COORD x2, COORD y, PIXELVAL c)
{
        /*
         * bogl uses type 2 line drawing, the last point is not drawn
         */
        bogl_hline(x1, x2+1, y, c);

        /*
         * Uncomment the following if driver doesn't support hline
        while(x1 <= x2)
                bogl_pixel(x1++, y, c);
         */
}

static void
BOGL_drawvline(COORD x, COORD y1, COORD y2, PIXELVAL c)
{
        /*
         * bogl uses type 2 line drawing, the last point is not drawn
         */
        bogl_vline(x, y1, y2+1, c);

        /*
         * Uncomment the following if driver doesn't support vline
        while(y1 <= y2)
                bogl_pixel(x, y1++, c);
         */
}

static void
BOGL_fillrect(COORD x1, COORD y1, COORD x2, COORD y2, PIXELVAL c)
{
        /*
         * Call bogl hline (type 2) to save size
         */
        ++x2;           /* fix bogl last point not drawn*/
        while(y1 <= y2)
                bogl_hline(x1, x2, y1++, c);
        /*
         * Uncomment the following if driver doesn't support fillrect
        while(y1 <= y2)
                BOGL_drawhline(x1, x2, y1++, c);
         */
}

#if 0000
/* 
 * Generalized low level text draw routine, called only
 * if no clipping is required
 */
static void
gen_drawtext(COORD x,COORD y,const UCHAR *s,int n,PIXELVAL fg,FONTID fontid)
{
        COORD           width;                  /* width of character */
        COORD           height;                 /* height of character */
        PFONT           pf;
        IMAGEBITS       bitmap[MAX_CHAR_HEIGHT];/* bitmap for character */

        if(fontid >= NUMBER_FONTS)
                return;
        pf = fonts[fontid];

        /* x, y is bottom left corner*/
        y -= pf->height - 1;
        while (n-- > 0) {
                gen_gettextbits(*s++, bitmap, &width, &height, pf);
                gen_drawbitmap(x, y, width, height, bitmap, fg);
                x += width;
        }
}

/*
 * Generalized low level bitmap output routine, called
 * only if no clipping is required.  Only the set bits
 * in the bitmap are drawn, in the foreground color.
 */
static void
gen_drawbitmap(COORD x, COORD y, COORD width, COORD height, IMAGEBITS *table,
        PIXELVAL fgcolor)
{
  COORD minx;
  COORD maxx;
  IMAGEBITS bitvalue;   /* bitmap word value */
  int bitcount;                 /* number of bits left in bitmap word */

  minx = x;
  maxx = x + width - 1;
  bitcount = 0;
  while (height > 0) {
        if (bitcount <= 0) {
                bitcount = IMAGE_BITSPERIMAGE;
                bitvalue = *table++;
        }
        if (IMAGE_TESTBIT(bitvalue))
                BOGL_drawpixel(x, y, fgcolor);
        bitvalue = IMAGE_SHIFTBIT(bitvalue);
        --bitcount;
        if (x++ == maxx) {
                x = minx;
                ++y;
                --height;
                bitcount = 0;
        }
  }
}
#endif

/*
 * Generalized low level get font info routine.  This
 * routine works with fixed and proportional fonts.
 */
static BOOL
gen_getfontinfo(FONTID fontid,PFONTINFO pfontinfo)
{
        PFONT   pf;
        int     i;

        if(fontid >= NUMBER_FONTS)
                return FALSE;
        pf = fonts[fontid];

        pfontinfo->font = fontid;
        pfontinfo->height = pf->height;
        pfontinfo->maxwidth = pf->maxwidth;
        pfontinfo->baseline = 0;
        pfontinfo->fixed = pf->width == NULL? TRUE: FALSE;
        for(i=0; i<256; ++i) {
                if(pf->width == NULL)
                        pfontinfo->widths[i] = pf->maxwidth;
                else {
                        if(i<pf->firstchar || i >= pf->firstchar+pf->size)
                                pfontinfo->widths[i] = 0;
                        else pfontinfo->widths[i] = pf->width[i-pf->firstchar];
                }
        }
        return TRUE;
}

/*
 * Generalized low level routine to calc bounding box for text output.
 * Handles both fixed and proportional fonts.
 */
static void
gen_gettextsize(const UCHAR *str,int cc,COORD *retwd,COORD *retht,
        FONTID fontid)
{
        PFONT   pf;
        int     c;
        int     width;

        if(fontid >= NUMBER_FONTS) {
                *retht = 0;
                *retwd = 0;
                return;
        }
        pf = fonts[fontid];

        if(pf->width == NULL)
                width = cc * pf->maxwidth;
        else {
                width = 0;
                while(--cc >= 0) {
                        if( (c = *str++) >= pf->firstchar &&
                             c < pf->firstchar+pf->size)
                                width += pf->width[c - pf->firstchar];
                }
        }

        *retwd = width;
        *retht = pf->height;

}

/*
 * Generalized low level routine to get the bitmap associated
 * with a character.  Handles fixed and proportional fonts.
 */
static void
gen_gettextbits(UCHAR ch,IMAGEBITS *retmap,COORD *retwd, COORD *retht,
        FONTID fontid)
{
        int             n;
        PFONT           pf = NULL;
        IMAGEBITS *     bits;

        if(fontid < NUMBER_FONTS)
                pf = fonts[fontid];

        if(!pf || ch < pf->firstchar || ch >= pf->firstchar+pf->size) {
                *retht = 0;
                *retwd = 0;
                return;
        }
        ch -= pf->firstchar;

        /* get font bitmap depending on fixed pitch or not*/
        bits = pf->bits + (pf->offset? pf->offset[ch]: (pf->height * ch));
        for(n=0; n<pf->height; ++n)
                *retmap++ = *bits++;

        /* return width depending on fixed pitch or not*/
        *retwd = pf->width? pf->width[ch]: pf->maxwidth;
        *retht = pf->height;
}

#if 0
static unsigned char palette[16+16][3] = {
  /* Linux 16 color palette*/
  { 0x00,0x00,0x00 },
  { 0x00,0x00,0xaa },
  { 0x00,0xaa,0x00 },
  { 0x00,0xaa,0xaa },
  { 0xaa,0x00,0x00 },
  { 0xaa,0x00,0xaa },
  { 0xaa,0x55,0x00 },   /* adjust to brown*/
  //{ 0xaa,0xaa,0x00 },
  { 0xaa,0xaa,0xaa },
  { 0x55,0x55,0x55 },
  { 0x55,0x55,0xff },
  { 0x55,0xff,0x55 },
  { 0x55,0xff,0xff },
  { 0xff,0x55,0x55 },
  { 0xff,0x55,0xff },
  { 0xff,0xff,0x55 },
  { 0xff,0xff,0xff },

  /* 16 entry std palette*/
  {0x00, 0x00, 0x00},
  {0x00, 0x00, 0xbf},
  {0x00, 0xbf, 0x00},
  {0x00, 0xbf, 0xbf},
  {0xbf, 0x00, 0x00},
  {0xbf, 0x00, 0xbf},
  {0xbf, 0x60, 0x00},   /* adjust to brown*/
  //{0xbf, 0xbf, 0x00},
  {0xc0, 0xc0, 0xc0},
  {0x80, 0x80, 0x80},
  {0x00, 0x00, 0xff},
  {0x00, 0xff, 0x00},
  {0x00, 0xff, 0xff},
  {0xff, 0x00, 0x00},
  {0xff, 0x00, 0xff},
  {0xff, 0xff, 0x00},
  {0xff, 0xff, 0xff},
};
#endif

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.