Annotation of XNU/iokit/Families/IOGraphics/IOCursorBlits.h, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

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