Annotation of ntddk/src/video/displays/framebuf/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 framebuffer     *
                      5: *                                                                          *
                      6: * Copyright (c) 1992 Microsoft Corporation                                 *
                      7: \**************************************************************************/
                      8: 
                      9: #include "driver.h"
                     10: 
                     11: BOOL bCopyColorPointer(
                     12: PPDEV ppdev,
                     13: SURFOBJ *psoMask,
                     14: SURFOBJ *psoColor,
                     15: XLATEOBJ *pxlo);
                     16: 
                     17: BOOL bCopyMonoPointer(
                     18: PPDEV ppdev,
                     19: SURFOBJ *psoMask);
                     20: 
                     21: BOOL bSetHardwarePointerShape(
                     22: SURFOBJ  *pso,
                     23: SURFOBJ  *psoMask,
                     24: SURFOBJ  *psoColor,
                     25: XLATEOBJ *pxlo,
                     26: LONG      x,
                     27: LONG      y,
                     28: FLONG     fl);
                     29: 
                     30: /******************************Public*Routine******************************\
                     31: * DrvMovePointer
                     32: *
                     33: * Moves the hardware pointer to a new position.
                     34: *
                     35: \**************************************************************************/
                     36: 
                     37: VOID DrvMovePointer
                     38: (
                     39:     SURFOBJ *pso,
                     40:     LONG     x,
                     41:     LONG     y,
                     42:     RECTL   *prcl
                     43: )
                     44: {
                     45:     PPDEV ppdev = (PPDEV) pso->dhpdev;
                     46:     DWORD returnedDataLength;
                     47:     VIDEO_POINTER_POSITION NewPointerPosition;
                     48: 
                     49:     // We don't use the exclusion rectangle because we only support
                     50:     // hardware Pointers. If we were doing our own Pointer simulations
                     51:     // we would want to update prcl so that the engine would call us
                     52:     // to exclude out pointer before drawing to the pixels in prcl.
                     53: 
                     54:     UNREFERENCED_PARAMETER(prcl);
                     55: 
                     56:     if (x == -1)
                     57:     {
                     58:         // A new position of (-1,-1) means hide the pointer.
                     59:         if (!DeviceIoControl(ppdev->hDriver,
                     60:                              IOCTL_VIDEO_DISABLE_POINTER,
                     61:                              NULL,
                     62:                              0,
                     63:                              NULL,
                     64:                              0,
                     65:                              &returnedDataLength,
                     66:                              NULL))
                     67:         {
                     68:             // Not the end of the world, print warning in checked build.
                     69: 
                     70:             DISPDBG((1, "DISP vMoveHardwarePointer failed IOCTL_VIDEO_DISABLE_POINTER\n"));
                     71:         }
                     72:     }
                     73:     else
                     74:     {
                     75:         NewPointerPosition.Column = (SHORT) x - (SHORT) (ppdev->ptlHotSpot.x);
                     76:         NewPointerPosition.Row    = (SHORT) y - (SHORT) (ppdev->ptlHotSpot.y);
                     77:         // Call NT screen driver to move Pointer.
                     78: 
                     79:         if (!DeviceIoControl(ppdev->hDriver,
                     80:                              IOCTL_VIDEO_SET_POINTER_POSITION,
                     81:                              &NewPointerPosition,
                     82:                              sizeof(VIDEO_POINTER_POSITION),
                     83:                              NULL,
                     84:                              0,
                     85:                              &returnedDataLength,
                     86:                              NULL))
                     87:         {
                     88:             // Not the end of the world, print warning in checked build.
                     89: 
                     90:             DISPDBG((1, "DISP vMoveHardwarePointer failed IOCTL_VIDEO_SET_POINTER_POSITION\n"));
                     91:         }
                     92:     }
                     93: }
                     94: 
                     95: /******************************Public*Routine******************************\
                     96: * DrvSetPointerShape
                     97: *
                     98: * Sets the new pointer shape.
                     99: *
                    100: \**************************************************************************/
                    101: 
                    102: ULONG DrvSetPointerShape
                    103: (
                    104:     SURFOBJ  *pso,
                    105:     SURFOBJ  *psoMask,
                    106:     SURFOBJ  *psoColor,
                    107:     XLATEOBJ *pxlo,
                    108:     LONG      xHot,
                    109:     LONG      yHot,
                    110:     LONG      x,
                    111:     LONG      y,
                    112:     RECTL    *prcl,
                    113:     FLONG     fl
                    114: )
                    115: {
                    116:     PPDEV   ppdev = (PPDEV) pso->dhpdev;
                    117:     DWORD   returnedDataLength;
                    118: 
                    119:     // We don't use the exclusion rectangle because we only support
                    120:     // hardware Pointers. If we were doing our own Pointer simulations
                    121:     // we would want to update prcl so that the engine would call us
                    122:     // to exclude out pointer before drawing to the pixels in prcl.
                    123:     UNREFERENCED_PARAMETER(prcl);
                    124: 
                    125:     if (ppdev->pPointerAttributes == (PVIDEO_POINTER_ATTRIBUTES) NULL)
                    126:     {
                    127:         // Mini-port has no hardware Pointer support.
                    128:         return(SPS_ERROR);
                    129:     }
                    130: 
                    131:     // See if we are being asked to hide the pointer
                    132: 
                    133:     if (psoMask == (SURFOBJ *) NULL)
                    134:     {
                    135:         if (!DeviceIoControl(ppdev->hDriver,
                    136:                              IOCTL_VIDEO_DISABLE_POINTER,
                    137:                              NULL,
                    138:                              0,
                    139:                              NULL,
                    140:                              0,
                    141:                              &returnedDataLength,
                    142:                              NULL))
                    143:         {
                    144:             // It should never be possible to fail.
                    145:             // Message supplied for debugging.
                    146: 
                    147:             DISPDBG((1, "DISP bSetHardwarePointerShape failed IOCTL_VIDEO_DISABLE_POINTER\n"));
                    148:         }
                    149: 
                    150:         return(TRUE);
                    151:     }
                    152: 
                    153:     ppdev->ptlHotSpot.x = xHot;
                    154:     ppdev->ptlHotSpot.y = yHot;
                    155: 
                    156:     if (!bSetHardwarePointerShape(pso,psoMask,psoColor,pxlo,x,y,fl))
                    157:     {
                    158:             if (ppdev->fHwCursorActive) {
                    159:                 ppdev->fHwCursorActive = FALSE;
                    160: 
                    161:                 if (!DeviceIoControl(ppdev->hDriver,
                    162:                                      IOCTL_VIDEO_DISABLE_POINTER,
                    163:                                      NULL,
                    164:                                      0,
                    165:                                      NULL,
                    166:                                      0,
                    167:                                      &returnedDataLength,
                    168:                                      NULL)) {
                    169: 
                    170:                     DISPDBG((1, "DISP bSetHardwarePointerShape failed IOCTL_VIDEO_DISABLE_POINTER\n"));
                    171:                 }
                    172:             }
                    173:             //
                    174:             // Mini-port declines to realize this Pointer
                    175:             //
                    176:             return(SPS_DECLINE);
                    177:     }  else
                    178:         ppdev->fHwCursorActive = TRUE;
                    179: 
                    180:     return(SPS_ACCEPT_NOEXCLUDE);
                    181: }
                    182: 
                    183: /******************************Public*Routine******************************\
                    184: * bSetHardwarePointerShape
                    185: *
                    186: * Changes the shape of the Hardware Pointer.
                    187: *
                    188: * Returns: True if successful, False if Pointer shape can't be hardware.
                    189: *
                    190: \**************************************************************************/
                    191: 
                    192: BOOL bSetHardwarePointerShape(
                    193: SURFOBJ  *pso,
                    194: SURFOBJ  *psoMask,
                    195: SURFOBJ  *psoColor,
                    196: XLATEOBJ *pxlo,
                    197: LONG      x,
                    198: LONG      y,
                    199: FLONG     fl)
                    200: {
                    201:     PPDEV     ppdev = (PPDEV) pso->dhpdev;
                    202:     PVIDEO_POINTER_ATTRIBUTES pPointerAttributes = ppdev->pPointerAttributes;
                    203:     DWORD     returnedDataLength;
                    204: 
                    205:     if (psoColor != (SURFOBJ *) NULL)
                    206:     {
                    207:         if ((ppdev->PointerCapabilities.Flags & VIDEO_MODE_COLOR_POINTER) &&
                    208:                 bCopyColorPointer(ppdev, psoMask, psoColor, pxlo))
                    209:         {
                    210:             pPointerAttributes->Flags |= VIDEO_MODE_COLOR_POINTER;
                    211:         } else {
                    212:             return(FALSE);
                    213:         }
                    214: 
                    215:     } else {
                    216: 
                    217:         if ((ppdev->PointerCapabilities.Flags & VIDEO_MODE_MONO_POINTER) &&
                    218:                 bCopyMonoPointer(ppdev, psoMask))
                    219:         {
                    220:             pPointerAttributes->Flags |= VIDEO_MODE_MONO_POINTER;
                    221:         } else {
                    222:             return(FALSE);
                    223:         }
                    224:     }
                    225: 
                    226:     // Initialize Pointer attributes and position
                    227: 
                    228:     pPointerAttributes->Column = (SHORT)(x - ppdev->ptlHotSpot.x);
                    229:     pPointerAttributes->Row    = (SHORT)(y - ppdev->ptlHotSpot.y);
                    230:     pPointerAttributes->Enable = 1;
                    231: 
                    232:     if (fl & SPS_ANIMATESTART) {
                    233:         pPointerAttributes->Flags |= VIDEO_MODE_ANIMATE_START;
                    234:     } else if (fl & SPS_ANIMATEUPDATE) {
                    235:         pPointerAttributes->Flags |= VIDEO_MODE_ANIMATE_UPDATE;
                    236:     }
                    237: 
                    238:     // Set the new Pointer shape.
                    239: 
                    240:     if (!DeviceIoControl(ppdev->hDriver,
                    241:                          IOCTL_VIDEO_SET_POINTER_ATTR,
                    242:                          pPointerAttributes,
                    243:                          ppdev->cjPointerAttributes,
                    244:                          NULL,
                    245:                          0,
                    246:                          &returnedDataLength,
                    247:                          NULL)) {
                    248: 
                    249:         DISPDBG((1, "DISP:Failed IOCTL_VIDEO_SET_POINTER_ATTR call\n"));
                    250:         return(FALSE);
                    251:     }
                    252: 
                    253:     return(TRUE);
                    254: }
                    255: 
                    256: /******************************Public*Routine******************************\
                    257: * bCopyMonoPointer
                    258: *
                    259: * Copies two monochrome masks into a buffer of the maximum size handled by the
                    260: * miniport, with any extra bits set to 0.  The masks are converted to topdown
                    261: * form if they aren't already.  Returns TRUE if we can handle this pointer in
                    262: * hardware, FALSE if not.
                    263: *
                    264: \**************************************************************************/
                    265: 
                    266: BOOL bCopyMonoPointer(
                    267:     PPDEV    ppdev,
                    268:     SURFOBJ *pso)
                    269: {
                    270:     ULONG cx;
                    271:     ULONG cy;
                    272:     PBYTE pjSrcAnd, pjSrcXor;
                    273:     LONG  lDeltaSrc, lDeltaDst;
                    274:     LONG  lSrcWidthInBytes;
                    275:     ULONG cxSrc = pso->sizlBitmap.cx;
                    276:     ULONG cySrc = pso->sizlBitmap.cy;
                    277:     ULONG cxSrcBytes;
                    278:     PVIDEO_POINTER_ATTRIBUTES pPointerAttributes = ppdev->pPointerAttributes;
                    279:     PBYTE pjDstAnd = pPointerAttributes->Pixels;
                    280:     PBYTE pjDstXor = pPointerAttributes->Pixels;
                    281: 
                    282:     // Make sure the new pointer isn't too big to handle
                    283:     // (*2 because both masks are in there)
                    284:     if ((cxSrc > ppdev->PointerCapabilities.MaxWidth) ||
                    285:         (cySrc > (ppdev->PointerCapabilities.MaxHeight * 2)))
                    286:     {
                    287:         return(FALSE);
                    288:     }
                    289: 
                    290:     pjDstXor += ((ppdev->PointerCapabilities.MaxWidth + 7) / 8) *
                    291:             ppdev->pPointerAttributes->Height;
                    292: 
                    293:     // set the desk and mask to 0xff
                    294:     RtlFillMemory(pjDstAnd, ppdev->pPointerAttributes->WidthInBytes *
                    295:             ppdev->pPointerAttributes->Height, 0xFF);
                    296: 
                    297:     // Zero the dest XOR mask
                    298:     RtlZeroMemory(pjDstXor, ppdev->pPointerAttributes->WidthInBytes *
                    299:             ppdev->pPointerAttributes->Height);
                    300: 
                    301:     cxSrcBytes = (cxSrc + 7) / 8;
                    302: 
                    303:     if ((lDeltaSrc = pso->lDelta) < 0)
                    304:     {
                    305:         lSrcWidthInBytes = -lDeltaSrc;
                    306:     } else {
                    307:         lSrcWidthInBytes = lDeltaSrc;
                    308:     }
                    309: 
                    310:     pjSrcAnd = (PBYTE) pso->pvBits;
                    311: 
                    312:     // If the incoming pointer bitmap is bottomup, we'll flip it to topdown to
                    313:     // save the miniport some work
                    314:     if (!(pso->fjBitmap & BMF_TOPDOWN))
                    315:     {
                    316:         // Copy from the bottom
                    317:         pjSrcAnd += lSrcWidthInBytes * (cySrc - 1);
                    318:     }
                    319: 
                    320:     // Height of just AND mask
                    321:     cySrc = cySrc / 2;
                    322: 
                    323:     // Point to XOR mask
                    324:     pjSrcXor = pjSrcAnd + (cySrc * lDeltaSrc);
                    325: 
                    326:     // Offset from end of one dest scan to start of next
                    327:     lDeltaDst = ppdev->pPointerAttributes->WidthInBytes;
                    328: 
                    329:     for (cy = 0; cy < cySrc; ++cy)
                    330:     {
                    331:         RtlCopyMemory(pjDstAnd, pjSrcAnd, cxSrcBytes);
                    332:         RtlCopyMemory(pjDstXor, pjSrcXor, cxSrcBytes);
                    333: 
                    334:         // Point to next source and dest scans
                    335:         pjSrcAnd += lDeltaSrc;
                    336:         pjSrcXor += lDeltaSrc;
                    337:         pjDstAnd += lDeltaDst;
                    338:         pjDstXor += lDeltaDst;
                    339:     }
                    340: 
                    341:     return(TRUE);
                    342: }
                    343: 
                    344: /******************************Public*Routine******************************\
                    345: * bCopyColorPointer
                    346: *
                    347: * Copies the mono and color masks into the buffer of maximum size
                    348: * handled by the miniport with any extra bits set to 0. Color translation
                    349: * is handled at this time. The masks are converted to topdown form if they
                    350: * aren't already.  Returns TRUE if we can handle this pointer in  hardware,
                    351: * FALSE if not.
                    352: *
                    353: \**************************************************************************/
                    354: BOOL bCopyColorPointer(
                    355: PPDEV ppdev,
                    356: SURFOBJ *psoMask,
                    357: SURFOBJ *psoColor,
                    358: XLATEOBJ *pxlo)
                    359: {
                    360:     return(FALSE);
                    361: }
                    362: 
                    363: 
                    364: /******************************Public*Routine******************************\
                    365: * bInitPointer
                    366: *
                    367: * Initialize the Pointer attributes.
                    368: *
                    369: \**************************************************************************/
                    370: 
                    371: BOOL bInitPointer(PPDEV ppdev, DEVINFO *pdevinfo)
                    372: {
                    373:     DWORD    returnedDataLength;
                    374: 
                    375:     ppdev->pPointerAttributes = (PVIDEO_POINTER_ATTRIBUTES) NULL;
                    376:     ppdev->cjPointerAttributes = 0; // initialized in screen.c
                    377: 
                    378:     // Ask the miniport whether it provides pointer support.
                    379: 
                    380:     if (!DeviceIoControl(ppdev->hDriver,
                    381:             IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES, &ppdev->ulMode,
                    382:             sizeof(PVIDEO_MODE), &ppdev->PointerCapabilities,
                    383:             sizeof(ppdev->PointerCapabilities), &returnedDataLength, NULL))
                    384:     {
                    385:          return(FALSE);
                    386:     }
                    387: 
                    388:     // If neither mono nor color hardware pointer is supported, there's no
                    389:     // hardware pointer support and we're done.
                    390:     if ((!(ppdev->PointerCapabilities.Flags & VIDEO_MODE_MONO_POINTER)) &&
                    391:             (!(ppdev->PointerCapabilities.Flags & VIDEO_MODE_COLOR_POINTER)))
                    392:     {
                    393:         return(TRUE);
                    394:     }
                    395: 
                    396:     // Note: The buffer itself is allocated after we set the
                    397:     // mode. At that time we know the pixel depth and we can
                    398:     // allocate the correct size for the color pointer if supported.
                    399: 
                    400: 
                    401:     // Set the asynchronous support status (async means miniport is capable of
                    402:     // drawing the Pointer at any time, with no interference with any ongoing
                    403:     // drawing operation)
                    404: 
                    405:     if (ppdev->PointerCapabilities.Flags & VIDEO_MODE_ASYNC_POINTER)
                    406:     {
                    407:        pdevinfo->flGraphicsCaps |= GCAPS_ASYNCMOVE;
                    408:     }
                    409:     else
                    410:     {
                    411:        pdevinfo->flGraphicsCaps &= ~GCAPS_ASYNCMOVE;
                    412:     }
                    413: 
                    414:     return(TRUE);
                    415: }
                    416: 

unix.superglobalmegacorp.com

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