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

📄 cbmp.c

📁 redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
💻 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 + -