int drawString(IVideoDriver* driver, int x, int y, SColor color, const char* fmt, ...)
{
int i,len, cnt;
va_list ap;
char tmp[1024];
char *tex = "japanese.png";
if(driver == NULL)
return -1;
memset(tmp, 0x00, sizeof(tmp));
//書式付文字列を調整
va_start(ap, fmt);
vsprintf(tmp, fmt, ap);
va_end(ap);
cnt = 0;
len = strlen(tmp);
int posx = 0; //文字の描画位置
int posy = 0; //文字の廟が位置
int tx, ty; //画像読み込み位置
int w; //文字の幅
int h = FONT_SIZE; //文字の高さ
unsigned char buf[2]; //取得した文字を一時保存
for(i=0;i<len;i++)
{
buf[0] = tmp[i]&0xFF;
//iモード絵文字チェック
if(buf[0] == 0xF8 || buf[0] == 0xF9)
{
w = FONT_SIZE;
buf[1] = tmp[++i]&0xFF;//次のバッファ取得
//画像位置計算
tx = (buf[1]%64)*h;
ty = 73*FONT_SIZE+(buf[0]-0xF8)*FONT_SIZE*4+(buf[1]/64)*h;
drawImage(driver,tex,x+posx,y+posy,w,h,tx,ty,0,
0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,1,1);
posx += w;
cnt+=2;
}
//2バイト文字チェック
else if((buf[0] >= 0x80 && buf[0] <= 0x9F) || buf[0] >= 0xE0)
{
//2バイト文字処理
w = FONT_SIZE;
buf[1] = tmp[++i]&0xFF;//次のバッファ取得
//画像位置計算
tx = ((buf[1]-0x40)%64)*h;
ty = (1+(buf[0]-0x81)*3+(buf[1]-0x40)/64)*h;
drawImage(driver,tex,x+posx,y+posy,w,h,tx,ty,0,
color,color,color,color,1,1);
posx += w;
cnt += 2;
}
//1バイト文字
else
{
//1バイト文字処理
w = FONT_SIZE/2;
switch(buf[0])
{
//改行
case '\n':
posx = 0; //開始位置を0にする
posy += h; //文字の高さ分ずらす
break;
//タブ
case '\t':
posx += w*4; //半角文字4文字分ずらす
cnt += 4;
break;
//通常文字
default:
//半角カナ
if(buf[0] >= 0xA0 && buf[0] <= 0xDF)
{
//画像位置計算
tx = (buf[0]-0xA0)*w;
ty = 72*FONT_SIZE;
}
//英数
else
{
//画像位置計算
tx = (buf[0]-0x20)*w;
ty = 0;
}
drawImage(driver,tex,x+posx,y+posy,w,h,tx,ty,0,
color,color,color,color,1,1);
posx += w;
cnt += 1;
break;
}
}
}
return cnt;
}
|