読者です 読者をやめる 読者になる 読者になる

ハートに16連射。(30)


BMPファイルの展開ルーチンを試し書きしてみた。
フェイスプレートをユーザが用意した任意の画像に差し替えれるという機能を持たすため。


フェイスプレート画像を作ること自体が実は面倒と分かって…誰も使わないかも知れない機能w


24 ビット、 256x192 ピクセル、ファイル名固定とした場合、チェック処理の手間はあまり無さ気。
BMP なら前もって容量分かるし、仮に BMP ファイルじゃなくても
容量さえ合えば強引に NDS LCD サイズ分の画像データとして展開できてしまえるし。


見ての通りのベタなコードなので展開はすこぶる遅い。表示まで大体 2〜3 秒(笑)。
実際の実装は展開中を非表示とし、展開完了後に表示とすることになるかと。


bmp module test


main.c

/*---------------------------------------------------------------------------------
	
	shtwatch
	bmp module test
	
	version 0.01
	Mar 07, 2010
	
	By REGEKATSU
	
---------------------------------------------------------------------------------*/

#include <stdio.h>
#include <nds.h>
#include <fat.h>


#define FILE_NAME "HARUHI.BMP"
#define RGB24(r,g,b) ( (1 << 15) | RGB8((r), (g), (b)) )


//---------------------------------------------------------------------------------
int main(void){
//---------------------------------------------------------------------------------
	
	FILE *fp;
	
	videoSetMode(MODE_5_2D);
	vramSetBankA(VRAM_A_MAIN_BG);
	consoleDemoInit();
	
	bgInit(3, BgType_Bmp16, BgSize_B16_256x256, 0, 0);
	
	
	while(1) {
		swiWaitForVBlank();
		scanKeys();
		
		if(keysDown() & KEY_START){
			break;
		}
	}
	
	
	printf("fat init...");
	if(!fatInitDefault()){
		printf("error!\n");
		return 1;
	}
	printf("ok!\n");
	
	
	printf("file open...");
	if( ( fp = fopen(FILE_NAME, "rb") ) == NULL ){
		printf("error!\n");
		fclose(fp);
		return 1;
	}
	printf("ok!\n");
	
	
	long size;
	fseek(fp, 0L, SEEK_END);
	size = ftell(fp);
	
	printf("bmp size...%ldbyte...", size);
	if( size != 147510 ){
		printf("error!\n");
		fclose(fp);
		return 1;
	}
	printf("ok!\n");
	
	
	printf("bmp load...");
	fseek(fp, 54L, SEEK_SET);
	
	int x, y;
	char r, g, b;
	
	for(y = 0;y < 192;y++){
		for(x = 0;x < 256;x++){
			b = fgetc(fp);
			g = fgetc(fp);
			r = fgetc(fp);
			BG_GFX[x + ((191 - y) * 256)] = RGB24(r, g, b);
		}
	}
	fclose(fp);
	printf("ok!\n");
	
	
	return 0;
	
}

//---------------------------------------------------------------------------------