Annotation of ntddk/src/video/displays/xga/pointer.c, revision 1.1.1.1

1.1       root        1: /******************************Module*Header*******************************\
                      2: * Module Name: pointer.c
                      3: *
                      4: * This module contains the hardware pointer support for the XGA dispaly driver.
                      5: *
                      6: *
                      7: * Copyright (c) 1992 Microsoft Corporation
                      8: \**************************************************************************/
                      9: 
                     10: #include "driver.h"
                     11: 
                     12: ULONG DrvSetColorPointerShape(
                     13:     SURFOBJ     *pso,
                     14:     SURFOBJ     *psoMask,
                     15:     SURFOBJ     *psoColor,
                     16:     XLATEOBJ    *pxlo,
                     17:     LONG        xHot,
                     18:     LONG        yHot,
                     19:     LONG        x,
                     20:     LONG        y,
                     21:     RECTL       *prcl,
                     22:     FLONG       fl
                     23: ) ;
                     24: 
                     25: ULONG DrvSetMonoHwPointerShape(
                     26:     SURFOBJ     *pso,
                     27:     SURFOBJ     *psoMask,
                     28:     SURFOBJ     *psoColor,
                     29:     XLATEOBJ    *pxlo,
                     30:     LONG        xHot,
                     31:     LONG        yHot,
                     32:     LONG        x,
                     33:     LONG        y,
                     34:     RECTL       *prcl,
                     35:     FLONG       fl
                     36: ) ;
                     37: 
                     38: 
                     39: VOID DrvMoveColorPointer(SURFOBJ *pso,LONG x,LONG y,RECTL *prcl) ;
                     40: VOID DrvMoveHwPointer(SURFOBJ *pso,LONG x,LONG y,RECTL *prcl) ;
                     41: 
                     42: /*
                     43:         These globals must be global.
                     44:         Need to look into putting them into the pdev.
                     45: */
                     46: 
                     47: 
                     48: LONG        gxHot, gyHot,
                     49:         gcxPointer, gcyPointer,
                     50:         gxLast, gyLast ;
                     51: 
                     52: ULONG   gPointerFlags ;
                     53: 
                     54: #define VALID_SAVE_BUFFER 0x1
                     55: #define COLOR_POINTER     0x2
                     56: #define TAKE_DOWN_POINTER 0X4
                     57: 
                     58: 
                     59: 
                     60: /*****************************************************************************
                     61:  * DrvMovePointer -
                     62:  ****************************************************************************/
                     63: VOID DrvMovePointer(SURFOBJ *pso,LONG x,LONG y,RECTL *prcl)
                     64: {
                     65: 
                     66:         if (gPointerFlags & COLOR_POINTER)
                     67:             DrvMoveColorPointer(pso, x, y, prcl) ;
                     68:         else
                     69:             DrvMoveHwPointer(pso, x, y, prcl) ;
                     70: 
                     71:         return ;
                     72: 
                     73: }
                     74: 
                     75: 
                     76: /*****************************************************************************
                     77:  * DrvMoveColorPointer -
                     78:  ****************************************************************************/
                     79: VOID DrvMoveColorPointer(SURFOBJ *pso,LONG x,LONG y,RECTL *prcl)
                     80: {
                     81:         return ;
                     82: 
                     83: 
                     84: }
                     85: 
                     86: /*****************************************************************************
                     87:  * DrvMoveHwPointer -
                     88:  ****************************************************************************/
                     89: VOID DrvMoveHwPointer(SURFOBJ *pso,LONG x,LONG y,RECTL *prcl)
                     90: {
                     91: WORD    msb,
                     92:         lsb ;
                     93: 
                     94: PPDEV   ppdev ;
                     95: INT     XgaIndexReg ;
                     96: 
                     97:         // get a local pointer to the pdev and all the registers we plan
                     98:         // to use.
                     99: 
                    100:         ppdev = (PPDEV) pso->dhpdev ;
                    101:         XgaIndexReg = ppdev->ulXgaIoRegsBase + INDEX_REG ;
                    102: 
                    103:         // If x is -1 then take down the cursor.
                    104: 
                    105:         if (x == -1)
                    106:         {
                    107:             outpw (XgaIndexReg, SPRITE_CONTROL) ;
                    108:             return ;
                    109:         }
                    110: 
                    111:         // Adjust the actual pointer position depending upon
                    112:         // the hot spot.
                    113: 
                    114:         x -= gxHot ;
                    115:         y -= gyHot ;
                    116: 
                    117:         if (x <= 0)
                    118:         {
                    119:             outpw (XgaIndexReg, ((-x << 8) | SPRITE_HORZ_PRESET)) ;
                    120:             x = 0 ;
                    121:         }
                    122:         else
                    123:         {
                    124:             outpw (XgaIndexReg, ((0 << 8) | SPRITE_HORZ_PRESET)) ;
                    125:         }
                    126: 
                    127:         if (y <= 0)
                    128:         {
                    129:             outpw (XgaIndexReg, ((-y << 8) | SPRITE_VERT_PRESET)) ;
                    130:             y = 0 ;
                    131:         }
                    132:         else
                    133:         {
                    134:             outpw (XgaIndexReg, ((0 << 8) | SPRITE_VERT_PRESET)) ;
                    135:         }
                    136: 
                    137:         // Set the position of the cursor.
                    138: 
                    139:         msb = HIBYTE (x) ;
                    140:         lsb = LOBYTE (x) ;
                    141:         outpw (XgaIndexReg, ((lsb << 8) | SPRITE_HORZ_START_LOW)) ;
                    142:         outpw (XgaIndexReg, ((msb << 8) | SPRITE_HORZ_START_HIGH)) ;
                    143: 
                    144:         msb = HIBYTE (y) ;
                    145:         lsb = LOBYTE (y) ;
                    146:         outpw (XgaIndexReg, ((lsb << 8) | SPRITE_VERT_START_LOW)) ;
                    147:         outpw (XgaIndexReg, ((msb << 8) | SPRITE_VERT_START_HIGH)) ;
                    148: 
                    149:         return ;
                    150: }
                    151: 
                    152: 
                    153: /*****************************************************************************
                    154:  * DrvSetPointerShape -
                    155:  ****************************************************************************/
                    156: ULONG DrvSetPointerShape(
                    157:     SURFOBJ     *pso,
                    158:     SURFOBJ     *psoMask,
                    159:     SURFOBJ     *psoColor,
                    160:     XLATEOBJ    *pxlo,
                    161:     LONG        xHot,
                    162:     LONG        yHot,
                    163:     LONG        x,
                    164:     LONG        y,
                    165:     RECTL       *prcl,
                    166:     FLONG       fl)
                    167: {
                    168: ULONG   ulRet ;
                    169: 
                    170: PPDEV   ppdev ;
                    171: INT     XgaIndexReg ;
                    172: 
                    173:         DISPDBG((3, "Change hardware pointer shape\n"));
                    174: 
                    175:         // get a local pointer to the pdev and all the registers we plan
                    176:         // to use.
                    177: 
                    178:         ppdev = (PPDEV) pso->dhpdev ;
                    179:         XgaIndexReg = ppdev->ulXgaIoRegsBase + INDEX_REG ;
                    180: 
                    181:         // Save the position and hot spot in globals.
                    182: 
                    183:         gxHot = xHot ;
                    184:         gyHot = yHot ;
                    185: 
                    186:         gcxPointer = psoMask->sizlBitmap.cx ;
                    187:         gcyPointer = psoMask->sizlBitmap.cy / 2;
                    188: 
                    189:         if (psoColor != NULL)
                    190:         {
                    191:             // Disable the mono hardware pointer.
                    192: 
                    193:             outpw (XgaIndexReg, SPRITE_CONTROL) ;
                    194: 
                    195:             gPointerFlags |= COLOR_POINTER ;
                    196:             ulRet = DrvSetColorPointerShape(pso, psoMask, psoColor, pxlo,
                    197:                                             xHot, yHot, x, y, prcl, fl) ;
                    198: 
                    199:         }
                    200:         else
                    201:         {
                    202:             // Take down the color pointer if it is visible.
                    203: 
                    204:             if (   (gPointerFlags & COLOR_POINTER)
                    205:                 && (gPointerFlags & VALID_SAVE_BUFFER)
                    206:                )
                    207:             {
                    208:                 ulRet = DrvSetColorPointerShape(NULL, NULL, NULL, NULL,
                    209:                                                 0, 0, 0, 0, NULL, 0) ;
                    210:             }
                    211: 
                    212:             // Take care of the monochrome pointer.
                    213: 
                    214:             gPointerFlags &= ~COLOR_POINTER ;
                    215:             ulRet = DrvSetMonoHwPointerShape(pso, psoMask, psoColor, pxlo,
                    216:                                              xHot, yHot, x, y, prcl, fl) ;
                    217:         }
                    218: 
                    219: 
                    220:         return (ulRet) ;
                    221: }
                    222: 
                    223: 
                    224: /*****************************************************************************
                    225:  * DrvSetColorPointerShape -
                    226:  ****************************************************************************/
                    227: ULONG DrvSetColorPointerShape(
                    228:     SURFOBJ     *pso,
                    229:     SURFOBJ     *psoMask,
                    230:     SURFOBJ     *psoColor,
                    231:     XLATEOBJ    *pxlo,
                    232:     LONG        xHot,
                    233:     LONG        yHot,
                    234:     LONG        x,
                    235:     LONG        y,
                    236:     RECTL       *prcl,
                    237:     FLONG       fl)
                    238: {
                    239:         return (SPS_DECLINE) ;
                    240: }
                    241: 
                    242: /*****************************************************************************
                    243:  * DrvSetMonoHwPointerShape -
                    244:  ****************************************************************************/
                    245: ULONG DrvSetMonoHwPointerShape(
                    246:     SURFOBJ     *pso,
                    247:     SURFOBJ     *psoMask,
                    248:     SURFOBJ     *psoColor,
                    249:     XLATEOBJ    *pxlo,
                    250:     LONG        xHot,
                    251:     LONG        yHot,
                    252:     LONG        x,
                    253:     LONG        y,
                    254:     RECTL       *prcl,
                    255:     FLONG       fl)
                    256: {
                    257: 
                    258: UINT    i,
                    259:         j,
                    260:         cxMask,
                    261:         cyMask,
                    262:         cyAND,
                    263:         cxAND,
                    264:         cyXOR,
                    265:         cxXOR ;
                    266: 
                    267: PBYTE   pjAND,
                    268:         pjXOR ;
                    269: 
                    270: INT     lDelta ;
                    271: 
                    272: PPDEV   ppdev ;
                    273: INT     XgaIndexReg ;
                    274: 
                    275: INT     ix,
                    276:         iy,
                    277:         is,
                    278:         ip,
                    279:         iBit,
                    280:         jAndByte,
                    281:         jXorByte,
                    282:         jSpriteBits,
                    283:         jSpriteByte ;
                    284: 
                    285: BYTE    ajAndMask[64][8],
                    286:         ajXorMask[64][8] ;
                    287: 
                    288: BYTE    ajXgaSprite[1024] ;
                    289: 
                    290: 
                    291:         DISPDBG((3, "XGA.DLL:DrvSetPointerShape - Entry\n")) ;
                    292:         DISPDBG((3, "\txHot: %d\n", xHot)) ;
                    293:         DISPDBG((3, "\tyHot: %d\n", yHot)) ;
                    294: 
                    295:         // get a local pointer to the pdev and all the registers we plan
                    296:         // to use.
                    297: 
                    298:         ppdev = (PPDEV) pso->dhpdev ;
                    299:         XgaIndexReg = ppdev->ulXgaIoRegsBase + INDEX_REG ;
                    300: 
                    301:         // If the mask is NULL this implies the pointer is not
                    302:         // visible.
                    303: 
                    304:         if (psoMask == NULL)
                    305:         {
                    306:             outpw (XgaIndexReg, SPRITE_CONTROL) ;
                    307:             return (SPS_ACCEPT_NOEXCLUDE) ;
                    308:         }
                    309: 
                    310:         // Init the AND and XOR masks.
                    311: 
                    312:         memset (ajAndMask, 0xFFFFFFFF, 512) ;
                    313:         memset (ajXorMask, 0, 512) ;
                    314: 
                    315:         // Get the bitmap dimensions.
                    316: 
                    317:         cxMask = psoMask->sizlBitmap.cx ;
                    318:         cyMask = psoMask->sizlBitmap.cy ;
                    319: 
                    320:         cyAND = cyXOR = cyMask / 2 ;
                    321:         cxAND = cxXOR = cxMask / 8 ;
                    322: 
                    323:         // Set up pointers to the AND and XOR masks.
                    324: 
                    325:         pjAND  =  psoMask->pvScan0 ;
                    326:         lDelta = psoMask->lDelta ;
                    327:         pjXOR  = pjAND + (cyAND * lDelta) ;
                    328: 
                    329:         // Copy the AND mask.
                    330: 
                    331:         for (i = 0 ; i < cyAND ; i++)
                    332:         {
                    333:             // Copy over a line of the AND mask.
                    334: 
                    335:             for (j = 0 ; j < cxAND ; j++)
                    336:             {
                    337:                 ajAndMask[i][j] = pjAND[j] ;
                    338:             }
                    339: 
                    340:             // point to the next line of the AND mask.
                    341: 
                    342:             pjAND += lDelta ;
                    343:         }
                    344: 
                    345:         // Copy the XOR mask.
                    346: 
                    347:         for (i = 0 ; i < cyXOR ; i++)
                    348:         {
                    349:             // Copy over a line of the XOR mask.
                    350: 
                    351:             for (j = 0 ; j < cxXOR ; j++)
                    352:             {
                    353:                 ajXorMask[i][j] = pjXOR[j] ;
                    354:             }
                    355: 
                    356:             // point to the next line of the XOR mask.
                    357: 
                    358:             pjXOR += lDelta ;
                    359:         }
                    360: 
                    361:         // Build up the XGA sprite from NT's And and Xor masks.
                    362: 
                    363:         // Init the indexes into the sprite buffer (is) and the
                    364:         // index for the bit pairs (ip).
                    365: 
                    366:         is = 0 ;
                    367:         ip = 0 ;
                    368: 
                    369:         // Outer most loop goes over NT's And and Xor rows.
                    370: 
                    371:         for (iy = 0 ; iy < 64 ; iy++)
                    372:         {
                    373:             // loop over Nt's columns.
                    374: 
                    375:             for (ix = 0 ; ix < 8 ; ix++)
                    376:             {
                    377:                 // pickup a source byte for each mask.
                    378: 
                    379:                 jAndByte = ajAndMask[iy][ix] ;
                    380:                 jXorByte = ajXorMask[iy][ix] ;
                    381: 
                    382:                 // loop over the bits in the byte.
                    383: 
                    384:                 for (iBit = 0x80 ; iBit != 0 ; iBit >>= 1)
                    385:                 {
                    386:                     // init the sprite  bitpair.
                    387: 
                    388:                     jSpriteBits = 0x0 ;
                    389: 
                    390:                     // Set the sprite bit pairs.
                    391: 
                    392:                     if (jAndByte & iBit)
                    393:                         jSpriteBits |= 0x02 ;
                    394: 
                    395:                     if (jXorByte & iBit)
                    396:                         jSpriteBits |= 0x01 ;
                    397: 
                    398:                     // If all 4 bit pairs in this byte are filled in
                    399:                     // flush the sprite byte to the sprite byte array.
                    400:                     // and set the first bit pair.
                    401: 
                    402:                     if ((ip % 4) == 0)
                    403:                     {
                    404:                         if (ip != 0)
                    405:                         {
                    406:                             ajXgaSprite[is++] = jSpriteByte ;
                    407:                         }
                    408:                         jSpriteByte = jSpriteBits ;
                    409:                     }
                    410: 
                    411:                     // If the sprite byte is not full, shift the bit pair
                    412:                     // into position, and or it into the sprite byte.
                    413: 
                    414:                     else
                    415:                     {
                    416:                         jSpriteBits <<= (ip % 4) * 2 ;
                    417:                         jSpriteByte  |= jSpriteBits ;
                    418:                     }
                    419: 
                    420:                     // bump the bit pair counter.
                    421: 
                    422:                     ip++ ;
                    423:                 }
                    424:             }
                    425:         }
                    426: 
                    427:         // Flush the last byte.
                    428: 
                    429:         ajXgaSprite[is++] = jSpriteByte ;
                    430: 
                    431: 
                    432:         // Disable the pointer.
                    433: 
                    434:         outpw (XgaIndexReg, SPRITE_CONTROL) ;
                    435: 
                    436:         // Set the sprite index to 0.
                    437: 
                    438:         outpw (XgaIndexReg, SPRITE_INDEX_LOW) ;
                    439:         outpw (XgaIndexReg, SPRITE_INDEX_HIGH) ;
                    440: 
                    441:         // Down load the sprite data to the XGA.
                    442: 
                    443:         for (i = 0 ; i < 1024 ; i++)
                    444:         {
                    445:             jSpriteByte = ajXgaSprite[i] ;
                    446:             outpw (XgaIndexReg, ((jSpriteByte << 8) | SPRITE_DATA)) ;
                    447:         }
                    448: 
                    449:         // Set the pointer colors.
                    450: 
                    451:         outpw (XgaIndexReg, SPRITE_COLOR_REG0_RED) ;
                    452:         outpw (XgaIndexReg, SPRITE_COLOR_REG0_GREEN) ;
                    453:         outpw (XgaIndexReg, SPRITE_COLOR_REG0_BLUE) ;
                    454: 
                    455:         outpw (XgaIndexReg, ((0xff << 8) | SPRITE_COLOR_REG1_RED)) ;
                    456:         outpw (XgaIndexReg, ((0xff << 8) | SPRITE_COLOR_REG1_GREEN)) ;
                    457:         outpw (XgaIndexReg, ((0xff << 8) | SPRITE_COLOR_REG1_BLUE)) ;
                    458: 
                    459:         // Set the position of the cursor.
                    460: 
                    461:         DrvMovePointer(pso, x, y, NULL) ;
                    462: 
                    463:         outpw (XgaIndexReg, ((SC << 8) | SPRITE_CONTROL)) ;
                    464: 
                    465:         return (SPS_ACCEPT_NOEXCLUDE) ;
                    466: }
                    467: 

unix.superglobalmegacorp.com

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