logo_saver.c revision 42504
142120Sdes/*- 242120Sdes * Copyright (c) 1998 Dag-Erling Co�dan Sm�rgrav 342120Sdes * All rights reserved. 442120Sdes * 542120Sdes * Redistribution and use in source and binary forms, with or without 642120Sdes * modification, are permitted provided that the following conditions 742120Sdes * are met: 842120Sdes * 1. Redistributions of source code must retain the above copyright 942120Sdes * notice, this list of conditions and the following disclaimer 1042120Sdes * in this position and unchanged. 1142120Sdes * 2. Redistributions in binary form must reproduce the above copyright 1242120Sdes * notice, this list of conditions and the following disclaimer in the 1342120Sdes * documentation and/or other materials provided with the distribution. 1442120Sdes * 3. The name of the author may not be used to endorse or promote products 1542120Sdes * derived from this software without specific prior written permission 1642120Sdes * 1742120Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1842120Sdes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1942120Sdes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2042120Sdes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2142120Sdes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2242120Sdes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2342120Sdes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2442120Sdes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2542120Sdes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2642120Sdes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2742120Sdes * 2842504Syokota * $Id: logo_saver.c,v 1.2 1999/01/01 14:40:49 des Exp $ 2942120Sdes */ 3042120Sdes 3142120Sdes#include <sys/param.h> 3242120Sdes#include <sys/systm.h> 3342120Sdes#include <sys/kernel.h> 3442120Sdes#include <sys/module.h> 3542120Sdes#include <sys/syslog.h> 3642120Sdes 3742120Sdes#include <saver.h> 3842120Sdes 3942120Sdesstatic u_char *vid; 4042236Sdesstatic int banksize, scrmode, scrw, scrh; 4142504Syokotastatic int blanked; 4242120Sdes 4342120Sdes#include "logo.c" 4442120Sdes 4542504Syokota#define set_origin(adp, o) (*vidsw[(adp)->va_index]->set_win_org)(adp, o) 4642120Sdes 4742120Sdesstatic void 4842504Syokotalogo_blit(video_adapter_t *adp, int x, int y) 4942120Sdes{ 5042120Sdes int d, l, o, p; 5142120Sdes 5242236Sdes for (o = 0, p = y * scrw + x; p > banksize; p -= banksize) 5342120Sdes o += banksize; 5442504Syokota set_origin(adp, o); 5542120Sdes 5642120Sdes for (d = 0; d < sizeof logo_img; d += logo_w) { 5742120Sdes if (p + logo_w < banksize) { 5842120Sdes bcopy(logo_img + d, vid + p, logo_w); 5942236Sdes p += scrw; 6042120Sdes } else if (p < banksize) { 6142120Sdes l = banksize - p; 6242120Sdes bcopy(logo_img + d, vid + p, l); 6342504Syokota set_origin(adp, (o += banksize)); 6442120Sdes bcopy(logo_img + d + l, vid, logo_w - l); 6542236Sdes p += scrw - banksize; 6642120Sdes } else { 6742120Sdes p -= banksize; 6842504Syokota set_origin(adp, (o += banksize)); 6942120Sdes bcopy(logo_img + d, vid + p, logo_w); 7042236Sdes p += scrw; 7142120Sdes } 7242120Sdes } 7342120Sdes} 7442120Sdes 7542120Sdesstatic void 7642504Syokotalogo_update(video_adapter_t *adp) 7742120Sdes{ 7842120Sdes static int xpos = 0, ypos = 0; 7942120Sdes static int xinc = 1, yinc = 1; 8042120Sdes 8142120Sdes /* Turn when you hit the edge */ 8242236Sdes if ((xpos + logo_w + xinc > scrw) || (xpos + xinc < 0)) 8342236Sdes xinc = -xinc; 8442236Sdes if ((ypos + logo_h + yinc > scrh) || (ypos + yinc < 0)) 8542236Sdes yinc = -yinc; 8642236Sdes xpos += xinc; 8742236Sdes ypos += yinc; 8842120Sdes 8942120Sdes /* XXX Relies on margin around logo to erase trail */ 9042504Syokota logo_blit(adp, xpos, ypos); 9142120Sdes} 9242120Sdes 9342504Syokotastatic int 9442504Syokotalogo_saver(video_adapter_t *adp, int blank) 9542120Sdes{ 9642236Sdes int i, pl; 9742120Sdes 9842120Sdes if (blank) { 9942120Sdes /* switch to graphics mode */ 10042504Syokota if (blanked <= 0) { 10142120Sdes pl = splhigh(); 10242504Syokota set_video_mode(adp, scrmode, logo_pal, 0); 10342504Syokota blanked++; 10442504Syokota vid = (u_char *)adp->va_window; 10542120Sdes splx(pl); 10642236Sdes for (i = 0; i < scrw*scrh; i += banksize) { 10742504Syokota set_origin(adp, i); 10842236Sdes bzero(vid, banksize); 10942236Sdes } 11042120Sdes } 11142504Syokota logo_update(adp); 11242120Sdes } else { 11342504Syokota blanked = 0; 11442120Sdes } 11542504Syokota return 0; 11642120Sdes} 11742120Sdes 11842120Sdesstatic int 11942504Syokotalogo_init(video_adapter_t *adp) 12042120Sdes{ 12142120Sdes video_info_t info; 12242236Sdes 12342504Syokota if (!get_mode_info(adp, M_VESA_CG800x600, &info)) { 12442236Sdes scrmode = M_VESA_CG800x600; 12542504Syokota } else if (!get_mode_info(adp, M_VGA_CG320, &info)) { 12642236Sdes scrmode = M_VGA_CG320; 12742236Sdes } else { 12842236Sdes log(LOG_NOTICE, "logo_saver: no suitable graphics mode\n"); 12942120Sdes return ENODEV; 13042120Sdes } 13142120Sdes 13242236Sdes banksize = info.vi_window_size; 13342236Sdes scrw = info.vi_width; 13442236Sdes scrh = info.vi_height; 13542504Syokota blanked = 0; 13642236Sdes 13742504Syokota return 0; 13842120Sdes} 13942120Sdes 14042120Sdesstatic int 14142504Syokotalogo_term(video_adapter_t *adp) 14242120Sdes{ 14342504Syokota return 0; 14442120Sdes} 14542120Sdes 14642504Syokotastatic scrn_saver_t logo_module = { 14742504Syokota "logo_saver", logo_init, logo_term, logo_saver, NULL, 14842504Syokota}; 14942504Syokota 15042504SyokotaSAVER_MODULE(logo_saver, logo_module); 151