📄 ebook.c
字号:
#include <CsAgb.h>
#include <rb_stdio.h>
#include <rbasic.h>
#include <rb_string.h>
#include <text.h>
#include <graph.h>
#include <Qgraph.h>
#include <rb_mem.h>
#define fbase 0x8100000
#define is_unk 0
#define is_txt 24
#define is_bmp 25
#define is_wav 26
#define is_jpg 27
#define SET_BAS 10344
#define book_mark_M 440 //电子书书签设置 10*12=120字节
extern void cbmp(u32 loc,u8 x,u8 y);
extern u32 list_fsys(u32 loc);
extern void nsh_text(char *tit,char *txt,u32 size);
extern void jpeg(u8 xp,u8 yp,u32 loc);
void ebook2(char *tit,char *ebk);
extern void (*sys_deamon)();
extern void new_scroll(u32 lc,u32 len);
extern void show_ico(u8 id,u8 xp,u8 yp);
extern void nsh_text(char *tit,char *txt,u32 size);
typedef struct
{
char ftype[4];//文件类型码 "EBK"
u32 size;//文件大小
u32 icnt;//项目个数
u32 logo;//logo位图信息
u32 mus;//music信息
u32 re;//保留区
}ebk_head;//ebk文件头
typedef struct
{
char name[40];//名称
u32 loc;//项目地址
u32 csize;//压缩后大小
u32 dsize;//解压后大小
}ebk_item;//项目信息
extern void paint_bg(u8 xp,u8 yp,u8 xsp,u8 ysp,u16 *bg);
extern const ebk_bg[];
extern void lzss(void *sou,u32 size,void *de);
extern u32 _fid,_iid,_line;
extern void ebk_font_set(char *M,u8 act);
extern u8 is_basic_run;
void ebk_deamon()
{
write(10,140,rnd(0xffff),"EBOOK 2.0 FOR GBA PUSH START");
}
int ebk_type(char *name)
{
int i=0;
char nn[40];
while (name[i]!='\0' && name[i]!='.') i++;
if (name[i]=='\0') return is_unk;
i++;
strcpy(nn,name+i);
str_up(nn);
if (strcmp(nn,"TXT")==0) return is_txt;
if (strcmp(nn,"BMP")==0) return is_bmp;
if (strcmp(nn,"JPG")==0) return is_jpg;
return is_unk;
}
void ebk_list(u8 id,ebk_item *item)
{
int i=0;
/*char name[40];
while (item->name[i]!='.' && item->name[i]!='\0' && i<39) {name[i]=item->name[i];i++;}
name[i]='\0';*/
//Q_box(1,17+id*16,238,30+id*16,RGB(30,30,30));
i=ebk_type(item->name);
if (i==is_txt) show_ico(0,2,17+id*16);
else if(i==is_bmp || i==is_jpg) show_ico(1,2,17+id*16);
cwrite(19,17+id*16+2,0,item->name);
}
void ebook(char *tit,char *ebk)
{
u8 done=2;
u8 start=1;
int bas=0;
int sel=0;
int old=0;
int i;
int font=0;
int type=0;
char *sv;
ebk_head head;
ebk_item item,blank={"",0,0,0};
new_mark:
get_data(&head,(char *)ebk,sizeof(ebk_head));
font_set(2);
if (strcmp(head.ftype,"EBK")!=0)
{
arlt("系统提示:","您打开的文件为非ebk格式或者EBK版本过低!系统将尝试以老的方式打开文件.");
ebook2(tit,ebk);
return;
}
if (head.logo && start)
{
cbmp(ebk+head.logo,255,0);
sys_deamon=ebk_deamon;
wait_key();
sys_deamon=NULL;
}
if (is_basic_run && _iid<head.icnt)//有书签
{
bas=_iid;
sel=0;
is_basic_run=1;
goto do_mark;
}
while (1)
{
if (start) {start=0;CS_ReadKey();}
else readkey();
if (CS_IsKeyDown(KEY_UP) && (bas+sel)>0)
{
if (sel) {sel--;done=1;}
else {bas--;done=3;}
}
else if(CS_IsKeyDown(KEY_DOWN) && (bas+sel+1)<head.icnt)
{
if (sel<8) {sel++;done=1;}
else {bas++;done=3;}
}
else if(CS_IsKeyDown(KEY_LEFT) && (bas+sel))
{
done=3;
if (bas>=9) bas-=9;
else {bas=0;sel=0;}
}
else if(CS_IsKeyDown(KEY_RIGHT) && (bas+sel+1)<head.icnt)
{
done=3;
if (bas+10<head.icnt)
{
bas+=9;
if (bas+sel+1>=head.icnt) sel=head.icnt-bas-1;
}
else
{
bas=head.icnt-1;
sel=0;
}
}
else if(CS_IsKeyDown(KEY_A))
{
_line=0;
do_mark:
done=2;
_iid=bas+sel;
get_data(&item,(void *)(ebk+sizeof(ebk_head)+(bas+sel)*sizeof(ebk_item)),sizeof(ebk_item));
type=ebk_type(item.name);
if (type==is_txt)
{
if (item.dsize>item.csize)
{
sv=(char *)new_malloc(item.dsize+4);
if (sv==NULL) arlt("系统提示:","没有足够内存来解压缩文件!请注意退出部分程序。");
else
{
lzss((char *)(ebk+item.loc),item.csize,sv);
sv[item.dsize]='\0';
nsh_text(item.name,(char *)sv,item.dsize);
new_free(sv);
}
}
else nsh_text(item.name,ebk+item.loc,item.dsize);
if (is_basic_run)//重新载入过书签
{
ebk=(char *)_file_loc;
strcpy(tit,_file);
goto new_mark;
}
}
else if(type==is_bmp) {cbmp(ebk+item.loc,255,0);wait_key();}
else if(type==is_jpg) jpeg(255,0,ebk+item.loc);
}
else if(CS_IsKeyDown(KEY_B)) {_iid=0xFFFFFFF0;return;}
if (done==1)
{
done=0;
if (old!=sel) r_box(1,18+16*old,232,17+old*16+13,0,5);
old=sel;
r_box(1,18+16*sel,232,17+sel*16+13,0,5);
new_scroll(bas+sel,head.icnt);
}
else if (done==3)
{
done=0;
Q_box(1,17,229,158,RGB(30,30,30));
for (i=0;i<9;i++)
{
get_data(&item,(char *)(ebk+sizeof(ebk_head)+(bas+i)*sizeof(ebk_item)),sizeof(ebk_item));
ebk_list(i,&item);
if (bas+i+1>=head.icnt) break;
}
old=sel;
r_box(1,18+16*sel,232,17+sel*16+13,0,5);
r_line(0,159,249,159,28160,0);
new_scroll(bas+sel,head.icnt);
}
else if (done==2)
{
done=0;
title(tit);
Q_box(1,17,229,158,RGB(30,30,30));
r_line(0,0,239,0,28160,0);
r_line(0,159,239,159,28160,0);
r_line(0,0,0,159,28160,0);
r_line(239,0,239,159,28160,0);
r_line(0,16,239,16,28160,0);
//cwrite(3,4,0,tit);
//cwrite(10,3,RGB(30,30,30),tit);
for (i=0;i<9;i++)
{
get_data(&item,(char *)(ebk+sizeof(ebk_head)+(bas+i)*sizeof(ebk_item)),sizeof(ebk_item));
ebk_list(i,&item);
if (bas+i+1>=head.icnt) break;
}
old=sel;
r_box(1,18+16*sel,232,17+sel*16+13,0,5);
r_line(0,159,249,159,28160,0);
new_scroll(bas+sel,head.icnt);
}
}
}
extern u32 cal_loc(char *loc);
void ebook2(char *tit,char *ebk)
{
u8 items;
u8 now=0;
u8 old=0;
u8 ip=0;
u8 done=2;
u8 i;
Q_box(0,17,239,159,RGB(0,9,16));
title(tit);
//r_line(0,16,239,16,RGB(30,30,30),1);
items=cal_loc(ebk);
while (1)
{
CS_ReadKey();
if (CS_IsKeyDown(KEY_UP))
{
if (now)
{
done=1;
now--;
}
else if(ip)
{
ip--;
done=2;
}
}
else if (CS_IsKeyDown(KEY_DOWN))
{
if (now<10)
{
if (ip+now+1<items) {done=1;now++;}
}
else if (ip+1+now<items)
{
ip++;
done=2;
}
}
else if (CS_IsKeyDown(KEY_R)||CS_IsKeyDown(KEY_RIGHT))
{
if (ip+12<=items)
{
ip+=11;
done=2;
if (ip+now+1>items) now=0;
}
else {now=items-ip-1;done=1;}
}
else if(CS_IsKeyDown(KEY_L)||CS_IsKeyDown(KEY_LEFT))
{
if (ip>11)
{
ip-=11;
done=2;
}
else if(ip)
{
ip=0;
done=2;
}
else {now=0;done=1;}
}
else if(CS_IsKeyDown(KEY_B)) {_iid=0xFFFFFFF0;return;}
else if(CS_IsKeyDown(KEY_A))
{
show_text(ebk+10+60*(ip+now)+6,ebk+cal_loc(ebk+10+60*(ip+now)));
title(tit);
done=2;
}
if (done==2)
{
Q_box(0,17,239,19,RGB(0,9,16));
for (i=0;i<11;i++)
{
if (ip+i+1>items) break;
Q_box(0,17+i*13,239,29+i*13,RGB(0,9,16));
cwrite(1,18+13*i,RGB(30,30,30),ebk+10+60*(ip+i)+6);
}
while (i<11)
{
Q_box(0,17+i*13,239,29+i*13,RGB(0,9,16));
i++;
}
r_box(0,17+now*13,239,29+now*13,0,5);
old=now;
done=0;
}
else if(done==1)
{
if (now!=old)
{
r_box(0,17+now*13,239,29+now*13,0,5);
r_box(0,17+old*13,239,29+old*13,0,5);
}
old=now;
done=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -