📄 gpcbmp.c
字号:
#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 + -