Leaked source code of windows server 2003
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

/******************************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