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

📄 vram2b.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
	DWORD *pixelPos = (DWORD *)desLinePos, ad;
	DWORD unitValue = srcValue;
	SHORT i, k;
	
	DWORD mask;
	WORD totalOffset, num, r;

	ad = ( (DWORD)pixelPos ) & 0x3;
	if( ad != 0 )		// 奇地址
	{
////		pixelPos = (DWORD *)(( (DWORD)pixelPos ) - ( 4 - ad ));
////		desBitOffset += (CHAR)( ( 4 - ad )<< 3 );
		pixelPos = (DWORD *)(( (DWORD)pixelPos ) - ( ad ));
		desBitOffset += (CHAR)( ( ad )<< 3 );
	}

	totalOffset = ( len << LOG_PIXEL_BITS ) + desBitOffset;
	num = totalOffset >> 5;		// 4 bytes 
	r = totalOffset & 0x1f;
	for( i = -2, k = BITS_PER_PIXEL; i < LOG_PIXEL_NUM; i ++ )	// 循环次数为log2( PIXEL_NUM * 4 )
	{
		unitValue |= ( unitValue << k );
		k = k << 1;
	}
	
	if( desBitOffset != 0 )
	{						
		if( num == 0 )	// 不到一个整单位
		{
	#ifdef BIG_ENDIAN_ORDER
			mask = MAKEMASK( totalOffset - desBitOffset ) << ( 32 - totalOffset );
			mask = exbyte(mask);
	#else
			mask = MAKEMASK( totalOffset - desBitOffset ) << desBitOffset;
			mask = test(mask);
	#endif
//			PixelMaskOp( pixelPos, unitValue, mask, op );
			PIXELMASKOP( pixelPos, unitValue, mask, op )
		}
		else	// 超过一个整单位
		{
	#ifdef BIG_ENDIAN_ORDER
			mask = MAKEMASK( 32 - desBitOffset );
			mask = exbyte(mask);
	#else
			mask = ~MAKEMASK( desBitOffset );
			mask = test(mask);
	#endif
//			PixelMaskOp( pixelPos, unitValue, mask, op );	// 头部
			PIXELMASKOP( pixelPos, unitValue, mask, op )	// 头部
			pixelPos++;
			
			switch( op )
			{
				case GPC_REPLACE_STYLE:
				case GPC_COPY_STYLE:
					for( i = 1; i < num; i++, pixelPos++ )
						(*pixelPos) = unitValue;
					break;
				case GPC_XOR_STYLE:
					for( i = 1; i < num; i++, pixelPos++ )
						(*pixelPos) ^= unitValue;
					break;
				case GPC_AND_STYLE:
					for( i = 1; i < num; i++, pixelPos++ )
						(*pixelPos) &= unitValue;
					break;
				case GPC_OR_STYLE:
					for( i = 1; i < num; i++, pixelPos++ )
						(*pixelPos) |= unitValue;
					break;
				default:
					break;
			}
			
			if( r != 0 )	// 尾部
			{
	#ifdef BIG_ENDIAN_ORDER
				mask = ~MAKEMASK( 32 - r );
				mask = exbyte(mask);
	#else
				mask = MAKEMASK( r );
				mask = test(mask);
	#endif
//				PixelMaskOp( pixelPos, unitValue, mask, op );
				PIXELMASKOP( pixelPos, unitValue, mask, op )
			}
		}
	}
	else	// 起始边界对齐
	{
		switch( op )
		{
			case GPC_REPLACE_STYLE:
			case GPC_COPY_STYLE:
				for( i = 0; i < num; i++, pixelPos++ )
					(*pixelPos) = unitValue;
				break;
			case GPC_XOR_STYLE:
				for( i = 0; i < num; i++, pixelPos++ )
					(*pixelPos) ^= unitValue;
				break;
			case GPC_AND_STYLE:
				for( i = 0; i < num; i++, pixelPos++ )
					(*pixelPos) &= unitValue;
				break;
			case GPC_OR_STYLE:
				for( i = 0; i < num; i++, pixelPos++ )
					(*pixelPos) |= unitValue;
				break;
			default:
				break;
		}
		
		if( r != 0 )	// 尾部
		{
	#ifdef BIG_ENDIAN_ORDER
			mask = ~MAKEMASK( 32 - r );
			mask = exbyte(mask);
	#else
			mask = MAKEMASK( r );
			mask = test(mask);
	#endif
//			PixelMaskOp( pixelPos, unitValue, mask, op );
			PIXELMASKOP( pixelPos, unitValue, mask, op )
		}
	}	
}

