home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / D / SVGALIB / SVGALIB1.TAR / svgalib / src / vgaaccel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-22  |  3.4 KB  |  153 lines

  1. /* Written by Michael Weller and Harm Hanemaayer. */
  2.  
  3.  
  4. #include "stdarg.h"
  5. #include "vga.h"
  6. #include "driver.h"
  7. #include "timing.h"
  8. #include "accel.h"
  9.  
  10.  
  11. /*
  12.  * This calls one of the acceleration interface functions.
  13.  */
  14.  
  15. int vga_accel( unsigned operation, ... ) {
  16.     va_list params;
  17.  
  18.     va_start(params, operation);
  19.  
  20.     /* Do a quick availability check to avoid disasters. */
  21.     if (driverspecs->accelspecs == 0)
  22.         return -1;
  23.     /* Check for operation availability flag. */
  24.     if (!(driverspecs->accelspecs->operations & (1 << (operation - 1))))
  25.         return -1;
  26.  
  27.     vga_lockvc();
  28.  
  29.     /*
  30.      * gcc doesn't produce glorious code here, it's much better with
  31.      * only one va_arg traversal in a function.
  32.      */
  33.  
  34.     switch (operation) {
  35.     case ACCEL_FILLBOX : {
  36.         int x, y, w, h;
  37.         x = va_arg(params, int);
  38.         y = va_arg(params, int);
  39.         w = va_arg(params, int);
  40.         h = va_arg(params, int);
  41.         (*driverspecs->accelspecs->FillBox)(x, y, w, h);
  42.         break;
  43.     }
  44.     case ACCEL_SCREENCOPY : {
  45.         int x1, y1, x2, y2, w, h;
  46.         x1 = va_arg(params, int);
  47.         y1 = va_arg(params, int);
  48.         x2 = va_arg(params, int);
  49.         y2 = va_arg(params, int);
  50.         w = va_arg(params, int);
  51.         h = va_arg(params, int);
  52.         (*driverspecs->accelspecs->ScreenCopy)(x1, y1, x2, y2, w, h);
  53.         break;
  54.     }
  55.     case ACCEL_PUTIMAGE : {
  56.         int x, y, w, h;
  57.         void *p;
  58.         x = va_arg(params, int);
  59.         y = va_arg(params, int);
  60.         w = va_arg(params, int);
  61.         h = va_arg(params, int);
  62.         p = va_arg(params, void *);
  63.         (*driverspecs->accelspecs->PutImage)(x, y, w, h, p);
  64.         break;
  65.     }
  66.     case ACCEL_DRAWLINE : {
  67.         int x1, x2, y1, y2;
  68.         x1 = va_arg(params, int);
  69.         y1 = va_arg(params, int);
  70.         x2 = va_arg(params, int);
  71.         y2 = va_arg(params, int);
  72.         (*driverspecs->accelspecs->DrawLine)(x1, y1, x2, y2);
  73.         break;
  74.     }
  75.     case ACCEL_SETFGCOLOR : {
  76.         int c;
  77.         c = va_arg(params, int);
  78.         (*driverspecs->accelspecs->SetFGColor)(c);
  79.         break;
  80.     }
  81.     case ACCEL_SETBGCOLOR : {
  82.         int c; 
  83.         c = va_arg(params, int);
  84.         (driverspecs->accelspecs->SetBGColor)(c);
  85.         break;
  86.     }
  87.     case ACCEL_SETTRANSPARENCY : {
  88.         int m, c;
  89.         m = va_arg(params, int);
  90.         c = va_arg(params, int);
  91.         (*driverspecs->accelspecs->SetTransparency)(m, c);
  92.         break;
  93.     }
  94.     case ACCEL_SETRASTEROP : {
  95.         int r;
  96.         r = va_arg(params, int);
  97.         (*driverspecs->accelspecs->SetRasterOp)(r);
  98.         break;
  99.     }
  100.     case ACCEL_PUTBITMAP : {
  101.         int x, y, w, h;
  102.         void *p;
  103.         x = va_arg(params, int);
  104.         y = va_arg(params, int);
  105.         w = va_arg(params, int);
  106.         h = va_arg(params, int);
  107.         p = va_arg(params, void *);
  108.         (*driverspecs->accelspecs->PutBitmap)(x, y, w, h, p);
  109.         break;
  110.     }
  111.     case ACCEL_SCREENCOPYBITMAP : {
  112.         int x1, y1, x2, y2, w, h;
  113.         x1 = va_arg(params, int);
  114.         y1 = va_arg(params, int);
  115.         x2 = va_arg(params, int);
  116.         y2 = va_arg(params, int);
  117.         w = va_arg(params, int);
  118.         h = va_arg(params, int);
  119.         (*driverspecs->accelspecs->ScreenCopyBitmap)(x1, y1, x2, y2, w, h);
  120.         break;
  121.     }
  122.     case ACCEL_DRAWHLINELIST : {
  123.         int y, n, *x1, *x2;
  124.         y = va_arg(params, int);
  125.         n = va_arg(params, int);
  126.         x1 = va_arg(params, int *);
  127.         x2 = va_arg(params, int *);
  128.         (*driverspecs->accelspecs->DrawHLineList)(y, n, x1, x2);
  129.         break;
  130.     }
  131.     case ACCEL_SETMODE : {
  132.         int m;
  133.         /* This isn't sent to the chipset-specific driver. */
  134.         m = va_arg(params, int);
  135.         if ((accel_mode & BLITS_IN_BACKGROUND)
  136.         && !(m & BLITS_IN_BACKGROUND))
  137.             /* Make sure background blits are finished. */
  138.             (*driverspecs->accelspecs->Sync)();
  139.         accel_mode = m;
  140.         break;
  141.     }
  142.     case ACCEL_SYNC :
  143.         (*driverspecs->accelspecs->Sync)();
  144.         break;
  145.     } /* switch */
  146.  
  147.     va_end(params);
  148.  
  149.     vga_unlockvc();
  150.  
  151.     return 0;
  152. }
  153.