Home | Lesson | Game | Tool | Link

D01.iアプリ用絵文字描画

iアプリで使用している絵文字を描画します
SJISコードの0xF800〜0xF9FFに配置されているので、
絵文字のコードを指定されたら対応する絵文字を表示するように設定します
iアプリでは半角カタカナも使用できるので、半角カタカナも用意します
通常は12ドットで作成されているので、12ドットのフォントとして用意します


iモード対応絵文字(docomo)
また、上記サイトでwindowsでiアプリ用絵文字を使用できるツールも紹介されています

プログラムは今まで作成してきたものを絵文字も描画できるように変更しました

文字列描画関数
iアプリ絵文字・2バイト文字・1バイト文字・半角カタカナに対応しています
画像は専用に用意しました
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;
}


ダウンロード
今回作成したファイル一式です。

宿題
1.絵文字用入力フォームを作ってみましょう