File:  [RetroPC.NET] / xmil / vram / palettes.c
Revision 1.1: download - view: text, annotated - select for diffs
Sun Aug 1 14:31:31 2004 JST (21 years, 3 months ago) by yui
Branches: MAIN
CVS tags: HEAD
initialize

#include	"compiler.h"
#include	"scrnmng.h"
#include	"pccore.h"
#include	"x1_io.h"
#include	"x1_crtc.h"
#include	"draw.h"
#include	"palettes.h"


	RGB32	x1n_pal32[256];			// xm_palette
	RGB32	x1z_pal32[4096+8];		// GRPHPAL4096

#if defined(SUPPORT_16BPP)
	RGB16	x1n_pal16[256];			// xmil_pal16
	RGB16	x1z_pal16[4096+8];		// GRPHPAL16bit
#endif


// drop
	int		xm_palettes = 0;





void pals_cnv16pal(RGB16 *dst, const RGB32 *src, UINT pals) {

	while(pals--) {
		*dst++ = scrnmng_makepal16(*src++);
	}
}


void pal_makegrad(RGB32 *pal, int pals, DWORD bg, DWORD fg) {

	int		i;

	if (pals >= 2) {
		pals--;
		for (i=0; i<=pals; i++) {
			pal[i].p.b = (BYTE)
				((((fg >> 0) & 0x0000ff) * i + 
				((bg >> 0) & 0x0000ff) * (pals-i)) / pals);
			pal[i].p.g = (BYTE)
				((((fg >> 8) & 0x0000ff) * i + 
				((bg >> 8) & 0x0000ff) * (pals-i)) / pals);
			pal[i].p.r = (BYTE)
				((((fg >> 16) & 0x0000ff) * i + 
				((bg >> 16) & 0x0000ff) * (pals-i)) / pals);
			pal[i].p.e = 0;
		}
	}
}

// ---------------------------------------------------------------------------

static	BYTE	blankcol = 0;
static	WORD	halfgrp = 0;
static	WORD	halftxt = 0;

		RGB32	TEXTPALS[24];
		RGB32	GRPHPALS[2][16];
		RGB32	GRPHPALS64[2][64];


void textpalette1(BYTE num) {

	REG8	f;
	RGB32	c;

	f = 0;
	c.p.e = 0;
	c.p.b = (crtc_TEXTPAL[num] & 0x3) * 0x55;
	if (c.p.b < blankcol) {
		f |= 1;
	}
	c.p.g = ((crtc_TEXTPAL[num] & 0x30) >> 4) * 0x55;
	if (c.p.g < blankcol) {
		f |= 2;
	}
	c.p.r = ((crtc_TEXTPAL[num] & 0x0c) >> 2) * 0x55;
	if (c.p.r < blankcol) {
		f |= 4;
	}
	if (f == 7) {
		c.d = 0x010101 * blankcol;
	}
	x1z_pal32[4096+num].d = c.d;
#if defined(SUPPORT_16BPP)
	if (scrnmng_getbpp() == 16) {
		x1z_pal16[4096+num] = scrnmng_makepal16(c);
	}
#endif

	TEXTPALS[num].d = c.d;
	TEXTPALS[num].p.e = num + START_EXT;

	TEXTPALS[num+8].p.b = (halftxt * c.p.b) / 0x00ff;
	TEXTPALS[num+8].p.g = (halftxt * c.p.g) / 0x00ff;
	TEXTPALS[num+8].p.r = (halftxt * c.p.r) / 0x00ff;
	TEXTPALS[num+8].p.e = num + START_EXT + 0x08;

	TEXTPALS[num+16].p.b = (halfgrp * c.p.b) / 0x00ff;
	TEXTPALS[num+16].p.g = (halfgrp * c.p.g) / 0x00ff;
	TEXTPALS[num+16].p.r = (halfgrp * c.p.r) / 0x00ff;
	TEXTPALS[num+16].p.e = num + START_EXT + 0x10;

	palandply = 1;
}


void grphpalette1(BYTE bank, BYTE num) {

	RGB32	c;
	BYTE	f = 0;

	c.p.b = (crtc_GRPHPAL[bank][num] & 0xf) * 0x11;
	if (c.p.b < blankcol) {
		f |= 1;
	}
	c.p.g = (crtc_GRPHPAL[bank][num] >> 8) * 0x11;
	if (c.p.g < blankcol) {
		f |= 2;
	}
	c.p.r = ((crtc_GRPHPAL[bank][num] & 0xf0) >> 4) * 0x11;
	if (c.p.r < blankcol) {
		f |= 4;
	}
	if (f == 7) {
		c.d = 0x010101 * blankcol;
	}

	GRPHPALS64[bank][num].d = c.d;
	GRPHPALS64[bank][num].p.e = num + START_PAL;
	if (!(((num >> 3) ^ num) & 7)) {
		num &= 7;
		GRPHPALS[bank][num+0].d = c.d;
		GRPHPALS[bank][num+0].p.e = num + START_EXT + 0x18;
		GRPHPALS[bank][num+8].p.b = (halfgrp * c.p.b) / 0xff;
		GRPHPALS[bank][num+8].p.g = (halfgrp * c.p.g) / 0xff;
		GRPHPALS[bank][num+8].p.r = (halfgrp * c.p.r) / 0xff;
		GRPHPALS[bank][num+8].p.e = num + START_EXT + 0x20;
	}
	palandply = 1;
}


void grphpal4096(WORD num) {

	RGB32	c;
	BYTE	f = 0;

	c.p.e = 0;
	c.p.b = (crtc_PAL4096[num] & 0xf) * 0x11;
	if (c.p.b < blankcol) {
		f |= 1;
	}
	c.p.g = (crtc_PAL4096[num] >> 8) * 0x11;
	if (c.p.g < blankcol) {
		f |= 2;
	}
	c.p.r = ((crtc_PAL4096[num] & 0xf0) >> 4) * 0x11;
	if (c.p.r < blankcol) {
		f |= 4;
	}
	if (f == 7) {
		c.d = 0x010101 * blankcol;
	}
	x1z_pal32[num].d = c.d;
#if defined(SUPPORT_16BPP)
	if (scrnmng_getbpp() == 16) {
		x1z_pal16[num] = scrnmng_makepal16(c);
	}
#endif
	palandply = 1;
}



void reflesh_palette(void) {

	BYTE	i, j;
	WORD	k;

	blankcol = xmilcfg.BLKLIGHT;
	if ((!xmilcfg.SKIP_LINE) || (crtc.SCRN_BITS & SCRN_24KHZ)) {
		blankcol >>= 1;
	}
	halfgrp = xmilcfg.LINEDEPTH;
	switch(xmilcfg.TEXT400L) {
		case 0:
			halftxt = xmilcfg.LINEDEPTH;
			break;
		case 1:
			halftxt = 0xff;
			break;
		default:
			halftxt = xmilcfg.LINETEXT;
			break;
	}

	for (i=0; i<8; i++) {
		textpalette1(i);
	}
	for (j=0; j<2; j++) {
		for (i=0; i<64; i++) {
			grphpalette1(j, i);
		}
	}
	for (k=0; k<4096; k++) {
		grphpal4096(k);
	}
}


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