Rev 81 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/* VGAlib version 1.2 - (c) 1993 Tommy Frandsen */
/* */
/* This library is free software; you can redistribute it and/or */
/* modify it without any restrictions. This library is distributed */
/* in the hope that it will be useful, but without any warranty. */
/* Multi-chipset support Copyright 1993 Harm Hanemaayer */
/* partially copyrighted (C) 1993 by Hartmut Schirmer */
/* Converted to especially ugly code and seriously hacked for Mach32: */
/* M. Weller in 1994 */
#include <stdlib.h>
#include "vga.h"
#include "vgaio.h"
#include "libvga.h"
#include "driver.h"
/*
* In grayscale mode, we convert RGB colors to a Y component on the
* green-channel (the Y component is used in grayscale TV sets for the
* same purpose and corresponds to the "brightness" of the color as
* perceived by the human eye. In order to be able to return to the
* user the original green-component, we save a backup copy of the
* green channel in __svgalib_green_backup:
*/
int __svgalib_green_backup[256];
static int set_lut(int index, int red, int green, int blue)
{
if (__svgalib_novga) return 1;
/* prevents lockups */
if ((__svgalib_chipset == MACH64)) {
outb(0x02ec+0x5c00,index);
outb(0x02ec+0x5c01,red);
outb(0x02ec+0x5c01,green);
outb(0x02ec+0x5c01,blue);
return 0;
}
__svgalib_outpal(index,red,green,blue);
return 0;
}
static int get_lut(int index, int *red, int *green, int *blue)
{
if (__svgalib_novga) return 0;
/* prevents lockups on mach64 */
if ((__svgalib_chipset == MACH64)) {
outb(0x02ec+0x5c00,index);
*red=port_in(0x02ec+0x5c01);
*green=port_in(0x02ec+0x5c01);
*blue=port_in(0x02ec+0x5c01);
return 0;
}
__svgalib_inpal(index,red,green,blue);
return 0;
}
int vga_setpalette(int index, int red, int green, int blue)
{
DTP(("setpalette %i %i %i %i\n",index,red,green,blue));
if (__svgalib_grayscale) {
if ((unsigned) index >= sizeof(__svgalib_green_backup) / sizeof(__svgalib_green_backup[0])) {
cprintf("vga_setpalette: color index %d out of range\n", index);
}
__svgalib_green_backup[index] = green;
green = 0.299 * red + 0.587 * green + 0.114 * blue;
if (green < 0)
green = 0;
if (green > 255)
green = 255;
}
if (__svgalib_driverspecs->emul && __svgalib_driverspecs->emul->setpalette) {
return __svgalib_driverspecs->emul->setpalette(index, red, green, blue);
} else {
return set_lut(index, red, green, blue);
}
}
int vga_getpalette(int index, int *red, int *green, int *blue)
{
if (__svgalib_driverspecs->emul && __svgalib_driverspecs->emul->getpalette)
__svgalib_driverspecs->emul->getpalette(index, red, green, blue);
else get_lut(index, red, green, blue);
if (__svgalib_grayscale) {
if ((unsigned) index >= sizeof(__svgalib_green_backup) / sizeof(__svgalib_green_backup[0])) {
cprintf("vga_getpalette: color index %d out of range\n", index);
}
*green = __svgalib_green_backup[index];
}
return 0;
}
int vga_setpalvec(int start, int num, int *pal)
{
int i;
DTP(("setpalvec %i %i %x\n",start,num,pal));
if ((__svgalib_driverspecs->emul && __svgalib_driverspecs->emul->setpalette) ||
(__svgalib_outpal!=__svgalib_vga_outpal)) {
for (i = start; i < start + num; ++i) {
vga_setpalette(i, pal[0], pal[1], pal[2]);
pal += 3;
}
} else {
unsigned char string[768];
if ( num > 256 )
return 0;
for (i = 0; i < num * 3; i++)
string[i] = pal[i];
port_out ( start, 0x3c8 );
#if 0
port_rep_outb( string, num * 3, 0x3c9 );
#else
for(i=0;i<num*3;i++)port_out(string[i],0x3c9);
#endif
}
return num;
}
int vga_getpalvec(int start, int num, int *pal)
{
int i;
for (i = start; i < start + num; ++i) {
vga_getpalette(i, pal + 0, pal + 1, pal + 2);
pal += 3;
}
return num;
}