|
|
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.