141 lines
2.7 KiB
C
141 lines
2.7 KiB
C
/*
|
|
** thinlib (c) 2001 Matthew Conte (matt@conte.com)
|
|
**
|
|
**
|
|
** tl_video.h
|
|
**
|
|
** thinlib video routines
|
|
**
|
|
** $Id: $
|
|
*/
|
|
|
|
#include "tl_types.h"
|
|
#include "tl_video.h"
|
|
#include "tl_vesa.h"
|
|
#include "tl_vga.h"
|
|
#include "tl_log.h"
|
|
|
|
typedef struct viddriver_s
|
|
{
|
|
const char *name;
|
|
int (*init)(int width, int height, int bpp, int param);
|
|
void (*shutdown)(void);
|
|
int (*setmode)(int width, int height, int bpp);
|
|
void (*setpalette)(rgb_t *palette, int index, int length);
|
|
void (*waitvsync)(void);
|
|
bitmap_t *(*lock)(void);
|
|
void (*free)(int num_dirties, rect_t *dirty_rects);
|
|
void (*blit)(bitmap_t *primary, int num_dirties, rect_t *dirty_rects);
|
|
int caps;
|
|
} viddriver_t;
|
|
|
|
static viddriver_t vesa =
|
|
{
|
|
"VESA 3.0 LFB",
|
|
thin_vesa_init,
|
|
thin_vesa_shutdown,
|
|
thin_vesa_setmode,
|
|
thin_vga_setpalette,
|
|
thin_vga_waitvsync,
|
|
thin_vesa_lockwrite,
|
|
thin_vesa_freewrite,
|
|
NULL,
|
|
0,
|
|
};
|
|
|
|
static viddriver_t vga =
|
|
{
|
|
"VGA",
|
|
thin_vga_init,
|
|
thin_vga_shutdown,
|
|
thin_vga_setmode,
|
|
thin_vga_setpalette,
|
|
thin_vga_waitvsync,
|
|
thin_vga_lockwrite,
|
|
thin_vga_freewrite,
|
|
NULL,
|
|
0, /*THIN_VIDEO_SCANLINES,*/
|
|
};
|
|
|
|
static viddriver_t *driver_list[] =
|
|
{
|
|
&vesa,
|
|
&vga,
|
|
NULL
|
|
};
|
|
|
|
static viddriver_t driver;
|
|
|
|
int thin_vid_init(int width, int height, int bpp, int param)
|
|
{
|
|
/* cascade driver checks by iterating through all drivers */
|
|
viddriver_t **iter;
|
|
|
|
for (iter = driver_list; *iter != NULL; iter++)
|
|
{
|
|
if (0 == (*iter)->init(width, height, bpp, param))
|
|
{
|
|
driver = **iter;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
driver.name = NULL;
|
|
thin_printf("thinlib.video: could not find any matching video modes.\n");
|
|
return -1;
|
|
}
|
|
|
|
void thin_vid_shutdown(void)
|
|
{
|
|
if (NULL != driver.name)
|
|
{
|
|
driver.shutdown();
|
|
memset(&driver, 0, sizeof(viddriver_t));
|
|
}
|
|
}
|
|
|
|
int thin_vid_getcaps(void)
|
|
{
|
|
return driver.caps;
|
|
}
|
|
|
|
int thin_vid_setmode(int width, int height, int bpp)
|
|
{
|
|
if (driver.setmode(width, height, bpp))
|
|
{
|
|
thin_printf("thinlib.video: could not set %s video mode %dx%d %dbpp\n",
|
|
driver.name, width, height, bpp);
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void thin_vid_setpalette(rgb_t *palette, int index, int length)
|
|
{
|
|
driver.setpalette(palette, index, length);
|
|
}
|
|
|
|
bitmap_t *thin_vid_lockwrite(void)
|
|
{
|
|
return driver.lock();
|
|
}
|
|
|
|
void thin_vid_freewrite(int num_dirties, rect_t *dirty_rects)
|
|
{
|
|
if (NULL != driver.free)
|
|
driver.free(num_dirties, dirty_rects);
|
|
}
|
|
|
|
void thin_vid_customblit(bitmap_t *primary, int num_dirties,
|
|
rect_t *dirty_rects)
|
|
{
|
|
THIN_ASSERT(driver.blit);
|
|
|
|
driver.blit(primary, num_dirties, dirty_rects);
|
|
}
|
|
|
|
/*
|
|
** $Log: $
|
|
*/
|