試しにコマンドラインツールを作ってみた [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 */
/* ------------------------------------------------------------------------ */
コメント 0