|
|
1.1 ! root 1: /*********************************************************** ! 2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, ! 3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts. ! 4: ! 5: All Rights Reserved ! 6: ! 7: Permission to use, copy, modify, and distribute this software and its ! 8: documentation for any purpose and without fee is hereby granted, ! 9: provided that the above copyright notice appear in all copies and that ! 10: both that copyright notice and this permission notice appear in ! 11: supporting documentation, and that the names of Digital or MIT not be ! 12: used in advertising or publicity pertaining to distribution of the ! 13: software without specific, written prior permission. ! 14: ! 15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 21: SOFTWARE. ! 22: ! 23: ******************************************************************/ ! 24: /* $Header: mfbbres.c,v 1.11 87/09/11 07:48:29 toddb Exp $ */ ! 25: #include "X.h" ! 26: #include "misc.h" ! 27: #include "mfb.h" ! 28: #include "maskbits.h" ! 29: ! 30: /* Solid bresenham line */ ! 31: /* NOTES ! 32: e2 is used less often than e1, so it's not in a register ! 33: */ ! 34: ! 35: mfbBresS(rop, addrl, nlwidth, signdx, signdy, axis, x1, y1, e, e1, e2, len) ! 36: int rop; /* a reduced rasterop */ ! 37: register int *addrl; /* pointer to base of bitmap */ ! 38: int nlwidth; /* width in longwords of bitmap */ ! 39: int signdx, signdy; /* signs of directions */ ! 40: int axis; /* major axis (Y_AXIS or X_AXIS) */ ! 41: int x1, y1; /* initial point */ ! 42: register int e; /* error accumulator */ ! 43: register int e1; /* bresenham increments */ ! 44: int e2; ! 45: register int len; /* length of line */ ! 46: { ! 47: ! 48: register int yinc; /* increment to next scanline */ ! 49: register int addrb; /* bitmask */ ! 50: ! 51: /* point to longword containing first point */ ! 52: addrl = addrl + (y1 * nlwidth) + (x1 >> 5); ! 53: addrb = x1&0x1f; ! 54: yinc = signdy * nlwidth; ! 55: ! 56: if (rop == RROP_BLACK) ! 57: { ! 58: if (axis == X_AXIS) ! 59: { ! 60: if (signdx > 0) ! 61: { ! 62: while(len--) ! 63: { ! 64: *addrl &= rmask[addrb]; ! 65: if (e < 0) ! 66: e += e1; ! 67: else ! 68: { ! 69: addrl += yinc; ! 70: e += e2; ! 71: } ! 72: if (addrb == 31) ! 73: { ! 74: addrb = -1; ! 75: addrl++; ! 76: } ! 77: addrb++; ! 78: } ! 79: } ! 80: else ! 81: { ! 82: while(len--) ! 83: { ! 84: *addrl &= rmask[addrb]; ! 85: if (e <= 0) ! 86: e += e1; ! 87: else ! 88: { ! 89: addrl += yinc; ! 90: e += e2; ! 91: } ! 92: if (addrb == 0) ! 93: { ! 94: addrb = 32; ! 95: addrl--; ! 96: } ! 97: addrb--; ! 98: } ! 99: } ! 100: } /* if X_AXIS */ ! 101: else ! 102: { ! 103: if (signdx > 0) ! 104: { ! 105: while(len--) ! 106: { ! 107: *addrl &= rmask[addrb]; ! 108: if (e < 0) ! 109: e += e1; ! 110: else ! 111: { ! 112: if (addrb == 31) ! 113: { ! 114: addrb = -1; ! 115: addrl++; ! 116: } ! 117: addrb++; ! 118: e += e2; ! 119: } ! 120: addrl += yinc; ! 121: } ! 122: } ! 123: else ! 124: { ! 125: while(len--) ! 126: { ! 127: *addrl &= rmask[addrb]; ! 128: if (e <= 0) ! 129: e += e1; ! 130: else ! 131: { ! 132: if (addrb == 0) ! 133: { ! 134: addrb = 32; ! 135: addrl--; ! 136: } ! 137: addrb--; ! 138: e += e2; ! 139: } ! 140: addrl += yinc; ! 141: } ! 142: } ! 143: } /* else Y_AXIS */ ! 144: } ! 145: else if (rop == RROP_WHITE) ! 146: { ! 147: if (axis == X_AXIS) ! 148: { ! 149: if (signdx > 0) ! 150: { ! 151: while(len--) ! 152: { ! 153: *addrl |= mask[addrb]; ! 154: if (e < 0) ! 155: e += e1; ! 156: else ! 157: { ! 158: addrl += yinc; ! 159: e += e2; ! 160: } ! 161: if (addrb == 31) ! 162: { ! 163: addrb = -1; ! 164: addrl++; ! 165: } ! 166: addrb++; ! 167: } ! 168: } ! 169: else ! 170: { ! 171: while(len--) ! 172: { ! 173: *addrl |= mask[addrb]; ! 174: if (e <= 0) ! 175: e += e1; ! 176: else ! 177: { ! 178: addrl += yinc; ! 179: e += e2; ! 180: } ! 181: if (addrb == 0) ! 182: { ! 183: addrb = 32; ! 184: addrl--; ! 185: } ! 186: addrb--; ! 187: } ! 188: } ! 189: } /* if X_AXIS */ ! 190: else ! 191: { ! 192: if (signdx > 0) ! 193: { ! 194: while(len--) ! 195: { ! 196: *addrl |= mask[addrb]; ! 197: if (e < 0) ! 198: e += e1; ! 199: else ! 200: { ! 201: if (addrb == 31) ! 202: { ! 203: addrb = -1; ! 204: addrl++; ! 205: } ! 206: addrb++; ! 207: e += e2; ! 208: } ! 209: addrl += yinc; ! 210: } ! 211: } ! 212: else ! 213: { ! 214: while(len--) ! 215: { ! 216: *addrl |= mask[addrb]; ! 217: if (e <= 0) ! 218: e += e1; ! 219: else ! 220: { ! 221: if (addrb == 0) ! 222: { ! 223: addrb = 32; ! 224: addrl--; ! 225: } ! 226: addrb--; ! 227: e += e2; ! 228: } ! 229: addrl += yinc; ! 230: } ! 231: } ! 232: } /* else Y_AXIS */ ! 233: } ! 234: else if (rop == RROP_INVERT) ! 235: { ! 236: if (axis == X_AXIS) ! 237: { ! 238: if (signdx > 0) ! 239: { ! 240: while(len--) ! 241: { ! 242: *addrl ^= mask[addrb]; ! 243: if (e < 0) ! 244: e += e1; ! 245: else ! 246: { ! 247: addrl += yinc; ! 248: e += e2; ! 249: } ! 250: if (addrb == 31) ! 251: { ! 252: addrb = -1; ! 253: addrl++; ! 254: } ! 255: addrb++; ! 256: } ! 257: } ! 258: else ! 259: { ! 260: while(len--) ! 261: { ! 262: *addrl ^= mask[addrb]; ! 263: if (e <= 0) ! 264: e += e1; ! 265: else ! 266: { ! 267: addrl += yinc; ! 268: e += e2; ! 269: } ! 270: if (addrb == 0) ! 271: { ! 272: addrb = 32; ! 273: addrl--; ! 274: } ! 275: addrb--; ! 276: } ! 277: } ! 278: } /* if X_AXIS */ ! 279: else ! 280: { ! 281: if (signdx > 0) ! 282: { ! 283: while(len--) ! 284: { ! 285: *addrl ^= mask[addrb]; ! 286: if (e < 0) ! 287: e += e1; ! 288: else ! 289: { ! 290: if (addrb == 31) ! 291: { ! 292: addrb = -1; ! 293: addrl++; ! 294: } ! 295: addrb++; ! 296: e += e2; ! 297: } ! 298: addrl += yinc; ! 299: } ! 300: } ! 301: else ! 302: { ! 303: while(len--) ! 304: { ! 305: *addrl ^= mask[addrb]; ! 306: if (e <= 0) ! 307: e += e1; ! 308: else ! 309: { ! 310: if (addrb == 0) ! 311: { ! 312: addrb = 32; ! 313: addrl--; ! 314: } ! 315: addrb--; ! 316: e += e2; ! 317: } ! 318: addrl += yinc; ! 319: } ! 320: } ! 321: } /* else Y_AXIS */ ! 322: } ! 323: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.