/* * Creation Date: <2002/10/23 20:26:40 samuel> * Time-stamp: <2004/01/07 19:39:15 samuel> * * * * Mac-on-Linux display node * * Copyright (C) 2002, 2003, 2004 Samuel Rydh (samuel@ibrium.se) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation * */ #include "config.h" #include "libopenbios/bindings.h" #include "libc/diskio.h" #include "libopenbios/ofmem.h" #include "drivers/drivers.h" #include "packages/video.h" #include "libopenbios/video.h" #include "drivers/vga.h" /************************************************************************/ /* OF methods */ /************************************************************************/ DECLARE_NODE( video, 0, 0, "Tdisplay" ); /* ( r g b index -- ) */ static void molvideo_color_bang( void ) { int index = POP(); int b = POP(); int g = POP(); int r = POP(); unsigned long col = ((r << 16) & 0xff0000) | ((g << 8) & 0x00ff00) | (b & 0xff); /* printk("color!: %08lx %08lx %08lx %08lx\n", r, g, b, index ); */ if( VIDEO_DICT_VALUE(video.depth) == 8 ) { OSI_SetColor( index, col ); OSI_RefreshPalette(); } } /* ( -- ) - really should be reworked as draw-logo */ static void molvideo_startup_splash( void ) { int fd, s, i, y, x, dx, dy; int width, height; char *pp, *p; char buf[64]; /* only draw logo in 24-bit mode (for now) */ if( VIDEO_DICT_VALUE(video.depth) < 15 ) return; for( i=0; i<2; i++ ) { if( !BootHGetStrResInd("bootlogo", buf, sizeof(buf), 0, i) ) return; *(!i ? &width : &height) = atol(buf); } if( (s=width * height * 3) > 0x20000 ) return; if( (fd=open_io("pseudo:,bootlogo")) >= 0 ) { p = malloc( s ); if( read_io(fd, p, s) != s ) printk("bootlogo size error\n"); close_io( fd ); dx = (VIDEO_DICT_VALUE(video.w) - width)/2; dy = (VIDEO_DICT_VALUE(video.h) - height)/3; pp = (char*)VIDEO_DICT_VALUE(video.mvirt) + dy * VIDEO_DICT_VALUE(video.rb) + dx * (VIDEO_DICT_VALUE(video.depth) >= 24 ? 4 : 2); for( y=0 ; y= 24 ) { unsigned long *d = (unsigned long*)pp; for( x=0; x>9) & 0x7c00) | ((col>>6) & 0x03e0) | ((col>>3) & 0x1f); } } } free( p ); } /* No bootlogo support yet on other platforms */ return; } NODE_METHODS( video ) = { {"mol-startup-splash", molvideo_startup_splash }, }; /************************************************************************/ /* init */ /************************************************************************/ void molvideo_init(void) { xt_t color_bang; REGISTER_NODE( video ); /* Bind the MOL graphic routines to the mol-color! defer */ color_bang = bind_noname_func(molvideo_color_bang); PUSH(color_bang); feval(" to mol-color!"); }