|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: ! 23: #define RBMASK 0xF0F0 /* Short, or 16 bit format */ ! 24: #define GAMASK 0x0F0F /* Short, or 16 bit format */ ! 25: #define AMASK 0x000F /* Short, or 16 bit format */ ! 26: ! 27: #define short34to35WithGamma(x) \ ! 28: ( (_bm34To35SampleTable[((x) & 0x00F0) >> 4]) \ ! 29: | (_bm34To35SampleTable[((x) & 0x0F00) >> 8] << 5) \ ! 30: | (_bm34To35SampleTable[(x) >> 12] << 10) ) ! 31: ! 32: #define short35to34WithGamma(x) \ ! 33: ( 0x000F \ ! 34: | (_bm35To34SampleTable[x & 0x001F] << 4) \ ! 35: | (_bm35To34SampleTable[(x & 0x03E0) >> 5] << 8) \ ! 36: | (_bm35To34SampleTable[(x & 0x7C00) >> 10] << 12) ) ! 37: ! 38: void IOFramebuffer::StdFBDisplayCursor555( ! 39: IOFramebuffer * inst, ! 40: StdFBShmem_t *shmem, ! 41: volatile unsigned short *vramPtr, ! 42: unsigned int cursStart, ! 43: unsigned int vramRow, ! 44: unsigned int cursRow, ! 45: int width, ! 46: int height ) ! 47: { ! 48: int i, j; ! 49: volatile unsigned short *cursPtr; ! 50: volatile unsigned short *savePtr; ! 51: unsigned short s, d, f; ! 52: unsigned char *_bm34To35SampleTable; ! 53: unsigned char *_bm35To34SampleTable; ! 54: ! 55: savePtr = (volatile unsigned short *) inst->cursorSave; ! 56: cursPtr = (volatile unsigned short *) inst->cursorImages[ shmem->frame ]; ! 57: cursPtr += cursStart; ! 58: ! 59: _bm34To35SampleTable = inst->colorConvert.t._bm34To35SampleTable; ! 60: _bm35To34SampleTable = inst->colorConvert.t._bm35To34SampleTable; ! 61: ! 62: for (i = height; --i >= 0; ) { ! 63: for (j = width; --j >= 0; ) { ! 64: d = *savePtr++ = *vramPtr; ! 65: if ( (s = *cursPtr++) == 0 ) ! 66: { /* Transparent black area. Leave dst as is. */ ! 67: ++vramPtr; ! 68: continue; ! 69: } ! 70: if ( (f = (~s) & (unsigned int)AMASK) == 0 ) ! 71: { /* Opaque cursor pixel. Mark it. */ ! 72: *vramPtr++ = short34to35WithGamma(s); ! 73: continue; ! 74: } ! 75: if ((f == AMASK)) ! 76: { /* Transparent non black cursor pixel. xor it. */ ! 77: *vramPtr++ = d ^ short34to35WithGamma(s); ! 78: continue; ! 79: } ! 80: /* Alpha is not 0 or 1.0. Sover the cursor. */ ! 81: d = short35to34WithGamma(d); ! 82: d = s + (((((d & RBMASK)>>4)*f + GAMASK) & RBMASK) ! 83: | ((((d & GAMASK)*f+GAMASK)>>4) & GAMASK)); ! 84: *vramPtr++ = short34to35WithGamma(d); ! 85: } ! 86: cursPtr += cursRow; /* starting point of next cursor line */ ! 87: vramPtr += vramRow; /* starting point of next screen line */ ! 88: } ! 89: } ! 90: ! 91: void IOFramebuffer::StdFBDisplayCursor444( ! 92: IOFramebuffer * inst, ! 93: StdFBShmem_t *shmem, ! 94: volatile unsigned short *vramPtr, ! 95: unsigned int cursStart, ! 96: unsigned int vramRow, ! 97: unsigned int cursRow, ! 98: int width, ! 99: int height ) ! 100: { ! 101: int i, j; ! 102: volatile unsigned short *savePtr; /* saved screen data pointer */ ! 103: volatile unsigned short *cursPtr; ! 104: unsigned short s, d, f; ! 105: ! 106: savePtr = (volatile unsigned short *) inst->cursorSave; ! 107: cursPtr = (volatile unsigned short *) inst->cursorImages[ shmem->frame ]; ! 108: cursPtr += cursStart; ! 109: ! 110: for (i = height; --i >= 0; ) { ! 111: for (j = width; --j >= 0; ) { ! 112: d = *savePtr++ = *vramPtr; ! 113: if ( (s = *cursPtr++) == 0 ) ! 114: { /* Transparent black area. Leave dst as is. */ ! 115: ++vramPtr; ! 116: continue; ! 117: } ! 118: if ( (f = (~s) & (unsigned int)AMASK) == 0 ) ! 119: { /* Opaque cursor pixel. Mark it. */ ! 120: *vramPtr++ = s; ! 121: continue; ! 122: } ! 123: if ((f == AMASK)) ! 124: { /* Transparent non black cursor pixel. xor it. */ ! 125: *vramPtr++ = d ^ s; ! 126: continue; ! 127: } ! 128: /* Alpha is not 0 or 1.0. Sover the cursor. */ ! 129: *vramPtr++ = s + (((((d & RBMASK)>>4)*f + GAMASK) & RBMASK) ! 130: | ((((d & GAMASK)*f+GAMASK)>>4) & GAMASK)); ! 131: } ! 132: cursPtr += cursRow; /* starting point of next cursor line */ ! 133: vramPtr += vramRow; /* starting point of next screen line */ ! 134: } ! 135: } ! 136: ! 137: static inline unsigned int MUL32(unsigned int a, unsigned int b) ! 138: { ! 139: unsigned int v, w; ! 140: ! 141: v = ((a & 0xff00ff00) >> 8) * b; ! 142: v += ((v & 0xff00ff00) >> 8) + 0x00010001; ! 143: w = (a & 0x00ff00ff) * b; ! 144: w += ((w & 0xff00ff00) >> 8) + 0x00010001; ! 145: ! 146: return (v & 0xff00ff00) | ((w >> 8) & 0x00ff00ff); ! 147: } ! 148: ! 149: static inline unsigned char map32to256( unsigned char *directToLogical, unsigned int s) ! 150: { ! 151: unsigned char logicalValue; ! 152: ! 153: if ((s ^ (s>>8)) & 0x00ffff00) { ! 154: logicalValue = directToLogical[(s>>24) + 0] + ! 155: directToLogical[((s>>16)&0xff) + 256] + ! 156: directToLogical[((s>>8)&0xff) + 512]; ! 157: } else { ! 158: logicalValue = directToLogical[(s>>24) + 768]; ! 159: } ! 160: // final conversion to actual palette ! 161: return( directToLogical[ logicalValue + 1024 ]); ! 162: } ! 163: ! 164: void IOFramebuffer::StdFBDisplayCursor8P( ! 165: IOFramebuffer * inst, ! 166: StdFBShmem_t *shmem, ! 167: volatile unsigned char *vramPtr, ! 168: unsigned int cursStart, ! 169: unsigned int vramRow, ! 170: unsigned int cursRow, ! 171: int width, ! 172: int height ) ! 173: { ! 174: int i, j; ! 175: volatile unsigned char *savePtr; /* saved screen data pointer */ ! 176: volatile unsigned char *cursPtr; ! 177: unsigned char dst, src, alpha, white; ! 178: unsigned int rgb32val; ! 179: volatile unsigned char *maskPtr; /* cursor mask pointer */ ! 180: unsigned int *_bm256To38SampleTable ! 181: = inst->colorConvert.t._bm256To38SampleTable; ! 182: unsigned char *_bm38To256SampleTable ! 183: = inst->colorConvert.t._bm38To256SampleTable; ! 184: ! 185: savePtr = (volatile unsigned char *) inst->cursorSave; ! 186: cursPtr = (volatile unsigned char *) inst->cursorImages[ shmem->frame ]; ! 187: maskPtr = (volatile unsigned char *) inst->cursorMasks[ shmem->frame ]; ! 188: cursPtr += cursStart; ! 189: maskPtr += cursStart; ! 190: ! 191: white = inst->white; ! 192: for (i = height; --i >= 0; ) { ! 193: for (j = width; --j >= 0; savePtr++,maskPtr++,cursPtr++,vramPtr++) { ! 194: dst = *savePtr = *vramPtr; ! 195: src = *cursPtr; ! 196: if ((alpha = *maskPtr)) { ! 197: if ((alpha = ~alpha)) { ! 198: rgb32val = _bm256To38SampleTable[dst]; ! 199: rgb32val = (_bm256To38SampleTable[src] & ~0xff) + ! 200: MUL32(rgb32val, alpha); ! 201: *vramPtr = map32to256(_bm38To256SampleTable, rgb32val); ! 202: } else ! 203: *vramPtr = src; ! 204: } else if (src == white) ! 205: *vramPtr = map32to256(_bm38To256SampleTable, ! 206: _bm256To38SampleTable[dst] ^ 0xffffffff); ! 207: } ! 208: cursPtr += cursRow; /* starting point of next cursor line */ ! 209: maskPtr += cursRow; ! 210: vramPtr += vramRow; /* starting point of next screen line */ ! 211: } ! 212: } ! 213: ! 214: ! 215: void IOFramebuffer::StdFBDisplayCursor8G( ! 216: IOFramebuffer * inst, ! 217: StdFBShmem_t *shmem, ! 218: volatile unsigned char *vramPtr, ! 219: unsigned int cursStart, ! 220: unsigned int vramRow, ! 221: unsigned int cursRow, ! 222: int width, ! 223: int height ) ! 224: { ! 225: int i, j; ! 226: volatile unsigned char *savePtr; /* saved screen data pointer */ ! 227: unsigned short s, d, a; ! 228: volatile unsigned char *cursPtr; ! 229: volatile unsigned char *maskPtr; /* cursor mask pointer */ ! 230: ! 231: savePtr = (volatile unsigned char *) inst->cursorSave; ! 232: cursPtr = (volatile unsigned char *) inst->cursorImages[ shmem->frame ]; ! 233: maskPtr = (volatile unsigned char *) inst->cursorMasks[ shmem->frame ]; ! 234: cursPtr += cursStart; ! 235: maskPtr += cursStart; ! 236: ! 237: for (i = height; --i >= 0; ) { ! 238: for (j = width; --j >= 0; ) { ! 239: int t; ! 240: d = *savePtr++ = *vramPtr; ! 241: s = *cursPtr++; ! 242: a = *maskPtr++; ! 243: if (a) { ! 244: t = d * (255 - *maskPtr++); ! 245: *vramPtr = s + ((t + (t >> 8) + 1) >> 8); ! 246: } else if (s) ! 247: *vramPtr = d ^ s; ! 248: vramPtr++; ! 249: } ! 250: cursPtr += cursRow; /* starting point of next cursor line */ ! 251: maskPtr += cursRow; ! 252: vramPtr += vramRow; /* starting point of next screen line */ ! 253: } ! 254: } ! 255: ! 256: void IOFramebuffer::StdFBDisplayCursor32Axxx( ! 257: IOFramebuffer * inst, ! 258: StdFBShmem_t *shmem, ! 259: volatile unsigned int *vramPtr, ! 260: unsigned int cursStart, ! 261: unsigned int vramRow, ! 262: unsigned int cursRow, ! 263: int width, ! 264: int height ) ! 265: { ! 266: int i, j; ! 267: volatile unsigned int *savePtr; /* saved screen data pointer */ ! 268: unsigned int s, d, f; ! 269: volatile unsigned int *cursPtr; ! 270: ! 271: savePtr = (volatile unsigned int *) inst->cursorSave; ! 272: cursPtr = (volatile unsigned int *) inst->cursorImages[ shmem->frame ]; ! 273: cursPtr += cursStart; ! 274: ! 275: /* Pixel format is Axxx */ ! 276: for (i = height; --i >= 0; ) { ! 277: for (j = width; --j >= 0; ) { ! 278: d = *savePtr++ = *vramPtr; ! 279: s = *cursPtr++; ! 280: f = s >> 24; ! 281: if (f) { ! 282: if (f == 0xff) // Opaque pixel ! 283: *vramPtr++ = s; ! 284: else { // SOVER the cursor pixel ! 285: s <<= 8; d <<= 8; /* Now pixels are xxxA */ ! 286: f ^= 0xFF; ! 287: d = s+(((((d&0xFF00FF00)>>8)*f+0x00FF00FF)&0xFF00FF00) ! 288: | ((((d & 0x00FF00FF)*f+0x00FF00FF)>>8) & ! 289: 0x00FF00FF)); ! 290: *vramPtr++ = (d>>8) | 0xff000000; ! 291: } ! 292: } else if (s) { ! 293: // Transparent non black cursor pixel. xor it. ! 294: *vramPtr++ = d ^ s; ! 295: continue; ! 296: } else // Transparent cursor pixel ! 297: vramPtr++; ! 298: } ! 299: cursPtr += cursRow; /* starting point of next cursor line */ ! 300: vramPtr += vramRow; /* starting point of next screen line */ ! 301: } ! 302: } ! 303: ! 304: void IOFramebuffer::StdFBDisplayCursor32xxxA( ! 305: IOFramebuffer * inst, ! 306: StdFBShmem_t *shmem, ! 307: volatile unsigned int *vramPtr, ! 308: unsigned int cursStart, ! 309: unsigned int vramRow, ! 310: unsigned int cursRow, ! 311: int width, ! 312: int height ) ! 313: { ! 314: int i, j; ! 315: volatile unsigned int *savePtr; /* saved screen data pointer */ ! 316: unsigned int s, d, f; ! 317: volatile unsigned int *cursPtr; ! 318: ! 319: savePtr = (volatile unsigned int *) inst->cursorSave; ! 320: cursPtr = (volatile unsigned int *) inst->cursorImages[ shmem->frame ]; ! 321: cursPtr += cursStart; ! 322: ! 323: /* Pixel format is xxxA */ ! 324: for (i = height; --i >= 0; ) { ! 325: for (j = width; --j >= 0; ) { ! 326: d = *savePtr++ = *vramPtr; ! 327: s = *cursPtr++; ! 328: f = s & (unsigned int)0xFF; ! 329: if (f) { ! 330: if (f == 0xff) // Opaque pixel ! 331: *vramPtr++ = s; ! 332: else { // SOVER the cursor pixel ! 333: f ^= 0xFF; ! 334: d = s+(((((d&0xFF00FF00)>>8)*f+0x00FF00FF)&0xFF00FF00) ! 335: | ((((d & 0x00FF00FF)*f+0x00FF00FF)>>8) & ! 336: 0x00FF00FF)); ! 337: *vramPtr++ = d; ! 338: } ! 339: } else if (s) { ! 340: // Transparent non black cursor pixel. xor it. ! 341: *vramPtr++ = d ^ s; ! 342: continue; ! 343: } else // Transparent cursor pixel ! 344: vramPtr++; ! 345: } ! 346: cursPtr += cursRow; /* starting point of next cursor line */ ! 347: vramPtr += vramRow; /* starting point of next screen line */ ! 348: } ! 349: } ! 350: ! 351: void IOFramebuffer::StdFBRemoveCursor16( ! 352: IOFramebuffer * inst, ! 353: StdFBShmem_t *shmem, ! 354: volatile unsigned short *vramPtr, ! 355: unsigned int vramRow, ! 356: int width, ! 357: int height ) ! 358: { ! 359: int i, j; ! 360: volatile unsigned short *savePtr; ! 361: ! 362: savePtr = (volatile unsigned short *) inst->cursorSave; ! 363: ! 364: for (i = height; --i >= 0; ) { ! 365: for (j = width; --j >= 0; ) ! 366: *vramPtr++ = *savePtr++; ! 367: vramPtr += vramRow; ! 368: } ! 369: } ! 370: ! 371: void IOFramebuffer::StdFBRemoveCursor8( ! 372: IOFramebuffer * inst, ! 373: StdFBShmem_t *shmem, ! 374: volatile unsigned char *vramPtr, ! 375: unsigned int vramRow, ! 376: int width, ! 377: int height ) ! 378: { ! 379: int i, j; ! 380: volatile unsigned char *savePtr; ! 381: ! 382: savePtr = (volatile unsigned char *) inst->cursorSave; ! 383: ! 384: for (i = height; --i >= 0; ) { ! 385: for (j = width; --j >= 0; ) ! 386: *vramPtr++ = *savePtr++; ! 387: vramPtr += vramRow; ! 388: } ! 389: } ! 390: ! 391: void IOFramebuffer::StdFBRemoveCursor32( ! 392: IOFramebuffer * inst, ! 393: StdFBShmem_t *shmem, ! 394: volatile unsigned int *vramPtr, ! 395: unsigned int vramRow, ! 396: int width, ! 397: int height ) ! 398: { ! 399: int i, j; ! 400: volatile unsigned int *savePtr; ! 401: ! 402: savePtr = (volatile unsigned int *) inst->cursorSave; ! 403: ! 404: for (i = height; --i >= 0; ) { ! 405: for (j = width; --j >= 0; ) ! 406: *vramPtr++ = *savePtr++; ! 407: vramPtr += vramRow; ! 408: } ! 409: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.