Subversion Repositories shark

Rev

Blame | Last modification | View Log | RSS feed

/* Written by Michael Weller and Harm Hanemaayer. */


#include <stdarg.h>
#include "vga.h"
#include "driver.h"
#include "timing.h"
#include "accel.h"


/*
 * This calls one of the acceleration interface functions.
 */


int vga_accel(unsigned operation,...)
{
    va_list params;

    va_start(params, operation);
    /* This is the fast interface which I thought of first: */
    if (__svgalib_driverspecs->accel) {
        int retval;

        retval = (*(__svgalib_driverspecs->accel))(operation, params);
        va_end(params);
        return retval;
    }

    /* Do a quick availability check to avoid disasters. */
    if (__svgalib_driverspecs->accelspecs == 0)
        return -1;
    /* Check for operation availability flag. */
    if (!(__svgalib_driverspecs->accelspecs->operations & (1 << (operation - 1))))
        return -1;

    vga_lockvc();

    /*
     * gcc doesn't produce glorious code here, it's much better with
     * only one va_arg traversal in a function.
     */


    switch (operation) {
    case ACCEL_FILLBOX:
        {
            int x, y, w, h;
            x = va_arg(params, int);
            y = va_arg(params, int);
            w = va_arg(params, int);
            h = va_arg(params, int);
            (*__svgalib_driverspecs->accelspecs->FillBox) (x, y, w, h);
            break;
        }
    case ACCEL_SCREENCOPY:
        {
            int x1, y1, x2, y2, w, h;
            x1 = va_arg(params, int);
            y1 = va_arg(params, int);
            x2 = va_arg(params, int);
            y2 = va_arg(params, int);
            w = va_arg(params, int);
            h = va_arg(params, int);
            (*__svgalib_driverspecs->accelspecs->ScreenCopy) (x1, y1, x2, y2, w, h);
            break;
        }
    case ACCEL_PUTIMAGE:
        {
            int x, y, w, h;
            void *p;
            x = va_arg(params, int);
            y = va_arg(params, int);
            w = va_arg(params, int);
            h = va_arg(params, int);
            p = va_arg(params, void *);
            (*__svgalib_driverspecs->accelspecs->PutImage) (x, y, w, h, p);
            break;
        }
    case ACCEL_DRAWLINE:
        {
            int x1, x2, y1, y2;
            x1 = va_arg(params, int);
            y1 = va_arg(params, int);
            x2 = va_arg(params, int);
            y2 = va_arg(params, int);
            (*__svgalib_driverspecs->accelspecs->DrawLine) (x1, y1, x2, y2);
            break;
        }
    case ACCEL_SETFGCOLOR:
        {
            int c;
            c = va_arg(params, int);
            (*__svgalib_driverspecs->accelspecs->SetFGColor) (c);
            break;
        }
    case ACCEL_SETBGCOLOR:
        {
            int c;
            c = va_arg(params, int);
            (__svgalib_driverspecs->accelspecs->SetBGColor) (c);
            break;
        }
    case ACCEL_SETTRANSPARENCY:
        {
            int m, c;
            m = va_arg(params, int);
            c = va_arg(params, int);
            (*__svgalib_driverspecs->accelspecs->SetTransparency) (m, c);
            break;
        }
    case ACCEL_SETRASTEROP:
        {
            int r;
            r = va_arg(params, int);
            (*__svgalib_driverspecs->accelspecs->SetRasterOp) (r);
            break;
        }
    case ACCEL_PUTBITMAP:
        {
            int x, y, w, h;
            void *p;
            x = va_arg(params, int);
            y = va_arg(params, int);
            w = va_arg(params, int);
            h = va_arg(params, int);
            p = va_arg(params, void *);
            (*__svgalib_driverspecs->accelspecs->PutBitmap) (x, y, w, h, p);
            break;
        }
    case ACCEL_SCREENCOPYBITMAP:
        {
            int x1, y1, x2, y2, w, h;
            x1 = va_arg(params, int);
            y1 = va_arg(params, int);
            x2 = va_arg(params, int);
            y2 = va_arg(params, int);
            w = va_arg(params, int);
            h = va_arg(params, int);
            (*__svgalib_driverspecs->accelspecs->ScreenCopyBitmap) (x1, y1, x2, y2, w, h);
            break;
        }
    case ACCEL_DRAWHLINELIST:
        {
            int y, n, *x1, *x2;
            y = va_arg(params, int);
            n = va_arg(params, int);
            x1 = va_arg(params, int *);
            x2 = va_arg(params, int *);
            (*__svgalib_driverspecs->accelspecs->DrawHLineList) (y, n, x1, x2);
            break;
        }
    case ACCEL_SETMODE:
        {
            int m;
            /* This isn't sent to the chipset-specific driver. */
            m = va_arg(params, int);
            if ((__svgalib_accel_mode & BLITS_IN_BACKGROUND)
                && !(m & BLITS_IN_BACKGROUND))
                /* Make sure background blits are finished. */
                (*__svgalib_driverspecs->accelspecs->Sync) ();
            __svgalib_accel_mode = m;
            break;
        }
    case ACCEL_SYNC:
        (*__svgalib_driverspecs->accelspecs->Sync) ();
        break;
    }                           /* switch */

    va_end(params);

    vga_unlockvc();

    return 0;
}