SSブログ

試しにコマンドラインツールを作ってみた [MSP430]

Windows ビットマップファイルをPW160128LCDに最適化したデータに変換するプログラム。MSP430のアセンブラのテーブルを生成する。

一応2色(白黒)、16色(グレースケール)に対応している、、、筈だ。
しかしサイズが8で割り切れない時の対処を行っていないので、更なる煮詰めが必要。

/* ------------------------------------------------------------------------ */
/*  Windows ビットマップファイルをMSP430のASMソースに変換する。             */
/*                                                                          */
/*  変換出来るフォーマットはWindows BMP、2色と16階調グレースケールです。    */
/*  上記のフォーマットは、大概のペイントツールで可能でしょう。              */
/*                                        Copyright (C) 2007 - by hamayan   */
/* ------------------------------------------------------------------------ */
#include <stdio.h>
#include <stdlib.h>

typedef	struct	/*ビットマップファイルヘッダー*/
{
  char  bfType[2];  /*認識文字*/
  char  bfSize[4];  /*ファイルサイズ*/
  char  bfReserved1[2];  /*予約1*/
  char  bfReserved2[2];  /*予約2*/
  char  bfOffBits[4];  /*ピクセルデータまでのバイト数*/
} BITMAPFILEHEADER;

typedef  struct  /*ビットマップ情報ヘッダー*/
{
  char  biSize[4];  /*BITMAPFILEHEADERのサイズ*/
  char  biWidth[4];  /*ピクセルデータの幅*/
  char  biHeight[4];  /*ピクセルデータの高さ*/
  char  Planes[2];  /*カラープレーン数*/
  char  biBitCount[2];  /*色数*/
  char  biCompression[4];  /*圧縮形式*/
  char  biSizeImage[4];  /*ピクセルデータのサイズ*/
  char  biXPelsPerMeter[4];  /*水平解像度*/
  char  biYPelsPerMeter[4];  /*垂直解像度*/
  char  biClrUsed[4];  /*使用カラー数*/
  char  biClrImportant[4];  /*重要なカラー数*/
} BITMAPINFOHEADER;

typedef  struct  /*カラーパレット*/
{
  unsigned char  rgbBlue;  /*青の輝度*/
  unsigned char  rgbGreen;  /*緑の輝度*/
  unsigned char  rgbRed;    /*赤の輝度*/
  unsigned char  rgbReserved;  /*予約*/
} RGBQUAD;

typedef  struct  /*ファイル全体のフォーマット*/
{
  BITMAPFILEHEADER  bf;
  BITMAPINFOHEADER  bi;
  RGBQUAD        rgb[1];
} BITMAPFILEFORMAT;

