📄 cbmp.c
字号:
#include <csagb.h>
#include <rb_mem.h>
#define mVRAM (u16 *) 0x06000000
typedef struct
{
char type[4];//文件标识"CBP"
u32 size;//位图信息大小
u32 loc;//位图信息偏移地址
u8 bitcnt;//位图深度 1/4/8/16
u8 width;//宽度
u8 height;//高度
u8 cmp;//压缩方式 0:无压缩,1:有压缩
} cbp_head;//cbmp文件头部信息
extern void load_scr(u16 *sav,u8 xp,u8 yp,u8 xsp,u8 ysp);
extern void get_data(void *d,void *loc,int size);
extern void lzss(void *sou,u32 size,void *de);
void bmp16(u8 *bmes,cbp_head *head,u8 xp,u8 yp)//
{
u8 *bbb=(u8 *)new_malloc(head->height*head->width*2);
lzss(bmes+head->loc,head->size,bbb);
load_scr((u16 *)bbb,xp,yp,xp+head->width-1,yp+head->width-1);
new_free(bbb);
}
void bmp8(u8 *bmes,cbp_head *head,u8 xp,u8 yp)
{
u16 pal[256];
int i,j;
int w=head->width;
int h=head->height;
int loc=yp*240+xp;
u8 *bb;
u8 *bbb=(u8 *)new_malloc(head->height*head->width*2);
lzss(bmes+head->loc,head->size,bbb);
bb=bbb;
if (xp>239 || yp>159) return;
if (xp+w>239) w=240-xp;
if (yp+h>159) h=160-yp;
get_data(pal,bmes+sizeof(cbp_head),256*2);
//DmaCopy(3,bmes+sizeof(cbp_head),pal,256*2,16);
for (i=0;i<h;i++)
{
for (j=0;j<w;j++) *(mVRAM+loc+j)=pal[*(bb+j)];
loc+=240;
bb+=head->width;
}
new_free(bbb);
}
void bmp4(u8 *bmes,cbp_head *head,u8 xp,u8 yp)
{
u16 pal[16];
int i,j;
int w=head->width;
int h=head->height;
int loc=yp*240+xp;
int ww=(w+1)/2;
int www;
u8 *bb;
u8 *bbb=(u8 *)new_malloc(head->height*head->width*2);
lzss(bmes+head->loc,head->size,bbb);
bb=bbb;
if (xp>239 || yp>159) return;
if (xp+w>239) w=240-xp;
if (yp+h>159) h=160-yp;
get_data(pal,bmes+sizeof(cbp_head),16*2);
for (i=0;i<h;i++)
{
www=0;
for (j=0;j<ww;j++)
{
*(mVRAM+loc+www)=pal[bb[j]>>4];
www++;
*(mVRAM+loc+www)=pal[bb[j]&0x0f];
www++;
}
loc+=240;
bb+=ww;
}
new_free(bbb);
}
extern const u8 font_mask[8];
void bmp1(u8 *bmes,cbp_head *head,u8 xp,u8 yp)//黑白位图
{
int i,j,k;
int w=head->width;
int h=head->height;
int loc=yp*240+xp;
int ww=(w+7)/8;
int cnt=0;
//int cnt2=0;
u8 dm;
u8 *bb;//=bmes+head->loc;
u8 *bbb;
u8 fmask;
bbb=(u8 *)new_malloc(ww*h);
lzss(bmes+head->loc,head->size,bbb);
bb=bbb;
if (xp>239 || yp>159) return;
if (xp+w>239) w=240-xp;
if (yp+h>159) h=160-yp;
for (i=0;i<h;i++)
{
cnt=0;
for (j=0;j<ww;j++)
{
dm=*(bb+j);
fmask=0x80;
for (k=0;k<8;k++)
{
if (cnt>=w) break;
if (dm&fmask) *(mVRAM+loc+cnt)=RGB(30,30,30);
else *(mVRAM+loc+cnt)=0;
cnt++;
fmask>>=1;
}
}
loc+=240;
bb+=ww;
}
new_free(bbb);
}
void cbmp(u32 loc,u8 x,u8 y)
{
cbp_head head;
get_data(&head,(void *)loc,sizeof(cbp_head));
if (strcmp(head.type,"BMP")!=0)
{
arlt("系统提示:","您打开的不是BMP位图或者位图信息不能识别.");
return;
}
if (x==255)//自动调整模式
{
x=(240-head.width)/2;
y=(160-head.height)/2;
}
switch(head.bitcnt)
{
case 16:
bmp16((u8 *)loc,&head,x,y);
break;
case 8:
bmp8((u8 *)loc,&head,x,y);
break;
case 4:
bmp4((u8 *)loc,&head,x,y);
break;
case 1:
bmp1((u8 *)loc,&head,x,y);
break;
default:
arlt("系统提示:","未知的位图模式!");
break;
}
//arlt("AA","Edn");
}
int ico_bmp(u8 xp,u8 yp,u8 *bmes)//显示32X32 256色BMP图标
{
int i,j;
int loc=yp*240+xp;
u16 pal[256];
u8 *bb;
u8 *bbb;
cbp_head head;
get_data(&head,bmes,sizeof(cbp_head));
if (strcmp(head.type,"BMP")!=0) return 0;//非BMP图片
if (head.bitcnt!=8) return 0;//非256色
if (head.height!=32 || head.width!=32) return 0;//图标大小不对
bbb=(u8 *)new_malloc(32*32*2);
lzss(bmes+head.loc,head.size,bbb);
bb=bbb;
//get_data(pal,bmes+sizeof(cbp_head),256*2);
DmaCopy(3,bmes+sizeof(cbp_head),pal,256*2,16);
for (i=0;i<32;i++)
{
for (j=0;j<32;j++) if (bb[j]!=bb[0]) *(mVRAM+loc+j)=pal[*(bb+j)];
//else *(mVRAM+loc+j)^=pal[*(bb+j)];
loc+=240;
bb+=32;
}
new_free(bbb);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -