|
|
1.1 ! root 1: /******************************Module*Header*******************************\ ! 2: * Module Name: lines.h ! 3: * ! 4: * Line drawing constants and structures. ! 5: * ! 6: * NOTE: This file mirrors LINES.INC. Changes here must be reflected in ! 7: * the .inc file! ! 8: * ! 9: * Copyright (c) 1992 Microsoft Corporation ! 10: \**************************************************************************/ ! 11: ! 12: // We have to be careful that we don't overflow any registers when using ! 13: // the hardware to draw lines (as opposed to going through the strips ! 14: // routines, which will never overflow). We accomplish this by simply ! 15: // checking the bounds of the path; if it is so large that any of the ! 16: // hardware terms may overflow, we punt the entire path to the strips ! 17: // code (should be pretty rare). ! 18: ! 19: #define MAX_INTEGER_BOUND (1535) // S3's line length term is limited to ! 20: #define MIN_INTEGER_BOUND (-512) // a maximum value of 2047 ! 21: ! 22: // We have special strip routines when all strips have at most this many ! 23: // pixels: ! 24: ! 25: #define MAX_SHORT_STROKE_LENGTH 15 ! 26: ! 27: // # of strip drawers in every group: ! 28: ! 29: #define NUM_STRIP_DRAW_DIRECTIONS 4 ! 30: ! 31: // # of strip drawers for doing either solid lines or styled lines: ! 32: ! 33: #define NUM_STRIP_DRAW_STYLES 8 ! 34: ! 35: typedef LONG STYLEPOS; ! 36: ! 37: #define STYLE_MAX_COUNT 16 ! 38: #define STYLE_MAX_VALUE 0x3fffL ! 39: #define RUN_MAX 20 ! 40: #define STRIP_MAX 100 ! 41: #define STYLE_DENSITY 3 ! 42: ! 43: // For the ROP table: ! 44: ! 45: #define MIX_XOR_OFFSET 8 ! 46: ! 47: #define AND_ZERO 0L ! 48: #define AND_PEN 1L ! 49: #define AND_NOTPEN 2L ! 50: #define AND_ONE 3L ! 51: ! 52: #define XOR_ZERO (AND_ZERO << MIX_XOR_OFFSET) ! 53: #define XOR_PEN (AND_PEN << MIX_XOR_OFFSET) ! 54: #define XOR_NOTPEN (AND_NOTPEN << MIX_XOR_OFFSET) ! 55: #define XOR_ONE (AND_ONE << MIX_XOR_OFFSET) ! 56: ! 57: // Flip and round flags: ! 58: ! 59: #define FL_H_ROUND_DOWN 0x00000080L // .... .... 1... .... ! 60: #define FL_V_ROUND_DOWN 0x00000100L // .... ...1 .... .... ! 61: ! 62: #define FL_FLIP_D 0x00000005L // .... .... .... .1.1 ! 63: #define FL_FLIP_V 0x00000008L // .... .... .... 1... ! 64: #define FL_FLIP_SLOPE_ONE 0x00000010L // .... .... ...1 .... ! 65: #define FL_FLIP_HALF 0x00000002L // .... .... .... ..1. ! 66: #define FL_FLIP_H 0x00000200L // .... ..1. .... .... ! 67: ! 68: #define FL_ROUND_MASK 0x0000001CL // .... .... ...1 11.. ! 69: #define FL_ROUND_SHIFT 2 ! 70: ! 71: #define FL_RECTLCLIP_MASK 0x0000000CL // .... .... .... 11.. ! 72: #define FL_RECTLCLIP_SHIFT 2 ! 73: ! 74: #define FL_STRIP_MASK 0x00000003L // .... .... .... ..11 ! 75: #define FL_STRIP_SHIFT 0 ! 76: ! 77: #define FL_SIMPLE_CLIP 0x00000020 // .... .... ..1. .... ! 78: #define FL_COMPLEX_CLIP 0x00000040 // .... .... .1.. .... ! 79: #define FL_CLIP (FL_SIMPLE_CLIP | FL_COMPLEX_CLIP) ! 80: ! 81: #define FL_ARBITRARYSTYLED 0x00000400L // .... .1.. .... .... ! 82: #define FL_MASKSTYLED 0x00000800L // .... 1... .... .... ! 83: #define FL_STYLED (FL_ARBITRARYSTYLED | FL_MASKSTYLED) ! 84: #define FL_ALTERNATESTYLED 0x00001000L // ...1 .... .... .... ! 85: ! 86: #define FL_STYLE_MASK 0x00000C00L ! 87: #define FL_STYLE_SHIFT 10 ! 88: ! 89: // Simpler flag bits in high byte: ! 90: ! 91: #define FL_DONT_DO_HALF_FLIP 0x00002000L // ..1. .... .... .... ! 92: #define FL_PHYSICAL_DEVICE 0x00004000L // .1.. .... .... .... ! 93: ! 94: // Miscellaneous DDA defines: ! 95: ! 96: #define LROUND(x, flRoundDown) (((x) + F/2 - ((flRoundDown) > 0)) >> 4) ! 97: #define F 16 ! 98: #define FLOG2 4 ! 99: #define LFLOOR(x) ((x) >> 4) ! 100: #define FXFRAC(x) ((x) & (F - 1)) ! 101: ! 102: typedef struct _STRIP { ! 103: LONG cStrips; // # of strips in array ! 104: LONG flFlips; // Indicates if line goes up or down ! 105: POINTL ptlStart; // first point ! 106: LONG alStrips[STRIP_MAX]; // Array of strips ! 107: } STRIP; ! 108: ! 109: typedef struct _LINESTATE { ! 110: LONG lNextScan; // Offset to next scan ! 111: BYTE jAnd; // Color to be ANDed for DFBs ! 112: BYTE jXor; // Color to be XORed for DFBs ! 113: BYTE filler1[2]; ! 114: ! 115: STYLEPOS* pspStart; // Pointer to start of style array ! 116: STYLEPOS* pspEnd; // Pointer to end of style array ! 117: STYLEPOS* psp; // Pointer to current style entry ! 118: ! 119: STYLEPOS spRemaining; // To go in current style ! 120: STYLEPOS spTotal; // Sum of style array ! 121: STYLEPOS spTotal2; // Twice sum of style array ! 122: STYLEPOS spNext; // Style state at start of next line ! 123: STYLEPOS spComplex; // Style state at start of complex clip line ! 124: ! 125: STYLEPOS* aspRtoL; // Style array in right-to-left order ! 126: STYLEPOS* aspLtoR; // Style array in left-to-right order ! 127: ! 128: ULONG ulStyleMask; // Are we working on a gap in the style? ! 129: // 0xff if yes, 0x0 if not ! 130: ULONG xyDensity; // Density of style ! 131: ULONG cStyle; // Size of style array ! 132: ! 133: ULONG ulStyleMaskLtoR;// Original style mask, left-to-right order ! 134: ULONG ulStyleMaskRtoL;// Original style mask, right-to-left order ! 135: ! 136: BOOL ulStartMask; // Determines if first element in style ! 137: // array is for a gap or a dash ! 138: ! 139: } LINESTATE; /* ls */ ! 140: ! 141: // Strip drawer prototype: ! 142: ! 143: typedef VOID (*PFNSTRIP)(PPDEV, STRIP*, LINESTATE*); ! 144: ! 145: // Strip drawers: ! 146: ! 147: VOID vssSolidHorizontal(PPDEV ppdev, STRIP *pStrip, LINESTATE *pLineState); ! 148: VOID vrlSolidHorizontal(PPDEV ppdev, STRIP *pStrip, LINESTATE *pLineState); ! 149: ! 150: VOID vssSolidVertical(PPDEV ppdev, STRIP *pStrip, LINESTATE *pLineState); ! 151: VOID vrlSolidVertical(PPDEV ppdev, STRIP *pStrip, LINESTATE *pLineState); ! 152: ! 153: VOID vssSolidDiagonalHorizontal(PPDEV ppdev, STRIP *pStrip, LINESTATE *pLineState); ! 154: VOID vrlSolidDiagonalHorizontal(PPDEV ppdev, STRIP *pStrip, LINESTATE *pLineState); ! 155: ! 156: VOID vssSolidDiagonalVertical(PPDEV ppdev, STRIP *pStrip, LINESTATE *pLineState); ! 157: VOID vrlSolidDiagonalVertical(PPDEV ppdev, STRIP *pStrip, LINESTATE *pLineState); ! 158: ! 159: VOID vStripStyledHorizontal(PPDEV ppdev, STRIP *pStrip, LINESTATE *pLineState); ! 160: VOID vStripStyledVertical(PPDEV ppdev, STRIP *pStrip, LINESTATE *pLineState); ! 161: ! 162: // External calls: ! 163: ! 164: #ifdef __CPLUSPLUS ! 165: extern "C" ! 166: BOOL bLines(PPDEV, POINTFIX*, POINTFIX*, RUN* prun, ULONG, ! 167: LINESTATE*, RECTL*, PFNSTRIP*, FLONG); ! 168: #else ! 169: BOOL bLines(PPDEV, POINTFIX*, POINTFIX*, RUN* prun, ULONG, ! 170: LINESTATE*, RECTL*, PFNSTRIP*, FLONG); ! 171: #endif ! 172: ! 173: VOID vSetStrips(PPDEV, LINEATTRS *, INT, INT); ! 174: ! 175: VOID vFastLine(PPDEV, PATHOBJ*, RECTL*, PFNSTRIP*, LONG);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.