//InvertLine 对指定行进行反色逻辑操作
//以32比特为一个操作单位
void InvertLine( PIXEL *desLinePos, CHAR desBitOffset, WORD len )
{
	DWORD *pixelPos = (DWORD *)desLinePos, ad;
	DWORD unitMask = -1;
	SHORT i;
	
	DWORD mask;
	WORD totalOffset, num, r;
	
	ad = ( (DWORD)pixelPos ) & 0x3;
	if( ad != 0 )		// 奇地址
	{
////		pixelPos = (DWORD *)(( (DWORD)pixelPos ) - ( 4 - ad ));
////		desBitOffset += (CHAR)( ( 4 - ad )<< 3 );
		pixelPos = (DWORD *)(( (DWORD)pixelPos ) - ( ad ));
		desBitOffset += (CHAR)( ( ad )<< 3 );

	}

	totalOffset = ( len << LOG_PIXEL_BITS ) + desBitOffset;
	num = totalOffset >> 5;		// 4 bytes 
	r = totalOffset & 0x1f;
	
	if( desBitOffset != 0 )
	{						
		if( num == 0 )	// 不到一个整单位
		{
	#ifdef BIG_ENDIAN_ORDER
			mask = MAKEMASK( totalOffset - desBitOffset ) << ( 32 - totalOffset );
			mask = exbyte(mask);
	#else
			mask = MAKEMASK( totalOffset - desBitOffset ) << desBitOffset;
	#endif
			(*pixelPos) ^= mask;
		}
		else	// 超过一个整单位
		{
	#ifdef BIG_ENDIAN_ORDER
			mask = MAKEMASK( 32 - desBitOffset );
			mask = exbyte(mask);
	#else
			mask = ~MAKEMASK( desBitOffset );
	#endif
			(*pixelPos) ^= mask;
			pixelPos++;
			
			for( i = 1; i < num; i++, pixelPos++ )
				(*pixelPos) ^= unitMask;
			
			if( r != 0 )	// 尾部
			{
	#ifdef BIG_ENDIAN_ORDER
				mask = ~MAKEMASK( 32 - r );
				mask = exbyte(mask);
	#else
				mask = MAKEMASK( r );
	#endif
				(*pixelPos) ^= mask;
			}
		}
	}
	else	// 起始边界对齐
	{
		for( i = 0; i < num; i++, pixelPos++ )
			(*pixelPos) ^= unitMask;
		
		if( r != 0 )	// 尾部
		{
	#ifdef BIG_ENDIAN_ORDER
			mask = ~MAKEMASK( 32 - r );
			mask = exbyte(mask);
	#else
			mask = MAKEMASK( r );
	#endif
			(*pixelPos) ^= mask;
		}
	}	
}

void LineUnicolorMaskOp( PIXEL *desLinePos, CHAR desBitOffset, WORD len, PIXEL srcValue, WORD mask, WORD op )
{
	PIXEL *pixelPos;
	PIXEL unitValue = srcValue;
	WORD i, enBit = 0;	
	CHAR bitOffset;

	pixelPos = desLinePos;
	bitOffset = desBitOffset;
	for( i = 0; i < len; i++ )
	{
		if( enBit == 0 )
			enBit = 0x8000;
		if( enBit & mask )
			PixelOp( pixelPos, bitOffset, srcValue, op );
		GetNextPixelPosition( &pixelPos, &bitOffset, pixelPos, bitOffset );
		enBit = enBit >> 1;
	}
}

//LineOp 对指定的两行进行逻辑操作(包括按位与、或、异或、复制等)
//以16比特为一组
void LineOp( PIXEL *desLinePos, CHAR desBitOffset, PIXEL *srcLinePos, CHAR srcBitOffset, WORD len, WORD op )
{
	WORD i;
	WORD *srcPos = (WORD *)srcLinePos, *desPos = (WORD *)desLinePos;
	WORD mask;
	DWORD totalOffset, num, r; 

	if( ( (DWORD)srcPos ) & 0x1 )		// 奇地址
	{
		srcPos = (WORD *)( ((DWORD)srcPos) -1 );
		srcBitOffset += 8;
	}

	if( ( (DWORD)desPos ) & 0x1 )		// 奇地址
	{
		desPos = (WORD *)( ((DWORD)desPos) -1 );
		desBitOffset += 8;
	}

	totalOffset = ( len << LOG_PIXEL_BITS ) + desBitOffset;	// 要求一行的像素个数小于1023
	num = totalOffset >> 4;
	r = totalOffset & 0xf;	// 尾比特数
	if( num == 0 )	// 像素尺寸小于剩余单位
	{
		WORD tempValue;

	#ifdef BIG_ENDIAN_ORDER
		mask = MAKEMASK( totalOffset - desBitOffset ) << ( 16 - totalOffset );
		mask = ex2byte(mask);
	#else
		mask = MAKEMASK( totalOffset - desBitOffset ) << desBitOffset;
		mask = test(mask);
	#endif
			
		if( srcBitOffset <= desBitOffset )
		{
	#ifdef BIG_ENDIAN_ORDER
			tempValue = (*srcPos) >> ( desBitOffset - srcBitOffset );
	#else
			tempValue = (*srcPos) << ( desBitOffset - srcBitOffset );
	#endif
			UnitMaskOp( desPos, tempValue, mask, op );
		}
		else
		{
	#ifdef BIG_ENDIAN_ORDER
			tempValue = (WORD)( ( (*((DWORD *)srcPos)) << ( srcBitOffset - desBitOffset ) ) >> 16 );
	#else
			tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> ( srcBitOffset - desBitOffset ) ) & 0xffff );
	#endif
			UnitMaskOp( desPos, tempValue, mask, op );
		}
	}
	else	// 其他
	{
		if( desBitOffset == srcBitOffset )	// 边界对齐
		{
	#ifdef BIG_ENDIAN_ORDER
			mask = MAKEMASK( 16 - srcBitOffset );
			mask = ex2byte(mask);
	#else
			mask = ~MAKEMASK( srcBitOffset );
			mask = test(mask);
	#endif
			UnitMaskOp( desPos, *srcPos, mask, op );
			desPos++;
			srcPos++;
			switch( op )
			{
				case GPC_REPLACE_STYLE:
				case GPC_COPY_STYLE:
					for( i = 1; i < num; i++, desPos++, srcPos++ )
						(*desPos) = (*srcPos);
					break;
				case GPC_XOR_STYLE:
					for( i = 1; i < num; i++, desPos++, srcPos++ )
						(*desPos) ^= (*srcPos);
					break;
				case GPC_AND_STYLE:
					for( i = 1; i < num; i++, desPos++, srcPos++ )
						(*desPos) &= (*srcPos);
					break;
				case GPC_OR_STYLE:
					for( i = 1; i < num; i++, desPos++, srcPos++ )
						(*desPos) |= (*srcPos);
					break;
				default:
					break;
			}
	#ifdef BIG_ENDIAN_ORDER
			mask = ~MAKEMASK( 16 - r );
			mask = ex2byte(mask);
	#else
			mask = MAKEMASK( r );
			mask = test(mask);
	#endif
			UnitMaskOp( desPos, *srcPos, mask, op );
		}
		else	// 边界不对齐
		{
			WORD tempValue, t;
			
				
			if( desBitOffset < srcBitOffset )
			{
				t = srcBitOffset - desBitOffset;
	#ifdef BIG_ENDIAN_ORDER
				tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> ( 16 -  t ) ) );
	#else
				tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
	#endif
			}
			else
			{
				t = desBitOffset - srcBitOffset;
	#ifdef BIG_ENDIAN_ORDER
				tempValue = (*srcPos) >> t;
	#else
				tempValue = (*srcPos) << t;
	#endif
			}
	#ifdef BIG_ENDIAN_ORDER
			mask = MAKEMASK( 16 - desBitOffset );
			mask = ex2byte(mask);
	#else
			mask = ~MAKEMASK( desBitOffset );
			mask = test(mask);
	#endif
			UnitMaskOp( desPos, tempValue, mask, op );

			desPos++;

			if( desBitOffset < srcBitOffset )
			{
				srcPos++;
	#ifdef BIG_ENDIAN_ORDER
				t = 16 - t;
	#endif
			}
			else
			{
	#ifdef BIG_ENDIAN_ORDER
	#else
				t = 16 - t;
	#endif
			}

			switch( op )
			{
				case GPC_REPLACE_STYLE:
				case GPC_COPY_STYLE:
					for( i = 1; i < num; i++, desPos++, srcPos++ )
					{
	#ifdef BIG_ENDIAN_ORDER
						tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
	#else
						tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
	#endif
						(*desPos) = tempValue;
					}
					break;
				case GPC_XOR_STYLE:
					for( i = 1; i < num; i++, desPos++, srcPos++ )
					{
	#ifdef BIG_ENDIAN_ORDER
						tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
	#else
						tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
	#endif
						(*desPos) ^= tempValue;
					}
					break;
				case GPC_AND_STYLE:
					for( i = 1; i < num; i++, desPos++, srcPos++ )
					{
	#ifdef BIG_ENDIAN_ORDER
						tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
	#else
						tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
	#endif
						(*desPos) &= tempValue;
					}
					break;
				case GPC_OR_STYLE:
					for( i = 1; i < num; i++, desPos++, srcPos++ )
					{
	#ifdef BIG_ENDIAN_ORDER
						tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
	#else
						tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
	#endif
						(*desPos) |= tempValue;

⌨️ 快捷键说明

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