コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

自作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系のプログラム