Date: Tue, 09 Mar 1999 20:53:21 +0900 From: Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> To: Charles Quarri <randy@hackerz.org> Cc: freebsd stable <freebsd-stable@freebsd.org>, yokota@zodiac.mech.utsunomiya-u.ac.jp Subject: Re: Color messed up for splash screen Message-ID: <199903091153.UAA13236@zodiac.mech.utsunomiya-u.ac.jp> In-Reply-To: Your message of "Tue, 09 Mar 1999 01:01:00 EST." <Pine.BSF.4.02A.9903090057320.13165-100000@hackerz.org> References: <Pine.BSF.4.02A.9903090057320.13165-100000@hackerz.org>
next in thread | previous in thread | raw e-mail | index | archive | help
>I have been trying to put together a splash screen for my box using
>gimp to generate the image. I am using the vesa module to get a
>800x600 image, but all the colors are messed up, though the image
>displays fine. Any ideas of what I am doing wrong?
The vesa module is suffering from incorrect palette colors lately :-<
And I am debugging it.
Would you apply the following patch to /sys/i386/isa/vesa.c, rebuild
and install the vesa module?
The patch will comment out problematic code.
Kazu
Index: vesa.c
===================================================================
RCS file: /src/CVS/src/sys/i386/isa/vesa.c,v
retrieving revision 1.18
diff -u -r1.18 vesa.c
--- vesa.c 1999/02/20 03:05:37 1.18
+++ vesa.c 1999/03/09 10:35:26
@@ -151,6 +151,7 @@
static int int10_set_mode(int mode);
static int vesa_bios_get_mode(int mode, struct vesa_mode *vmode);
static int vesa_bios_set_mode(int mode);
+static int vesa_bios_get_dac(void);
static int vesa_bios_set_dac(int bits);
static int vesa_bios_save_palette(int start, int colors, u_char *palette,
int bits);
@@ -233,6 +234,21 @@
}
static int
+vesa_bios_get_dac(void)
+{
+ struct vm86frame vmf;
+ int err;
+
+ bzero(&vmf, sizeof(vmf));
+ vmf.vmf_eax = 0x4f08;
+ vmf.vmf_ebx = 1; /* get DAC width */
+ err = vm86_intcall(0x10, &vmf);
+ if ((err != 0) || (vmf.vmf_eax != 0x4f))
+ return 6; /* XXX */
+ return ((vmf.vmf_ebx >> 8) & 0x00ff);
+}
+
+static int
vesa_bios_set_dac(int bits)
{
struct vm86frame vmf;
@@ -832,16 +848,20 @@
static int
vesa_save_palette(video_adapter_t *adp, u_char *palette)
{
+#if notyet
int bits;
int error;
- if ((adp == vesa_adp) && (vesa_adp_info->v_flags & V_DAC8)
- && ((bits = vesa_bios_set_dac(8)) > 6)) {
+ bits = 6;
+ if ((adp == vesa_adp) && (vesa_adp_info->v_flags & V_DAC8)
+ && VESA_MODE(adp->va_mode)) {
+ bits = vesa_bios_get_dac();
error = vesa_bios_save_palette(0, 256, palette, bits);
- vesa_bios_set_dac(6);
if (error == 0)
return 0;
+ bits = vesa_bios_set_dac(6);
}
+#endif /* notyet */
return (*prevvidsw->save_palette)(adp, palette);
}
@@ -849,16 +869,19 @@
static int
vesa_load_palette(video_adapter_t *adp, u_char *palette)
{
+#if notyet
int bits;
int error;
+ bits = 6;
if ((adp == vesa_adp) && (vesa_adp_info->v_flags & V_DAC8)
- && ((bits = vesa_bios_set_dac(8)) > 6)) {
+ && VESA_MODE(adp->va_mode) && ((bits = vesa_bios_set_dac(8)) > 6)) {
error = vesa_bios_load_palette(0, 256, palette, bits);
- vesa_bios_set_dac(6);
if (error == 0)
return 0;
+ bits = vesa_bios_set_dac(6);
}
+#endif /* notyet */
return (*prevvidsw->load_palette)(adp, palette);
}
@@ -1069,7 +1092,9 @@
static int
vesa_unload(void)
{
+ u_char palette[256*3];
int error;
+ int bits;
int s;
/* if the adapter is currently in a VESA mode, don't unload */
@@ -1083,8 +1108,16 @@
s = spltty();
if ((error = vesa_unload_ioctl()) == 0) {
if (vesa_adp != NULL) {
- if (vesa_adp_info->v_flags & V_DAC8)
- vesa_bios_set_dac(6);
+ if (vesa_adp_info->v_flags & V_DAC8) {
+ bits = vesa_bios_get_dac();
+ if (bits > 6) {
+ vesa_bios_save_palette(0, 256,
+ palette, bits);
+ vesa_bios_set_dac(6);
+ vesa_bios_load_palette(0, 256,
+ palette, 6);
+ }
+ }
vesa_adp->va_flags &= ~V_ADP_VESA;
vidsw[vesa_adp->va_index] = prevvidsw;
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199903091153.UAA13236>
