File:  [RetroPC.NET] / xmil / vram / scrndraw.c
Revision 1.7: download - view: text, annotated - select for diffs
Tue Aug 17 21:30:41 2004 JST (21 years, 2 months ago) by yui
Branches: MAIN
CVS tags: HEAD
fix...

#include	"compiler.h"
#include	"scrnmng.h"
#include	"sysmng.h"
#include	"scrndraw.h"
#include	"sdraw.h"
#include	"palettes.h"
#include	"makescrn.h"


	SCRN	scrn;
	UINT8	renewalline[SURFACE_HEIGHT+4];
	UINT8	screenmap[SURFACE_SIZE];


static void updateallline(UINT32 update) {

	UINT	i;

	for (i=0; i<SURFACE_HEIGHT; i+=4) {
		*(UINT32 *)(renewalline + i) |= update;
	}
}


// ----

void scrndraw_initialize(void) {					// ddraws_init

	ZeroMemory(screenmap, sizeof(screenmap));
	ZeroMemory(xmil_pal32, sizeof(xmil_pal32));
	xmil_palettes = 0;

	scrn.widthmode = SCRNWIDTHMODE_WIDTH40;

	updateallline(0x03030303);			// updateallline(0x01010101);
	scrnmng_allflash();
	sysmng_scrnwidth(scrn.widthmode);
}

void scrndraw_changewidth(REG8 widthmode) {

	if (scrn.widthmode != widthmode) {
		scrn.widthmode = widthmode;
		sysmng_scrnwidth(widthmode);
		updateallline(0x01010101);				// fillrenewalline(0x03030303)
	}
}

void scrndraw_changepalette(void) {

#if defined(SUPPORT_8BPP)
	if (scrnmng_getbpp() == 8) {
		scrnmng_palchanged();
		updateallline(0x01010101);				// fillrenewalline(0x02020202)
		return;
	}
#endif
	updateallline(0x01010101);					// fillrenewalline(0x03030303)
}

REG8 scrndraw_draw(REG8 redraw) {

const SCRNSURF	*surf;
const SDRAWFN	*sdrawfn;
	SDRAWFN		fn;
	_SDRAW		sdraw;
	UINT		i;

	if (redraw) {
		updateallline(0x01010101);
	}

	surf = scrnmng_surflock();
	if (surf == NULL) {
		goto sddr_exit1;
	}
	sdrawfn = sdraw_getproctbl(surf);
	if (sdrawfn == NULL) {
		goto sddr_exit2;
	}
	switch(scrn.widthmode) {
		case SCRNWIDTHMODE_WIDTH80:
		default:
			break;

		case SCRNWIDTHMODE_WIDTH40:
			sdrawfn += 1;
			break;

		case SCRNWIDTHMODE_4096:
			sdrawfn += 2;
			break;
	}
	fn = *sdrawfn;
	if (fn == NULL) {
		goto sddr_exit2;
	}

	for (i=0; i<SURFACE_HEIGHT; i++) {
		sdraw.dirty[i] = renewalline[i] & 1;
		if (sdraw.dirty[i]) {
			renewalline[i] &= ~1;
		}
	}

	sdraw.src = screenmap;
	sdraw.dst = surf->ptr;
	sdraw.width = surf->width;
	sdraw.xbytes = surf->xalign * surf->width;
	sdraw.y = 0;
	sdraw.xalign = surf->xalign;
	sdraw.yalign = surf->yalign;
	(*fn)(&sdraw, 400);

sddr_exit2:
	scrnmng_surfunlock(surf);

sddr_exit1:
	return(0);
}

void scrndraw_redraw(void) {

	scrnmng_allflash();
	pal_update();
	scrndraw_draw(TRUE);
}


RetroPC.NET-CVS <cvs@retropc.net>