Annotation of XNU/iokit/Families/IOGraphics/IOCursorBlits.h, revision 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.