/*
 * smoothcolor v1.0 by baldor & giemor
 * quick hack - done in about 30mins during a meeting on April 9th 98
 *
 * compile with gcc -O -o smoothcolor smoothcolor.c
 * (DON'T FORGET THE -O : the program doesnt compile without it !!!)
 *
 * you have to run this program as root because it accesses the ports
 * directly.
 *
 * works with Linux only !
 */

#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>

void pal(int color, int r, int g, int b)
{
        outb(color, 0x3c8);
        outb(r, 0x3c9);
        outb(g, 0x3c9);
        outb(b, 0x3c9);
}

void docolor()
{
        int i;

        /* I know this is ugly but hey - it works ! */

        for (i=63; i>0; i--) {
                usleep(30000);
                pal(7,63,i,i);
        }
        for (i=0; i<63; i++) {
                usleep(30000);
                pal(7,63,i,0);
        }
        for (i=63; i>0; i--) {
                usleep(30000);
                pal(7,i,63,0);
        }
        for (i=0; i<63; i++) {
                usleep(30000);
                pal(7,0,63,i);
        }
        for (i=63; i>0; i--) {
                usleep(30000);
                pal(7,0,i,63);
        }
        for (i=0; i<63; i++) {
                usleep(30000);
                pal(7,i,0,63);
        }
        for (i=0; i<63; i++) {
                usleep(30000);
                pal(7,63,i,63);
        }
}

int main(int argc, char *argv[])
{
        int i;
        printf("\n                Smoothcolor v1.0 by baldor & giemor (1998)\n\
n");

        if( (getuid()!=0) && (geteuid()!=0) ) {
                printf("ERROR: you need to be root to run this program\n");
                exit(1);
        }


        if( fork() != 0 ) return(0); /* go into background */

        /* Get IO-Permissions for port */
        ioperm(0x3c8,3,1);
        ioperm(0x3c9,3,1);

        while(1) {
                docolor();
        }

        /* Drop the permissions */
        ioperm(0x3c8,3,0);
        ioperm(0x3c9,3,0);
}



syntax highlighted by Code2HTML, v. 0.9.1