⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swconvrt.cpp

📁 wince下的源代码集合打包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved.*/#include "precomp.h"#define NUMINTENSITYGROUPS	(31 + 15 + 7 + 1)	// (=54) Green,  Red,  Blue,  black#define NUMRECENTENTRIES	16class LRU{	unsigned long		*m_aiUniq;	short				*m_aiNewer;	short				*m_aiOlder;	short				m_nLRU;	short				m_nMRU;	short				m_nListSize;public:						LRU();						Init( short listSize );	short				Find( unsigned long iUniq );	// -1 == not found	short				Add( unsigned long iUniq );		// returns index chosen	void				Fill( unsigned long value );	void				Free();//						~LRU();};class MaskInfo{public:	unsigned long		m_aMask[3];			// entry #0:r, #1:g, #2:b	unsigned char		m_anShift[3];		// To align top bit with bit#31	unsigned short		m_iType;	void				InitMaskInfo(							XLATEOBJ *pxo,							unsigned long ColorSource,	// XO_DESTPALETTE etc							unsigned short ColorType );};// static unsigned long    (ColorConverter::*m_afpConvertFunction[])(unsigned long);class MaskColorConverter : public ColorConverter{protected:	MaskInfo			m_Src;			// Source bitmasks	MaskInfo			m_Dst;			// Dest bitmaskspublic:	unsigned long		RGBToFromBGR( unsigned long rgbSrc );	unsigned long		MaskedSrcToRGB( unsigned long maskedSrc );	unsigned long		MaskedSrcToBGR( unsigned long maskedSrc );	unsigned long		RGBSrcToMaskedDst( unsigned long rgbSrc );	unsigned long		BGRSrcToMaskedDst( unsigned long bgrSrc );	unsigned long		MaskedSrcToMaskedDst( unsigned long maskedSrc );	void				Init( XLATEOBJ *pxo );};class GroupColorConverter : public ColorConverter{	unsigned long		m_aRecentResult[NUMRECENTENTRIES];	LRU					m_LRURecent;	short				m_piDstNext[256];	// Chain of entries of similar intensity	short				m_aiIntensityHead[NUMINTENSITYGROUPS+1];	// last == -1	unsigned short		m_nLowestGroup;	// Index of first valid entry in m_aiIntensityHead[]	unsigned short		m_nHighestGroup;// Index of first -1 in m_aiIntensityHead[]	unsigned long		m_pPalette[256];// Destination palette	 	unsigned short		m_nPaletteSize;	// Destination palette size ( <= 256 )	MaskInfo			m_Src;			// Source bitmaskspublic:	unsigned long		RGBToFromBGR( unsigned long rgbSrc );	unsigned long		MaskedSrcToRGB( unsigned long maskedSrc );	unsigned long		MaskedSrcToPaletteDst( unsigned long maskedSrc );	int					InitLRU();	void				FreeLRU();	void				Init( XLATEOBJ *pxo );};class MonoColorConverter : public ColorConverter{	unsigned long		m_BackgroundColor;public:	unsigned long		AnyToMono( unsigned long srcValue );	void				Init( unsigned long color )						{							m_BackgroundColor = color;						}};class LookupColorConverter : public ColorConverter{	MaskInfo			m_Dst;			// Dest bitmasks	unsigned long		m_aLookup[256];public:	unsigned long		RGBSrcToMaskedDst( unsigned long rgbSrc );	void				Init( XLATEOBJ *pxo );	unsigned long *		LookupTable() { return m_aLookup; }};#define MASK_LRU_SIZE 10#define GROUP_LRU_SIZE 2#define MONO_LRU_SIZE 10#define LOOKUP_LRU_SIZE 4LRU gMaskedLRU;LRU gGroupLRU;LRU gMonoLRU;LRU gLookupLRU;MaskColorConverter gMaskedConverter[MASK_LRU_SIZE];GroupColorConverter gGroupConverter[GROUP_LRU_SIZE];MonoColorConverter gMonoConverter[MONO_LRU_SIZE];LookupColorConverter gLookupConverter[LOOKUP_LRU_SIZE];// If AllocConverters fails, this returns 0. No free's are done as the driver is going// to exit anyway.int AllocConverters(){	int i;	if( !gMaskedLRU.Init(MASK_LRU_SIZE) ||		!gGroupLRU.Init(GROUP_LRU_SIZE) ||		!gMonoLRU.Init(MONO_LRU_SIZE) ||		!gLookupLRU.Init(LOOKUP_LRU_SIZE) )		return 0;		for( i=0; i<GROUP_LRU_SIZE; i++ )		if( !gGroupConverter[i].InitLRU() )			return 0;	return 1;}void FreeConverters(){	int i;	gMaskedLRU.Free();	gGroupLRU.Free();	gMonoLRU.Free();	gLookupLRU.Free();	for( i=0; i<GROUP_LRU_SIZE; i++ )		gGroupConverter[i].FreeLRU();}int GroupColorConverter::InitLRU(){	return m_LRURecent.Init(NUMRECENTENTRIES);}void GroupColorConverter::FreeLRU(){	m_LRURecent.Free();}LRU::LRU(){	m_aiUniq = (unsigned long *)NULL;	m_aiNewer = (short *)NULL;	m_aiOlder = (short *)NULL;}int LRU::Init( short listSize ){	int i;	DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("LRU::LRU( list size = %d )\r\n"),listSize ));	m_aiUniq = (unsigned long *)malloc( listSize * sizeof(unsigned long) );	m_aiNewer = (short *)malloc( listSize * sizeof(unsigned short) );	m_aiOlder = (short *)malloc( listSize * sizeof(unsigned short) );	if( !m_aiUniq || !m_aiNewer || !m_aiOlder )		return 0;	// see AllocConverters	m_nListSize = listSize;	for( i=0; i<m_nListSize; i++ )	{		m_aiUniq[i] = 0;		m_aiNewer[i] = i-1;		// Note that m_aiNewer[m_nMRU] is "undefined"		m_aiOlder[i] = i+1;		// Note that m_aiOlder[m_nLRU] is "undefined"	}	m_nMRU = 0;	m_nLRU = m_nListSize-1;	return 1;}short LRU::Find( unsigned long iUniq )	// -1 == not found{	int i;	for( i=0; i<m_nListSize; i++ )	{		if( m_aiUniq[i] == iUniq )		{			DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("LRU 0x%08x Find 0x%08x: found at location %d\r\n"),				this, iUniq, i ));			// Now we pop this to the most recently used:			if( i == m_nLRU )			{				m_nLRU = m_aiNewer[i];				m_aiNewer[m_nMRU] = i;				m_aiOlder[i] = m_nMRU;				m_nMRU = i;			}			else if ( i != m_nMRU )			{				m_aiNewer[m_aiOlder[i]] = m_aiNewer[i];				m_aiOlder[m_aiNewer[i]] = m_aiOlder[i];				m_aiNewer[m_nMRU] = i;				m_aiOlder[i] = m_nMRU;				m_nMRU = i;			}			return i;		}	}	DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("LRU 0x%08x Find 0x%08x: Not found!\r\n"),		this, iUniq ));	return -1;}short LRU::Add( unsigned long iUniq )		// returns index chosen{	m_aiNewer[m_nMRU] = m_nLRU;	m_aiOlder[m_nLRU] = m_nMRU;	m_nMRU = m_nLRU;	m_nLRU = m_aiNewer[m_nLRU];	m_aiUniq[m_nMRU] = iUniq;	return m_nMRU;	}void LRU::Fill( unsigned long value ){	int i;	for( i=0; i<m_nListSize; i++ )		m_aiUniq[i] = value;}// Not needed so long as DrvDisablePDEV gets called when this driver gets unloaded.//LRU::~LRU()//{//	Free();//}void LRU::Free(){	if( m_aiUniq )	{		free( (void *)m_aiUniq );		m_aiUniq = (unsigned long *)NULL;	}	if( m_aiNewer )	{		free( (void *)m_aiNewer );		m_aiNewer = (short *)NULL;	}	if( m_aiOlder )	{		free( (void *)m_aiOlder );		m_aiOlder = (short *)NULL;	}}//typedef struct _XLATEOBJ {//    ULONG  iUniq;//    FLONG  flXlate;//    USHORT iSrcType;//    USHORT iDstType;//    ULONG  cEntries;//    ULONG  *pulXlate;//} XLATEOBJ;unsigned long SwapRedBlue( unsigned long srcValue ){	unsigned long dstValue = srcValue;	((unsigned char *)(&dstValue))[0] = ((unsigned char *)(&srcValue))[2];	((unsigned char *)(&dstValue))[2] = ((unsigned char *)(&srcValue))[0];	return dstValue;}//#define XO_TRIVIAL 1//#define XO_TABLE 2//#define XO_TO_MONO 4////#define PAL_INDEXED 1//#define PAL_BITFIELDS 2//#define PAL_RGB 4//#define PAL_BGR 8////#define XO_SRCPALETTE    1//#define XO_DESTPALETTE   2//#define XO_DESTDCPALETTE 3	void MaskInfo::InitMaskInfo(	XLATEOBJ *pxo,	unsigned long colorSource,	// XO_DESTPALETTE etc	unsigned short colorType )	// PAL_INDEXED etc{	unsigned long mask;	int topBit;	m_iType = colorType;	if( m_iType == PAL_BITFIELDS )	{		unsigned char component;		XLATEOBJ_cGetPalette( pxo, colorSource, 3, m_aMask );		for( component=0; component<3; component++ )		{			mask = m_aMask[component];			for( topBit=0; mask; topBit++ )				mask>>=1;			m_anShift[component] = 32-topBit;		}	}}#define FNTYPE (unsigned long (ColorConverter::*)(unsigned long)) unsigned long (ColorConverter::* const m_afpConvertFunction[])(unsigned long) =// unsigned long (ColorConverter::*ColorConverter::m_afpConvertFunction[])(unsigned long) ={//	(unsigned long (ColorConverter::*)(unsigned long)) NULL,	// Indexed -> indexed//	(unsigned long (ColorConverter::*)(unsigned long)) NULL,	// Indexed -> bitfield//	(unsigned long (ColorConverter::*)(unsigned long)) NULL,	// Indexed -> rgb//	(unsigned long (ColorConverter::*)(unsigned long)) NULL,	// Indexed -> bgr	FNTYPE GroupColorConverter::MaskedSrcToPaletteDst,			// bitfield -> indexed	FNTYPE MaskColorConverter::MaskedSrcToMaskedDst,			// bitfield -> bitfield	FNTYPE MaskColorConverter::MaskedSrcToRGB,					// bitfield -> rgb	FNTYPE MaskColorConverter::MaskedSrcToBGR,					// bitfield -> bgr	FNTYPE GroupColorConverter::MaskedSrcToPaletteDst,			// rgb -> indexed	FNTYPE MaskColorConverter::RGBSrcToMaskedDst,				// rgb -> bitfield	FNTYPE NULL,												// rgb -> rgb	FNTYPE MaskColorConverter::RGBToFromBGR,					// rgb -> bgr	FNTYPE GroupColorConverter::MaskedSrcToPaletteDst,			// bgr -> indexed	FNTYPE MaskColorConverter::BGRSrcToMaskedDst,				// bgr -> bitfield	FNTYPE MaskColorConverter::RGBToFromBGR,					// bgr -> rgb	FNTYPE NULL													// bgr -> bgr};static unsigned char log2nOver2[] = { 0, 1, 2, 2, 3 };unsigned long RGBError(	unsigned long v1,	unsigned long v2 ){	unsigned char *p1 = (unsigned char *)&v1;	unsigned char *p2 = (unsigned char *)&v2;	long accum = *p1++ - *p2++;	accum *= accum;	long diff = *p1++ - *p2++;	accum += diff * diff;	diff = *p1++ - *p2++;	return accum + diff * diff;}short RGBToGroup( unsigned long rgbValue ){	// From 0x00bbggrr format	return (short)(		((rgbValue>>(24-3))&7)+		// 3 bits blue		((rgbValue>>(16-5))&31)+	// 5 bits green		((rgbValue>>(8-4))&15));		// 4 bits red}void ColorConverter::InitConverter(	XLATEOBJ *pxo,	ColorConverter **ppConvertObj,	unsigned long (ColorConverter::**ppConvertFn)(unsigned long),	unsigned long **ppLookup ){//	m_iUniq = pxo->iUniq;	*ppConvertObj = (ColorConverter *)NULL;	*ppLookup = (unsigned long *)NULL;	*ppConvertFn = NULL;	short converterIndex;	if( pxo->flXlate == XO_TRIVIAL )	{		DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("XO_TRIVIAL\r\n")));		;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -