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

📄 gpcbmp.c

📁 一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <string.h>
#include <sys\gpc.h>
#include <sys\taskdsp.h>
#include <sys\systsk.h>
#include <sys\lmalloc.h>
//#include <simdrv\export\driver.h>
#include <sys\vramop.h>
//#include <hardware\lcd68k.h>
//#include <simdrv\include\vramop.h>

//-------------------------------------------------------------------------
// 函数名:		SysLoadBitmap
// 功能说明:	从资源数组中获取位图
// 参数说明:
//      resource		-存放位图的资源数组.
// 返回值说明:
//		非0				-位图句柄
//		0				-失败
//-------------------------------------------------------------------------

//高字节是后一个像素
DWORD SysLoadBitmap( BYTE *resource, DWORD *userpal )
{
	BMPHEADER	*info = (BMPHEADER *)resource;
	BITMAP		*bmp;
	VRAM		*desData;		//2002
	PIXEL		*dataAd, value, *LineAd;		//2002
	BYTE		*srcData;
	CHAR		desOffset, srcOffset, bits, LineOffset;
	DWORD		index, mask, i, j;		//2002
	PIXEL		palette[8];//*palette;		//2002
	WORD		type;

	// 参数检查
	if( info == NULL )
		return 0;
	
	memcpy( &type, info, 2 );
	if( type != GPC_BMP_SYMBOL )
		return 0;
	
	bmp = (BITMAP *)SysLmalloc( sizeof( BITMAP ) );
	if( bmp == NULL )
		return 0;

	memcpy( &bmp->info, info, sizeof(BMPHEADER) );
	// 复制位图头信息
#ifdef BIG_ENDIAN_ORDER
	bmp->info.width = SWAPWORD(bmp->info.width);
	bmp->info.height = SWAPWORD(bmp->info.height);
	bmp->info.bitcount = bmp->info.bitcount;
	bmp->info.flag = bmp->info.flag;
	bmp->info.colorused = INVERTDWORD(bmp->info.colorused);
	bmp->info.offset = INVERTDWORD(bmp->info.offset);
#endif
	
	// 获取调色板
	if( userpal == NULL )
	{
		if( bmp->info.flag & GPC_BMP_PALETTE_FLAG )
			bmp->palette = (DWORD *)( resource + sizeof( BMPHEADER ) );
		else
			bmp->palette = seGetSysPalette( bmp->info.bitcount );
	}
	else
	{
		bmp->palette = userpal;
	}

//	bmp->data = resource + info->offset;
	//变换调色板
	for( i = 0; i < bmp->info.colorused; i++ )
		seRGBtoIndex( bmp->palette[i], &palette[i] );

	// 获取位图数据
	srcData = resource + bmp->info.offset;//2002word
	srcOffset = 0;
	desData = GetVRAM( bmp->info.width, bmp->info.height );
	if( desData == NULL )
	{
		SysLfree( bmp );
		return 0;
	}
	LineAd = desData->ad;
	dataAd = LineAd;//2002word
	LineOffset = 0;
	desOffset = 0;

	bits = info->bitcount;
	mask = MAKEMASK( bits );
	for ( i = 0; i < bmp->info.height; i++ )
	{
		dataAd = LineAd;
		desOffset = LineOffset;
		for ( j = 0; j < bmp->info.width; j++ )
		{
			//将位图的索引值转为系统的索引值			
			if( bits < 8 )
			{
				index = ( (*srcData) >> ( 8 - bits - srcOffset ) ) & mask;
				srcOffset += bits;
				if ( srcOffset >= 8 )
				{
					srcOffset = 0;
					srcData++;
				}				
			}
			else
			{
				CHAR	k, num = bits >> 3;
				
				index = *srcData;
				srcData++;
				for( k = 1; k < num; k++, srcData++ )
					index = ( index << 8 ) | ( *srcData );
			}
			value = palette[index];

			{
			#ifdef	BIG_ENDIAN_ORDER
				PIXEL	vmask = PixelMask << ( PIXEL_UNIT - BITS_PER_PIXEL - desOffset );
			#else
				PIXEL	vmask = PixelMask << desOffset;
			#endif
			
			#ifdef	BIG_ENDIAN_ORDER
				(*dataAd) = ( (*dataAd) & ~vmask ) | ( value << ( PIXEL_UNIT - BITS_PER_PIXEL - desOffset ) );
			#else
				(*dataAd) = ( (*dataAd) & ~vmask ) | ( value << desOffset );
			#endif
			}
			desOffset += BITS_PER_PIXEL;
			if( desOffset >= PIXEL_UNIT )
			{
				desOffset -= PIXEL_UNIT;
				dataAd++;
			}
		}
		GetNextLine( &LineAd, &LineOffset, LineAd, LineOffset, desData )
	}
	
	bmp->data = desData;
	
	return (DWORD)bmp;
}


/*
//字节高位为前一个像素
DWORD SysLoadBitmap( BYTE *resource )
{
	BMPHEADER	*info = (BMPHEADER *)resource;
	BITMAP		*bmp;
	VRAM		*desData;		//2002
	PIXEL		*dataAd, value;		//2002
	BYTE		*srcData, desOffset, srcOffset, bits, offset;		//2002
	DWORD		index, mask, i, j;		//2002
	PIXEL		palette[8];//palette;		//2002

	// 参数检查
	if( info == NULL || info->type != GPC_BMP_SYMBOL )
		return 0;
	
	bmp = (BITMAP *)SysLmalloc( sizeof( BITMAP ) );
	if( bmp == NULL )
		return 0;
	
	// 复制位图头信息
	memcpy( &bmp->info, info, sizeof( BMPHEADER ) );
	
	// 获取调色板
	if( bmp->info.flag & GPC_BMP_PALETTE_FLAG )
		bmp->palette = (DWORD *)( resource + sizeof( BMPHEADER ) );
	else
		bmp->palette = seGetSysPalette( bmp->info.bitcount );
	
//	bmp->data = resource + info->offset;
	//变换调色板
	for( i = 0; i < bmp->info.colorused; i++ )
		seRGBtoIndex( bmp->palette[i], &palette[i] );

	// 获取位图数据
	srcData = resource + bmp->info.offset;
	srcOffset = 0;
	desData = GetVRAM( bmp->info.width, bmp->info.height );
	dataAd = desData->ad;
	desOffset = 0;

	for ( i = 0; i < bmp->info.height; i++ )
	{
		for ( j = 0; j < bmp->info.width; j++ )
		{
			//将位图的索引值转为系统的索引值
			bits = info->bitcount;
			if( srcOffset + bits > 8 )	// 位图索引值超过一个字节
			{
				mask = MAKEMASK( 8 - srcOffset );
				index = (*srcData) & mask;
		
				bits = bits + srcOffset - 8;
				srcData++;
				while( bits > 8 )
				{
					index  = ( index  << 8 ) | ( *srcData );
					bits -= 8;
					srcData++;
				}
				mask = MAKEMASK( bits );
				index  = ( index  << 8 ) | ( ( *srcData ) & mask );
				srcOffset = bits;
			}
			else	// 位图索引值不超过一个字节
			{
				mask = MAKEMASK( bits );
				index = ( (*srcData) >> ( 8 - bits - srcOffset ) ) & mask;
				srcOffset += bits;
				if ( srcOffset >= PIXEL_UNIT )
				{
					srcOffset -= PIXEL_UNIT;
					srcData++;
				}
			}
			value = palette[index];

			//将转换好的值写入系统开的内存区间
			#if ( BITS_PER_PIXEL != PIXEL_UNIT )	// 非整单位像素
			{
				CHAR r;
			
				r = PIXEL_UNIT - desOffset;
				if( r >= BITS_PER_PIXEL )	// 像素尺寸小于剩余单位
				{
					PIXEL tempValue;
			
//					tempValue = (*desData) & (~( PixelMask << ( r - BITS_PER_PIXEL ) ));
					tempValue = (*dataAd) & ( ~( MAKEMASK( r ) ^ MAKEMASK( r - BITS_PER_PIXEL ) ));
					(*dataAd) = ( value << ( r - BITS_PER_PIXEL ) ) | tempValue;
					desOffset = desOffset + BITS_PER_PIXEL;
					if ( desOffset >= PIXEL_UNIT )
					{
						desOffset -= PIXEL_UNIT;
						dataAd++;
					}
				}
				else    // 像素越过边界
				{
					PIXEL mask;
			
					mask = MAKEMASK( r );
					(*dataAd) = ( value >> ( BITS_PER_PIXEL - r ) ) | ( (*dataAd) & ~mask );
					dataAd++;
					r = PIXEL_UNIT - BITS_PER_PIXEL + r;
					mask = MAKEMASK( r );
					(*dataAd) = ( (*dataAd) & mask ) | ( value << r );
					desOffset = BITS_PER_PIXEL - r;
				}
			}
			#else	// 整单位像素
				*dataAd = value;
				dataAd++;
			#endif
		}
	}
	
	bmp->data = desData;
	
	return (DWORD)bmp;
}
*/

void SysFreeBitmap( DWORD hbmp )
{
	BITMAP	*bmp = (BITMAP *)hbmp;

	if( bmp == NULL || bmp->info.type != GPC_BMP_SYMBOL )
		return;
	
	FreeVRAM( bmp->data );
	SysLfree( bmp );
}

STATUS SysSetBMPPalette( DWORD hbmp, DWORD *palette, DWORD **oldPalette )
{
	BITMAP	*bmp = (BITMAP *)hbmp;

	if( bmp == NULL || bmp->info.type != GPC_BMP_SYMBOL )
		return GPC_ERR_FAILED;

	if( palette == NULL )
		return GPC_ERR_FAILED;

	if( oldPalette != NULL )
		*oldPalette = bmp->palette;
	bmp->palette = palette;

	return GPC_ERR_OK;
}