int main( int argc, char *argv[] )
{
  char  *FileBuffer;
  unsigned char *bmp,data,bit_chk;
  int    i,j,k,width,line,shift;
  long  FileSz,curpos;
  BITMAPFILEFORMAT  *head;
  RGBQUAD        *rgb;
  FILE  *in,*out;

  if( argc != 2 && argc != 3 )
  {
    printf( "Parameter Error\n" );
    return EOF;
  }

  if( argc == 2 ) out = stdout;
  else
  {
    out = fopen( argv[2], "w+t" );
  }

  /*引数のファイルをOPENする。*/
  if( (in = fopen( argv[ 1 ], "rb" )) == NULL ) return EOF;

  /*ファイルのサイズを取得する。*/
  curpos = ftell( in );
  fseek( in, 0, SEEK_END );
  FileSz = ftell( in );
  fseek( in, curpos, SEEK_SET );
  FileBuffer = malloc( FileSz + 1 );

  /*ファイルの内容を取込み*/
  fread( FileBuffer, 1, FileSz, in );

  /*ファイルの内容を取り込んだので、CLOSEする。*/
  fclose( in );

  /*ファイルの情報を表示する。*/
  head = (BITMAPFILEFORMAT *)FileBuffer;

  /*意匠表示と擬似命令*/
  fprintf( out,
    ";* ------------------------------------------------------------------------ *\n"
    ";* 画像データテーブル                                                     *\n"
    ";*                                          designed by hamayan             *\n"
    ";*                                          Copyright (C) 2007 - by hamayan *\n"
    ";* ------------------------------------------------------------------------ *\n\n"
    "\tNAME bmp_data_table\n"
    "\tRSEG DATA16_C\n"
    "\tEXPORT  PixWidth\n"
    "\tEXPORT  PixHeight\n"
    "\tEXPORT  PixColor\n"
    "\tEXPORT  Graphic\n\n"
  );

  fprintf( out,  ";\tGraphic Info\n" );
  fprintf( out,
    ";\tType:%c%c*\n"
    ";\tFile size=%ld*\n"
    ";\tOffset=%ld*\n\n",
    head->bf.bfType[0],head->bf.bfType[1],
    *((long *)head->bf.bfSize),
    *((long *)head->bf.bfOffBits)
  );

  fprintf( out,
    ";\tHeader size=%ld\n"
    ";\tWidth=%ld\n"
    ";\tHeight=%ld\n"
    ";\tPlanes=%d\n"
    ";\tCount=%d\n"
    ";\tImg size=%d\n"
    ";\tX pics=%ld\n"
    ";\tY pics=%ld\n"
    ";\tColor Used=%d\n\n",
    *((long *)head->bi.biSize),
    *((long *)head->bi.biWidth),
    *((long *)head->bi.biHeight),
    *((short *)head->bi.Planes),
    *((short *)head->bi.biBitCount),
    *((long *)head->bi.biSizeImage),
    *((long *)head->bi.biXPelsPerMeter),
    *((long *)head->bi.biYPelsPerMeter),
    *((long *)head->bi.biClrUsed)
  );

  fprintf( out, 
    "PixWidth:\tDW\t%ld\n"
    "PixHeight:\tDW\t%ld\n"
    "PixColor:\tDW\t%ld\n",
    *((long *)head->bi.biWidth),
    *((long *)head->bi.biHeight),
    *((long *)head->bi.biClrUsed)
  );

#define    BITCOUNT  (*((short *)head->bi.biBitCount))
#define    OFFBITS    (*((long *)head->bf.bfOffBits))
#define    HEIGHT    (*((long *)head->bi.biHeight) - 1)

  /*縦横サイズの調整*/
  width = *((long *)head->bi.biWidth);    /*横方向のbyte数を計算*/
  width = ((width - 1) * BITCOUNT / 8) + 1;
  line = (((width - 1) / sizeof(long)) + 1) * sizeof(long);

  /*左下を原点にしている為に、上下方向のみ入れ替えが必要となる。*/

  /*画像データをASMソースファイルに変換する。*/
  fprintf( out, "\n;\tparameter width = %d height = %d line = %d\n", width, HEIGHT + 1, line );
  fprintf( out, "Graphic:\n" );
  for( i = HEIGHT; i >= 0; i -= 8 )  /*逆順に廻して行く*/
  {
    bmp = (unsigned char *)head + (i * line) + OFFBITS;  /*パレット番号が登録されたテーブルから読み出し*/
    for( j = 0; j < width; j++ )
    {
      fprintf( out, "\tDB\t" );
      for( k = 0,bit_chk = 0x80; k < 8; k++ )
      {
        data =  ( *(bmp - (line * 0)) & bit_chk) ? 0x01 : 0x00;
        data |= ( *(bmp - (line * 1)) & bit_chk) ? 0x02 : 0x00;
        data |= ( *(bmp - (line * 2)) & bit_chk) ? 0x04 : 0x00;
        data |= ( *(bmp - (line * 3)) & bit_chk) ? 0x08 : 0x00;
        data |= ( *(bmp - (line * 4)) & bit_chk) ? 0x10 : 0x00;
        data |= ( *(bmp - (line * 5)) & bit_chk) ? 0x20 : 0x00;
        data |= ( *(bmp - (line * 6)) & bit_chk) ? 0x40 : 0x00;
        data |= ( *(bmp - (line * 7)) & bit_chk) ? 0x80 : 0x00;
        bit_chk >>= 1;

        if( k != 7 )
          fprintf( out, "0x%02X,", ~data & 0x00ff );
        else
          fprintf( out, "0x%02X\n", ~data & 0x00ff );
      }
      bmp++;
    }
    putc( '\n', out );
  }

  for( i = HEIGHT; i >= 0; i-- )  /*逆順に廻して行く*/
  {
    fprintf( out,  ";\t" );
    bmp = (unsigned char *)head + (i * line) + OFFBITS;  /*パレット番号が登録されたテーブルから読み出し*/
    for( j = 0; j < width; j++ )
    {
      for( k = 0; k < 8; k++ )
      {
        fprintf( out, "%c", (*bmp & (0x80 >> k)) ? ' ' : '*' );
      }
      bmp++;
    }
    fprintf( out,  "\n" );
  }

  fprintf( out, "\n\tEND\n\n" );

  /*意匠表示*/
  fprintf( out,
    "\n"
    ";* ------------------------------------------------------------------------ *\n"
    ";* end of file                                                              *\n"
    ";*                                          designed by hamayan             *\n"
    ";*                                          Copyright (C) 2007 - by hamayan *\n"
    ";* ------------------------------------------------------------------------ *\n\n"
  );

  if( argc == 3 ) fclose( out );
  free( FileBuffer );
  return 0;
}

/* ------------------------------------------------------------------------ */
/*                                         Copyright (C) 2007 - by hamayan  */
/* ------------------------------------------------------------------------ */


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

MSP430F2274 + LCD Ga..PW160128LCD設定編 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。