?? book.c
字號:
#include "main.h"
//#define TEMPFILE "fatms0:/PSP/GAME/cnreader/moonread_tempfile.tmp"
#include "uni2cjk.c"
//#include "jisunicode.c"
#include "sjis.h"
#include "big5hkscs.h"
unsigned char* gPr;
BOOKINF gBookInf;
unsigned char gTextBuf[BUF_MAX];
/*
trans single unicode to cjk coke
*/
int uni2cjk(unsigned char *uni,unsigned char *cjk){
//if(cjk==NULL)cjk=uni;
int transcount = 0;
unsigned char tmp[2];
tmp[0]=uni[0];
tmp[1]=uni[1];
if(tmp[0]<0x81 && tmp[1]==0){
cjk[0]=tmp[0];
transcount = 1;
}else{
int pos = (int)(*(unsigned short*)tmp)*2;
cjk[0]=UNI_CJK[pos];
cjk[1]=UNI_CJK[pos+1];
transcount = 2;
if(cjk[0]==0x3f && cjk[1]==0)
{
cjk[0]=0xa1;
cjk[1]=0xf6;
}
}
return transcount;
}
//bg5hk -> unicode
int bg5hk2cjk(unsigned char *big5hk,unsigned char *cjk){
//if(cjk==NULL)cjk=jis;
int transcount = 0;
if(big5hk[0]<0x81){
cjk[0]=big5hk[0];
transcount = 1;
}else{
unsigned int iunic=0x1fff;
big5hkscs_mbtowc(&iunic,big5hk,2);
transcount = uni2cjk((unsigned char*)&iunic,cjk);
}
return transcount;
}
/*
conv a string
*/
void big52cjk(unsigned char *gib5,unsigned char *cjk){
if(cjk==NULL)cjk=gib5;
int ilen = strlen((const char*)gib5);
int i=0;
for(;i<ilen;){
i+=bg5hk2cjk(gib5+i,cjk+i);
}
}
//sjis -> unicode
int sjis2cjk(unsigned char *jis,unsigned char *cjk){
//if(cjk==NULL)cjk=jis;
int transcount = 0;
if(jis[0]<0x81){
cjk[0]=jis[0];
transcount = 1;
}else{
unsigned int iunic=0x1fff;
//cancel moon's jis2uni table
//iunic = (int)JIS_UNICODE[*(unsigned short*)tmp]*2;
sjis_mbtowc(&iunic,jis,2);
transcount = uni2cjk((unsigned char*)&iunic,cjk);
}
return transcount;
}
/*
conv a string
*/
void jis2cjk(unsigned char *jis,unsigned char *cjk){
if(cjk==NULL)cjk=jis;
int ilen = strlen((const char*)jis);
int i=0;
for(;i<ilen;){
i+=sjis2cjk(jis+i,cjk+i);
}
}
void dsp_num(int x,int y,int col,int num)
{
char str[10];
sprintf(str,"%d",num);
pgPrint(x,y,col,str);
}
void dsp_numl(int x,int y,int col,int num)
{
char str[10];
sprintf(str,"%d",num);
pgPrint(x-(strlen(str)-1),y,col,str);
}
void disp(char *str,bool wait){
pgWaitV();
pgFillvram(rgb2col(0,0,0));
chDrawString((SCREEN_WIDTH-strlen(str)*8)/2,200,0xffff,str,1,1);
chDrawRec(0,254,SCREEN_WIDTH,1, 0xffff,1);
pgPrint(0,32,0x5555,PSPVER);
pgScreenFlipV();
if(wait){
wait_button();
}
}
void debug_disp(char *str)
{
/*
pgWaitV();
pgFillvram(rgb2col(0,0,0));
chDrawString((SCREEN_WIDTH-strlen(str)*8)/2,200,0xffff,str,1,1);
chDrawRec(0,254,SCREEN_WIDTH,1, 0xffff,1);
pgPrint(0,32,0x5555,PSPVER);
pgScreenFlipV();
if(wait){
wait_button();
}
*/
disp(str,true);
}
int unZipFile(const char* zipfilename,unsigned char* szBuffer,int size)
{
char zipname[264];
strcpy(zipname,zipfilename);
char * pzn;
char * pfn;
//get zip file name
char *p = strchr(zipname,'?');
*p=0;
pzn = zipname;
//get compress file name
pfn = p+1;
//
unzFile hUnzip = unzOpen(pzn);
if (!hUnzip) return 0;
unz_file_info fileInfo;
int nLen,i;
if (unzLocateFile(hUnzip,pfn, 1) != UNZ_OK)
return 0;
if (unzOpenCurrentFile(hUnzip) != UNZ_OK) return 0;
unsigned long dwSizeRead = unzReadCurrentFile(hUnzip, szBuffer, size);
if(dwSizeRead<0)
{
debug_disp("讀取zip文件時出錯,按任意鍵繼續");
dwSizeRead = 0;
}
if(unzCloseCurrentFile(hUnzip)==UNZ_CRCERROR)
{
debug_disp("CRC校驗錯誤.按任意鍵繼續");
dwSizeRead = 0;
}
unzClose(hUnzip);
return dwSizeRead;
}
int open_book(const char* filename){
int fp;
int re = 0;
bool isZip = false;
if(strchr(filename,'?')){
isZip = true;
}
unzFile hUnzip=NULL;
if(isZip){
//open zip file
char zipname[264];
strcpy(zipname,filename);
char * pzn;
char * pfn;
//get zip file name
char *p = strchr(zipname,'?');
*p=0;
pzn = zipname;
//get compress file name
pfn = p+1;
//
hUnzip = unzOpen(pzn);
if (!hUnzip) return 0;
unz_file_info fileInfo;
int nLen,i;
if (unzLocateFile(hUnzip,pfn, 1) != UNZ_OK) return 0;
if (unzOpenCurrentFile(hUnzip) != UNZ_OK) return 0;
}else{
fp=sceIoOpen(filename,PSP_O_RDONLY,0777);
}
if(fp<0)
{
//失敗
pgFillvram(rgb2col(0,0,0));
pgPrint(0,0,rgb2col(255,0,0),"ERROR : CANNOT OPEN FILE");
pgPrint(0,1,rgb2col(255,0,0),filename);
wait_button();
return 0;
}
if(isZip){
re = unzReadCurrentFile(hUnzip, gTextBuf, BUF_MAX);
}else{
re = sceIoRead(fp,gTextBuf,BUF_MAX);
}
if(isZip){
if(unzCloseCurrentFile(hUnzip)==UNZ_CRCERROR){
debug_disp("CRC校驗錯誤.按任意鍵繼續");
gBookInf.filesize = 0;
}
unzClose(hUnzip);
re = 0;
}else{
sceIoClose(fp);
}
return re;
}
int moo_open_book(const char* filename)
{
int re;
int pos,j,i;
//unsigned char tmp[2];
unsigned char tmpbuf[256];
gBookInf.rows=0;
gBookInf.startrow=0;
memset(gTextBuf,0,BUF_MAX);
//read zip file
re = open_book(filename);
if(re>=2 && *(unsigned short*)gTextBuf==0xFEFF)
{
int buffp=0;
isUnicode = true;
//unicode轉CJK ASCII 0xFF 0xFF
for(j=0;j<re;)
{
int tc = uni2cjk(gTextBuf+j+2,gTextBuf+buffp);
j+=2;
buffp+=tc;
}
gBookInf.filesize=buffp;
}else{
isUnicode = false;
//*(gTextBuf+re+1)=0;
if(bookconf.encodeing==SHIFT_JIS){
jis2cjk(gTextBuf,NULL);
}else if(bookconf.encodeing==BIG5HK){
big52cjk(gTextBuf,NULL);
}
//else use gb2312
}
if(gBookInf.filesize<=0)
{
gBookInf.filesize = 0;
return 0;
}
powerControl(true);
return gBookInf.filesize;
}
void moo_Init_Index(void)
{
char chflag;//中文標識
int len,i;
int seekoffset;
int offset;
gBookInf.rows=0;
gBookInf.startrow=0;
gPr = gTextBuf;
offset =0;
seekoffset=0;
len=0;
//memset((unsigned char *)gBookInf.row,0,ROW_MAX*sizeof(int));
while(1)
{
gBookInf.row[gBookInf.rows] = offset;
if(offset>=gBookInf.filesize)//判斷是否到結尾
break;
else
{
if((gBookInf.filesize-offset)>C_LEN)
len =C_LEN;
else
len =gBookInf.filesize-offset+1;
chflag = 0;
for(i=0;i<len;i++)
{
if(gPr[i]>=0x81)
{
if(chflag)
chflag = 0;
else
chflag = 1;
}
else
{
chflag = 0;
}
if(gPr[i]==0x0D && gPr[i+1]==0x0A&&gPr[i+2]==0x0D && gPr[i+3]==0x0A)
{
seekoffset =offset+i;
gBookInf.rows++;
gBookInf.row[gBookInf.rows]=seekoffset;
seekoffset +=2;
break;
}
if(gPr[i]==0x0A)
{
seekoffset =offset+i+1;
break;
}
else if(gPr[i]==0x0D && gPr[i+1]==0x0A)
{
seekoffset =offset+i+2;
break;
}
}
if(i==len)
seekoffset =offset+i-chflag;
offset = seekoffset;
gPr = gTextBuf+seekoffset;
if(i>0)
gBookInf.rows++;
}
}
}
void moo_disp_pagenumber(int x,int y,int col)
{
int pg;
int pgc;
pg = (gBookInf.startrow)/R_LEN;
if(gBookInf.startrow%R_LEN)
pg++;
pg++;
pgc = gBookInf.rows/R_LEN;
if(gBookInf.rows%R_LEN)
pgc++;
dsp_numl(x-1,y,col,pg);
pgPrint(x,y,col,"/");
dsp_num(x+1,y,col,pgc);
}
void moo_disp_page(void)
{
unsigned char buf[C_LEN+1];
char i,j;
char chflag;
int len;
pgWaitV();
pgFillvram(BG_COLOR);
for(i=0;i<R_LEN;i++)
{
gPr = gTextBuf+gBookInf.row[gBookInf.startrow+i];
if(gBookInf.startrow+i+1>=gBookInf.rows)
{
len = gBookInf.filesize-gBookInf.row[gBookInf.startrow+i];
if(len<=0)break;
if(len>C_LEN)
len =C_LEN;
memcpy(buf,gPr,len);
}
else
{
len =C_LEN;
memcpy(buf,gPr,C_LEN+1);
}
if(len==2&&buf[0]==0x0d&&buf[1]==0x0a)
continue;
chflag = 0;
for(j=0;j<len;j++)
{
if(buf[j]>=0x81)
{
if(chflag)
chflag = 0;
else
chflag = 1;
}
else
{
chflag = 0;
}
if(buf[j]==0x0a)
break;
else if(buf[j]==0x0D && buf[j+1]==0x0A)
break;
}
buf[j-chflag]=0;
chDrawStringEx(CX,CY+i*(16*bookconf.magnify+bookconf.rowinter),FONT_COLOR,buf,bookconf.magnify,1,bookconf.colinter);
}
if(bookconf.isdippage)
{
chDrawRec(0,254,SCREEN_WIDTH,1, FONT_COLOR,1);
pgPrint(0,32,subtitlecol,PSPVER);
moo_disp_pagenumber(53,32,FONT_COLOR);
//to display c/b speed
char tname[256];
sprintf(tname,"Cup/Bus:%d/%d",scePowerGetCpuClockFrequency(),scePowerGetBusClockFrequency());
pgPrint(33-strlen(tname),32,rgb2col(0,0xff,0),tname);
//print current encoding
*tname=0;
if(isUnicode){
strcat(tname,"UNICODE");
}else if(bookconf.encodeing==GB2312){
strcat(tname,"GB2312");
}else if(bookconf.encodeing==BIG5HK){
strcat(tname,"BIG5HK");
}else if(bookconf.encodeing==SHIFT_JIS){
strcat(tname,"SHIFT_JIS");
}else{
strcat(tname,"GB2312");
}
if(isUnicode){
pgPrint(45-strlen(tname),32,uniitem,tname);
}else{
pgPrint(45-strlen(tname),32,selitem,tname);
}
}
pgScreenFlipV();
}
void moo_ctrl_nextrow(void)
{
if(((gBookInf.startrow+1)<gBookInf.rows)&&(gBookInf.startrow+R_LEN<gBookInf.rows))
{
gBookInf.startrow++;
moo_disp_page();
}
}
void moo_ctrl_prerow(void)
{
if((gBookInf.startrow-1)>=0)
{
gBookInf.startrow--;
moo_disp_page();
}
}
void moo_ctrl_nextpage(void)
{
if(gBookInf.startrow+R_LEN>=gBookInf.rows || gBookInf.rows<=R_LEN)
return;
if(bookconf.isnextfirst)
{
if((gBookInf.startrow+2*R_LEN-1)<gBookInf.rows)
gBookInf.startrow+=R_LEN-1;
else
{
gBookInf.startrow=gBookInf.rows-R_LEN;
}
}
else
{
if((gBookInf.startrow+2*R_LEN)<gBookInf.rows)
gBookInf.startrow+=R_LEN;
else
{
gBookInf.startrow=gBookInf.rows-R_LEN;
}
}
moo_disp_page();
}
void moo_ctrl_prepage(void)
{
if(gBookInf.startrow==0)
return;
if(bookconf.isnextfirst)
{
if((gBookInf.startrow-R_LEN+1)>=0)
gBookInf.startrow-=R_LEN-1;
else
gBookInf.startrow=0;
}
else
{
if((gBookInf.startrow-R_LEN)>=0)
gBookInf.startrow-=R_LEN;
else
gBookInf.startrow=0;
}
moo_disp_page();
}
void moo_ctrl_nextmorepage(void)
{
if(gBookInf.startrow+R_LEN>=gBookInf.rows || gBookInf.rows<=R_LEN)
return;
if((gBookInf.startrow+1000+R_LEN)<gBookInf.rows)
gBookInf.startrow+=1000;
else
{
gBookInf.startrow=gBookInf.rows-R_LEN;
}
moo_disp_page();
}
void moo_ctrl_premorepage(void)
{
if(gBookInf.startrow==0)
return;
if((gBookInf.startrow-1000)>=0)
gBookInf.startrow-=1000;
else
gBookInf.startrow=0;
moo_disp_page();
}
//------------------------------------------------------------------------------------------------
// taken from:
// .../psp/trunk/pspgl/test-q3/generic/main.c
// returns number of milliseconds since game started
int Sys_Milliseconds(void)
{
static long sys_timeBase = 0;
struct timeval tp;
gettimeofday(&tp, NULL);
if (!sys_timeBase) {
sys_timeBase = tp.tv_sec;
return tp.tv_usec / 1000;
}
return (tp.tv_sec - sys_timeBase) * 1000 + tp.tv_usec / 1000;
}
void moo_ctrl_autonextpage(void)
{
SceCtrlData padd;
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
unsigned int oldButtons = 0;
int end,delta;
int timer=0;
int start=Sys_Milliseconds();
while(isautob==1)
{
end = Sys_Milliseconds();
delta=end-start;
start=end;
timer += delta;
if (timer>bookconf.frequency*1000)
{
moo_ctrl_nextpage();
timer = 0;
}
sceCtrlReadBufferPositive(&padd, 1); // read control pad
if (padd.Buttons != 0)
{
if ((padd.Buttons&PSP_CTRL_CIRCLE) && !(oldButtons&PSP_CTRL_CIRCLE))
{
isautob=0;
}
// only if L button wasn't in 'down' state previously
if ((padd.Buttons&PSP_CTRL_LTRIGGER) && !(oldButtons&PSP_CTRL_LTRIGGER))
{
moo_ctrl_prepage();
// only if R button wasn't in 'down' state previously
if ((padd.Buttons&PSP_CTRL_RTRIGGER) && !(oldButtons&PSP_CTRL_RTRIGGER))
{
moo_ctrl_nextpage();
}
}
oldButtons = padd.Buttons;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -