You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
7.9 KiB
231 lines
7.9 KiB
/******************************Module*Header*******************************\
|
|
*
|
|
* *******************
|
|
* * GDI SAMPLE CODE *
|
|
* *******************
|
|
*
|
|
* Module Name: pointer.h
|
|
*
|
|
* This module contains all the definitions for pointer related stuff
|
|
*
|
|
* Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
|
|
* Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved.
|
|
\**************************************************************************/
|
|
#ifndef __POINTER__H__
|
|
#define __POINTER__H__
|
|
|
|
//
|
|
// Some size definition
|
|
//
|
|
#define POINTER_DATA_SIZE 128 // Number of bytes to allocate for the
|
|
// miniport down-loaded pointer code
|
|
// working space
|
|
#define HW_INVISIBLE_OFFSET 2 // Offset from 'ppdev->yPointerBuffer'
|
|
// to the invisible pointer
|
|
#define HW_POINTER_DIMENSION 64 // Maximum dimension of default
|
|
// (built-in) hardware pointer
|
|
#define HW_POINTER_TOTAL_SIZE 1024 // Total size in bytes required
|
|
// to define the hardware pointer
|
|
|
|
typedef enum
|
|
{
|
|
PTR_HW_ACTIVE = 1, // The hardware pointer is active and
|
|
// visible
|
|
PTR_SW_ACTIVE = 2, // The software pointer is active
|
|
} ;
|
|
typedef int PtrFlags;
|
|
|
|
typedef struct _PDev PDev;
|
|
|
|
//
|
|
// 64 x 64 Hardware Pointer Caching data structures
|
|
//
|
|
#define SMALL_POINTER_MEM (32 * 4 * 2) // Bytes read for 32x32 cursor
|
|
#define LARGE_POINTER_MEM (SMALL_POINTER_MEM * 4)
|
|
// Bytes read for 64x64 cursor
|
|
|
|
// Hardware workaround. We have had to stop using the hardware pointer
|
|
// cache due to problems with changing pointer shape. Occasionaly it
|
|
// caused the pointer to jump around on the screen. We don't currently
|
|
// have time to work with 3Dlabs to find out how we can stop this jumpyness
|
|
// so instead we will just not use the hardware pointer cache for the time
|
|
// being.
|
|
//#define SMALL_POINTER_MAX 4 // No. of cursors in cache
|
|
#define SMALL_POINTER_MAX 1 // Hardware pointer cache workaround
|
|
|
|
#define HWPTRCACHE_INVALIDENTRY (SMALL_POINTER_MAX + 1)
|
|
// Well-known value
|
|
|
|
//
|
|
// Pointer cache item data structure, there is one of these for every cached
|
|
// pointer
|
|
//
|
|
typedef struct
|
|
{
|
|
ULONG ptrCacheTimeStamp; // Timestamp used for LRU cache ageing
|
|
ULONG ulKey; // iUniq value of pointer mask surface
|
|
HSURF hsurf; // hsurf of the pointer mask surface
|
|
} HWPointerCacheItemEntry;
|
|
|
|
//
|
|
// The complete cache looks like this
|
|
//
|
|
typedef struct
|
|
{
|
|
BYTE cPtrCacheInUseCount; // The no. of cache items used
|
|
ULONG ptrCacheCurTimeStamp; // The date stamp used for LRU stuff
|
|
ULONG ptrCacheData[LARGE_POINTER_MEM / 4];
|
|
// The cached pointer data
|
|
HWPointerCacheItemEntry ptrCacheItemList [SMALL_POINTER_MAX];
|
|
// The cache item list
|
|
} HWPointerCache;
|
|
|
|
//
|
|
// Capabilities flags
|
|
//
|
|
// These are private flags passed to us from the Permedia2 miniport. They
|
|
// come from the high word of the 'AttributeFlags' field of the
|
|
// 'VIDEO_MODE_INFORMATION' structure (found in 'ntddvdeo.h') passed
|
|
// to us via an 'VIDEO_QUERY_AVAIL_MODES' or 'VIDEO_QUERY_CURRENT_MODE'
|
|
// IOCTL.
|
|
//
|
|
// NOTE: These definitions must match those in the Permedia2 miniport's
|
|
// 'permedia.h'!
|
|
//
|
|
typedef enum
|
|
{
|
|
//
|
|
// NT4 uses the DeviceSpecificAttributes field so the low word is available
|
|
//
|
|
CAPS_ZOOM_X_BY2 = 0x00000001, // Hardware has zoomed by 2 in X
|
|
CAPS_ZOOM_Y_BY2 = 0x00000002, // Hardware has zoomed by 2 in Y
|
|
CAPS_SPARSE_SPACE = 0x00000004, // Framebuffer is sparsely mapped
|
|
// (don't allow direct access).
|
|
// The machine is probably an Alpha
|
|
CAPS_SW_POINTER = 0x00010000, // No hardware pointer; use
|
|
// software simulation
|
|
CAPS_TVP4020_POINTER = 0x20000000, // Use Permedia2 builtin pointer
|
|
CAPS_P2RD_POINTER = 0x80000000 // Use the 3Dlabs P2RD RAMDAC
|
|
} /*CAPS*/;
|
|
|
|
typedef int CAPS;
|
|
|
|
//
|
|
// Initializes hardware pointer or software pointer
|
|
//
|
|
BOOL bEnablePointer(PDev* ppdev);
|
|
|
|
//
|
|
// Determine whether we can do color space double buffering in the current mode
|
|
//
|
|
BOOL bP2RDCheckCSBuffering(PDev* ppdev);
|
|
|
|
//
|
|
// Use the pixel read mask to perform color space double buffering
|
|
//
|
|
BOOL bP2RDSwapCSBuffers(PDev* ppdev, LONG bufNo);
|
|
|
|
//
|
|
// Stores the 15-color cursor in the RAMDAC
|
|
//
|
|
BOOL bSet15ColorPointerShapeP2RD(PDev* ppdev, SURFOBJ* psoMask,
|
|
SURFOBJ* psoColor,
|
|
LONG x,
|
|
LONG y,
|
|
LONG xHot,
|
|
LONG yHot);
|
|
|
|
//
|
|
// Stores the 3-color cursor in the RAMDAC
|
|
//
|
|
BOOL bSet3ColorPointerShapeP2RD(PDev* ppdev,
|
|
SURFOBJ* psoMask,
|
|
SURFOBJ* psoColor,
|
|
LONG x,
|
|
LONG y,
|
|
LONG xHot,
|
|
LONG yHot);
|
|
|
|
//
|
|
// Set pointer shape for P2RD
|
|
//
|
|
BOOL bSetPointerShapeP2RD(PDev* ppdev,
|
|
SURFOBJ* pso,
|
|
SURFOBJ* psoColor,
|
|
XLATEOBJ* pxlo,
|
|
LONG x,
|
|
LONG y,
|
|
LONG xHot,
|
|
LONG yHot);
|
|
|
|
//
|
|
// Set the TI TVP4020 hardware pointer shape
|
|
//
|
|
BOOL bSetPointerShapeTVP4020(PDev* ppdev,
|
|
SURFOBJ* pso,
|
|
SURFOBJ* psoColor,
|
|
LONG x,
|
|
LONG y,
|
|
LONG xHot,
|
|
LONG yHot);
|
|
|
|
|
|
//
|
|
// Determine whether we can do color space double buffering in the current mode
|
|
//
|
|
BOOL bTVP4020CheckCSBuffering(PDev* ppdev);
|
|
|
|
//
|
|
// Set cache index
|
|
//
|
|
LONG HWPointerCacheCheckAndAdd(HWPointerCache* ptrCache,
|
|
HSURF hsurf,
|
|
ULONG ulKey,
|
|
BOOL* isCached);
|
|
|
|
//
|
|
// Initialise the hardware pointer cache.
|
|
//
|
|
VOID HWPointerCacheInit(HWPointerCache* ptrCache);
|
|
|
|
//
|
|
// Hardware pointer caching functions/macros.
|
|
//
|
|
#define HWPointerCacheInvalidate(ptrCache) (ptrCache)->cPtrCacheInUseCount = 0
|
|
|
|
//
|
|
// Enable everything but hide the pointer
|
|
//
|
|
VOID vAssertModePointer(PDev* ppdev, BOOL bEnable);
|
|
|
|
//
|
|
// Get the hardware ready to use the 3Dlabs P2RD hardware pointer.
|
|
//
|
|
VOID vEnablePointerP2RD(PDev* ppdev);
|
|
|
|
//
|
|
// Get the hardware ready to use the TI TVP4020 hardware pointer.
|
|
//
|
|
VOID vEnablePointerTVP4020(PDev* ppdev);
|
|
|
|
//
|
|
// Move the 3Dlabs P2RD hardware pointer.
|
|
//
|
|
VOID vMovePointerP2RD(PDev* ppdev, LONG x, LONG y);
|
|
|
|
//
|
|
// Move the TI TVP4020 hardware pointer.
|
|
//
|
|
VOID vMovePointerTVP4020(PDev* ppdev, LONG x, LONG y);
|
|
|
|
//
|
|
// Show or hide the 3Dlabs P2RD hardware pointer.
|
|
//
|
|
VOID vShowPointerP2RD(PDev* ppdev, BOOL bShow);
|
|
|
|
//
|
|
// Show or hide the TI TVP4020 hardware pointer.
|
|
//
|
|
VOID vShowPointerTVP4020(PDev* ppdev, BOOL bShow);
|
|
|
|
#endif
|