STATUS SysSetBMPData( DWORD hbmp, VRAM *data, VRAM **oldData )
{
	BITMAP	*bmp = (BITMAP *)hbmp;

	if( bmp == NULL || bmp->info.type != GPC_BMP_SYMBOL )
		return GPC_ERR_FAILED;

	if( data == NULL )
		return GPC_ERR_FAILED;

	if( oldData != NULL )
		*oldData = bmp->data;
	bmp->data = data;

	return GPC_ERR_OK;
}

STATUS SysModifyBMPPalette( DWORD hbmp, DWORD index, DWORD color, DWORD *oldColor )
{
	BITMAP	*bmp = (BITMAP *)hbmp;

	if( bmp == NULL || bmp->info.type != GPC_BMP_SYMBOL )
		return GPC_ERR_FAILED;

	if( bmp->palette == NULL || index >= bmp->info.colorused )
		return GPC_ERR_FAILED;

	if( oldColor != NULL )
		*oldColor = bmp->palette[index];
	bmp->palette[index] = color;

	return GPC_ERR_OK;
}

//-------------------------------------------------------------------------
// 函数名:		SysDisplayBMP
// 功能说明:	在指定区域显示一幅位图
// 参数说明:
//      gc				-GC句柄.
//		xSrc			-显示区域在VRAM中的左上角逻辑横坐标
//		ySrc			-显示区域在VRAM中的左上角逻辑纵坐标
//		hbmp			-要显示的位图的句柄
// 返回值说明:
//		GPC_ERR_OK		-成功
//		GPC_ERR_FAILED	-失败
//-------------------------------------------------------------------------
STATUS SysDisplayBMP( DWORD gc, WORD xSrc, WORD ySrc, DWORD hbmp )
{
	GC		*pGC = (GC *)gc;
	BITMAP	*bmp = (BITMAP *)hbmp;
	WORD	xDes, yDes, width, height;

	// 参数检查
	if( pGC == NULL || pGC->symbol != GPC_GC_SYMBOL )
		return GPC_ERR_FAILED;

	if( bmp == NULL || bmp->info.type != GPC_BMP_SYMBOL ||
		bmp->data == NULL || bmp->palette == NULL )
		return GPC_ERR_FAILED;

	if ( xSrc >= pGC->width || ySrc >= pGC->height ) 
		return GPC_ERR_FAILED;
	
	// 如果位图超过边界,截取显示
	if ( xSrc + bmp->info.width > pGC->width )
	{	
		xDes = pGC->width -1;
		width = xDes - xSrc +1;
	}
	else
	{
		width = bmp->info.width;
		xDes = xSrc + width -1;
	}

	if ( ySrc + bmp->info.height > pGC->height )
	{	
		yDes = pGC->height -1;
		height = yDes - ySrc +1;
	}
	else
	{
		height = bmp->info.height;
		yDes = ySrc + height -1;
	}
	
	
	seDisplayBMP( pGC, xSrc, ySrc, width, height, bmp );

	if( pGC == gSysTcbTbl[ gLcdOwnerTskId-1 ].gc && pGC->group_operation == 0 )
		WRITELCD( xSrc, ySrc, xDes, yDes );
//	if( pGC == gSysTcbTbl[ gLcdOwnerTskId-1 ].gc && pGC->group_operation == 0 )
//		seWrite2LCD( pGC->vram, 0);
	
	return GPC_ERR_OK;
}


STATUS SysDisplayBMPEx( DWORD gc, WORD xSrc, WORD ySrc, DWORD hbmp, WORD style, DWORD trColor )
{
	GC		*pGC = (GC *)gc;
	BITMAP	*bmp = (BITMAP *)hbmp;
	WORD	xDes, yDes, width, height;
	PIXEL	trIndex;

	// 参数检查
	if( pGC == NULL || pGC->symbol != GPC_GC_SYMBOL )
		return GPC_ERR_FAILED;

	if( bmp == NULL || bmp->info.type != GPC_BMP_SYMBOL ||
		bmp->data == NULL || bmp->palette == NULL )
		return GPC_ERR_FAILED;
	
	if ( xSrc >= pGC->width || ySrc >= pGC->height ) 
		return GPC_ERR_FAILED;
	
	// 如果位图超过边界,截取显示
	if ( xSrc + bmp->info.width > pGC->width )
	{	
		xDes = pGC->width -1;
		width = xSrc - xDes +1;
	}
	else
	{
		width = bmp->info.width;
		xDes = xSrc + width -1;
	}

	if ( ySrc + bmp->info.height > pGC->height )
	{	
		yDes = pGC->height -1;
		height = ySrc - yDes +1;
	}
	else
	{
		height = bmp->info.height;
		yDes = ySrc + height -1;
	}
	
	seRGBtoIndex( trColor, &trIndex );
	
	seDisplayBMPEx( pGC, xSrc, ySrc, width, height, bmp, style, trIndex );

	if( pGC == gSysTcbTbl[ gLcdOwnerTskId-1 ].gc && pGC->group_operation == 0 )
		WRITELCD( xSrc, ySrc, xDes, yDes );
//	if( pGC == gSysTcbTbl[ gLcdOwnerTskId-1 ].gc && pGC->group_operation == 0 )
//		seWrite2LCD( pGC->vram, 0);
	

⌨️ 快捷键说明

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