Annotation of ntddk/src/video/displays/s3/intline.c, revision 1.1.1.1

1.1       root        1: /*************************************************************************\
                      2: * Module Name: Lines.cxx
                      3: *
                      4: * C template for the ASM version of the line DDA calculator.
                      5: * contains the C code associated with the c++ code (c++ does not handle
                      6: * READ/WRITE_REGISTER to well
                      7: *
                      8: * Copyright (c) 1993 Microsoft Corporation
                      9: * Copyright (c) 1992 Digital Equipment Corporation
                     10: \**************************************************************************/
                     11: 
                     12: #include "driver.h"
                     13: #include "lines.h"
                     14: 
                     15: #define S3_MAX_INT_LINE        0x800
                     16: #define DEFAULT_DRAW_CMD       DRAW_LINE | \
                     17:                                 DRAW | \
                     18:                                 DIR_TYPE_XY | \
                     19:                                 MULTIPLE_PIXELS | \
                     20:                                 WRITE | \
                     21:                                 LAST_PIXEL_OFF
                     22: 
                     23: 
                     24: /******************************************************************************
                     25:  * bIntegerLine
                     26:  *
                     27:  *
                     28:  * This routine attempts to draw a line segment between two points. It
                     29:  * will only draw if both end points are whole integers: it does not support
                     30:  * fractional endpoints.
                     31:  *
                     32:  * Returns:
                     33:  *   TRUE     if the line segment is drawn
                     34:  *   FALSE    otherwise
                     35:  *****************************************************************************/
                     36: 
                     37: BOOL
                     38: bIntegerLine (
                     39:              PPDEV     ppdev,
                     40:              ULONG     X1,
                     41:              ULONG     Y1,
                     42:              ULONG     X2,
                     43:              ULONG     Y2
                     44: )
                     45:     {
                     46:        LONG            Cmd;
                     47:        LONG            DeltaX, DeltaY;
                     48:        LONG            ErrorTerm;
                     49:        LONG            Major, Minor;
                     50:        
                     51:        
                     52:        
                     53:        X1 >>= 4;
                     54:        Y1 >>= 4;
                     55:        X2 >>= 4;
                     56:        Y2 >>= 4;
                     57:        
                     58:        Cmd = DEFAULT_DRAW_CMD | PLUS_Y | PLUS_X | MAJOR_Y;
                     59:        
                     60:        DeltaX = X2 - X1;
                     61:        if (DeltaX < 0) {
                     62:            DeltaX = -DeltaX;
                     63:            Cmd &= ~PLUS_X;
                     64:        }
                     65:        DeltaY = Y2 - Y1;
                     66:        if (DeltaY < 0) {
                     67:            DeltaY = -DeltaY;
                     68:            Cmd &= ~PLUS_Y;
                     69:        }
                     70:        
                     71:        // Compute the major drawing axis
                     72:        
                     73:        if (DeltaX > DeltaY) {
                     74:            Cmd &= ~MAJOR_Y;
                     75:            Major = DeltaX;
                     76:            Minor = DeltaY;
                     77:        } else {
                     78:            Major = DeltaY;
                     79:            Minor = DeltaX;
                     80:        }
                     81:        
                     82:        
                     83:        // Tell the S3 to draw the line
                     84:        
                     85:        FIFOWAIT (FIFO_7_EMPTY);
                     86:        OUTPW (CUR_X, X1);
                     87:        OUTPW (CUR_Y, Y1);
                     88:        OUTPW (LINE_MAX, Major);
                     89:        OUTPW (AXSTP, Minor * 2);
                     90:        OUTPW (DIASTP, 2 * Minor - 2 * Major);
                     91:        
                     92:        
                     93:        // Adjust the error term so that 1/2 always rounds down, to
                     94:        // conform with GIQ.
                     95:        
                     96:        ErrorTerm = 2 * Minor - Major;
                     97:        if (Cmd & MAJOR_Y) {
                     98:            if (Cmd & PLUS_X) {
                     99:                ErrorTerm--;
                    100:            }
                    101:        } else {
                    102:            if (Cmd & PLUS_Y) {
                    103:                ErrorTerm--;
                    104:            }
                    105:        }
                    106:        
                    107:        OUTPW (ERR_TERM, ErrorTerm);
                    108:        OUTPW (CMD, Cmd);
                    109:        
                    110:        
                    111:        // Wait until the S3 has finished drawing, and return success
                    112:        // to the caller
                    113:        
                    114:        GPWAIT();
                    115:        return TRUE;
                    116:        
                    117:     }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.