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.
 
 
 
 
 
 

2289 lines
89 KiB

/****************************************************************************/
// uh.h
//
// Update Handler Class
//
// Copyright (C) 1997-1999 Microsoft Corporation
/****************************************************************************/
#ifndef _H_UH_
#define _H_UH_
extern "C" {
#include <adcgdata.h>
}
#include "fs.h"
#include "op.h"
#include "or.h"
#include "gh.h"
#include "ih.h"
#include "objs.h"
#include "cd.h"
#ifdef OS_WINCE
#include <ceconfig.h>
#endif
#include "tscerrs.h"
//USE Mem mapped file for bitmap cache
//#define VM_BMPCACHE 1
class CSL;
class COD;
class CUI;
class CCC;
#define TRC_GROUP TRC_GROUP_CORE
#define TRC_FILE "uh"
#define TSC_HR_FILEID TSC_HR_UH_H
typedef struct tagUH_ORDER
{
RECT dstRect;
BYTE orderData[1];
} UH_ORDER, FAR *PUH_ORDER;
typedef UH_ORDER UNALIGNED FAR *PUH_ORDER_UA;
#define UH_ORDER_HEADER_SIZE (FIELDOFFSET(UH_ORDER, orderData))
extern const UINT16 uhWindowsROPs[256];
/****************************************************************************/
/* Number of glyph caches. */
/****************************************************************************/
#define UH_GLC_NUM_CACHES 10
/****************************************************************************/
/* Number of entries in the color table cache. */
/****************************************************************************/
#define UH_COLOR_TABLE_CACHE_ENTRIES 6
/****************************************************************************/
/* Save Bitmap constants */
/****************************************************************************/
#define UH_SAVE_BITMAP_WIDTH 480
#define UH_SAVE_BITMAP_HEIGHT 480
#define UH_SAVE_BITMAP_SIZE ((DCUINT32)UH_SAVE_BITMAP_WIDTH * \
(DCUINT32)UH_SAVE_BITMAP_HEIGHT)
#define UH_SAVE_BITMAP_X_GRANULARITY 1
#define UH_SAVE_BITMAP_Y_GRANULARITY 20
// Cache IDs have a protocol-implicit cell size, starting from 256 and
// increasing in factors of 4. Scale by the bit depth.
#ifdef DC_HICOLOR
#define UH_CellSizeFromCacheID(_id) \
((TS_BITMAPCACHE_0_CELL_SIZE << (2 * (_id))) * _UH.copyMultiplier)
#define UH_CellSizeFromCacheIDAndMult(_id,mult) \
((TS_BITMAPCACHE_0_CELL_SIZE << (2 * (_id))) * mult)
#define UH_PropVirtualCacheSizeFromMult(mult) \
(_UH.PropBitmapVirtualCacheSize[mult-1])
#else
#define UH_CellSizeFromCacheID(_id) \
(TS_BITMAPCACHE_0_CELL_SIZE << (2 * (_id)))
#endif
// Tile sizes are also protocol-implied and dependent on the cache ID,
// starting at 16 per side and increasing in powers of two in each dimension.
#define UH_CACHE_0_DIMENSION 16
//
// From wuhint.h
//
#define UH_NUM_8BPP_PAL_ENTRIES 256
#define UH_LOGPALETTE_VERSION 0x300
#define UH_LAST_PAL_ENTRY (UH_NUM_8BPP_PAL_ENTRIES-1)
#define UH_NUM_SYSTEM_COLORS 20
#define UH_COLOR_RGB 0
#define UH_COLOR_PALETTE 1
#define UH_RGB_BLACK RGB(0x00, 0x00, 0x00)
#define UH_RGB_RED RGB(0xFF, 0x00, 0x00)
#define UH_RGB_GREEN RGB(0x00, 0xFF, 0x00)
#define UH_RGB_BLUE RGB(0x00, 0x00, 0xFF)
#define UH_RGB_MAGENTA RGB(0xFF, 0x00, 0xFF)
#define UH_RGB_CYAN RGB(0x00, 0xFF, 0xFF)
#define UH_RGB_YELLOW RGB(0xFF, 0xFF, 0x00)
#define UH_RGB_WHITE RGB(0xFF, 0xFF, 0xFF)
#define UH_BRUSHTYPE_FDIAGONAL 1
#define UH_BRUSHTYPE_DIAGCROSS 2
#define UH_BRUSHTYPE_HORIZONTAL 3
#define UH_BRUSHTYPE_VERTICAL 4
#define WM_RECALC_CELL_SPACING (WM_APP + 100)
/****************************************************************************/
// Size of the decompression buffer used for decompressing screen data.
// This is the maximum decompressed size the server will send.
/****************************************************************************/
#define UH_DECOMPRESSION_BUFFER_LENGTH 32000
/****************************************************************************/
// Min value configurable for the bitmap cache total size.
/****************************************************************************/
#define UH_BMC_LOW_THRESHOLD 150
/****************************************************************************/
/* Max and min values configurable for the glyph cache total size */
/****************************************************************************/
#define UH_GLC_LOW_THRESHOLD 50
#define UH_GLC_HIGH_THRESHOLD 2000
/****************************************************************************/
/* Glyph cache constants. */
/****************************************************************************/
// Warning: data sizes must be a power of 2
#define UH_GLC_CACHE_MAXIMUMCELLSIZE 2048
#define UH_GLC_CACHE_MINIMUMCELLCOUNT 16
#define UH_GLC_CACHE_MAXIMUMCELLCOUNT 254
/****************************************************************************/
/* Frag cache constants. */
/****************************************************************************/
// Warning: data sizes must be a power of 2
#define UH_FGC_CACHE_MAXIMUMCELLSIZE 256
#define UH_FGC_CACHE_MAXIMUMCELLCOUNT 256
/****************************************************************************/
// Offscreen cache constants
/****************************************************************************/
#define UH_OBC_LOW_CACHESIZE 512 // half MB
#define UH_OBC_HIGH_CACHESIZE 7680 // 7.5 MB
#define UH_OBC_LOW_CACHEENTRIES 50
#define UH_OBC_HIGH_CACHEENTRIES 500
#ifdef DRAW_GDIPLUS
#define UH_GDIP_LOW_CACHEENTRIES 2
#define UH_GDIP_HIGH_CACHEENTRIES 20
#endif
#ifdef DC_DEBUG
/****************************************************************************/
/* Bitmap Cache Monitor Window Class name. */
/****************************************************************************/
#define UH_BITMAP_CACHE_MONITOR_CLASS_NAME _T("BitmapCacheMonitorClass")
#define UH_CACHE_WINDOW_BORDER_WIDTH 20
#define UH_CACHE_BLOB_WIDTH 6
#define UH_CACHE_BLOB_HEIGHT 6
#define UH_CACHE_BLOB_SPACING 1
#define UH_INTER_CACHE_SPACING 20
#define UH_CACHE_TEXT_SPACING 5
#define UH_CACHE_BLOB_TOTAL_WIDTH \
(UH_CACHE_BLOB_WIDTH + UH_CACHE_BLOB_SPACING)
#define UH_CACHE_BLOB_TOTAL_HEIGHT \
(UH_CACHE_BLOB_HEIGHT + UH_CACHE_BLOB_SPACING)
#define UH_CACHE_FLASH_PERIOD 1000
#define UH_CACHE_DISPLAY_FONT_NAME _T("Comic Sans MS")
#define UH_CACHE_DISPLAY_FONT_SIZE 16
#define UH_CACHE_DISPLAY_FONT_WEIGHT FW_NORMAL
#define UH_CACHE_MONITOR_UPDATE_PERIOD 200
// Cache monitor entry states. Describes where the cache entry is.
#define UH_CACHE_STATE_UNUSED 0
#define UH_CACHE_STATE_IN_MEMORY 1
#define UH_CACHE_STATE_ON_DISK 2
#define UH_CACHE_NUM_STATES 3
// Cache monitor flash transitions transitions. Describes the temporary state
// of a displayed entry after an event has occurred. Each entry has an
// associated timestamp that determines when the transition flash will end.
// These should be ordered in importance, most important having higher numbers
// -- the more important events supersede other events in use of the timer.
#define UH_CACHE_TRANSITION_NONE 0
#define UH_CACHE_TRANSITION_TOUCHED 1
#define UH_CACHE_TRANSITION_EVICTED 2
#define UH_CACHE_TRANSITION_LOADED_FROM_DISK 3
#define UH_CACHE_TRANSITION_KEY_LOAD_ON_SESSION_START 4
#define UH_CACHE_TRANSITION_SERVER_UPDATE 5
#define UH_CACHE_NUM_TRANSITIONS 6
#endif /* DC_DEBUG */
typedef struct tagUHBITMAPINFOPALINDEX
{
// Set where the palette contains palette indices of 0..255.
BOOL bIdentityPalette;
// The following entries are used directly as a bitmap info header with
// embedded palette when doing blts.
BITMAPINFOHEADER hdr;
UINT16 paletteIndexTable[256];
} UHBITMAPINFOPALINDEX, FAR *PUHBITMAPINFOPALINDEX;
typedef struct tagUHCACHEDCOLORTABLE
{
RGBTRIPLE rgb[256];
} UHCACHEDCOLORTABLE, FAR *PUHCACHEDCOLORTABLE;
/****************************************************************************/
// Bitmap Cache Definitions
/****************************************************************************/
#define CACHE_DIRECTORY_NAME _T("cache\\")
// This value should be 13 for 8.3 file name and \0, additional 2 is for legacy
// purpose. Old cache structure contains cacheId\ as subcache directory name.
// We can remove 2 if we don't need to support Win2000 Beta3.
#define CACHE_FILENAME_LENGTH 15
typedef struct tagUHBITMAPINFO
{
UINT32 Key1, Key2;
UINT16 bitmapWidth;
UINT16 bitmapHeight;
UINT32 bitmapLength;
} UHBITMAPINFO, FAR *PUHBITMAPINFO;
// File Header for bitmap file used in persistent bitmap caching
typedef struct tagUHBITMAPFILEHDR
{
UHBITMAPINFO bmpInfo;
UINT32 bmpVersion : 3;
UINT32 bCompressed : 1;
UINT32 bNoBCHeader : 1; // add new flag to indicate if the compressed
// bitmap data contains BC header or not
UINT32 pad : 27;
} UHBITMAPFILEHDR, FAR *PUHBITMAPFILEHDR;
// Information maintained for each bitmap cache
typedef struct tagUHBITMAPCACHEINFO
{
UINT32 NumVirtualEntries;
UINT32 NumEntries : 31;
UINT32 bSendBitmapKeys : 1;
#ifdef DC_HICOLOR
UINT32 OrigNumEntries;
UINT32 MemLen;
#endif
} UHBITMAPCACHEINFO, FAR *PUHBITMAPCACHEINFO;
#ifdef DC_DEBUG
// Used to hold bitmap cache monitor information in debug builds.
typedef struct {
BYTE ColorTable;
BYTE State : 2;
BYTE FlashTransition : 6;
unsigned UsageCount;
UINT32 EventTime;
} UH_CACHE_MONITOR_ENTRY_DATA;
#endif
// Bitmap cache entry definitions
// The fields in UHBITMAPCACHEENTRYHDR are of explicit length deliberately
// to ensure 16 and 32 bit client match and to help force the cache entry
// header sizes to be powers of two.
typedef struct tagUHBITMAPCACHEENTRYHDR
{
UINT16 bitmapWidth;
UINT16 bitmapHeight;
UINT32 bitmapLength : 31;
UINT32 hasData : 1;
} UHBITMAPCACHEENTRYHDR, FAR *PUHBITMAPCACHEENTRYHDR,
DCHPTR HPUHBITMAPCACHEENTRYHDR;
// bitmap cache file info
typedef struct tagUHCACHEFILEINFO
{
HANDLE hCacheFile;
#ifdef VM_BMPCACHE
LPBYTE pMappedView;
#endif
} UHCACHEFILEINFO, FAR *PUHCACHEFILEINFO;
// Doubly Linked List Node - Used to maintain MRU list
typedef struct tagUHCHAIN
{
UINT32 next;
UINT32 prev;
} UHCHAIN, FAR *PUHCHAIN;
typedef TS_BITMAPCACHE_PERSISTENT_LIST_ENTRY DCHPTR HPTS_BITMAPCACHE_PERSISTENT_LIST_ENTRY;
// Bitmap Virtual Cache Page Table Entry
// We need 3 pad here to make sure the struct size be power of two
// This is required for huge memory allocation in Win16
typedef struct tagUHBITMAPCACHEPTE
{
UHCHAIN mruList;
UINT32 iEntryToMem;
TS_BITMAPCACHE_PERSISTENT_LIST_ENTRY bmpInfo;
} UHBITMAPCACHEPTE, FAR *PUHBITMAPCACHEPTE, DCHPTR HPUHBITMAPCACHEPTE;
// Bitmap Virtual Cache Page Table
typedef struct tagUHBITMAPCACHEPAGETABLE
{
UINT32 MRUHead;
UINT32 MRUTail;
UINT32 FreeMemList;
UHCACHEFILEINFO CacheFileInfo;
HPUHBITMAPCACHEPTE PageEntries;
} UHBITMAPCACHEPAGETABLE, FAR *PUHBITMAPCACHEPAGETABLE;
// Bitmap physical memory caches
typedef struct tagUHBITMAPCACHE
{
UHBITMAPCACHEINFO BCInfo;
HPUHBITMAPCACHEENTRYHDR Header;
BYTE DCHPTR Entries;
UHBITMAPCACHEPAGETABLE PageTable;
} UHBITMAPCACHE;
/****************************************************************************/
/* Brush cache entry definitions */
/****************************************************************************/
typedef struct tagUHBRUSHCACHEHDR
{
BYTE iBitmapFormat;
BYTE cx;
BYTE cy;
BYTE iBytes;
} UHBRUSHCACHEHDR, FAR *PUHBRUSHCACHEHDR;
#define UH_MAX_MONO_BRUSHES 64
#define UH_MONO_BRUSH_SIZE 16
#define UH_COLOR_BRUSH_SIZE 64
#ifdef DC_HICOLOR
#define UH_COLOR_BRUSH_SIZE_16 128
#define UH_COLOR_BRUSH_SIZE_24 192
#endif
typedef struct tagUHMONOBRUSHCACHE
{
UHBRUSHCACHEHDR hdr;
BYTE data[UH_MONO_BRUSH_SIZE];
} UHMONOBRUSHCACHE, FAR *PUHMONOBRUSHCACHE;
typedef struct tagUHCOLORBRUSHINFO
{
BITMAPINFO bmi;
RGBQUAD rgbQuadTable[UH_NUM_8BPP_PAL_ENTRIES - 1];
BYTE bytes[UH_COLOR_BRUSH_SIZE];
HBRUSH hLastBrush;
} UHCOLORBRUSHINFO, *PUHCOLORBRUSHINFO;
#ifdef DC_HICOLOR
// We only need enough color table entries for the red, green blue bit masks
// used in 16bpp sessions.
// Note that we make this big enough to use for 15/16 and 24bpp brushes
typedef struct tagUHHICOLORBRUSHINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[3];
BYTE bytes[UH_COLOR_BRUSH_SIZE_24];
HBRUSH hLastBrush;
} UHHICOLORBRUSHINFO, FAR *PUHHICOLORBRUSHINFO;
#endif
#define UH_MAX_COLOR_BRUSHES 64
#ifdef DC_HICOLOR // Need enough space for a 24bpp brush
typedef struct tagUHCOLORBRUSHCACHE
{
UHBRUSHCACHEHDR hdr;
BYTE data[UH_COLOR_BRUSH_SIZE_24];
} UHCOLORBRUSHCACHE, FAR *PUHCOLORBRUSHCACHE;
#else
typedef struct tagUHCOLORBRUSHCACHE
{
UHBRUSHCACHEHDR hdr;
BYTE data[UH_COLOR_BRUSH_SIZE];
} UHCOLORBRUSHCACHE, FAR *PUHCOLORBRUSHCACHE;
#endif
/****************************************************************************/
/* Glyph cache entry definitions */
/****************************************************************************/
typedef struct tagUHGLYPHCACHEENTRYHDR
{
INT32 x;
INT32 y;
UINT32 cx;
UINT32 cy;
UINT32 unicode;
} UHGLYPHCACHEENTRYHDR, FAR *PUHGLYPHCACHEENTRYHDR,
DCHPTR HPUHGLYPHCACHEENTRYHDR;
typedef struct tagUHGLYPHCACHE
{
HPUHGLYPHCACHEENTRYHDR pHdr;
UINT32 cbEntrySize;
BYTE DCHPTR pData;
UINT32 cbUseCount;
} UHGLYPHCACHE, FAR *PUHGLYPHCACHE, DCHPTR HPUHGLYPHCACHE;
/****************************************************************************/
/* Frag cache entry definitions */
/****************************************************************************/
typedef struct tagUHFRAGCACHEENTRYHDR
{
UINT32 cbFrag;
INT32 cacheId;
} UHFRAGCACHEENTRYHDR, FAR *PUHFRAGCACHEENTRYHDR,
DCHPTR HPUHFRAGCACHEENTRYHDR;
typedef struct tagUHFRAGCACHE
{
HPUHFRAGCACHEENTRYHDR pHdr;
UINT32 cbEntrySize;
BYTE DCHPTR pData;
} UHFRAGCACHE, FAR *PUHFRAGCACHE, DCHPTR HPUHFRAGCACHE;
/****************************************************************************/
// Offscreen bitmap cache
/****************************************************************************/
typedef struct tagUHOFFSCRBITMAPCACHE
{
HBITMAP offscrBitmap;
UINT32 cx;
UINT32 cy;
} UHOFFSCRBITMAPCACHE, FAR *PUHOFFSCRBITMAPCACHE, DCHPTR HPUHOFFSCRBITMAPCACHE;
#ifdef DRAW_NINEGRID
/****************************************************************************/
// DrawNineGrid bitmap cache
/****************************************************************************/
typedef struct tagUHDRAWNINEGRIDBITMAPCACHE
{
HBITMAP drawNineGridBitmap;
UINT32 cx;
UINT32 cy;
UINT32 bitmapBpp;
TS_NINEGRID_BITMAP_INFO dngInfo;
} UHDRAWSTREAMBITMAPCACHE, FAR *PUHDRAWSTREAMBITMAPCACHE;
#ifdef DRAW_GDIPLUS
/****************************************************************************/
// Gdiplus object cache
/****************************************************************************/
typedef struct tagUHGDIPLUSOBJECTCACHE
{
UINT32 CacheSize;
BYTE * CacheData;
} UHGDIPLUSOBJECTCACHE, FAR *PUHGDIPLUSOBJECTCACHE;
typedef struct tagUHGDIPLUSIMAGECACHE
{
UINT32 CacheSize;
UINT16 ChunkNum;
INT16 *CacheDataIndex;
} UHGDIPLUSIMAGECACHE, FAR *PUHGDIPLUSIMAGECACHE;
#endif
typedef BOOL (FNGDI_DRAWSTREAM)(HDC, ULONG, VOID*);
#endif
#define UHROUNDUP(val, granularity) \
((((val)+((granularity) - 1)) / (granularity)) * (granularity))
#define UH_IS_SYSTEM_COLOR_INDEX(i) \
((i < (UH_NUM_SYSTEM_COLORS / 2)) || \
(i > (UH_LAST_PAL_ENTRY - (UH_NUM_SYSTEM_COLORS / 2))))
#define UH_TWEAK_COLOR_COMPONENT(colorComponent) \
if ((colorComponent) == 0) \
{ \
(colorComponent)++; \
} \
else \
{ \
(colorComponent)--; \
}
#define TSRECT16_TO_RECTL(dst, src) \
(dst).left = (src).left; \
(dst).top = (src).top; \
(dst).right = (src).right; \
(dst).bottom = (src).bottom;
#define TSPOINT16_TO_POINTL(dst, src) \
(dst).x = (src).x; \
(dst).y = (src).y;
/****************************************************************************/
// UH_DATA
/****************************************************************************/
typedef struct tagUH_DATA
{
#ifdef DC_LATENCY
unsigned fakeKeypressCount;
#endif /* DC_LATENCY */
HBITMAP hShadowBitmap;
HBITMAP hunusedBitmapForShadowDC;
HBITMAP hSaveScreenBitmap;
HBITMAP hunusedBitmapForSSBDC;
HDC hdcShadowBitmap;
HDC hdcOutputWindow;
HDC hdcDraw;
HDC hdcSaveScreenBitmap;
HDC hdcBrushBitmap;
BOOL usingDIBSection;
BOOL shadowBitmapRequested;
BOOL dedicatedTerminal;
unsigned drawThreshold;
UHBITMAPINFOPALINDEX bitmapInfo;
#ifdef DC_HICOLOR
unsigned DIBFormat;
unsigned copyMultiplier;
unsigned protocolBpp;
unsigned bitmapBpp;
unsigned shadowBitmapBpp;
#endif
BOOL shadowBitmapEnabled;
#ifdef DISABLE_SHADOW_IN_FULLSCREEN
BOOL DontUseShadowBitmap; // True: don't use shadow; False: use shadow
#endif
#ifdef OS_WINCE
BOOL paletteIsFixed;
#endif
HPALETTE hpalDefault;
HPALETTE hpalCurrent;
HWND hwndOutputWindow;
HRGN hrgnUpdate;
HRGN hrgnUpdateRect;
BOOL colorIndicesEnabled;
#ifdef DC_DEBUG
BOOL hatchBitmapPDUData;
BOOL hatchIndexPDUData;
BOOL hatchSSBOrderData;
BOOL hatchMemBltOrderData;
BOOL labelMemBltOrders;
#endif /* DC_DEBUG */
BYTE FAR *bitmapDecompressionBuffer;
unsigned bitmapDecompressionBufferSize;
/************************************************************************/
/* last used resource variables */
/************************************************************************/
COLORREF lastBkColor;
COLORREF lastTextColor;
int lastBkMode;
int lastROP2;
HDC lastHDC;
unsigned lastPenStyle;
unsigned lastPenWidth;
COLORREF lastPenColor;
COLORREF lastForeColor;
unsigned lastLogBrushStyle;
unsigned lastLogBrushHatch;
#if defined (OS_WINCE)
COLORREF lastLogBrushColorRef;
#else
DCCOLOR lastLogBrushColor;
#endif
BYTE lastLogBrushExtra[7];
#ifdef OS_WINCE
HDC hdcMemCached;
HBITMAP hBitmapCacheDIB;
PBYTE hBitmapCacheDIBits;
#endif
COLORREF lastBrushBkColor;
COLORREF lastBrushTextColor;
unsigned lastFillMode;
#ifdef DISABLE_SHADOW_IN_FULLSCREEN
BOOL fIsBBarVisible; // TRUE: visible, FALSE: invisible
RECT rectBBar;
#endif
/************************************************************************/
/* The following variables which describe the current clip rectangle */
/* are only valid if fRectReset is FALSE. If fRectReset is true then */
/* no clipping is in force. */
/************************************************************************/
BOOL rectReset;
int lastLeft;
int lastTop;
int lastRight;
int lastBottom;
#if defined (OS_WINCE)
HDC validClipDC;
HDC validBkColorDC;
HDC validBkModeDC;
HDC validROPDC;
HDC validTextColorDC;
HDC validPenDC;
HDC validBrushDC;
#endif
/************************************************************************/
/* Bitmaps */
/************************************************************************/
HBITMAP bmpPattern;
HBITMAP bmpMonoPattern;
HBITMAP bmpColorPattern;
/************************************************************************/
/* Memblt color table caches */
/************************************************************************/
PUHCACHEDCOLORTABLE pColorTableCache;
PUHBITMAPINFOPALINDEX pMappedColorTableCache;
int maxColorTableId;
/************************************************************************/
/* Glyph caches */
/************************************************************************/
UHGLYPHCACHE glyphCache[UH_GLC_NUM_CACHES];
UHFRAGCACHE fragCache;
unsigned cxGlyphBits;
unsigned cyGlyphBits;
HBITMAP hbmGlyph;
HDC hdcGlyph;
unsigned bmShadowWidth;
unsigned bmShadowHeight;
PBYTE bmShadowBits;
/************************************************************************/
// Bitmap cache entries.
/************************************************************************/
#if ((!defined(OS_WINCE)) || (defined(ENABLE_BMP_CACHING_FOR_WINCE)))
// Holds the persistent cache file name
TCHAR PersistCacheFileName[MAX_PATH];
UINT EndPersistCacheDir;
// For locking bitmap cache directory on disk
TCHAR PersistentLockName[MAX_PATH];
HANDLE hPersistentCacheLock;
// These entries are used in setting up bitmap key database and sending
// them to the server.
// bitmapKeyEnumTimerId: ID of timer used to schedule bitmap key enumeration.
// currentBitmapCacheId: currently enumerating keys at bitmap cache Id
// currentBitmapCacheIndex: currently enumerating keys at bitmap cache index
// sendBitmapCacheId: currently we are sending keys at bitmap cache id
// sendBitmapCacheIndex: currently we are sending keys at bitmap cache index
// sendNumBitmapKeys: how many keys we have sent so far
// numKeyEntries: number of keys at each bitmap cache
// totalNumKeyEntries: total number of keys in all caches
// BitmapCacheSizeInUse: total disk space in use for bitmaps
// pBitmapKeyDB: bitmap key database with all keys stored here
// totalNumErrorPDUs: maximum number of error pdus allowed to send to server
// lastTimeErrorPDU: last time sent error pdu for the cache
INT_PTR bitmapKeyEnumTimerId;
USHORT currentBitmapCacheId;
HANDLE currentFileHandle;
USHORT sendBitmapCacheId;
ULONG sendBitmapCacheIndex;
ULONG sendNumBitmapKeys;
ULONG numKeyEntries[TS_BITMAPCACHE_MAX_CELL_CACHES];
ULONG totalNumKeyEntries;
ULONG bitmapCacheSizeInUse;
ULONG totalNumErrorPDUs;
HPTS_BITMAPCACHE_PERSISTENT_LIST_ENTRY pBitmapKeyDB[TS_BITMAPCACHE_MAX_CELL_CACHES];
ULONG maxNumKeyEntries[TS_BITMAPCACHE_MAX_CELL_CACHES];
ULONG lastTimeErrorPDU[TS_BITMAPCACHE_MAX_CELL_CACHES];
ULONG BytesPerCluster;
ULONG NumberOfFreeClusters;
//
// Copy multiplier we are enumerating at
//
ULONG currentCopyMultiplier;
//
// Has the bmp cache memory been allocated
//
BOOL fBmpCacheMemoryAlloced;
#endif // ((!defined(OS_WINCE)) || (defined(ENABLE_BMP_CACHING_FOR_WINCE)))
// Property settings from which we determine how to allocate bitmap
// caches at connect time.
ULONG RegBitmapCacheSize;
//
// Virtual Cache size setting is indexed by copy multiplier
//
ULONG PropBitmapVirtualCacheSize[3];
ULONG RegScaleBitmapCachesByBPP;
USHORT RegNumBitmapCaches : 15;
USHORT RegPersistenceActive : 1;
UINT RegBCProportion[TS_BITMAPCACHE_MAX_CELL_CACHES];
ULONG RegBCMaxEntries[TS_BITMAPCACHE_MAX_CELL_CACHES];
UHBITMAPCACHEINFO RegBCInfo[TS_BITMAPCACHE_MAX_CELL_CACHES];
// Specifies the bitmap caching version the server has advertised.
// This is rev1 if no TS_BITMAPCACHE_CAPABILITYSET_HOSTSUPPORT
// capability was sent. Otherwise this version is the one advertised
// in HOSTSUPPORT.
unsigned BitmapCacheVersion;
// The number of cell caches in actual use in this session, and data
// for each cache. We need a copy of the cache attributes here
// because the capabilities could be rev1 or rev2 but we need a
// consistent format to work with.
unsigned NumBitmapCaches;
// Flags:
// bConnected: Used to reduce disconnect work done since it is
// possible to receive more than one call to UH_Disconnected()
// at session end.
// bEnabled : We can be disabled multiple times in a session. Make
// sure we don't do a bunch of extra work.
// bEnabledOnce: Indicates if we have already received a previous
// UH_Enable(). Used to keep from having to do work more than once
// on reconnect.
// bPersistentBitmapKeysSent: Set when we've sent the key PDUs to the
// server.
// bPersistenceActive: Session flag to determine if persistence is
// active.
// bPersistenceDisable: Property setting for persistent flag might
// change after UH_Init. But, if we have this flag on, we won't
// enable persistent caching even the property changed.
// bWarningDisplayed: We only need to display once per session for
// persistent caching failure
// bBitmapKeyEnumComplete: Set when we've done bitmap key enumeration
// on disk
unsigned bConnected : 1;
unsigned bEnabled : 1;
unsigned bEnabledOnce : 1;
unsigned bPersistenceActive : 1;
unsigned bPersistenceDisable : 1;
unsigned bPersistentBitmapKeysSent : 1;
unsigned bWarningDisplayed : 1;
unsigned bBitmapKeyEnumComplete : 1;
unsigned bBitmapKeyEnumerating : 1;
/************************************************************************/
/* Memblt bitmap caches */
/************************************************************************/
UHBITMAPCACHE bitmapCache[TS_BITMAPCACHE_MAX_CELL_CACHES];
/************************************************************************/
// Offscreen bitmap cache
/************************************************************************/
HDC hdcOffscreenBitmap;
HBITMAP hUnusedOffscrBitmap;
unsigned offscrCacheSize;
unsigned offscrCacheEntries;
HPUHOFFSCRBITMAPCACHE offscrBitmapCache;
unsigned sendOffscrCacheErrorPDU;
#ifdef DRAW_NINEGRID
/************************************************************************/
// DrawNineGrid bitmap cache
/************************************************************************/
BYTE *drawNineGridDecompressionBuffer;
unsigned drawNineGridDecompressionBufferSize;
BYTE *drawNineGridAssembleBuffer;
unsigned drawNineGridAssembleBufferOffset;
unsigned drawNineGridAssembleBufferBpp;
unsigned drawNineGridAssembleBufferWidth;
unsigned drawNineGridAssembleBufferHeight;
unsigned drawNineGridAssembleBufferSize;
BOOL drawNineGridAssembleCompressed;
HDC hdcDrawNineGridBitmap;
HBITMAP hUnusedDrawNineGridBitmap;
HRGN hDrawNineGridClipRegion;
unsigned drawNineGridCacheSize;
unsigned drawNineGridCacheEntries;
PUHDRAWSTREAMBITMAPCACHE drawNineGridBitmapCache;
unsigned sendDrawNineGridErrorPDU;
HMODULE hModuleGDI32;
HMODULE hModuleMSIMG32;
FNGDI_DRAWSTREAM *pfnGdiDrawStream;
FNGDI_ALPHABLEND *pfnGdiAlphaBlend;
FNGDI_TRANSPARENTBLT *pfnGdiTransparentBlt;
#endif
#ifdef DRAW_GDIPLUS
// Graw Gdiplus
TSUINT32 ServerGdiplusSupportLevel;
unsigned GdiplusCacheLevel;
BOOL fSendDrawGdiplusErrorPDU;
unsigned DrawGdiplusFailureCount;
#define DRAWGDIPLUSFAILURELIMIT 5
// Buffer to hold Gdiplus order
BYTE *drawGdipBuffer;
BYTE *drawGdipBufferOffset;
ULONG drawGdipBufferSize;
// Buffer to hold Gdiplus cache order
BYTE *drawGdipCacheBuffer;
BYTE *drawGdipCacheBufferOffset;
ULONG drawGdipCacheBufferSize;
// Buffer to hold assembled Gdiplus
BYTE *drawGdipEmfBuffer;
BYTE *drawGdipEmfBufferOffset;
// GdipCache Index data
PUHGDIPLUSOBJECTCACHE GdiplusGraphicsCache;
PUHGDIPLUSOBJECTCACHE GdiplusObjectPenCache;
PUHGDIPLUSOBJECTCACHE GdiplusObjectBrushCache;
PUHGDIPLUSIMAGECACHE GdiplusObjectImageCache;
PUHGDIPLUSOBJECTCACHE GdiplusObjectImageAttributesCache;
// Free list for the image cache chunks
INT16 *GdipImageCacheFreeList;
// Head index of the free list
INT16 GdipImageCacheFreeListHead;
#define GDIP_CACHE_INDEX_DEFAULT -1
INT16 *GdipImageCacheIndex;
// GdipCache actual data
BYTE *GdipGraphicsCacheData;
BYTE *GdipBrushCacheData;
BYTE *GdipPenCacheData;
BYTE *GdipImageAttributesCacheData;
BYTE *GdipImageCacheData;
// Gdiplus CacheEntries
unsigned GdiplusGraphicsCacheEntries;
unsigned GdiplusObjectPenCacheEntries;
unsigned GdiplusObjectBrushCacheEntries;
unsigned GdiplusObjectImageCacheEntries;
unsigned GdiplusObjectImageAttributesCacheEntries;
// Gdiplus CacheChunkSize
unsigned GdiplusGraphicsCacheChunkSize;
unsigned GdiplusObjectBrushCacheChunkSize;
unsigned GdiplusObjectPenCacheChunkSize;
unsigned GdiplusObjectImageAttributesCacheChunkSize;
unsigned GdiplusObjectImageCacheChunkSize;
// Total cache size allowed for Gdiplus image (number of chunks)
unsigned GdiplusObjectImageCacheTotalSize;
// Maximun size for a single Gdiplus image cache (number of chunks)
unsigned GdiplusObjectImageCacheMaxSize;
HMODULE hModuleGDIPlus;
FNGDIPPLAYTSCLIENTRECORD *pfnGdipPlayTSClientRecord;
FNGDIPLUSSTARTUP *pfnGdiplusStartup;
FNGDIPLUSSHUTDOWN *pfnGdiplusShutdown;
ULONG_PTR gpToken;
BOOL gpValid;
BOOL fGdipEnabled;
#endif // DRAW_GDIPLUS
/************************************************************************/
/* Brush caches */
/************************************************************************/
PUHMONOBRUSHCACHE pMonoBrush;
PUHCOLORBRUSHINFO pColorBrushInfo;
#ifdef DC_HICOLOR
PUHHICOLORBRUSHINFO pHiColorBrushInfo;
#endif
PUHCOLORBRUSHCACHE pColorBrush;
RGBQUAD rgbQuadTable[UH_NUM_8BPP_PAL_ENTRIES];
#ifdef DC_DEBUG
//
// Bitmap Cache Monitor data.
//
HWND hwndBitmapCacheMonitor;
UH_CACHE_MONITOR_ENTRY_DATA DCHPTR MonitorEntries[
TS_BITMAPCACHE_MAX_CELL_CACHES];
unsigned numCacheBlobsPerRow;
unsigned yCacheStart[TS_BITMAPCACHE_MAX_CELL_CACHES];
unsigned yDisplayedCacheBitmapStart;
unsigned displayedCacheId;
ULONG displayedCacheEntry;
BOOL showBitmapCacheMonitor;
INT_PTR timerBitmapCacheMonitor;
#endif /* DC_DEBUG */
//
// Disabled bitmap support
//
HBITMAP hbmpDisconnectedBitmap;
HBITMAP hbmpUnusedDisconnectedBitmap;
HDC hdcDisconnected;
#ifdef OS_WINCE
#define MAX_AOT_RECTS 10 //AOT = Always On Top
RECT rcaAOT[MAX_AOT_RECTS];
ULONG ulNumAOTRects;
#endif
} UH_DATA, FAR *PUH_DATA;
//
// Class definition
//
class CUH
{
public:
CUH(CObjs* objs);
~CUH();
public:
//
// Public data members
//
UH_DATA _UH;
public:
//
// API
//
/****************************************************************************/
/* FUNCTION PROTOTYPES */
/****************************************************************************/
void DCAPI UH_Init();
void DCAPI UH_Term();
DCBOOL DCAPI UH_SetServerFontCount(unsigned);
void DCAPI UH_Enable(ULONG_PTR);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UH_Enable);
void DCAPI UH_Disable(ULONG_PTR);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UH_Disable);
void DCAPI UH_Disconnect(ULONG_PTR);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UH_Disconnect);
void DCAPI UH_SetConnectOptions(ULONG_PTR);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UH_SetConnectOptions);
void DCAPI UH_ResetFontMap();
VOID DCAPI UH_BufferAvailable();
VOID DCAPI UH_SendPersistentKeysAndFontList();
VOID DCAPI UH_ClearOneBitmapDiskCache(UINT cacheId,UINT copyMultiplier);
HRESULT DCAPI UH_ProcessOrders(unsigned, BYTE FAR *, DCUINT);
HRESULT DCAPI UH_ProcessBitmapPDU(TS_UPDATE_BITMAP_PDU_DATA UNALIGNED FAR *,
DCUINT);
HRESULT DCAPI UH_ProcessPalettePDU(
TS_UPDATE_PALETTE_PDU_DATA UNALIGNED FAR *, DCUINT);
#ifdef DISABLE_SHADOW_IN_FULLSCREEN
void DCAPI UH_DisableShadowBitmap(ULONG_PTR);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UH_DisableShadowBitmap);
void DCAPI UH_EnableShadowBitmap(ULONG_PTR);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UH_EnableShadowBitmap);
void DCAPI UH_SetBBarRect(ULONG_PTR pData);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UH_SetBBarRect);
void DCAPI UH_SetBBarVisible(ULONG_PTR pData);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UH_SetBBarVisible);
#endif
// "Internal" functions required to handle inline functions below.
void DCINTERNAL UHUseSolidPaletteBrush(DCCOLOR);
#ifdef DC_DEBUG
void DCAPI UH_ChangeDebugSettings(ULONG_PTR);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UH_ChangeDebugSettings);
#endif /* DC_DEBUG */
void DCAPI UH_SetClipRegion(int, int, int, int);
#ifdef DC_DEBUG
HWND UH_GetBitmapCacheMonHwnd() {return _UH.hwndBitmapCacheMonitor;}
#endif
#ifdef DRAW_NINEGRID
HRESULT DCAPI UH_DrawNineGrid(PUH_ORDER, unsigned, RECT*);
#endif
#ifdef DRAW_GDIPLUS
BOOL DCAPI UHDrawGdiplusStartup(ULONG_PTR);
void DCAPI UHDrawGdiplusShutdown(ULONG_PTR);
#endif
/****************************************************************************/
/* INLINE FUNCTIONS */
/* */
/****************************************************************************/
inline void DCINTERNAL UHAddUpdateRegion(PUH_ORDER, HRGN);
/****************************************************************************/
/* Name: UHResetClipRegion */
/* */
/* Purpose: Disables any clipping region in the current output DC. */
/****************************************************************************/
_inline void DCAPI UH_ResetClipRegion()
{
DC_BEGIN_FN("UHResetClipRegion");
#if defined (OS_WINCE)
if ((! _UH.rectReset) || (_UH.validClipDC != _UH.hdcDraw))
#endif
{
SelectClipRgn(_UH.hdcDraw, NULL);
/********************************************************************/
/* Indicate that the region is currently reset. */
/********************************************************************/
_UH.rectReset = TRUE;
#if defined (OS_WINCE)
_UH.validClipDC = _UH.hdcDraw;
#endif
}
DC_END_FN();
}
#ifdef SMART_SIZING
/****************************************************************************/
/* Name: UHClearUpdateRegion */
/* */
/* Purpose: Clears the update region */
/****************************************************************************/
_inline void DCAPI UHClearUpdateRegion()
{
DC_BEGIN_FN("UHClearUpdateRegion");
SetRectRgn(_UH.hrgnUpdate, 0, 0, 0, 0);
_pOp->OP_ClearUpdateRegion();
DC_END_FN();
}
#endif // SMART_SIZING
#ifdef DC_HICOLOR
#define UHGetOffsetIntoCache(iEntry, cacheId) \
(iEntry) * UH_CellSizeFromCacheID((cacheId))
#endif
/****************************************************************************/
/* Name: UH_OnUpdatePDU */
/* */
/* Purpose: Process an Update PDU. */
/* */
/* Params: IN - pUpdatePDU: pointer to Update PDU */
/****************************************************************************/
inline HRESULT DCAPI UH_OnUpdatePDU(
TS_UPDATE_HDR_DATA UNALIGNED FAR *pUpdatePDU,
DCUINT dataLen)
{
DC_BEGIN_FN("UH_OnUpdatePDU");
HRESULT hr = S_OK;
PBYTE pDataEnd = (PBYTE)pUpdatePDU + dataLen;
switch (pUpdatePDU->updateType) {
case TS_UPDATETYPE_ORDERS: {
TS_UPDATE_ORDERS_PDU_DATA UNALIGNED FAR *pHdr;
// SECURITY: 552403
CHECK_READ_N_BYTES(pUpdatePDU, pDataEnd, sizeof(TS_UPDATE_ORDERS_PDU_DATA), hr,
(TB, _T("Bad TS_UPDATE_ORDERS_PDU_DATA; Size %u"), dataLen));
pHdr = (TS_UPDATE_ORDERS_PDU_DATA UNALIGNED FAR *)pUpdatePDU;
TRC_NRM((TB, _T("Order PDU")));
hr = UH_ProcessOrders(pHdr->numberOrders, pHdr->orderList,
dataLen - FIELDOFFSET(TS_UPDATE_ORDERS_PDU_DATA, orderList));
DC_QUIT_ON_FAIL(hr);
break;
}
case TS_UPDATETYPE_BITMAP:
TRC_NRM((TB, _T("Bitmap PDU")));
// SECURITY: 552403
CHECK_READ_N_BYTES(pUpdatePDU, pDataEnd, sizeof(TS_UPDATE_BITMAP_PDU_DATA), hr,
(TB, _T("Bad TS_UPDATE_BITMAP_PDU_DATA; Size %u"), dataLen));
hr = UH_ProcessBitmapPDU((PTS_UPDATE_BITMAP_PDU_DATA)pUpdatePDU,
dataLen);
DC_QUIT_ON_FAIL(hr);
break;
case TS_UPDATETYPE_PALETTE:
TRC_NRM((TB, _T("Palette PDU")));
// SECURITY: 552403
CHECK_READ_N_BYTES(pUpdatePDU, pDataEnd, sizeof(TS_UPDATE_PALETTE_PDU_DATA), hr,
(TB, _T("Bad TS_UPDATE_PALETTE_PDU_DATA; Size %u"), dataLen));
hr = UH_ProcessPalettePDU((PTS_UPDATE_PALETTE_PDU_DATA)pUpdatePDU,
dataLen);
DC_QUIT_ON_FAIL(hr);
break;
case TS_UPDATETYPE_SYNCHRONIZE:
TRC_NRM((TB, _T("Sync PDU")));
break;
default:
TRC_ERR((TB, _T("Unexpected Update PDU type: %u"),
pUpdatePDU->updateType));
DC_QUIT;
break;
}
/************************************************************************/
/* If there are a large number of PDUs arriving, messages flood the */
/* Receive Thread's message queue and it is possible for WM_PAINT */
/* messages to not get processed within a reasonable amount of time */
/* (as they have the lowest priority). We therefore ensure that */
/* any outstanding WM_PAINTs are flushed if they have not been */
/* processed within UH_WORST_CASE_WM_PAINT_PERIOD. */
/* */
/* Note that the normal processing of updates does not involve */
/* WM_PAINT messages - we draw directly to the Output Window. */
/* WM_PAINTs are only generated by resizing or obscuring/revealing */
/* an area of the client window. */
/************************************************************************/
_pOp->OP_MaybeForcePaint();
DC_EXIT_POINT:
DC_END_FN();
return hr;
} /* UH_OnUpdatePDU */
/****************************************************************************/
/* Name: UH_GetShadowBitmapDC */
/* */
/* Purpose: Returns the Shadow Bitmap DC handle. */
/* */
/* Returns: Shadow Bitmap DC handle. */
/****************************************************************************/
inline HDC DCAPI UH_GetShadowBitmapDC()
{
DC_BEGIN_FN("UH_GetShadowBitmapDC");
DC_END_FN();
return _UH.hdcShadowBitmap;
}
/****************************************************************************/
/* Name: UH_GetDisconnectBitmapDC */
/* */
/* Purpose: Returns the Disconnect Bitmap DC handle */
/* */
/* Returns: Disconnect DC handle. */
/****************************************************************************/
inline HDC DCAPI UH_GetDisconnectBitmapDC()
{
DC_BEGIN_FN("UH_GetShadowBitmapDC");
DC_END_FN();
return _UH.hdcDisconnected;
}
/****************************************************************************/
/* Name: UH_GetCurrentOutputDC */
/* */
/* Purpose: Returns the DC handle for the current output surface */
/* (either the Shadow Bitmap or the Output Window). */
/* */
/* Returns: Output DC handle. */
/****************************************************************************/
inline HDC DCAPI UH_GetCurrentOutputDC()
{
DC_BEGIN_FN("UH_GetCurrentOutputDC");
DC_END_FN();
return _UH.hdcDraw;
}
/****************************************************************************/
/* Name: UH_ShadowBitmapIsEnabled */
/* */
/* Purpose: Returns whether the Shadow Bitmap is currently enabled */
/* */
/* Returns: TRUE if Shadow Bitmap is enabled, FALSE otherwise */
/****************************************************************************/
inline BOOL DCAPI UH_ShadowBitmapIsEnabled()
{
DC_BEGIN_FN("UH_ShadowBitmapIsEnabled");
DC_END_FN();
return _UH.shadowBitmapEnabled;
}
/****************************************************************************/
/* Name: UH_GetCurrentPalette */
/* */
/* Purpose: Returns the handle of the current palette */
/* */
/* Returns: Palette handle */
/****************************************************************************/
inline HPALETTE DCAPI UH_GetCurrentPalette()
{
DC_BEGIN_FN("UH_GetCurrentPalette");
DC_END_FN();
return _UH.hpalCurrent;
}
#ifdef OS_WINCE
#define UHGetColorRef(_color,_type,_uhinst) (_uhinst)->UHGetColorRefCE(_color,_type)
#endif
/****************************************************************************/
// Convert the supplied DCCOLOR into a COLORREF.
// Macro to force inline.
/****************************************************************************/
#ifdef DC_HICOLOR
#ifndef OS_WINCE
#define UHGetColorRef(_color, _type, uhinst) \
(((uhinst)->_UH.protocolBpp == 24) \
? \
RGB(_color.u.rgb.red, _color.u.rgb.green, _color.u.rgb.blue) \
: \
(((uhinst)->_UH.protocolBpp == 16) \
? \
RGB((((*((PDCUINT16)&(_color))) >> 8) & 0x00f8) | \
(((*((PDCUINT16)&(_color))) >> 13) & 0x0007), \
(((*((PDCUINT16)&(_color))) >> 3) & 0x00fc) | \
(((*((PDCUINT16)&(_color))) >> 9) & 0x0003), \
(((*((PDCUINT16)&(_color))) << 3) & 0x00f8) | \
(((*((PDCUINT16)&(_color))) >> 2) & 0x0007)) \
: \
(((uhinst)->_UH.protocolBpp == 15) \
? \
RGB((((*((PDCUINT16)&(_color))) >> 7) & 0x00f8) | \
(((*((PDCUINT16)&(_color))) >> 12) & 0x0007), \
(((*((PDCUINT16)&(_color))) >> 2) & 0x00f8) | \
(((*((PDCUINT16)&(_color))) >> 7) & 0x0007), \
(((*((PDCUINT16)&(_color))) << 3) & 0x00f8) | \
(((*((PDCUINT16)&(_color))) >> 2) & 0x0007)) \
: \
((_type) != UH_COLOR_RGB \
? \
((uhinst)->_UH.colorIndicesEnabled \
? \
DC_PALINDEX((_color).u.index) \
: \
PALETTERGB((_color).u.rgb.red, \
(_color).u.rgb.green, \
(_color).u.rgb.blue)) \
: \
RGB((_color).u.rgb.red, \
(_color).u.rgb.green, \
(_color).u.rgb.blue)))) )
#else
inline COLORREF UHGetColorRefCE(DCCOLOR color, DCUINT type)
{
COLORREF outCol;
DC_BEGIN_FN("UHGetColorRef");
if (_UH.protocolBpp == 24)
{
outCol = RGB(color.u.rgb.red, color.u.rgb.green, color.u.rgb.blue);
}
else if (_UH.protocolBpp == 16)
{
outCol = RGB((((*((PDCUINT16)&(color))) & TS_RED_MASK_16BPP) >> 8),
(((*((PDCUINT16)&(color))) & TS_GREEN_MASK_16BPP)>> 3),
(((*((PDCUINT16)&(color))) & TS_BLUE_MASK_16BPP) << 3));
}
else if (_UH.protocolBpp == 15)
{
outCol = RGB((((*((PDCUINT16)&(color))) & TS_RED_MASK_15BPP) >> 7),
(((*((PDCUINT16)&(color))) & TS_GREEN_MASK_15BPP)>> 2),
(((*((PDCUINT16)&(color))) & TS_BLUE_MASK_15BPP) << 3));
}
else if (type == UH_COLOR_RGB)
{
outCol = RGB(color.u.rgb.red, color.u.rgb.green, color.u.rgb.blue);
}
else
{
if (_UH.colorIndicesEnabled)
{
if (g_CEConfig != CE_CONFIG_WBT)
{
if (_UH.paletteIsFixed)
{
PALETTEENTRY pe;
GetPaletteEntries(_UH.hpalCurrent, color.u.index, 1, &pe);
outCol = PALETTERGB(pe.peRed, pe.peGreen, pe.peBlue);
}
else
{
outCol = DC_PALINDEX(color.u.index);
}
}
else
{
outCol = DC_PALINDEX(color.u.index);
}
}
else
{
outCol = PALETTERGB(color.u.rgb.red,
color.u.rgb.green,
color.u.rgb.blue);
}
}
TRC_NRM((TB, "Returning rgb %08lx", outCol));
DC_END_FN();
return(outCol);
}
#endif // OS_WINCE
#else // not HICOLOR
#ifndef OS_WINCE
#define UHGetColorRef(_color, _type, uhinst) \
((_type) != UH_COLOR_RGB ? \
((uhinst)->_UH.colorIndicesEnabled ? DC_PALINDEX((_color).u.index) : \
PALETTERGB((_color).u.rgb.red, (_color).u.rgb.green, \
(_color).u.rgb.blue)) : \
RGB((_color).u.rgb.red, (_color).u.rgb.green, \
(_color).u.rgb.blue))
#else
_inline COLORREF DCINTERNAL UHGetColorRef(DCCOLOR color, DCUINT type)
{
COLORREF outCol;
DC_BEGIN_FN("UHGetColorRef");
if (type == UH_COLOR_RGB)
{
outCol = RGB(color.u.rgb.red, color.u.rgb.green, color.u.rgb.blue);
}
else
{
if (_UH.colorIndicesEnabled)
{
if (g_CEConfig != CE_CONFIG_WBT)
{
if (_UH.paletteIsFixed)
{
PALETTEENTRY pe;
GetPaletteEntries(_UH.hpalCurrent, color.u.index, 1, &pe);
outCol = PALETTERGB(pe.peRed, pe.peGreen, pe.peBlue);
}
else
{
outCol = DC_PALINDEX(color.u.index);
}
}
else
{
outCol = DC_PALINDEX(color.u.index);
}
}
else
{
outCol = PALETTERGB(color.u.rgb.red,
color.u.rgb.green,
color.u.rgb.blue);
}
}
TRC_NRM((TB, _T("Returning rgb %08lx"), outCol));
DC_END_FN();
return(outCol);
}
#endif // OS_WINCE
#endif // DC_HICOLOR
/****************************************************************************/
/* Name: UHUseBkColor */
/* */
/* Purpose: Selects a given background color into the output DC. */
/* */
/* Params: IN: color - background color */
/* IN: colorType - color type */
/****************************************************************************/
#if defined (OS_WINCE)
#define UHUseBkColor(_color, _colorType, uhinst) \
{ \
COLORREF rgb; \
\
rgb = UHGetColorRef((_color), (_colorType), (uhinst)); \
if ((rgb != (uhinst)->_UH.lastBkColor) || \
((uhinst)->_UH.hdcDraw != (uhinst)->_UH.validBkColorDC)) \
{ \
SetBkColor((uhinst)->_UH.hdcDraw, rgb); \
(uhinst)->_UH.lastBkColor = rgb; \
(uhinst)->_UH.validBkColorDC = (uhinst)->_UH.hdcDraw; \
} \
}
#else
#define UHUseBkColor(_color, _colorType, uhinst) \
{ \
COLORREF rgb; \
\
rgb = UHGetColorRef((_color), (_colorType), (uhinst)); \
{ \
SetBkColor((uhinst)->_UH.hdcDraw, rgb); \
(uhinst)->_UH.lastBkColor = rgb; \
} \
}
#endif
/****************************************************************************/
/* Name: UHUseTextColor */
/* */
/* Purpose: Selects a given text color into the output DC. */
/* */
/* Params: IN: color - text color */
/* IN: colorType - color type */
/****************************************************************************/
#if defined (OS_WINCE)
#define UHUseTextColor(_color, _colorType, uhinst) \
{ \
COLORREF rgb; \
\
rgb = UHGetColorRef((_color), (_colorType), uhinst); \
if ((rgb != (uhinst)->_UH.lastTextColor) || \
((uhinst)->_UH.hdcDraw != (uhinst)->_UH.validTextColorDC)) \
{ \
SetTextColor((uhinst)->_UH.hdcDraw, rgb); \
(uhinst)->_UH.lastTextColor = rgb; \
(uhinst)->_UH.validTextColorDC = (uhinst)->_UH.hdcDraw; \
} \
}
#else
#define UHUseTextColor(_color, _colorType, uhinst) \
{ \
COLORREF rgb; \
\
rgb = UHGetColorRef((_color), (_colorType), uhinst); \
{ \
SetTextColor((uhinst)->_UH.hdcDraw, rgb); \
(uhinst)->_UH.lastTextColor = rgb; \
} \
}
#endif
/****************************************************************************/
/* Name: UH_UseBrushEx */
/* */
/* Purpose: Creates and selects a given brush into the current output */
/* DC. */
/* */
/* Purpose: Sets given brush origin in the output DC. */
/* */
/* Params: IN: x, y - brush origin */
/* IN: style - brush style */
/* IN: hatch - brush hatch */
/* IN: color - brush color */
/* IN: colorType - type of color */
/* IN: extra - array of bitmap bits for custom brushes */
/****************************************************************************/
inline HRESULT DCAPI UH_UseBrushEx(
int x,
int y,
unsigned style,
unsigned hatch,
DCCOLOR color,
unsigned colorType,
PBYTE pextra)
{
DC_BEGIN_FN("UH_UseBrushEx");
HRESULT hr = S_OK;
UHUseBrushOrg(x, y);
hr = UHUseBrush(style, hatch, color, colorType, pextra);
DC_EXIT_POINT:
DC_END_FN();
return hr;
}
/****************************************************************************/
/* Name: UH_ProcessServerCaps */
/* */
/* Purpose: Processes the server's capabilities. Called on sender thread. */
/* +++NOTE: Called on sender thread. */
/* */
/* Returns: Nothing */
/* */
/* Params: IN: capsLength - number of bytes pointed to by pCaps */
/* IN: pCaps - pointer to the combined capabilities */
/****************************************************************************/
inline void DCAPI UH_ProcessServerCaps(PTS_ORDER_CAPABILITYSET pOrderCaps)
{
DC_BEGIN_FN("UH_ProcessServerCaps");
TRC_ASSERT(pOrderCaps, (TB,_T("pOrderCaps == NULL in call to UH_ProcessServerCaps")));
if (pOrderCaps)
{
// Look to see if the server will be sending us palette indices
// rather than RGB values.
if (_UH.colorIndicesEnabled)
{
if (pOrderCaps->orderFlags & TS_ORDERFLAGS_COLORINDEXSUPPORT)
{
TRC_NRM((TB, _T("color indices ARE supported")));
_UH.colorIndicesEnabled = TRUE;
}
else
{
TRC_NRM((TB, _T("color indices NOT supported")));
_UH.colorIndicesEnabled = FALSE;
}
}
}
DC_END_FN();
} /* UH_ProcessServerCaps */
/****************************************************************************/
// UH_ProcessBCHostSupportCaps
//
// Processes a TS_BITMAPCACHE_CAPABILITYSET_HOSTSUPPORT sent by the server.
// These caps are used to determine the bitmap caching protocol sequences
// to be used.
// +++NOTE: Called on sender thread.
/****************************************************************************/
inline void DCAPI UH_ProcessBCHostSupportCaps(
TS_BITMAPCACHE_CAPABILITYSET_HOSTSUPPORT *pHostSupport)
{
DC_BEGIN_FN("UH_ProcessBCHostSupportCaps");
if (pHostSupport != NULL &&
pHostSupport->CacheVersion == TS_BITMAPCACHE_REV2)
_UH.BitmapCacheVersion = TS_BITMAPCACHE_REV2;
else
_UH.BitmapCacheVersion = TS_BITMAPCACHE_REV1;
TRC_NRM((TB,_T("Received HOSTSUPPORT caps, cache version %u"),
_UH.BitmapCacheVersion));
DC_END_FN();
}
/**************************************************************************/
/* Name: UHIsValidGlyphCacheID */
/**************************************************************************/
inline HRESULT DCAPI UHIsValidGlyphCacheID(unsigned cacheId)
{
return (cacheId < UH_GLC_NUM_CACHES) ? S_OK : E_TSC_CORE_CACHEVALUE;
}
/**************************************************************************/
/* Name: UHIsValidGlyphCacheIDIndex */
/**************************************************************************/
HRESULT DCAPI UHIsValidGlyphCacheIDIndex(unsigned cacheId, unsigned cacheIndex);
/**************************************************************************/
/* Name: UHIsValidMonoBrushCacheIndex */
/**************************************************************************/
inline HRESULT DCAPI UHIsValidMonoBrushCacheIndex(unsigned cacheIndex)
{
return cacheIndex < UH_MAX_MONO_BRUSHES ? S_OK : E_TSC_CORE_CACHEVALUE;
}
/**************************************************************************/
/* Name: UHIsValidColorBrushCacheIndex */
/**************************************************************************/
inline HRESULT DCAPI UHIsValidColorBrushCacheIndex(unsigned cacheIndex)
{
return cacheIndex < UH_MAX_COLOR_BRUSHES ? S_OK : E_TSC_CORE_CACHEVALUE;
}
/**************************************************************************/
/* Name: UHIsValidColorTableCacheIndex */
/**************************************************************************/
inline HRESULT DCAPI UHIsValidColorTableCacheIndex(unsigned cacheIndex)
{
return cacheIndex < UH_COLOR_TABLE_CACHE_ENTRIES ?
S_OK : E_TSC_CORE_CACHEVALUE;
}
/**************************************************************************/
/* Name: UHIsValidOffsreenBitmapCacheIndex */
/**************************************************************************/
HRESULT DCAPI UHIsValidOffsreenBitmapCacheIndex(unsigned cacheIndex);
/**************************************************************************/
/* Name: UHIsValidBitmapCacheID */
/**************************************************************************/
inline HRESULT DCAPI UHIsValidBitmapCacheID(unsigned cacheId)
{
return cacheId < _UH.NumBitmapCaches ? S_OK : E_TSC_CORE_CACHEVALUE;
}
/**************************************************************************/
/* Name: UHIsValidBitmapCacheIndex */
/**************************************************************************/
inline HRESULT DCAPI UHIsValidBitmapCacheIndex(unsigned cacheId,
unsigned cacheIndex)
{
HRESULT hr = UHIsValidBitmapCacheID(cacheId);
if (SUCCEEDED(hr)) {
if (BITMAPCACHE_WAITING_LIST_INDEX == cacheIndex) {
hr = S_OK;
}
else if (_UH.bitmapCache[cacheId].BCInfo.bSendBitmapKeys) {
hr = cacheIndex < _UH.bitmapCache[cacheId].BCInfo.NumVirtualEntries ?
S_OK : E_TSC_CORE_CACHEVALUE;
}
else {
hr = cacheIndex < _UH.bitmapCache[cacheId].BCInfo.NumEntries ?
S_OK : E_TSC_CORE_CACHEVALUE;
}
}
return hr;
}
/**************************************************************************/
/* Name: UHIsValidGdipCacheType */
/**************************************************************************/
inline HRESULT DCAPI UHIsValidGdipCacheType(TSUINT16 CacheType)
{
HRESULT hr;
switch (CacheType) {
case GDIP_CACHE_GRAPHICS_DATA:
case GDIP_CACHE_OBJECT_BRUSH:
case GDIP_CACHE_OBJECT_PEN:
case GDIP_CACHE_OBJECT_IMAGE:
case GDIP_CACHE_OBJECT_IMAGEATTRIBUTES:
hr = S_OK;
break;
default:
hr = E_TSC_CORE_CACHEVALUE;
break;
}
return hr;
}
/**************************************************************************/
/* Name: UHIsValidGdipCacheTypeID */
/**************************************************************************/
inline HRESULT DCAPI UHIsValidGdipCacheTypeID(TSUINT16 CacheType,
TSUINT16 CacheID)
{
HRESULT hr;
switch (CacheType) {
case GDIP_CACHE_GRAPHICS_DATA:
hr = (CacheID < _UH.GdiplusGraphicsCacheEntries) ?
S_OK : E_TSC_CORE_CACHEVALUE;
break;
case GDIP_CACHE_OBJECT_BRUSH:
hr = (CacheID < _UH.GdiplusObjectBrushCacheEntries) ?
S_OK : E_TSC_CORE_CACHEVALUE;
break;
case GDIP_CACHE_OBJECT_PEN:
hr = (CacheID < _UH.GdiplusObjectPenCacheEntries) ?
S_OK : E_TSC_CORE_CACHEVALUE;
break;
case GDIP_CACHE_OBJECT_IMAGE:
hr = (CacheID < _UH.GdiplusObjectImageCacheEntries) ?
S_OK : E_TSC_CORE_CACHEVALUE;
break;
case GDIP_CACHE_OBJECT_IMAGEATTRIBUTES:
hr = (CacheID < _UH.GdiplusObjectImageAttributesCacheEntries) ?
S_OK : E_TSC_CORE_CACHEVALUE;
break;
default:
hr = E_TSC_CORE_CACHEVALUE;
break;
}
return hr;
}
/**************************************************************************/
/* Name: UHGdipCacheChunkSize */
/**************************************************************************/
inline unsigned DCAPI UHGdipCacheChunkSize(TSUINT16 CacheType)
{
unsigned rc;
switch (CacheType) {
case GDIP_CACHE_GRAPHICS_DATA:
rc = _UH.GdiplusGraphicsCacheChunkSize;
break;
case GDIP_CACHE_OBJECT_BRUSH:
rc = _UH.GdiplusObjectBrushCacheChunkSize;
break;
case GDIP_CACHE_OBJECT_PEN:
rc = _UH.GdiplusObjectPenCacheChunkSize;
break;
case GDIP_CACHE_OBJECT_IMAGE:
rc = _UH.GdiplusObjectImageCacheChunkSize;
break;
case GDIP_CACHE_OBJECT_IMAGEATTRIBUTES:
rc = _UH.GdiplusObjectImageAttributesCacheChunkSize;
break;
default:
rc = 0;
break;
}
return rc;
}
inline void DCAPI UH_SetServerGdipSupportLevel(
UINT32 SupportLevel)
{
_UH.ServerGdiplusSupportLevel = SupportLevel;
}
/**************************************************************************/
/* Name: UHIsValidNineGridCacheIndex */
/**************************************************************************/
inline HRESULT DCAPI UHIsValidNineGridCacheIndex(unsigned cacheIndex)
{
return cacheIndex < _UH.drawNineGridCacheEntries ?
S_OK : E_TSC_CORE_CACHEVALUE;
}
/**************************************************************************/
/* Name: UHIsValidFragmentCacheIndex */
/**************************************************************************/
inline HRESULT DCAPI UHIsValidFragmentCacheIndex(unsigned cacheIndex)
{
return (cacheIndex < UH_FGC_CACHE_MAXIMUMCELLCOUNT) ?
S_OK : E_TSC_CORE_CACHEVALUE;
}
#ifdef DC_DEBUG
void DCAPI UH_HatchRect(int, int, int, int, COLORREF, unsigned);
DCVOID DCAPI UH_HatchOutputRect(DCINT left, DCINT top, DCINT right,
DCINT bottom, COLORREF color, DCUINT hatchStyle);
DCVOID DCAPI UH_HatchRectDC(HDC hdc, DCINT left, DCINT top, DCINT right,
DCINT bottom, COLORREF color, DCUINT hatchStyle);
#endif
HRESULT DCAPI UHDrawMemBltOrder(HDC, MEMBLT_COMMON FAR *);
#ifdef DC_DEBUG
void DCAPI UHLabelMemBltOrder(int, int, unsigned, unsigned);
#endif
void DCAPI UHUsePen(unsigned, unsigned, DCCOLOR, unsigned);
/****************************************************************************/
/* Name: UHConvertToWindowsROP */
/* */
/* Purpose: Converts a rop index (in the range 0-255) to a 32-bit Windows */
/* rop code. */
/* */
/* Returns: 32-bit rop value. */
/****************************************************************************/
inline UINT32 DCAPI UHConvertToWindowsROP(unsigned ropIndex)
{
UINT32 rc;
DC_BEGIN_FN("UHConvertToWindowsROP");
TRC_ASSERT((ropIndex <= 0xFF), (TB, _T("ropIndex (%u) invalid"), ropIndex));
/************************************************************************/
/* Simply take the ROP value from the uhWindowsROPs lookup table and */
/* place the ropIndex in the upper 16-bits. */
/************************************************************************/
rc = (((UINT32)ropIndex) << 16) | (UINT32)(uhWindowsROPs[ropIndex]);
DC_END_FN();
return rc;
}
HRESULT DCAPI UHUseBrush(unsigned, unsigned, DCCOLOR, unsigned, BYTE [7]);
void DCAPI UHUseBrushOrg(int, int);
/****************************************************************************/
/* Name: UHDrawGlyphOrder */
/* */
/* Purpose: Initiates the drawing of a glyph order */
/****************************************************************************/
inline HRESULT DCAPI UHDrawGlyphOrder(
LPINDEX_ORDER pOrder,
LPVARIABLE_INDEXBYTES pVariableBytes)
{
HRESULT hr = S_OK;
DC_BEGIN_FN("UHDrawGlyphOrder");
if (pOrder->cacheId >= UH_GLC_NUM_CACHES) {
TRC_ABORT((TB,_T("Invalid glyph cacheId=%d"), pOrder->cacheId));
hr = E_TSC_CORE_CACHEVALUE;
DC_QUIT;
}
// The structure is defined with 255 elements
if (0 >= pVariableBytes->len ||255 < pVariableBytes->len) {
TRC_ABORT((TB,_T("Invalid glyph order length")));
hr = E_TSC_CORE_LENGTH;
DC_QUIT;
}
hr = _pGh->GH_GlyphOut(pOrder, pVariableBytes);
DC_EXIT_POINT:
DC_END_FN();
return hr;
}
HRESULT DCAPI UHProcessCacheGlyphOrderRev2(BYTE, unsigned, BYTE FAR *,
unsigned);
VOID DCINTERNAL UHResetAndRestartEnumeration();
VOID DCINTERNAL UHSendPersistentBitmapKeyList(ULONG_PTR unusedParm);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UHSendPersistentBitmapKeyList);
inline BOOL DCINTERNAL UHReadFromCacheFileForEnum(VOID);
VOID DCINTERNAL UHEnumerateBitmapKeyList(ULONG_PTR unusedParm);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UHEnumerateBitmapKeyList);
BOOL DCINTERNAL UHSendBitmapCacheErrorPDU(ULONG_PTR cacheId);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UHSendBitmapCacheErrorPDU);
BOOL DCINTERNAL UHSendOffscrCacheErrorPDU(DCUINT unused);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UHSendOffscrCacheErrorPDU);
#ifdef DRAW_NINEGRID
BOOL DCINTERNAL UHSendDrawNineGridErrorPDU(DCUINT unused);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UHSendDrawNineGridErrorPDU);
#endif
BOOL DCINTERNAL UHReadFromCacheIndexFile(VOID);
#ifdef DRAW_GDIPLUS
BOOL DCINTERNAL UHSendDrawGdiplusErrorPDU(DCUINT unused);
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CUH, UHSendDrawGdiplusErrorPDU);
#endif
private:
//
// Internal functions (from wuhint.h)
//
/****************************************************************************/
/* FUNCTIONS */
/****************************************************************************/
#ifndef OS_WINCE
inline HRESULT UHSetCurrentCacheFileName(UINT cacheId, UINT copyMultiplier);
#else
VOID UHSetCurrentCacheFileName(UINT cacheId, UINT copyMultiplier);
#endif
inline BOOL UHGrabPersistentCacheLock();
inline VOID UHReleasePersistentCacheLock();
inline HANDLE UHFindFirstFile(const TCHAR *, TCHAR *, long *);
inline BOOL UHFindNextFile(HANDLE, TCHAR *, long *);
inline void UHFindClose(HANDLE);
inline BOOL UHGetDiskFreeSpace(TCHAR *, ULONG *, ULONG *, ULONG *, ULONG *);
inline DCBOOL DCINTERNAL UHIsHighVGAColor(BYTE, BYTE, BYTE);
HRESULT DCINTERNAL UHCacheBitmap(UINT, UINT32,
TS_SECONDARY_ORDER_HEADER *, PUHBITMAPINFO, PBYTE);
inline VOID DCINTERNAL UHLoadBitmapBits(UINT, UINT32,
PUHBITMAPCACHEENTRYHDR *, PBYTE *);
inline VOID DCINTERNAL UHInitBitmapCachePageTable(UINT);
inline BOOL DCINTERNAL UHAllocBitmapCachePageTable(UINT32, UINT);
BOOL DCINTERNAL UHCreateCacheDirectory();
DCBOOL DCINTERNAL UHAllocOneGlyphCache(PUHGLYPHCACHE, DCUINT32);
DCBOOL DCINTERNAL UHAllocOneFragCache(PUHFRAGCACHE pCache,
DCUINT32 numEntries);
void DCINTERNAL GHSetShadowBitmapInfo();
unsigned DCINTERNAL UHGetANSICodePage();
void DCINTERNAL UHCommonDisable(BOOL fDisplayDisabledBitmap);
HRESULT DCINTERNAL UHProcessBitmapRect(TS_BITMAP_DATA UNALIGNED FAR *);
void DCINTERNAL UHResetDCState();
HRESULT DCINTERNAL UHProcessCacheBitmapOrder(void *, DCUINT);
HRESULT DCINTERNAL UHProcessCacheColorTableOrder(
PTS_CACHE_COLOR_TABLE_ORDER, DCUINT);
HRESULT DCINTERNAL UHProcessCacheGlyphOrder(PTS_CACHE_GLYPH_ORDER, DCUINT);
HRESULT DCINTERNAL UHProcessCacheBrushOrder(const TS_CACHE_BRUSH_ORDER *, DCUINT);
HRESULT DCINTERNAL UHCreateOffscrBitmap(PTS_CREATE_OFFSCR_BITMAP_ORDER,
DCUINT, unsigned *);
HRESULT DCINTERNAL UHSwitchBitmapSurface(PTS_SWITCH_SURFACE_ORDER, DCUINT);
HRESULT DCINTERNAL UHDrawOffscrBitmapBits(HDC hdc, MEMBLT_COMMON FAR *pMB);
#ifdef DRAW_GDIPLUS
HRESULT DCINTERNAL UHDrawGdiplusPDUComplete( ULONG, ULONG);
HRESULT DCINTERNAL UHDrawGdiplusPDUFirst(PTS_DRAW_GDIPLUS_ORDER_FIRST pOrder, DCUINT, unsigned *);
HRESULT DCINTERNAL UHDrawGdiplusPDUNext(PTS_DRAW_GDIPLUS_ORDER_NEXT pOrder, DCUINT, unsigned *);
HRESULT DCINTERNAL UHDrawGdiplusPDUEnd(PTS_DRAW_GDIPLUS_ORDER_END pOrder, DCUINT, unsigned *);
HRESULT DCINTERNAL UHDrawGdiplusCacheData(TSUINT16 CacheType, TSUINT16 CacheID, unsigned cbTotalSize);
HRESULT DCINTERNAL UHAssembleGdipEmfRecord(unsigned EmfSize, unsigned TotalSize);
HRESULT DCINTERNAL UHDrawGdiplusCachePDUFirst(PTS_DRAW_GDIPLUS_CACHE_ORDER_FIRST pOrder, DCUINT, unsigned *);
HRESULT DCINTERNAL UHDrawGdiplusCachePDUNext(PTS_DRAW_GDIPLUS_CACHE_ORDER_NEXT pOrder, DCUINT, unsigned *);
HRESULT DCINTERNAL UHDrawGdiplusCachePDUEnd(PTS_DRAW_GDIPLUS_CACHE_ORDER_END pOrder, DCUINT, unsigned *);
BOOL DCINTERNAL UHDrawGdipRemoveImageCacheEntry(TSUINT16 CacheID);
#endif
#ifdef DRAW_NINEGRID
#if 0
void DCINTERNAL UHCreateDrawStreamBitmap(PTS_CREATE_DRAW_STREAM_ORDER);
void DCINTERNAL UHDecodeDrawStream(PBYTE streamIn, unsigned streamSize, PBYTE streamOut,
unsigned *streamOutSize);
unsigned DCINTERNAL UHDrawStream(PTS_DRAW_STREAM_ORDER pOrder);
#endif
HRESULT DCINTERNAL UHCreateNineGridBitmap(PTS_CREATE_NINEGRID_BITMAP_ORDER, DCUINT, unsigned *);
HRESULT DCINTERNAL CUH::UHCacheStreamBitmapFirstPDU(
PTS_STREAM_BITMAP_FIRST_PDU pOrder, DCUINT, unsigned *);
HRESULT DCINTERNAL CUH::UHCacheStreamBitmapNextPDU(
PTS_STREAM_BITMAP_NEXT_PDU pOrder, DCUINT, unsigned *);
#endif
PBYTE DCINTERNAL UHGetMemBltBits(HDC, unsigned, unsigned, unsigned *,
PUHBITMAPCACHEENTRYHDR *);
BOOL DCINTERNAL UHDIBCopyBits(HDC, int, int, int, int, int, int, PBYTE,
UINT, PBITMAPINFO, BOOL);
void DCINTERNAL UHCalculateColorTableMapping(unsigned);
BOOL DCINTERNAL UHAllocColorTableCacheMemory();
DCBOOL DCINTERNAL UHAllocGlyphCacheMemory();
DCBOOL DCINTERNAL UHAllocBrushCacheMemory();
DCBOOL DCINTERNAL UHAllocOffscreenCacheMemory();
#ifdef DRAW_NINEGRID
DCBOOL DCINTERNAL UHAllocDrawNineGridCacheMemory();
#endif
#ifdef DRAW_GDIPLUS
DCBOOL DCINTERNAL UHAllocDrawGdiplusCacheMemory();
#endif
void DCINTERNAL UHReadBitmapCacheSettings();
void DCINTERNAL UHAllocBitmapCacheMemory();
void DCINTERNAL UHFreeCacheMemory();
#if ((!defined(OS_WINCE)) || (defined(ENABLE_BMP_CACHING_FOR_WINCE)))
UINT32 DCINTERNAL UHEvictLRUCacheEntry(UINT cacheId);
UINT32 DCINTERNAL UHFindFreeCacheEntry(UINT cacheId);
VOID DCINTERNAL UHTouchMRUCacheEntry(UINT cacheId, UINT32 iEntry);
#endif //((!defined(OS_WINCE)) || (defined(ENABLE_BMP_CACHING_FOR_WINCE)))
#ifdef DC_HICOLOR
DCUINT32 DCINTERNAL UHAllocOneBitmapCache(DCUINT32 maxMemToUse,
DCUINT entrySize,
HPDCVOID DCPTR ppCacheData,
HPDCVOID DCPTR ppCacheHdr);
#else
DCBOOL DCINTERNAL UHAllocOneBitmapCache(DCUINT32 maxMemToUse,
DCUINT entrySize,
HPDCVOID DCPTR ppCacheData,
HPDCVOID DCPTR ppCacheHdr);
#endif
DCBOOL DCINTERNAL UHCreateBitmap(HBITMAP* hBitmap,
HDC* hdcBitmap,
HBITMAP* hUnusedBitmap,
DCSIZE bitmapSize,
INT nForceBmpBpp=0);
void DCINTERNAL UHDeleteBitmap(HDC *, HBITMAP *, HBITMAP *);
#if ((!defined(OS_WINCE)) || (defined(ENABLE_BMP_CACHING_FOR_WINCE)))
BOOL DCINTERNAL UHSavePersistentBitmap(
#ifndef VM_BMPCACHE
HANDLE hFile,
#else
UINT cacheId,
#endif
UINT32 fileNum,
PDCUINT8 pCompressedBitmapBits,
UINT noBCHeader,
PUHBITMAPINFO pBitmapInfo);
HRESULT DCINTERNAL UHLoadPersistentBitmap(
HANDLE hFile,
UINT32 offset,
UINT cacheId,
UINT32 cacheIndex,
PUHBITMAPCACHEPTE pPTE);
#endif // ((!defined(OS_WINCE)) || (defined(ENABLE_BMP_CACHING_FOR_WINCE)))
void DCINTERNAL UHMaybeCreateShadowBitmap();
void DCINTERNAL UHMaybeCreateSaveScreenBitmap();
#ifdef OS_WINCE
void DCINTERNAL UHGetPaletteCaps();
#endif
#ifdef DC_DEBUG
void DCINTERNAL UHInitBitmapCacheMonitor();
void DCINTERNAL UHTermBitmapCacheMonitor();
LRESULT CALLBACK UHBitmapCacheWndProc( HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam );
static LRESULT CALLBACK UHStaticBitmapCacheWndProc( HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam );
void DCINTERNAL UHSetMonitorEntryState(unsigned, ULONG, BYTE, BYTE);
void DCINTERNAL UHCacheDataReceived(unsigned cacheId, ULONG cacheIndex);
void DCINTERNAL UHCacheEntryUsed(
unsigned cacheId,
ULONG cacheEntry,
unsigned colorTableCacheEntry);
#define UHCacheEntryEvictedFromMem(_id, _entry) \
UHSetMonitorEntryState(_id, _entry, UH_CACHE_STATE_ON_DISK, \
UH_CACHE_TRANSITION_EVICTED)
#define UHCacheEntryEvictedFromDisk(_id, _entry) \
UHSetMonitorEntryState(_id, _entry, UH_CACHE_STATE_UNUSED, \
UH_CACHE_TRANSITION_EVICTED)
#define UHCacheEntryKeyLoadOnSessionStart(_id, _entry) \
UHSetMonitorEntryState(_id, _entry, UH_CACHE_STATE_ON_DISK, \
UH_CACHE_TRANSITION_KEY_LOAD_ON_SESSION_START)
#define UHCacheEntryLoadedFromDisk(_id, _entry) \
UHSetMonitorEntryState(_id, _entry, UH_CACHE_STATE_IN_MEMORY, \
UH_CACHE_TRANSITION_LOADED_FROM_DISK)
void DCINTERNAL UHGetCacheBlobRect(unsigned, ULONG, LPRECT);
BOOL DCINTERNAL UHGetCacheBlobFromPoint(LPPOINT, unsigned *, ULONG *);
void DCINTERNAL UHDisplayCacheEntry(HDC, unsigned, ULONG);
void DCINTERNAL UHRefreshDisplayedCacheEntry();
void DCINTERNAL UHEnableBitmapCacheMonitor(void);
void DCINTERNAL UHDisconnectBitmapCacheMonitor(void);
#endif /* DC_DEBUG */
#if ((defined(OS_WINCE)) && (defined(ENABLE_BMP_CACHING_FOR_WINCE)))
#ifndef _tremove
#define _tremove DeleteFile
#endif
#define WINCE_STORAGE_CARD_DIRECTORY _T("\\Storage Card\\")
#define WINCE_FILE_SYSTEM_ROOT _T("\\")
#endif
/****************************************************************************/
/* Name: UHUseBkMode */
/* */
/* Purpose: Sets given background mode in output DC. */
/****************************************************************************/
#if defined (OS_WINCE)
#define UHUseBkMode(_mode, uhinst) \
if (((_mode) != (uhinst)->_UH.lastBkMode) || \
((uhinst)->_UH.hdcDraw != (uhinst)->_UH.validBkModeDC)) \
{ \
SetBkMode((uhinst)->_UH.hdcDraw, (_mode)); \
(uhinst)->_UH.lastBkMode = (_mode); \
(uhinst)->_UH.validBkModeDC = (uhinst)->_UH.hdcDraw; \
}
#else
#define UHUseBkMode(_mode, uhinst) \
{ \
SetBkMode((uhinst)->_UH.hdcDraw, (_mode)); \
(uhinst)->_UH.lastBkMode = (_mode); \
}
#endif
/****************************************************************************/
/* Name: UHUseROP2 */
/* */
/* Purpose: Sets given ROP2 in the output DC. */
/****************************************************************************/
#if defined (OS_WINCE)
#define UHUseROP2(_rop2, uhinst) \
if (((_rop2) != (uhinst)->_UH.lastROP2) || \
((uhinst)->_UH.hdcDraw != (uhinst)->_UH.validROPDC)) \
{ \
SetROP2((uhinst)->_UH.hdcDraw, (int)(_rop2)); \
(uhinst)->_UH.lastROP2 = (_rop2); \
(uhinst)->_UH.validROPDC = (uhinst)->_UH.hdcDraw; \
}
#else
#define UHUseROP2(_rop2, uhinst) \
{ \
SetROP2((uhinst)->_UH.hdcDraw, (int)(_rop2)); \
(uhinst)->_UH.lastROP2 = (_rop2); \
}
#endif
/****************************************************************************/
/* Name: UHUseBrushOrg */
/* */
/* Purpose: Sets given brush origin in the output DC. */
/****************************************************************************/
/************************************************************************/
/* JPB: There is a bug in WinNT as follows (as far as I can determine */
/* from observing the external behavior!)... */
/* */
/* When drawing to DIBSections, a particular (unknown) graphics */
/* operation occasionally modifies the brush origin in the DC state (in */
/* kernel mode). I don't know what this operation is, and think that */
/* it probably shouldn't be doing it. But it does. */
/* */
/* If this was the only problem, we could handle it by simply setting */
/* the origin to the desired value before every graphics call. */
/* However, this doesn't work! It appears that there is a "fastpath" */
/* check in the GDI that compares the supplied parameters with the */
/* previously set parameters, and takes an early exit if they are the */
/* same (i.e. does not update the DC). Therefore if we set the origin */
/* to (0,0), it gets mangled by the DIBSection code, then we try to */
/* set it to (0,0) again the actual DC value is NOT updated (i.e. stays */
/* in the mangled state). */
/* */
/* We therefore have to force the new origin to be set correctly in the */
/* DC by setting it twice: once to a value different from the one we */
/* want, then once to the actual value. Not pretty, but unfortunately */
/* seems to be the only way to ensure that the origin is set correctly! */
/* */
/* This problem has only been observed when drawing to 8bpp DIBSections */
/* on 16bpp and 24bpp machines. */
/************************************************************************/
/************************************************************************/
/* For Win9x we need to unrealise and re-select the brush before the */
/* new origin will take effect (BLAH!). On NT this does nothing. */
/************************************************************************/
#define UHUseBrushOrg(_x, _y, uhinst) \
SetBrushOrgEx((uhinst)->_UH.hdcDraw, (_x) + 1, (_y) + 1, NULL); \
SetBrushOrgEx((uhinst)->_UH.hdcDraw, (_x), (_y), NULL);
#ifdef DC_HICOLOR
/****************************************************************************/
/* Macro to calculate the number of cache entries that fit in a given space */
/****************************************************************************/
#define CALC_NUM_CACHE_ENTRIES(newNumEntries, origNumEntries, memLen, cacheId) \
{ \
DCUINT32 numEntries = (memLen) / UH_CellSizeFromCacheID((cacheId)); \
newNumEntries = DC_MIN(numEntries, origNumEntries); \
}
#endif
/****************************************************************************/
/* Name: UHUseFillMode */
/* */
/* Purpose: Sets given fill mode in the output DC. */
/****************************************************************************/
#if !defined(OS_WINCE) || defined(OS_WINCE_POLYFILLMODE)
#define UHUseFillMode(_mode, uhinst) \
{ \
SetPolyFillMode((uhinst)->_UH.hdcDraw, ((_mode) == ORD_FILLMODE_WINDING) ? \
WINDING : ALTERNATE); \
(uhinst)->_UH.lastFillMode = (unsigned)(_mode); \
}
#else
#define UHUseFillMode(_mode, uhinst) \
(uhinst)->_UH.lastFillMode = (_mode);
#endif
BOOL UHCreateDisconnectedBitmap();
private:
CGH* _pGh;
COP* _pOp;
CSL* _pSl;
CUT* _pUt;
CFS* _pFs;
COD* _pOd;
CIH* _pIh;
CCD* _pCd;
CUI* _pUi;
CCC* _pCc;
CCLX* _pClx;
COR* _pOr;
private:
CObjs* _pClientObjects;
};
#undef TRC_GROUP
#undef TRC_FILE
#undef TSC_HR_FILEID
#endif // _H_UH_