Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / packages / molvideo.c
diff --git a/qemu/roms/openbios/packages/molvideo.c b/qemu/roms/openbios/packages/molvideo.c
new file mode 100644 (file)
index 0000000..787c4dc
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ *   Creation Date: <2002/10/23 20:26:40 samuel>
+ *   Time-stamp: <2004/01/07 19:39:15 samuel>
+ *
+ *     <molvideo.c>
+ *
+ *     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<height; y++, pp += VIDEO_DICT_VALUE(video.rb) ) {
+                       if( VIDEO_DICT_VALUE(video.depth) >= 24 ) {
+                               unsigned long *d = (unsigned long*)pp;
+                               for( x=0; x<width; x++, p+=3, d++ )
+                                       *d = ((int)p[0] << 16) | ((int)p[1] << 8) | p[2];
+                       } else if( VIDEO_DICT_VALUE(video.depth) == 15 ) {
+                               unsigned short *d = (unsigned short*)pp;
+                               for( x=0; x<width; x++, p+=3, d++ ) {
+                                       int col = ((int)p[0] << 16) | ((int)p[1] << 8) | p[2];
+                                       *d = ((col>>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!");
+}