自作S-JIS用フォントデータをUTF-8用に変更する(5)
文字表示プログラムを完全にUTF-8に移植してみました。先日作成した東雲12ドットフォントをUTF-8コードデータ化したファイルを読み込んで、NDSの画面に文字が表示できます。自作S-JIS用フォントデータをUTF-8用に変更する(1)で書いた場合わけに基づいて、データ読み出しプログラムを作ったので、ソースがすごいことになってしまいました。
全然わからないソースになっていますが、以下にリストします。
bool GetZenkaku( unsigned char *code );
簡単なところから。UTF-8コードの1バイト〜3バイトを見て、全角か半角かを返すプログラムです。全角の場合はTRUEが、半角の場合はFALSEが返ります。
//********************************************* // UTF-8コードの1バイト〜3バイトを見て、 // 全角か半角かを返す。 // 戻り値: TRUE:全角 FALSE:半角 //********************************************* bool GetZenkaku( unsigned char *code ) { long p; if( code[0]<0x80 ){ return( false ); } if( code[0]==0xEF ){ p = (long)code[1]*256 + (long)code[2]; if( (p>=0xBDA1 && p<=0xBDBF) || (p>=0xBE80 && p<=0xBE9) ){ return( false ); } } if( code[0]==0xE2 && code[1]==0x80 && code[2]==0xBE ){ return( false ); } return( true ); }
long GetFontAdd( long j );
場合わけの固まりプログラムです。UTF-8の文字コードからフォントファイルの格納アドレスを求めます。JISの第一水準と第二水準の漢字コード及び半角カタカナをUTF-8コードに再配置したshinonomeutf8ファイルの格納アドレスを計算します。UTF-8にのみ存在する文字は、'・'が表示されます。
//********************************************* // UTF-8コードから東雲フォントデータの // 格納アドレスを計算する //********************************************* long GetFontAdd( long j ) { if( j<0x80 || j==0xE280BE || (j>=0xEFBDA1 && j<=0xEFBE9F) ){ //半角 //0x00〜0x7F if( j<0x80 ){ return( j*9 ); } //0xE280BE else if( j==0xE280BE ){ //半角の ̄; return( 1440 ); } //0xEFBDA1〜0xEFBDBF else if( j>=0xEFBDA1 && j<=0xEFBDBF ){ //半角のカナ; return( 1449+9*(j-0xEFBDA1) ); } //0xEFBE80〜0xEFBE9F else if( j>=0xEFBE80 && j<=0xEFBE9F ){ //半角のカナ; return( 1728 + 9*(j-0xEFBE80) ); } else{ //半角の・ return( 1485 ); } } else if( j<0xE000 ){ //0xC2A2〜0xC2B6 if( j>=0xC2A2 && j<=0xC2B6 ){ return( 2304 + (j-0xC2A2)*18 ); } //0xC397 × else if( j==0xC397 ){ return( 2682 ); } //0xC3B7 ÷ else if( j==0xC3B7 ){ return( 2700 ); } //0xCE91〜0xCEBF else if( j>=0xCE91 && j<=0xCEBF ){ return( 2718 + 18*(j-0xCE91) ); } //0xCF80〜0xCF89 else if( j>=0xCF80 && j<=0xCF89 ){ return( 3564 + 18*(j-0xCF80) ); } //0xD081 Ё else if( j==0xD081 ){ return( 3744 ); } //0xD090〜0xD0BF else if( j>=0xD090 && j<=0xD0BF ){ return( 3762 + 18*(j-0xD090) ); } //0xD180〜0xD191 else if( j>=0xD180 && j<=0xD191 ){ return( 4626 + 18*(j-0xD180) ); } else{ return( 2358 ); } } else{ if( j<0xE30000 ){ //0xE28090〜0xE280BB if( j>=0xE28090 && j<=0xE280BB ){ return( 4950 + 18*(j-0xE28090) ); } //0xE28483 ℃ else if( j==0xE28483 ){ return( 5742 ); } //0xE284AB Å else if( j==0xE284AB ){ return( 5760 ); } //0xE28690〜0xE28693 else if( j>=0xE28690 && j<=0xE28693 ){ return( 5778 + 18*(j-0xE28690) ); } //0xE28792〜0xE28794 else if( j>=0xE28792 && j<=0xE28794 ){ return( 5850 + 18*(j-0xE28792) ); } //0xE28880〜0xE288BF else if( j>=0xE28880 && j<=0xE288BF ){ return( 5904 + 18*(j-0xE28880) ); } //0xE28992〜0xE289AB else if( j>=0xE28992 && j<=0xE289AB ){ return( 7056 + 18*(j-0xE28992) ); } //0xE28A82〜0xE28A87 else if( j>=0xE28A82 && j<=0xE28A87 ){ return( 7524 + 18*(j-0xE28A82) ); } //0xE28AA5 ⊥ else if( j==0xE28AA5 ){ return( 7632 ); } //0xE28C92 ⌒ else if( j==0xE28C92 ){ return( 7650 ); } //0xE29480〜0xE294BF else if( j>=0xE29480 && j<=0xE294BF ){ return( 7668 + 18*(j-0xE29480) ); } //0xE29580〜0xE2958B else if( j>=0xE29580 && j<=0xE2958B ){ return( 8820 + 18*(j-0xE29580) ); } //0xE296A0〜0xE296BD else if( j>=0xE296A0 && j<=0xE296BD ){ return( 9036 + 18*(j-0xE296A0) ); } //0xE29786〜0xE2978F else if( j>=0xE29786 && j<=0xE2978F ){ return( 9576 + 18*(j-0xE29786) ); } //0xE297AF ○ else if( j==0xE297AF ){ return( 9756 ); } //0xE29885〜0xE29886 else if( j>=0xE29885 && j<=0xE29886 ){ return( 9774 + 18*(j-0xE29885) ); } //0xE29980〜0xE29982 else if( j>=0xE29980 && j<=0xE29982 ){ return( 9810 + 18*(j-0xE29980) ); } //0xE299AA〜0xE299AF else if( j>=0xE299AA && j<=0xE299AF ){ return( 9864 + 18*(j-0xE299AA) ); } else{ return( 2358 ); } } else if( j<0xE40000 ){ //0xE38080〜0xE3809C if( j>=0xE38080 && j<=0xE3809C ){ return( 9972 + 18*(j-0xE38080) ); } //0xE38181〜0xE381BF else if( j>=0xE38181 && j<=0xE381BF ){ return( 10494 + 18*(j-0xE38181) ); } //0xE38280〜0xE382BF else if( j>=0xE38280 && j<=0xE382BF ){ return( 11628 + 18*(j-0xE38280) ); } //0xE38380〜0xE383BE else if( j>=0xE38380 && j<=0xE383BE ){ return( 12780 + 18*(j-0xE38380) ); } else{ return( 2358 ); } } else if( j<0xE50000 ){ //0xE4B880〜0xE4B8BF if( j>=0xE4B880 && j<=0xE4B8BF ){ return( 13914 + 18*(j-0xE4B880) ); } //0xE4B982〜0xE4B9BF else if( j>=0xE4B982 && j<=0xE4B9BF ){ return( 15066 + 18*(j-0xE4B982) ); } //0xE4BA80〜0xE4BFBF else if( j<=0xE4BFBF ){ if( (j&0xff00)>=0xBA00 && (j&0xff00)<=0xBF00 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 16182 + 18*(j-(0xE4BA80+ 192*(((j&0xff00)-0xBA00)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } else{ return( 2358 ); } } //0xE58080〜0xE5BFBF else if( j<=0xE5bfbf ){ if( (j&0xff00)>=0x8000 && (j&0xff00)<=0xbf00 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 23094 + 18*(j-(0xE58080+ 192*(((j&0xff00)-0x8000)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } //0xE68080〜0xE6BFBF else if( j<=0xE6bfbf ){ if( (j&0xff00)>=0x8000 && (j&0xff00)<=0xbf00 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 96822 + 18*(j-(0xE68080+ 192*(((j&0xff00)-0x8000)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } else if( j<0xE80000 ){ //0xE78080〜0xE7B9BF if( j<=0xE7B9BF ){ if( (j&0xff00)>=0x8000 && (j&0xff00)<=0xb900 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 170550 + 18*(j-(0xE78080+ 192*(((j&0xff00)-0x8000)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } //0xE7BA80〜0xE7BA9C else if( j>=0xE7BA80 && j<=0xE7BA9C ){ return( 237366 + 18*(j-0xE7BA80) ); } //0xE7BCB6〜0xE7BCBF else if( j>=0xE7BCB6 && j<=0xE7BCBF ){ return( 237888 + 18*(j-0xE7BCB6) ); } //0xE7BD80〜0xE7BFBF else if( j<=0xE7BFBF ){ if( (j&0xff00)>=0xBD00 && (j&0xff00)<=0xBF00 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 238068 + 18*(j-(0xE7BD80+ 192*(((j&0xff00)-0xBD00)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } else{ return( 2358 ); } } else if( j<0xE90000 ){ //0xE88080〜0xE8ADBF if( j<=0xE8ADBF ){ if( (j&0xff00)>=0x8000 && (j&0xff00)<=0xAD00 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 241524 + 18*(j-(0xE88080+ 192*(((j&0xff00)-0x8000)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } //0xE8AE80〜0xE8AE9A else if( j>=0xE8AE80 && j<=0xE8AE9A ){ return( 294516 + 18*(j-0xE8AE80) ); } //0xE8B0B7〜0xE8B0BF else if( j>=0xE8B0B7 && j<=0xE8B0BF ){ return( 295002 + 18*(j-0xE8B0B7) ); } //0xE8B180〜0xE8B3BF else if( j<=0xE8B3BF ){ if( (j&0xff00)>=0xB100 && (j&0xff00)<=0xB300 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 295164 + 18*(j-(0xE8B180+ 192*(((j&0xff00)-0xB100)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } //0xE8B480〜0xE8B496 else if( j>=0xE8B480 && j<=0xE8B496 ){ return( 298620 + 18*(j-0xE8B480) ); } //0xE8B5A4〜0xE8B5BF else if( j>=0xE8B5A4 && j<=0xE8B5BF ){ return( 299034 + 18*(j-0xE8B5A4) ); } //0xE8B680〜0xE8BFBF else if( j<=0xE8BFBF ){ if( (j&0xff00)>=0xB600 && (j&0xff00)<=0xBF00 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 299538 + 18*(j-(0xE8B680+ 192*(((j&0xff00)-0xB600)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } else{ return( 2358 ); } } else if( j<0xEA0000 ){ //0xE98080〜0xE991BF if( j<=0xE991BF ){ if( (j&0xff00)>=0x8000 && (j&0xff00)<=0x9100 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 311058 + 18*(j-(0xE98080+ 192*(((j&0xff00)-0x8000)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } //0xE99280〜0xE99281 else if( j>=0xE99280 && j<=0xE99281 ){ return( 331794 + 18*(j-0xE99280) ); } //0xE995B7〜0xE995BF else if( j>=0xE995B7 && j<=0xE995BF ){ return( 331830 + 18*(j-0xE995B7) ); } //0xE99680〜0xE996BF else if( j>=0xE99680 && j<=0xE996BF ){ return( 331992 + 18*(j-0xE99680) ); } //0xE99780〜0xE997A5 else if( j>=0xE99780 && j<=0xE997A5 ){ return( 333144 + 18*(j-0xE99780) ); } //0xE9989C〜0xE998BF else if( j>=0xE9989C && j<=0xE998BF ){ return( 333828 + 18*(j-0xE9989C) ); } //0xE99980〜0xE9B0BF else if( j<=0xE9B0BF ){ if( (j&0xff00)>=0x9900 && (j&0xff00)<=0xB000 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 334476 + 18*(j-(0xE99980+ 192*(((j&0xff00)-0x9900)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } //0xE9B180〜0xE9B1B8 else if( j>=0xE9B180 && j<=0xE9B1B8 ){ return( 362124 + 18*(j-0xE9B180) ); } //0xE9B3A5〜0xE9B3BF else if( j>=0xE9B3A5 && j<=0xE9B3BF ){ return( 363150 + 18*(j-0xE9B3A5) ); } //0xE9B480〜0xE9B6BF else if( j<=0xE9B6BF ){ if( (j&0xff00)>=0xB400 && (j&0xff00)<=0xB600 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 363636 + 18*(j-(0xE9B480+ 192*(((j&0xff00)-0xB400)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } //0xE9B780〜0xE9B7BD else if( j>=0xE9B780 && j<=0xE9B7BD ){ return( 367092 + 18*(j-0xE9B780) ); } //0xE9B89A〜0xE9B89E else if( j>=0xE9B89A && j<=0xE9B89E ){ return( 368208 + 18*(j-0xE9B89A) ); } //0xE9B9B5〜0xE9B9BF else if( j>=0xE9B9B5 && j<=0xE9B9BF ){ return( 368298 + 18*(j-0xE9B9B5) ); } //0xE9BA80〜0xE9BDBF else if( j<=0xE9BDBF ){ if( (j&0xff00)>=0xBA00 && (j&0xff00)<=0xBD00 ){ if( (j&0xff)>=0x80 && (j&0xff)<=0xbf ){ return( 368496 + 18*(j-(0xE9BA80+ 192*(((j&0xff00)-0xBA00)>>8)))); } else{ return( 2358 ); } } else{ return( 2358 ); } } //0xE9BE80〜0xE9BEA0 else if( j>=0xE9BE80 && j<=0xE9BEA0 ){ return( 373104 + 18*(j-0xE9BE80) ); } else{ return( 2358 ); } } //0xEFBC81〜0xEFBCBF else if( j>=0xEFBC81 && j<=0xEFBCBF ){ return( 373698 + 18*(j-0xEFBC81) ); } //0xEFBD80〜0xEFBD9D else if( j>=0xEFBD80 && j<=0xEFBD9D ){ return( 374832 + 18*(j-0xEFBD80) ); } //0xEFBFA3  ̄ else if( j==0xEFBFA3 ){ return( 375372 ); } //0xEFBFA5 ¥ else if( j==0xEFBFA5 ){ return( 375390 ); } } return( 2358 ); }
void ShinoPrint( uint16* screen, int x, int y, u8 *st, u16 Fcolor, u16 Bcolor, u8 kaki );
東雲12ドットフォントをNDSの画面に表示するプログラムのUTF-8版です。プログラム的には文字コードからフォントの格納アドレスを取得して、グラフィック座標に文字を書いているだけです。
//******************************************** // 画面に東雲12フォントを表示する // Fpalet:文字色 // Bpalet:背景色 // kaki :or書きするか and書きするか // 0=or , 1=and //******************************************** void ShinoPrint( uint16* screen, int x, int y, u8 *st, u16 Fcolor, u16 Bcolor, u8 kaki ) { short i, p; int b; long s8, k; while( 1 ){ s8 = *st; if( s8<=0x7F ){ //1バイト:半角 st++; b = 1; } else if( s8>=0xC2 && s8<=0xDF ){ //2バイト st++; s8 = s8*256 + *st; st++; b = 2; } else if( s8>=0xe0 && s8<=0xef ){ //3バイト st++; s8 = s8*256 + *st; st++; s8 = s8*256 + *st; st++; if( s8==0xE280BE || (s8>=0xEFBDA1 && s8<=0xEFBE9F) ){ //半角 b = 1; } else{ //全角 b = 2; } } else{ break; } k = GetFontAdd( s8 ); if( b==2 ){ //全角文字 for( i=0; i<3; i++ ){ p = shinonomeutf8_bin[k+i*3]; if((p&0x80)!=0) Pixel( screen, x+0, y+i*4, Fcolor ); if((p&0x40)!=0) Pixel( screen, x+1, y+i*4, Fcolor ); if((p&0x20)!=0) Pixel( screen, x+2, y+i*4, Fcolor ); if((p&0x10)!=0) Pixel( screen, x+3, y+i*4, Fcolor ); if((p&0x8)!=0) Pixel( screen, x+4, y+i*4, Fcolor ); if((p&0x4)!=0) Pixel( screen, x+5, y+i*4, Fcolor ); if((p&0x2)!=0) Pixel( screen, x+0, y+i*4+1, Fcolor ); if((p&0x1)!=0) Pixel( screen, x+1, y+i*4+1, Fcolor ); if( kaki==1 ){ if((p&0x80)==0) Pixel( screen, x+0, y+i*4, Bcolor ); if((p&0x40)==0) Pixel( screen, x+1, y+i*4, Bcolor ); if((p&0x20)==0) Pixel( screen, x+2, y+i*4, Bcolor ); if((p&0x10)==0) Pixel( screen, x+3, y+i*4, Bcolor ); if((p&0x8)==0) Pixel( screen, x+4, y+i*4, Bcolor ); if((p&0x4)==0) Pixel( screen, x+5, y+i*4, Bcolor ); if((p&0x2)==0) Pixel( screen, x+0, y+i*4+1, Bcolor ); if((p&0x1)==0) Pixel( screen, x+1, y+i*4+1, Bcolor ); } p = shinonomeutf8_bin[k+i*3+1]; if((p&0x80)!=0) Pixel( screen, x+2, y+i*4+1, Fcolor ); if((p&0x40)!=0) Pixel( screen, x+3, y+i*4+1, Fcolor ); if((p&0x20)!=0) Pixel( screen, x+4, y+i*4+1, Fcolor ); if((p&0x10)!=0) Pixel( screen, x+5, y+i*4+1, Fcolor ); if((p&0x8)!=0) Pixel( screen, x+0, y+i*4+2, Fcolor ); if((p&0x4)!=0) Pixel( screen, x+1, y+i*4+2, Fcolor ); if((p&0x2)!=0) Pixel( screen, x+2, y+i*4+2, Fcolor ); if((p&0x1)!=0) Pixel( screen, x+3, y+i*4+2, Fcolor ); if( kaki==1 ){ if((p&0x80)==0) Pixel( screen, x+2, y+i*4+1, Bcolor ); if((p&0x40)==0) Pixel( screen, x+3, y+i*4+1, Bcolor ); if((p&0x20)==0) Pixel( screen, x+4, y+i*4+1, Bcolor ); if((p&0x10)==0) Pixel( screen, x+5, y+i*4+1, Bcolor ); if((p&0x8)==0) Pixel( screen, x+0, y+i*4+2, Bcolor ); if((p&0x4)==0) Pixel( screen, x+1, y+i*4+2, Bcolor ); if((p&0x2)==0) Pixel( screen, x+2, y+i*4+2, Bcolor ); if((p&0x1)==0) Pixel( screen, x+3, y+i*4+2, Bcolor ); } p = shinonomeutf8_bin[k+i*3+2]; if((p&0x80)!=0) Pixel( screen, x+4, y+i*4+2, Fcolor ); if((p&0x40)!=0) Pixel( screen, x+5, y+i*4+2, Fcolor ); if((p&0x20)!=0) Pixel( screen, x+0, y+i*4+3, Fcolor ); if((p&0x10)!=0) Pixel( screen, x+1, y+i*4+3, Fcolor ); if((p&0x8)!=0) Pixel( screen, x+2, y+i*4+3, Fcolor ); if((p&0x4)!=0) Pixel( screen, x+3, y+i*4+3, Fcolor ); if((p&0x2)!=0) Pixel( screen, x+4, y+i*4+3, Fcolor ); if((p&0x1)!=0) Pixel( screen, x+5, y+i*4+3, Fcolor ); if( kaki==1 ){ if((p&0x80)==0) Pixel( screen, x+4, y+i*4+2, Bcolor ); if((p&0x40)==0) Pixel( screen, x+5, y+i*4+2, Bcolor ); if((p&0x20)==0) Pixel( screen, x+0, y+i*4+3, Bcolor ); if((p&0x10)==0) Pixel( screen, x+1, y+i*4+3, Bcolor ); if((p&0x8)==0) Pixel( screen, x+2, y+i*4+3, Bcolor ); if((p&0x4)==0) Pixel( screen, x+3, y+i*4+3, Bcolor ); if((p&0x2)==0) Pixel( screen, x+4, y+i*4+3, Bcolor ); if((p&0x1)==0) Pixel( screen, x+5, y+i*4+3, Bcolor ); } p = shinonomeutf8_bin[k+i*3+9]; if((p&0x80)!=0) Pixel( screen, x+6, y+i*4, Fcolor ); if((p&0x40)!=0) Pixel( screen, x+7, y+i*4, Fcolor ); if((p&0x20)!=0) Pixel( screen, x+8, y+i*4, Fcolor ); if((p&0x10)!=0) Pixel( screen, x+9, y+i*4, Fcolor ); if((p&0x8)!=0) Pixel( screen, x+10, y+i*4, Fcolor ); if((p&0x4)!=0) Pixel( screen, x+11, y+i*4, Fcolor ); if((p&0x2)!=0) Pixel( screen, x+6, y+i*4+1, Fcolor ); if((p&0x1)!=0) Pixel( screen, x+7, y+i*4+1, Fcolor ); if( kaki==1 ){ if((p&0x80)==0) Pixel( screen, x+6, y+i*4, Bcolor ); if((p&0x40)==0) Pixel( screen, x+7, y+i*4, Bcolor ); if((p&0x20)==0) Pixel( screen, x+8, y+i*4, Bcolor ); if((p&0x10)==0) Pixel( screen, x+9, y+i*4, Bcolor ); if((p&0x8)==0) Pixel( screen, x+10, y+i*4, Bcolor ); if((p&0x4)==0) Pixel( screen, x+11, y+i*4, Bcolor ); if((p&0x2)==0) Pixel( screen, x+6, y+i*4+1, Bcolor ); if((p&0x1)==0) Pixel( screen, x+7, y+i*4+1, Bcolor ); } p = shinonomeutf8_bin[k+i*3+10]; if((p&0x80)!=0) Pixel( screen, x+8, y+i*4+1, Fcolor ); if((p&0x40)!=0) Pixel( screen, x+9, y+i*4+1, Fcolor ); if((p&0x20)!=0) Pixel( screen, x+10, y+i*4+1, Fcolor ); if((p&0x10)!=0) Pixel( screen, x+11, y+i*4+1, Fcolor ); if((p&0x8)!=0) Pixel( screen, x+6, y+i*4+2, Fcolor ); if((p&0x4)!=0) Pixel( screen, x+7, y+i*4+2, Fcolor ); if((p&0x2)!=0) Pixel( screen, x+8, y+i*4+2, Fcolor ); if((p&0x1)!=0) Pixel( screen, x+9, y+i*4+2, Fcolor ); if( kaki==1 ){ if((p&0x80)==0) Pixel( screen, x+8, y+i*4+1, Bcolor ); if((p&0x40)==0) Pixel( screen, x+9, y+i*4+1, Bcolor ); if((p&0x20)==0) Pixel( screen, x+10, y+i*4+1, Bcolor ); if((p&0x10)==0) Pixel( screen, x+11, y+i*4+1, Bcolor ); if((p&0x8)==0) Pixel( screen, x+6, y+i*4+2, Bcolor ); if((p&0x4)==0) Pixel( screen, x+7, y+i*4+2, Bcolor ); if((p&0x2)==0) Pixel( screen, x+8, y+i*4+2, Bcolor ); if((p&0x1)==0) Pixel( screen, x+9, y+i*4+2, Bcolor ); } p = shinonomeutf8_bin[k+i*3+11]; if((p&0x80)!=0) Pixel( screen, x+10, y+i*4+2, Fcolor ); if((p&0x40)!=0) Pixel( screen, x+11, y+i*4+2, Fcolor ); if((p&0x20)!=0) Pixel( screen, x+6, y+i*4+3, Fcolor ); if((p&0x10)!=0) Pixel( screen, x+7, y+i*4+3, Fcolor ); if((p&0x8)!=0) Pixel( screen, x+8, y+i*4+3, Fcolor ); if((p&0x4)!=0) Pixel( screen, x+9, y+i*4+3, Fcolor ); if((p&0x2)!=0) Pixel( screen, x+10, y+i*4+3, Fcolor ); if((p&0x1)!=0) Pixel( screen, x+11, y+i*4+3, Fcolor ); if( kaki==1 ){ if((p&0x80)==0) Pixel( screen, x+10, y+i*4+2, Bcolor ); if((p&0x40)==0) Pixel( screen, x+11, y+i*4+2, Bcolor ); if((p&0x20)==0) Pixel( screen, x+6, y+i*4+3, Bcolor ); if((p&0x10)==0) Pixel( screen, x+7, y+i*4+3, Bcolor ); if((p&0x8)==0) Pixel( screen, x+8, y+i*4+3, Bcolor ); if((p&0x4)==0) Pixel( screen, x+9, y+i*4+3, Bcolor ); if((p&0x2)==0) Pixel( screen, x+10, y+i*4+3, Bcolor ); if((p&0x1)==0) Pixel( screen, x+11, y+i*4+3, Bcolor ); } } x += 12; } else{ //半角文字だよ if( s8==0 ) break; for( i=0; i<3; i++ ){ p = shinonomeutf8_bin[k+i*3]; if((p&0x80)!=0) Pixel( screen, x+0, y+i*4, Fcolor ); if((p&0x40)!=0) Pixel( screen, x+1, y+i*4, Fcolor ); if((p&0x20)!=0) Pixel( screen, x+2, y+i*4, Fcolor ); if((p&0x10)!=0) Pixel( screen, x+3, y+i*4, Fcolor ); if((p&0x8)!=0) Pixel( screen, x+4, y+i*4, Fcolor ); if((p&0x4)!=0) Pixel( screen, x+5, y+i*4, Fcolor ); if((p&0x2)!=0) Pixel( screen, x+0, y+i*4+1, Fcolor ); if((p&0x1)!=0) Pixel( screen, x+1, y+i*4+1, Fcolor ); if( kaki==1 ){ if((p&0x80)==0) Pixel( screen, x+0, y+i*4, Bcolor ); if((p&0x40)==0) Pixel( screen, x+1, y+i*4, Bcolor ); if((p&0x20)==0) Pixel( screen, x+2, y+i*4, Bcolor ); if((p&0x10)==0) Pixel( screen, x+3, y+i*4, Bcolor ); if((p&0x8)==0) Pixel( screen, x+4, y+i*4, Bcolor ); if((p&0x4)==0) Pixel( screen, x+5, y+i*4, Bcolor ); if((p&0x2)==0) Pixel( screen, x+0, y+i*4+1, Bcolor ); if((p&0x1)==0) Pixel( screen, x+1, y+i*4+1, Bcolor ); } p = shinonomeutf8_bin[k+i*3+1]; if((p&0x80)!=0) Pixel( screen, x+2, y+i*4+1, Fcolor ); if((p&0x40)!=0) Pixel( screen, x+3, y+i*4+1, Fcolor ); if((p&0x20)!=0) Pixel( screen, x+4, y+i*4+1, Fcolor ); if((p&0x10)!=0) Pixel( screen, x+5, y+i*4+1, Fcolor ); if((p&0x8)!=0) Pixel( screen, x+0, y+i*4+2, Fcolor ); if((p&0x4)!=0) Pixel( screen, x+1, y+i*4+2, Fcolor ); if((p&0x2)!=0) Pixel( screen, x+2, y+i*4+2, Fcolor ); if((p&0x1)!=0) Pixel( screen, x+3, y+i*4+2, Fcolor ); if( kaki==1 ){ if((p&0x80)==0) Pixel( screen, x+2, y+i*4+1, Bcolor ); if((p&0x40)==0) Pixel( screen, x+3, y+i*4+1, Bcolor ); if((p&0x20)==0) Pixel( screen, x+4, y+i*4+1, Bcolor ); if((p&0x10)==0) Pixel( screen, x+5, y+i*4+1, Bcolor ); if((p&0x8)==0) Pixel( screen, x+0, y+i*4+2, Bcolor ); if((p&0x4)==0) Pixel( screen, x+1, y+i*4+2, Bcolor ); if((p&0x2)==0) Pixel( screen, x+2, y+i*4+2, Bcolor ); if((p&0x1)==0) Pixel( screen, x+3, y+i*4+2, Bcolor ); } p = shinonomeutf8_bin[k+i*3+2]; if((p&0x80)!=0) Pixel( screen, x+4, y+i*4+2, Fcolor ); if((p&0x40)!=0) Pixel( screen, x+5, y+i*4+2, Fcolor ); if((p&0x20)!=0) Pixel( screen, x+0, y+i*4+3, Fcolor ); if((p&0x10)!=0) Pixel( screen, x+1, y+i*4+3, Fcolor ); if((p&0x8)!=0) Pixel( screen, x+2, y+i*4+3, Fcolor ); if((p&0x4)!=0) Pixel( screen, x+3, y+i*4+3, Fcolor ); if((p&0x2)!=0) Pixel( screen, x+4, y+i*4+3, Fcolor ); if((p&0x1)!=0) Pixel( screen, x+5, y+i*4+3, Fcolor ); if( kaki==1 ){ if((p&0x80)==0) Pixel( screen, x+4, y+i*4+2, Bcolor ); if((p&0x40)==0) Pixel( screen, x+5, y+i*4+2, Bcolor ); if((p&0x20)==0) Pixel( screen, x+0, y+i*4+3, Bcolor ); if((p&0x10)==0) Pixel( screen, x+1, y+i*4+3, Bcolor ); if((p&0x8)==0) Pixel( screen, x+2, y+i*4+3, Bcolor ); if((p&0x4)==0) Pixel( screen, x+3, y+i*4+3, Bcolor ); if((p&0x2)==0) Pixel( screen, x+4, y+i*4+3, Bcolor ); if((p&0x1)==0) Pixel( screen, x+5, y+i*4+3, Bcolor ); } } x += 6; } } }
int ShinoPrintBoxSubroutine( uint16* screen, int xz, int yz, unsigned char* moji, int mojisuu, u16 fcolor, u16 bcolor, u8 kaki, uint16 backcolor, int upFlg );
画面に文字を折り返して表示するプログラムです。S-JISは固定長コードでしたがUTF-8は可変長コードなので、折り返しの処理がずいぶん違うので、新たに書き直しました。
//************************************************** // 画面に、ある文字数(半角換算)で文を折り返して表示する // 引数 xz,yz:開始するx,y座標、 // *moji文が入った配列、 // mojisuu:折り返す文字数(半角換算で指定) // fcolor:文字色 // bcolor:背景色 // backcolor:スクロールするときの背景色 // upFlg:スクロール表示かどうかのフラグ // 戻り値:書いた行( 折り返さ無かったときは 1 ) //************************************************** int ShinoPrintBoxSubroutine( uint16* screen, int xz, int yz, unsigned char* moji, int mojisuu, u16 fcolor, u16 bcolor, u8 kaki, uint16 backcolor, int upFlg ) { unsigned char ori[144]; //1列分の文を入れる配列 3バイト×48文字分 int orisuu; //折り返し数のカウンタ int lenmoji; //UTF-8コードの長さ int breakFlag; //全部表示し終わったことを示すフラグ int syoriMojiByte; //折り返し処理をした文字数(半角換算); int i; //ori[]1列分のコードデータの配列番号 int j; //moji[]表示文字コードの配列番号 int k0, k1; //1文字前の配列位置を保持している変数 int kasanByte; //1文字表示したときのコードサイズ int dispmojisuu; //1列分の表示文字数(半角換算) //折り返す文字数は42文字(半角換算)以下である if( mojisuu>42 ) return( 0 ); //42文字(半角換算)以上なら、何もしない。 lenmoji = strlen( (char*)moji ); //コードの量を計測 orisuu = 0; //折り返し数の初期化 breakFlag = 1; //処理終了を示すフラグの初期化 syoriMojiByte = 0; //折り返し処理した文字数を初期化 j = 0; //表示コード配列位置の初期化 while( breakFlag==1 ){ dispmojisuu = 0; //1列分の表示文字数の初期化 i = 0; //1列分の表示データ配列位置の初期化 while( true ){ //1列分の文字列を抽出する if( j>=lenmoji ){ //元データ量になったらori[]に0を代入してループ終了 ori[i] = 0; breakFlag = 0; break; } ori[i] = moji[j]; //1バイトずつori[]にコピー //加算文字数を求める if( GetZenkaku( &moji[j] )==true ){ kasanByte = 2; } else{ kasanByte = 1; } dispmojisuu += kasanByte; k0 = j; //jを退避 k1 = i; //iを退避 if( ori[i] <=0x7F ){ //1バイト j++; i++; } else if( ori[i]>=0xC2 && ori[i]<=0xDF ){ //2バイト ori[i+1] = moji[j+1]; j += 2; i +=2; } else if( ori[i]>=0xE0 && ori[i]<=0xEF ){ //3バイト ori[i+1] = moji[j+1]; ori[i+2] = moji[j+2]; j += 3; i += 3; } if( dispmojisuu==mojisuu ){ ori[i] = 0; break; } else if( dispmojisuu>mojisuu ){ j = k0; //jの値を1文字前に戻す i = k1; //iの値を1文字前に戻す ori[i] = 0; dispmojisuu -= kasanByte; if( kasanByte==2 && mojisuu==1 ){ breakFlag = 0; } //半角幅に全角を表示する条件の場合は強制終了。 break; } } syoriMojiByte += dispmojisuu; //折り返し処理文字数を加算 if( upFlg==0 ){ ShinoPrint( screen, xz, yz+orisuu*12, (u8 *)ori, fcolor, bcolor, kaki ); } else{ if( orisuu==0 || ori[0]!=0 ){ ShinoScrnUp( screen, backcolor ); } ShinoPrint( screen, 0, 180, (u8 *)ori, fcolor, bcolor, kaki ); } if( strlen((char*)ori)!=0 ) orisuu++; //表示文字数が0出なければ、折り返し数のカウントアップ if( orisuu>64 ) break; //64行を超えたら処理を止める } return( orisuu ); }
ソースの羅列になってしまいましたが、明日にでも使用例と共にアップしたいと思います。
プログラム環境をUTF-8に変更してみた感想ですが、コード体系はS-JISの方が固定長データなので文字処理が楽です。また、フォントデータのサイズも幾分小さいです。
ですので、どうしてもUTF-8系でプログラムをする必要が生じない限り、S-JIS環境でNDSのプログラムを行う方が楽だと感じました。
twitterのプログラムは、もう一度見直して、S-JIS環境でUTF-8コード投稿ができるようなものに作り変えようと思います。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム