changes from smg
This commit is contained in:
parent
8224daf61a
commit
05f5dde560
2 changed files with 63 additions and 13 deletions
|
|
@ -4,7 +4,7 @@
|
|||
* $Source$
|
||||
*
|
||||
* load a splash image from a pcx file
|
||||
* the pcs file is stored in flash at a know address.
|
||||
* the pcs file is stored in flash at a known address.
|
||||
* VGA must be in gmode prior to entering this routine.
|
||||
* There are some assumptions made about the pcx image
|
||||
* and the color table. See the code.
|
||||
|
|
@ -12,6 +12,10 @@
|
|||
* by
|
||||
* Steve M. Gehlbach <steve@kesa.com>
|
||||
*
|
||||
* References:
|
||||
* PCX file spec:
|
||||
* http://www.whisqu.se/per/docs/graphics57.htm
|
||||
*
|
||||
* pcx row decode function modified from the netpbm project
|
||||
* http://download.sourceforge.net/netpbm/
|
||||
*
|
||||
|
|
@ -28,9 +32,11 @@ u8 *vga = (u8 *) VGA_GRAFIX_BASE;
|
|||
static void GetPCXRow(unsigned char * pcx_file, unsigned char * const pcxrow, int const bytesperline, int * file_index);
|
||||
void writeVga(u8 *pcxrow);
|
||||
|
||||
// globals
|
||||
static int rowsRead = 0;
|
||||
static int xsize = 0;
|
||||
static int ysize = 0;
|
||||
static u8 p_offset;
|
||||
|
||||
struct pcx_header {
|
||||
u8 manufacturer;
|
||||
|
|
@ -58,6 +64,31 @@ int vga_load_pcx (char * pcx_file, int size) {
|
|||
u8 vgarow[650];
|
||||
struct pcx_header *pcx;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Image must be 1 plane, 8 bits per pixel, run length encoding,
|
||||
// 256 colors with only 16 colors of the 256 used. The file is
|
||||
// assumed to be a version 5 type file with the 256
|
||||
// color palette at the file end. Only 4 bit planes
|
||||
// are used, however, so the image must be generated with
|
||||
// 16 colors, so that the palette uses only 16
|
||||
// entries. The image can use either the bottom or
|
||||
// top of the palette (the code checks the
|
||||
// bottom then the top of 256 entry palette).
|
||||
// Gimp puts the 16 entry palette at the beginning of the 256 color
|
||||
// palette, and PhotoShop puts the 16 colors at the end of the palette.
|
||||
// Both are supported. To generate a compatible pcx file in gimp,
|
||||
// right click on the image and select image->mode->indexed,
|
||||
// change #colors to 16, and make sure "Generate Optimal Palette"
|
||||
// and appropriate dithering is selected (Floyd Steinberg Normal
|
||||
// is the default and seems to work). Click Okay, then right
|
||||
// click and select File->Save As and select PCX as the File
|
||||
// Type and save the file with a pcx extension.
|
||||
// This routine supports variable width and height but the default
|
||||
// for linuxbios is 640 x 400 pixels.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
pcx = (struct pcx_header *) pcx_file;
|
||||
if ( ! (pcx->manufacturer == 0x0a && pcx->version == 0x05 && pcx->encoding == 0x01) ) {
|
||||
printk_info("vga_load_pcx: not a compatible .pcx file.\n");
|
||||
|
|
@ -83,22 +114,35 @@ int vga_load_pcx (char * pcx_file, int size) {
|
|||
total_bytes_per_line*ysize
|
||||
);
|
||||
|
||||
// read the color table at the end of the file
|
||||
// skip first 240 colors
|
||||
// we only use last 16 colors
|
||||
// Read the color table at the end of the file.
|
||||
// Check the beginning of the palette to see if it
|
||||
// is non-zero. Default to the end of the palette
|
||||
// if beginning is zero. We only use 16 colors.
|
||||
|
||||
file_index = size-769;
|
||||
// check palette signature
|
||||
if (pcx_file[file_index++] != PCX_256_COLORS) {
|
||||
// palette no good, bail out
|
||||
printk_info("vga_load_pcx: invalid color table signature at file_index %d: 0x%x\n",
|
||||
file_index-1,pcx_file[file_index-1]);
|
||||
return -1;
|
||||
}
|
||||
file_index += 240*3;
|
||||
|
||||
// add up 2 3-tuples at beginning of palette and see if the result == 0; if so,
|
||||
// then use top 16 entries. If not, then use 16 entries at beginning of palette.
|
||||
p_offset = 0;
|
||||
for (i = 0; i<6; i++) p_offset += pcx_file[file_index + i];
|
||||
if (p_offset == 0) p_offset = 240;
|
||||
else p_offset = 0;
|
||||
|
||||
file_index += p_offset*3;
|
||||
i = 0;
|
||||
outb_p(240, PEL_IW);
|
||||
do {
|
||||
// put the 16 3-tuple color table at the top of the PEL
|
||||
// scale 0-255 -> 0-63
|
||||
// put the 16 3-tuple color table at the upper end of the PEL
|
||||
// this avoids conflicting with standard palette at lower end
|
||||
// since the upper end is not used in this legacy mode
|
||||
// scale 0-255 -> 0-63 (6 bit DAC)
|
||||
outb_p(pcx_file[file_index++]>>2, PEL_D);
|
||||
outb_p(pcx_file[file_index++]>>2, PEL_D);
|
||||
outb_p(pcx_file[file_index++]>>2, PEL_D);
|
||||
|
|
@ -110,6 +154,7 @@ int vga_load_pcx (char * pcx_file, int size) {
|
|||
printk_debug("vga_load_pcx: %d colors read into colortable.\n",i);
|
||||
|
||||
// set the color select to set b7-4 to 1111 to use high end of PEL
|
||||
// this avoids conflicting with standard palette at lower end
|
||||
write_att(read_att_b(ATC_MODE)|0x80,ATC_MODE);
|
||||
write_att(0x0f,ATC_COLOR_PAGE);
|
||||
|
||||
|
|
@ -211,8 +256,9 @@ void writeVga(u8 *pcxrow) {
|
|||
}
|
||||
if (i >= xsize) return;
|
||||
}
|
||||
// pixel value is at high end so subtract 240
|
||||
s_pixel = pcxrow[i] - 240;
|
||||
// if we are using upper end of palette, then
|
||||
// subtract 240 to scale value to 0-15
|
||||
s_pixel = pcxrow[i] - p_offset;
|
||||
mask = 0x80 >> (i % 8);
|
||||
for (j=0;j<4;j++)
|
||||
if (s_pixel & (1<<j) )
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue