home *** CD-ROM | disk | FTP | other *** search
/ Graphics Programming Black Book (Special Edition) / BlackBook.bin / disk1 / source / chapter42 / l42-2.c < prev    next >
C/C++ Source or Header  |  1997-06-18  |  6KB  |  127 lines

  1. /* Sample line-drawing program to demonstrate Wu antialiasing. Also draws
  2.  * non-antialiased lines for comparison.
  3.  * Tested with Borland C++ 4.02 in small model by Jim Mischel 12/16/94.
  4.  */
  5. #include <dos.h>
  6. #include <conio.h>
  7.  
  8. void SetPalette(struct WuColor *);
  9. extern void DrawWuLine(int, int, int, int, int, int, unsigned int);
  10. extern void DrawLine(int, int, int, int, int);
  11. extern void SetMode(void);
  12. extern int ScreenWidthInPixels;  /* screen dimension globals */
  13. extern int ScreenHeightInPixels;
  14.  
  15. #define NUM_WU_COLORS 2 /* # of colors we'll do antialiased drawing with */
  16. struct WuColor {        /* describes one color used for antialiasing */
  17.    int BaseColor;       /* # of start of palette intensity block in DAC */
  18.    int NumLevels;       /* # of intensity levels */
  19.    int IntensityBits;   /* IntensityBits == log2 NumLevels */
  20.    int MaxRed;          /* red component of color at full intensity */
  21.    int MaxGreen;        /* green component of color at full intensity */
  22.    int MaxBlue;         /* blue component of color at full intensity */
  23. };
  24. enum {WU_BLUE=0, WU_WHITE=1};             /* drawing colors */
  25. struct WuColor WuColors[NUM_WU_COLORS] =  /* blue and white */
  26.     {{192, 32, 5, 0, 0, 0x3F}, {224, 32, 5, 0x3F, 0x3F, 0x3F}};
  27.  
  28. void main()
  29. {
  30.    int CurrentColor, i;
  31.    union REGS regset;
  32.  
  33.    /* Draw Wu-antialiased lines in all directions */
  34.    SetMode();
  35.    SetPalette(WuColors);
  36.    for (i=5; i<ScreenWidthInPixels; i += 10) {
  37.       DrawWuLine(ScreenWidthInPixels/2-ScreenWidthInPixels/10+i/5,
  38.             ScreenHeightInPixels/5, i, ScreenHeightInPixels-1,
  39.             WuColors[WU_BLUE].BaseColor, WuColors[WU_BLUE].NumLevels,
  40.             WuColors[WU_BLUE].IntensityBits);
  41.    }
  42.    for (i=0; i<ScreenHeightInPixels; i += 10) {
  43.       DrawWuLine(ScreenWidthInPixels/2-ScreenWidthInPixels/10, i/5, 0, i,
  44.             WuColors[WU_BLUE].BaseColor, WuColors[WU_BLUE].NumLevels,
  45.             WuColors[WU_BLUE].IntensityBits);
  46.    }
  47.    for (i=0; i<ScreenHeightInPixels; i += 10) {
  48.       DrawWuLine(ScreenWidthInPixels/2+ScreenWidthInPixels/10, i/5,
  49.             ScreenWidthInPixels-1, i, WuColors[WU_BLUE].BaseColor,
  50.             WuColors[WU_BLUE].NumLevels, WuColors[WU_BLUE].IntensityBits);
  51.    }
  52.    for (i=0; i<ScreenWidthInPixels; i += 10) {
  53.       DrawWuLine(ScreenWidthInPixels/2-ScreenWidthInPixels/10+i/5,
  54.             ScreenHeightInPixels, i, 0, WuColors[WU_WHITE].BaseColor,
  55.             WuColors[WU_WHITE].NumLevels,
  56.             WuColors[WU_WHITE].IntensityBits);
  57.    }
  58.    getch();                /* wait for a key press */
  59.  
  60.    /* Now clear the screen and draw non-antialiased lines */
  61.    SetMode();
  62.    SetPalette(WuColors);
  63.    for (i=0; i<ScreenWidthInPixels; i += 10) {
  64.       DrawLine(ScreenWidthInPixels/2-ScreenWidthInPixels/10+i/5,
  65.             ScreenHeightInPixels/5, i, ScreenHeightInPixels-1,
  66.             WuColors[WU_BLUE].BaseColor);
  67.    }
  68.    for (i=0; i<ScreenHeightInPixels; i += 10) {
  69.       DrawLine(ScreenWidthInPixels/2-ScreenWidthInPixels/10, i/5, 0, i,
  70.             WuColors[WU_BLUE].BaseColor);
  71.    }
  72.    for (i=0; i<ScreenHeightInPixels; i += 10) {
  73.       DrawLine(ScreenWidthInPixels/2+ScreenWidthInPixels/10, i/5,
  74.             ScreenWidthInPixels-1, i, WuColors[WU_BLUE].BaseColor);
  75.    }
  76.    for (i=0; i<ScreenWidthInPixels; i += 10) {
  77.       DrawLine(ScreenWidthInPixels/2-ScreenWidthInPixels/10+i/5,
  78.             ScreenHeightInPixels, i, 0, WuColors[WU_WHITE].BaseColor);
  79.    }
  80.    getch();                /* wait for a key press */
  81.  
  82.    regset.x.ax = 0x0003;   /* AL = 3 selects 80x25 text mode */
  83.    int86(0x10, ®set, ®set);   /* return to text mode */
  84. }
  85.  
  86. /* Sets up the palette for antialiasing with the specified colors.
  87.  * Intensity steps for each color are scaled from the full desired intensity
  88.  * of the red, green, and blue components for that color down to 0%
  89.  * intensity; each step is rounded to the nearest integer. Colors are
  90.  * corrected for a gamma of 2.3. The values that the palette is programmed
  91.  * with are hardwired for the VGA's 6 bit per color DAC.
  92.  */
  93. void SetPalette(struct WuColor * WColors)
  94. {
  95.    int i, j;
  96.    union REGS regset;
  97.    struct SREGS sregset;
  98.    static unsigned char PaletteBlock[256][3];   /* 256 RGB entries */
  99.    /* Gamma-corrected DAC color components for 64 linear levels from 0% to
  100.       100% intensity */
  101.    static unsigned char GammaTable[] = {
  102.       0, 10, 14, 17, 19, 21, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34,
  103.       35, 36, 37, 37, 38, 39, 40, 41, 41, 42, 43, 44, 44, 45, 46, 46,
  104.       47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55,
  105.       56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63};
  106.  
  107.    for (i=0; i<NUM_WU_COLORS; i++) {
  108.       for (j=0; j<WColors[i].NumLevels; j++) {
  109.          PaletteBlock[j][0] = GammaTable[((double)WColors[i].MaxRed * (1.0 -
  110.                (double)j / (double)(WColors[i].NumLevels - 1))) + 0.5];
  111.          PaletteBlock[j][1] = GammaTable[((double)WColors[i].MaxGreen * (1.0 -
  112.                (double)j / (double)(WColors[i].NumLevels - 1))) + 0.5];
  113.          PaletteBlock[j][2] = GammaTable[((double)WColors[i].MaxBlue * (1.0 -
  114.                (double)j / (double)(WColors[i].NumLevels - 1))) + 0.5];
  115.       }
  116.       /* Now set up the palette to do Wu antialiasing for this color */
  117.       regset.x.ax = 0x1012;   /* set block of DAC registers function */
  118.       regset.x.bx = WColors[i].BaseColor;   /* first DAC location to load */
  119.       regset.x.cx = WColors[i].NumLevels;   /* # of DAC locations to load */
  120.       regset.x.dx = (unsigned int)PaletteBlock; /* offset of array from which
  121.                                                    to load RGB settings */
  122.       sregset.es = _DS; /* segment of array from which to load settings */
  123.       int86x(0x10, ®set, ®set, &sregset); /* load the palette block */
  124.    }
  125. }
  126.  
  127.