windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/as/h/bmc.h
2020-09-26 16:20:57 +08:00

146 lines
3.7 KiB
C

//
// BMC.H
// Bitmap Cache
//
// Copyright (c) Microsoft 1997-
//
#ifndef _H_BMC
#define _H_BMC
//
// Bitmap caching order header
//
typedef struct tagBMC_ORDER_HDR
{
TSHR_UINT8 bmcPacketType;
}
BMC_ORDER_HDR;
typedef BMC_ORDER_HDR FAR * PBMC_ORDER_HDR;
//
// Structure of data stored in DIB cache.
// The first few fields are variable and therefore not included in the
// cache hash.
//
#define BMC_DIB_NOT_HASHED (FIELD_OFFSET(BMC_DIB_ENTRY, cx))
typedef struct tagBMC_DIB_ENTRY
{
BYTE inUse;
BYTE bCompressed;
TSHR_UINT16 iCacheIndex;
TSHR_UINT16 cx;
TSHR_UINT16 cxFixed;
TSHR_UINT16 cy;
TSHR_UINT16 bpp;
UINT cCompressed;
UINT cBits;
BYTE bits[1];
}
BMC_DIB_ENTRY;
typedef BMC_DIB_ENTRY FAR * PBMC_DIB_ENTRY;
//
// DIB cache header
//
typedef struct tagBMC_DIB_CACHE
{
PCHCACHE handle;
PBMC_DIB_ENTRY freeEntry;
LPBYTE data;
UINT cEntries;
UINT cCellSize;
UINT cSize;
}
BMC_DIB_CACHE;
typedef BMC_DIB_CACHE * PBMC_DIB_CACHE;
//
// WE HAVE NO SMALL TILES ANYMORE
// Medium sized tiles must fit into a medium cell for the sending depth.
// Large sized tiles must fit into a large cell for the sending depth.
//
// Since true color sending can change dynamically, the easiest thing to do
// to cut down on memory usage is to check the capture depth. If it's
// <= 8, then we can never send true color, so allocate for 8bpp. Else
// allocate for 24bpp.
//
#define BYTES_IN_SCANLINE(width, bpp) ((((width)*(bpp))+31)/32)*4
#define BYTES_IN_BITMAP(width, height, bpp) (BYTES_IN_SCANLINE(width, bpp)*height)
__inline UINT MaxBitmapHeight(UINT width, UINT bpp)
{
UINT bytesPerRow;
//
// If bpp is 4, there are width/2 bytes per Row
// If bpp is 8, there are width bytes per Row
// If bpp is 24, there are 3*width bytes per Row
//
bytesPerRow = BYTES_IN_SCANLINE(width, bpp);
return((TSHR_MAX_SEND_PKT - sizeof(S20DATAPACKET) + sizeof(DATAPACKETHEADER)) / bytesPerRow);
}
//
// Define the cache identifiers which are transmitted in the hBitmap field
// of Memory->Screen blt orders.
//
// These are replaced by the receiver with their local (real) bitmap
// handle of the specified cache.
//
// Note that they are assumed to be contiguous with the smallest as 0
//
//
#define ID_SMALL_BMP_CACHE 0
#define ID_MEDIUM_BMP_CACHE 1
#define ID_LARGE_BMP_CACHE 2
#define NUM_BMP_CACHES 3
//
// WHEN 2.X COMPAT IS GONE, WE CAN PLAY WITH THESE SIZES AT WILL. But
// since the cell size (width * height * bpp) is negotiated when a 2.x
// node is in the share, we can not. Back level nodes assume a certain
// cell size. So do new level nodes for now!
//
#define MP_SMALL_TILE_WIDTH 16
#define MP_SMALL_TILE_WIDTH 16
#define MP_MEDIUM_TILE_WIDTH 32
#define MP_MEDIUM_TILE_HEIGHT 32
#define MP_LARGE_TILE_WIDTH 64
#define MP_LARGE_TILE_HEIGHT 63
#define MP_CACHE_CELLSIZE(width, height, bpp) \
(BYTES_IN_BITMAP(width, height, bpp) + sizeof(BMC_DIB_ENTRY) - 1)
//
// Upper bound on the total cache memory we'll use (2 MB)
//
#define MP_MEMORY_MAX 0x200000
#define COLORCACHEINDEX_NONE 0xFF
#define MEMBLT_CACHETABLE(pMemBlt) ((TSHR_UINT16)LOBYTE(pMemBlt->cacheId))
#define MEMBLT_COLORINDEX(pMemBlt) ((TSHR_UINT16)HIBYTE(pMemBlt->cacheId))
#define MEMBLT_COMBINEHANDLES(colort, bitmap) ((TSHR_UINT16)MAKEWORD(bitmap, colort))
BOOL BMCAllocateCacheData(UINT numEntries, UINT cellSize, UINT cacheID,
PBMC_DIB_CACHE pCache);
void BMCFreeCacheData(PBMC_DIB_CACHE pCache);
#endif // H_BMC